Files
sandwich-hime-tooling/editors/vscode/test/integration/suite/index.js
T

81 lines
5.1 KiB
JavaScript

// 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 compatible compiler 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('<?sando go\npackage views\nfunc Home(name string)\n?>\n<p><?= name ?></p>\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<div>'));
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<div>'));
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};