blob: db9df46cbc76cc565d1b9d183ac6fa588b309189 [file] [log] [blame]
/*---------------------------------------------------------
* Copyright 2022 The Go Authors. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------*/
import assert from 'assert';
import path from 'path';
import { TreeItem, Uri, window, workspace } from 'vscode';
import { getGoConfig } from '../../src/config';
import { GoExplorerProvider } from '../../src/goExplorer';
import { getRequiredTools } from '../../src/goTools';
import { resolveHomeDir } from '../../src/utils/pathUtils';
import { MockExtensionContext } from '../mocks/MockContext';
suite('GoExplorerProvider', () => {
const fixtureDir = path.join(__dirname, '../../../test/testdata/baseTest');
const ctx = MockExtensionContext.new();
let explorer: GoExplorerProvider;
suiteSetup(async () => {
explorer = GoExplorerProvider.setup(ctx);
const uri = Uri.file(path.join(fixtureDir, 'test.go'));
await workspace.openTextDocument(uri);
await window.showTextDocument(uri);
});
suiteTeardown(() => {
ctx.teardown();
});
// The GoExplorerProvider extends vscode.TreeDataProvider,
// and presents tree view consisting of:
// + env (env variable tree)
// + GOENV
// + GOMOD
// + ....
// + tools (tools info tree)
// + various tools
// + ....
// The ordering of children is deterministric. Env tree comes
// before Tools tree in the current implementation.
//
// Env tree changes depending on the open file.
// Tools tree is the list of tools used for the window and remains static.
test('env tree', async () => {
const [env] = await explorer.getChildren()!; // the first level has two children [env, tool]
assert.strictEqual(env.label, 'env');
assert.strictEqual(env.contextValue, 'go:explorer:envtree');
});
test('env tree items', async () => {
const [env] = await explorer.getChildren()!;
const items = (await explorer.getChildren(env)) as { key: string; value: string }[];
for (const key of ['GOENV', 'GOTOOLCHAIN', 'GOMOD']) {
const item = items.find((item) => item.key === key);
assert(item, `missing ${key}: ${JSON.stringify(items)}`);
if (key === 'GOMOD') {
assert.strictEqual(resolveHomeDir(item.value), path.join(fixtureDir, 'go.mod'));
}
}
});
test('tools tree', async () => {
const [, tools] = await explorer.getChildren()!;
assert(tools.label === 'tools');
assert.strictEqual(tools.contextValue, 'go:explorer:tools');
});
test('tools tree items', async () => {
const allTools = getRequiredTools(getGoConfig());
const expectTools = allTools.map((t) => t.name);
const [, tools] = await explorer.getChildren()!;
const items = (await explorer.getChildren(tools)) as TreeItem[];
for (const idx in items) {
assert(
items[idx].label?.toString().startsWith(expectTools[idx]),
`Unexpected tool tree item with label "${items[idx].label}"`
);
}
});
});