import * as path from 'path';
import { runTests } from 'vscode-test';

async function main() {
	// The folder containing the Extension Manifest package.json
	// Passed to `--extensionDevelopmentPath`
	const extensionDevelopmentPath = path.resolve(__dirname, '../../');

	let failed = false;

	try {
		// The path to the extension test script
		// Passed to --extensionTestsPath
		const extensionTestsPath = path.resolve(__dirname, './integration/index');

		// Download VS Code, unzip it and run the integration test
		await runTests({
			extensionDevelopmentPath,
			extensionTestsPath,
			launchArgs: ['--disable-extensions'],  // disable all other extensions
		});
	} catch (err) {
		console.error('Failed to run integration tests' + err);
		failed = true;
	}

	// Integration tests using gopls.
	try {
		// Currently gopls requires a workspace. Code in test environment does not support
		// dynamically adding folders.
		// tslint:disable-next-line:max-line-length
		// https://github.com/microsoft/vscode/blob/890f62dfd9f3e70198931f788c5c332b3e8b7ad7/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts#L281
		// So, we start the test extension host with a dummy workspace (test/gopls/testdata/src/workspace)
		// and copy necessary files to the workspace.
		const ws = path.resolve(extensionDevelopmentPath, 'test/gopls/testdata/src/workspace');

		await runTests({
			extensionDevelopmentPath,
			extensionTestsPath: path.resolve(__dirname, './gopls/index'),
			launchArgs: [
				'--disable-extensions',  // disable all other extensions
				ws  // dummy workspace to start with
			],
		});
	} catch (err) {
		console.error('Failed to run gopls tests' + err);
		failed = true;
	}

	if (failed) {
		process.exit(1);
	}
}

main();
