81 lines
5.1 KiB
JavaScript
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};
|