/*---------------------------------------------------------
 * Copyright 2020 The Go Authors. All rights reserved.
 * Licensed under the MIT License. See LICENSE in the project root for license information.
 *--------------------------------------------------------*/

import vscode = require('vscode');
import assert from 'assert';
import { shouldShowGoWelcomePage } from '../../src/welcome';
import { extensionId } from '../../src/const';
import { WelcomePanel } from '../../src/welcome';

suite('WelcomePanel Tests', () => {
	// 0:showVersions, 1:newVersion, 2:oldVersion, 3:expected
	type testCase = [string[], string, string, boolean];
	const testCases: testCase[] = [
		[[], '0.22.0', '0.0.0', false],
		[[], '0.22.0', '0.21.0', false],
		[[], '0.22.0', '0.22.0-rc.1', false],
		[[], '0.22.0', '0.22.0', false],
		[[], '0.22.0', '0.23.0', false],

		[['0.22.0'], '0.22.0', '0.0.0', true],
		[['0.22.0'], '0.22.0', '0.21.0-rc.1', true],
		[['0.22.0'], '0.22.0', '0.21.0', true],
		[['0.22.0'], '0.22.0', '0.22.0-rc.1', true],
		[['0.22.0'], '0.22.0', '0.22.0', false],
		[['0.22.0'], '0.22.0', '0.22.1', false],
		[['0.22.0'], '0.22.0', '0.23.0', false],
		[['0.22.0'], '0.22.0', '1.0.0', false],
		[['0.22.0'], '0.22.0', '2021.1.100', false],

		[['0.22.0'], '0.22.0-rc.2', '0.0.0', true],
		[['0.22.0'], '0.22.0-rc.2', '0.21.0-rc.1', true],
		[['0.22.0'], '0.22.0-rc.2', '0.21.0', true],
		[['0.22.0'], '0.22.0-rc.2', '0.22.0-rc.1', true],
		[['0.22.0'], '0.22.0-rc.2', '0.22.0-rc.2', false],
		[['0.22.0'], '0.22.0-rc.2', '0.22.0-rc.3', true],
		[['0.22.0'], '0.22.0-rc.2', '0.22.0', true],
		[['0.22.0'], '0.22.0-rc.2', '0.22.1', false],
		[['0.22.0'], '0.22.0-rc.2', '0.23.0', false],
		[['0.22.0'], '0.22.0-rc.2', '1.0.0', false],
		[['0.22.0'], '0.22.0-rc.2', '2021.1.100', false],

		[['0.22.0'], '0.22.1', '0.0.0', false],
		[['0.22.0'], '0.22.1', '0.21.0-rc.1', false],
		[['0.22.0'], '0.22.1', '0.21.0', false],
		[['0.22.0'], '0.22.1', '0.22.0-rc.1', false],
		[['0.22.0'], '0.22.1', '0.22.0', false],
		[['0.22.0'], '0.22.1', '0.23.0', false],
		[['0.22.0'], '0.22.1', '1.0.0', false],
		[['0.22.0'], '0.22.1', '2021.1.100', false]
	];
	testCases.forEach((c: testCase) => {
		const [showVersions, newVersion, oldVersion, expected] = c;

		test(`shouldShowGoWelcomePage(${JSON.stringify(showVersions)}, ${newVersion}, ${oldVersion})`, () => {
			assert.strictEqual(shouldShowGoWelcomePage(showVersions, newVersion, oldVersion), expected);
		});
	});
});

suite('joinPath Tests', () => {
	test('WelcomePanel dataroot is set as expected', () => {
		const uri = vscode.extensions.getExtension(extensionId)?.extensionUri;
		assert(uri);
		WelcomePanel.createOrShow({ extensionUri: uri })();
		const got = WelcomePanel.currentPanel?.dataroot;
		const want = vscode.Uri.joinPath(uri, 'media');
		assert.strictEqual(got?.toString(), want.toString());
	});
});
