0.3.0: .archify files are YAML and open straight into the diagram
- .archify content is YAML (JSON still accepted); converted to JSON for the renderer - Archify Diagram custom editor is the default for *.archify; Show Source opens the YAML beside it - YAML syntax errors and validation problems mapped to YAML lines - yamlValidation for schema completion with redhat.vscode-yaml - scripts/to-yaml.mjs converts existing .archify files
This commit is contained in:
+32
-25
@@ -49,36 +49,31 @@ export async function run(): Promise<void> {
|
||||
await waitFor('activation', () => extension.isActive);
|
||||
});
|
||||
|
||||
await check('.archify files open as JSON with the preview available', async () => {
|
||||
const doc = await vscode.workspace.openTextDocument(workspaceFile('web-platform.archify'));
|
||||
assert.equal(doc.languageId, 'json');
|
||||
await vscode.window.showTextDocument(doc);
|
||||
await vscode.commands.executeCommand('archify.showPreviewToSide');
|
||||
const tabs = await waitFor('.archify preview tab', () => {
|
||||
const found = webviewTabs('archify.preview').filter((tab) => /web-platform\.archify/.test(tab.label));
|
||||
return found.length > 0 && found;
|
||||
});
|
||||
assert.equal(tabs.length, 1);
|
||||
await check('clicking a .archify file opens the diagram, not the text', async () => {
|
||||
const uri = workspaceFile('web-platform.archify');
|
||||
await vscode.commands.executeCommand('vscode.open', uri);
|
||||
const tab = await waitFor('diagram editor tab', () =>
|
||||
vscode.window.tabGroups.all
|
||||
.flatMap((group) => group.tabs)
|
||||
.find((t) => t.input instanceof vscode.TabInputCustom && t.input.viewType === 'archify.diagram' && t.input.uri.toString() === uri.toString()),
|
||||
);
|
||||
assert.ok(tab.isActive, 'the diagram tab is active');
|
||||
assert.equal(vscode.window.activeTextEditor?.document.uri.toString() === uri.toString(), false, 'no text editor was opened for it');
|
||||
});
|
||||
|
||||
await check('.archify completion comes from the schema of its diagram_type', async () => {
|
||||
const doc = await vscode.workspace.openTextDocument(workspaceFile('web-platform.archify'));
|
||||
await vscode.window.showTextDocument(doc);
|
||||
// Complete the value of the first component's "type".
|
||||
const offset = doc.getText().indexOf('"type": "') + '"type": "'.length;
|
||||
const position = doc.positionAt(offset);
|
||||
let labels: string[] = [];
|
||||
for (let attempt = 0; attempt < 50 && !labels.includes('backend'); attempt += 1) {
|
||||
const list = await vscode.commands.executeCommand<vscode.CompletionList>('vscode.executeCompletionItemProvider', doc.uri, position);
|
||||
labels = list.items.map((item) => (typeof item.label === 'string' ? item.label : item.label.label).replace(/"/g, ''));
|
||||
if (!labels.includes('backend')) await new Promise((resolve) => setTimeout(resolve, 300));
|
||||
}
|
||||
assert.ok(labels.includes('backend') && labels.includes('database'), `offered: ${labels.join(', ')}`);
|
||||
await check('.archify files are YAML and Show Source opens the text beside the diagram', async () => {
|
||||
const uri = workspaceFile('web-platform.archify');
|
||||
await vscode.commands.executeCommand('archify.showSource');
|
||||
const editor = await waitFor('source text editor', () =>
|
||||
vscode.window.visibleTextEditors.find((e) => e.document.uri.toString() === uri.toString()),
|
||||
);
|
||||
assert.equal(editor.document.languageId, 'yaml');
|
||||
assert.match(editor.document.getText(), /^schema_version: 1/m);
|
||||
});
|
||||
|
||||
await check('.archify problems are reported against the file', async () => {
|
||||
await check('.archify validation problems are reported against the YAML', async () => {
|
||||
const good = await vscode.workspace.openTextDocument(workspaceFile('cache-miss.archify'));
|
||||
const broken = good.getText().replace('"participants"', '"actors"');
|
||||
const broken = good.getText().replace(/^participants:/m, 'actors:');
|
||||
const target = workspaceFile('broken.archify');
|
||||
await vscode.workspace.fs.writeFile(target, new TextEncoder().encode(broken));
|
||||
const doc = await vscode.workspace.openTextDocument(target);
|
||||
@@ -90,6 +85,18 @@ export async function run(): Promise<void> {
|
||||
assert.ok(diagnostics.some((d) => d.severity === vscode.DiagnosticSeverity.Error));
|
||||
});
|
||||
|
||||
await check('.archify YAML syntax errors are reported at their line', async () => {
|
||||
const target = workspaceFile('syntax.archify');
|
||||
await vscode.workspace.fs.writeFile(target, new TextEncoder().encode('schema_version: 1\ndiagram_type: architecture\nmeta: [unclosed\n'));
|
||||
const doc = await vscode.workspace.openTextDocument(target);
|
||||
await vscode.window.showTextDocument(doc);
|
||||
const diagnostics = await waitFor('yaml syntax diagnostics', () => {
|
||||
const found = vscode.languages.getDiagnostics(doc.uri).filter((d) => d.source === 'archify' && d.message.startsWith('YAML:'));
|
||||
return found.length > 0 && found;
|
||||
});
|
||||
assert.ok(diagnostics[0].range.start.line >= 2, `reported on line ${diagnostics[0].range.start.line + 1}`);
|
||||
});
|
||||
|
||||
await check('opens a live preview beside the source', async () => {
|
||||
await vscode.commands.executeCommand('archify.showPreviewToSide', workspaceFile('production-deployment.architecture.json'));
|
||||
const tabs = await waitFor('preview tab', () => {
|
||||
|
||||
Reference in New Issue
Block a user