/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the Source EULA. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import 'mocha';
import assert = require('assert');
import { SemVerProxy } from '../services/tools/SemVerProxy';

interface Expected {
	[index: string]: string | number | undefined | Error
	major?: number;
	minor?: number;
	patch?: number;
	build?: string;
	raw?: string;
	prerelease?: string;
	version?: string | Error
}

interface TestDefinition {
	testName: string;
	inputVersion: string;
	expected: Expected;

}


class SymVerProxyTest extends SemVerProxy {
	[index: string]: any;
	constructor(version: string | SemVerProxy, loose?: boolean) {
		super(version, loose);
	}
}

const testDefinitions: TestDefinition[] = [
	{
		testName: 'SemVerProxyTest: canonical 3 part version - Pre-existing common SymVers work as before', inputVersion: '1.2.3', expected: {
			major: 1,
			minor: 2,
			patch: 3,
			raw: '1.2.3',
			version: '1.2.3'
		}
	},
	{
		testName: 'SemVerProxyTest: canonical 4 part version', inputVersion: '1.2.3.4', expected: {
			major: 1,
			minor: 2,
			patch: 3,
			build: '4',
			raw: '1.2.3+4',
			version: '1.2.3.4'
		}
	},
	{
		testName: 'SemVerProxyTest: canonical 8 part version', inputVersion: '1.2.3.4.5.6.7.8', expected: {
			major: 1,
			minor: 2,
			patch: 3,
			build: '4,5,6,7,8',
			raw: '1.2.3+4.5.6.7.8',
			version: '1.2.3.4.5.6.7.8'
		}
	},
	{
		testName: 'SemVerProxyTest: canonical pre-rel version', inputVersion: '1.2.3-rc1.22.33.44+55.66.77', expected: {
			major: 1,
			minor: 2,
			patch: 3,
			build: '55,66,77',
			prerelease: 'rc1,22,33,44',
			raw: '1.2.3-rc1.22.33.44+55.66.77',
			version: '1.2.3-rc1.22.33.44+55.66.77'
		}
	}
];

function validate(test: TestDefinition, semVerProxy: SymVerProxyTest) {
	for (const key in test.expected) {
		const expected = test.expected[key];
		if (expected) {
			assert.strictEqual(semVerProxy[key].toString(), expected.toString(), `validation for property ${key} failed.`);
		}
	}
}

describe('SemVeryProxy Tests', function (): void {
	testDefinitions.forEach((semVerTest: TestDefinition) => {
		it(semVerTest.testName, () => {
			const semVerProxy = new SymVerProxyTest(semVerTest.inputVersion);
			validate(semVerTest, semVerProxy);
		});
	});
});
