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

import * as assert from 'assert';
import { shouldShowGoWelcomePage } from '../../src/goMain';

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);
		});
	});
});
