// SPDX-License-Identifier: AGPL-3.0-only 'use strict'; const assert = require('node:assert/strict'); const fs = require('node:fs'); const path = require('node:path'); const vscode = require('vscode'); async function run() { const binary = process.env.HIMESAN_TEST_BINARY; assert.ok(binary && path.isAbsolute(binary), 'HIMESAN_TEST_BINARY must be an absolute Beta 2 candidate path'); const folder = vscode.workspace.workspaceFolders?.[0]; assert.ok(folder, 'integration workspace missing'); await vscode.workspace.getConfiguration('sandwichHime', folder.uri).update('himesanPath', binary, vscode.ConfigurationTarget.WorkspaceFolder); const extension = vscode.extensions.getExtension('gamertan.sandwich-hime'); assert.ok(extension, 'extension not discovered'); await extension.activate(); const homeUri = vscode.Uri.joinPath(folder.uri, 'views', 'home.sando'); const pillUri = vscode.Uri.joinPath(folder.uri, 'views', 'badge.sando'); const badgeUri = vscode.Uri.joinPath(folder.uri, 'cards', 'badge.sando'); const duplicateUri = vscode.Uri.joinPath(folder.uri, 'views', 'duplicate.sando'); const document = await vscode.workspace.openTextDocument(homeUri); await vscode.window.showTextDocument(document); await waitFor(() => vscode.languages.getDiagnostics(homeUri).length === 0, 5000); const pillPosition = document.positionAt(document.getText().indexOf('Pill') + 2); const pillCompletions = await vscode.commands.executeCommand('vscode.executeCompletionItemProvider', homeUri, pillPosition, '.'); assert.ok(pillCompletions.items.some((item) => item.label === 'Pill'), 'same-package component completion missing'); const pillDefinitions = await vscode.commands.executeCommand('vscode.executeDefinitionProvider', homeUri, pillPosition); assert.ok(pillDefinitions.some((item) => item.uri.toString() === pillUri.toString()), 'same-package component definition missing'); const badgePosition = document.positionAt(document.getText().indexOf('cards.Badge') + 'cards.Ba'.length); const badgeCompletions = await vscode.commands.executeCommand('vscode.executeCompletionItemProvider', homeUri, badgePosition, '.'); assert.ok(badgeCompletions.items.some((item) => item.label === 'cards.Badge'), 'imported component completion missing'); const badgeDefinitions = await vscode.commands.executeCommand('vscode.executeDefinitionProvider', homeUri, badgePosition); assert.ok(badgeDefinitions.some((item) => item.uri.toString() === badgeUri.toString()), 'imported component definition missing'); const hovers = await vscode.commands.executeCommand('vscode.executeHoverProvider', homeUri, badgePosition); assert.ok(hovers.length > 0, 'component hover missing'); const symbols = await vscode.commands.executeCommand('vscode.executeDocumentSymbolProvider', homeUri); assert.ok(symbols.some((item) => item.name === 'Home'), 'document component symbol missing'); const duplicate = Buffer.from('\n

\n'); await vscode.workspace.fs.writeFile(duplicateUri, duplicate); const duplicateDocument = await vscode.workspace.openTextDocument(duplicateUri); await vscode.window.showTextDocument(duplicateDocument); await waitFor(() => vscode.languages.getDiagnostics(duplicateUri).some((item) => item.code === 'HIM1500'), 15000); await waitFor(() => vscode.languages.getDiagnostics(homeUri).some((item) => item.code === 'HIM1500'), 15000); await vscode.commands.executeCommand('workbench.action.closeActiveEditor'); await vscode.workspace.fs.delete(duplicateUri); await vscode.commands.executeCommand('sandwichHime.restartLanguageServer'); await waitFor(() => !vscode.languages.getDiagnostics(homeUri).some((item) => item.code === 'HIM1500'), 15000); const editor = await vscode.window.showTextDocument(document); const end = document.positionAt(document.getText().length); await editor.edit((builder) => builder.insert(end, '\n
')); await waitFor(() => vscode.languages.getDiagnostics(homeUri).some((item) => item.code === 'HIM1311'), 5000); assert.equal(fs.existsSync(`${homeUri.fsPath}.go`), false, 'LSP wrote generated output'); const brokenStart = document.positionAt(document.getText().lastIndexOf('\n
')); await editor.edit((builder) => builder.delete(new vscode.Range(brokenStart, document.positionAt(document.getText().length)))); await waitFor(() => !vscode.languages.getDiagnostics(homeUri).some((item) => item.code === 'HIM1311'), 5000); await vscode.workspace.fs.delete(badgeUri); await vscode.commands.executeCommand('sandwichHime.restartLanguageServer'); await waitFor(async () => { const result = await vscode.commands.executeCommand('vscode.executeCompletionItemProvider', homeUri, badgePosition, '.'); return !result.items.some((item) => item.label === 'cards.Badge'); }, 5000); } async function waitFor(predicate, timeout) { const deadline = Date.now() + timeout; while (Date.now() < deadline) { if (await predicate()) return; await new Promise((resolve) => setTimeout(resolve, 100)); } throw new Error('timed out waiting for integration condition'); } module.exports = {run};