Path: blob/main/src/vs/platform/extensions/test/common/extensionValidator.test.ts
5251 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/4import assert from 'assert';5import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';6import { IExtensionManifest } from '../../common/extensions.js';7import { areApiProposalsCompatible, INormalizedVersion, IParsedVersion, isValidExtensionVersion, isValidVersion, isValidVersionStr, normalizeVersion, parseVersion } from '../../common/extensionValidator.js';89suite('Extension Version Validator', () => {1011ensureNoDisposablesAreLeakedInTestSuite();1213const productVersion = '2021-05-11T21:54:30.577Z';1415test('isValidVersionStr', () => {16assert.strictEqual(isValidVersionStr('0.10.0-dev'), true);17assert.strictEqual(isValidVersionStr('0.10.0'), true);18assert.strictEqual(isValidVersionStr('0.10.1'), true);19assert.strictEqual(isValidVersionStr('0.10.100'), true);20assert.strictEqual(isValidVersionStr('0.11.0'), true);2122assert.strictEqual(isValidVersionStr('x.x.x'), true);23assert.strictEqual(isValidVersionStr('0.x.x'), true);24assert.strictEqual(isValidVersionStr('0.10.0'), true);25assert.strictEqual(isValidVersionStr('0.10.x'), true);26assert.strictEqual(isValidVersionStr('^0.10.0'), true);27assert.strictEqual(isValidVersionStr('*'), true);2829assert.strictEqual(isValidVersionStr('0.x.x.x'), false);30assert.strictEqual(isValidVersionStr('0.10'), false);31assert.strictEqual(isValidVersionStr('0.10.'), false);32});3334test('parseVersion', () => {35function assertParseVersion(version: string, hasCaret: boolean, hasGreaterEquals: boolean, majorBase: number, majorMustEqual: boolean, minorBase: number, minorMustEqual: boolean, patchBase: number, patchMustEqual: boolean, preRelease: string | null): void {36const actual = parseVersion(version);37const expected: IParsedVersion = { hasCaret, hasGreaterEquals, majorBase, majorMustEqual, minorBase, minorMustEqual, patchBase, patchMustEqual, preRelease };3839assert.deepStrictEqual(actual, expected, 'parseVersion for ' + version);40}4142assertParseVersion('0.10.0-dev', false, false, 0, true, 10, true, 0, true, '-dev');43assertParseVersion('0.10.0', false, false, 0, true, 10, true, 0, true, null);44assertParseVersion('0.10.1', false, false, 0, true, 10, true, 1, true, null);45assertParseVersion('0.10.100', false, false, 0, true, 10, true, 100, true, null);46assertParseVersion('0.11.0', false, false, 0, true, 11, true, 0, true, null);4748assertParseVersion('x.x.x', false, false, 0, false, 0, false, 0, false, null);49assertParseVersion('0.x.x', false, false, 0, true, 0, false, 0, false, null);50assertParseVersion('0.10.x', false, false, 0, true, 10, true, 0, false, null);51assertParseVersion('^0.10.0', true, false, 0, true, 10, true, 0, true, null);52assertParseVersion('^0.10.2', true, false, 0, true, 10, true, 2, true, null);53assertParseVersion('^1.10.2', true, false, 1, true, 10, true, 2, true, null);54assertParseVersion('*', false, false, 0, false, 0, false, 0, false, null);5556assertParseVersion('>=0.0.1', false, true, 0, true, 0, true, 1, true, null);57assertParseVersion('>=2.4.3', false, true, 2, true, 4, true, 3, true, null);5859// Parse versions with HHMM date format60assertParseVersion('1.10.0-202105111430', false, false, 1, true, 10, true, 0, true, '-202105111430');61assertParseVersion('^1.10.0-202105112359', true, false, 1, true, 10, true, 0, true, '-202105112359');62});6364test('normalizeVersion', () => {65function assertNormalizeVersion(version: string, majorBase: number, majorMustEqual: boolean, minorBase: number, minorMustEqual: boolean, patchBase: number, patchMustEqual: boolean, isMinimum: boolean, notBefore = 0): void {66const actual = normalizeVersion(parseVersion(version));67const expected: INormalizedVersion = { majorBase, majorMustEqual, minorBase, minorMustEqual, patchBase, patchMustEqual, isMinimum, notBefore };68assert.deepStrictEqual(actual, expected, 'parseVersion for ' + version);69}7071assertNormalizeVersion('0.10.0-dev', 0, true, 10, true, 0, true, false, 0);72assertNormalizeVersion('0.10.0-222222222', 0, true, 10, true, 0, true, false, 0);73assertNormalizeVersion('0.10.0-20210511', 0, true, 10, true, 0, true, false, new Date('2021-05-11T00:00:00Z').getTime());7475// Normalize versions with HHMM date format76assertNormalizeVersion('1.10.0-202105111430', 1, true, 10, true, 0, true, false, new Date('2021-05-11T14:30:00Z').getTime());77assertNormalizeVersion('1.10.0-202105112359', 1, true, 10, true, 0, true, false, new Date('2021-05-11T23:59:00Z').getTime());78assertNormalizeVersion('1.10.0-202105110000', 1, true, 10, true, 0, true, false, new Date('2021-05-11T00:00:00Z').getTime());7980assertNormalizeVersion('0.10.0', 0, true, 10, true, 0, true, false);81assertNormalizeVersion('0.10.1', 0, true, 10, true, 1, true, false);82assertNormalizeVersion('0.10.100', 0, true, 10, true, 100, true, false);83assertNormalizeVersion('0.11.0', 0, true, 11, true, 0, true, false);8485assertNormalizeVersion('x.x.x', 0, false, 0, false, 0, false, false);86assertNormalizeVersion('0.x.x', 0, true, 0, false, 0, false, false);87assertNormalizeVersion('0.10.x', 0, true, 10, true, 0, false, false);88assertNormalizeVersion('^0.10.0', 0, true, 10, true, 0, false, false);89assertNormalizeVersion('^0.10.2', 0, true, 10, true, 2, false, false);90assertNormalizeVersion('^1.10.2', 1, true, 10, false, 2, false, false);91assertNormalizeVersion('*', 0, false, 0, false, 0, false, false);9293assertNormalizeVersion('>=0.0.1', 0, true, 0, true, 1, true, true);94assertNormalizeVersion('>=2.4.3', 2, true, 4, true, 3, true, true);95assertNormalizeVersion('>=2.4.3', 2, true, 4, true, 3, true, true);96});9798test('isValidVersion', () => {99function testIsValidVersion(version: string, desiredVersion: string, expectedResult: boolean): void {100const actual = isValidVersion(version, productVersion, desiredVersion);101assert.strictEqual(actual, expectedResult, 'extension - vscode: ' + version + ', desiredVersion: ' + desiredVersion + ' should be ' + expectedResult);102}103104testIsValidVersion('0.10.0-dev', 'x.x.x', true);105testIsValidVersion('0.10.0-dev', '0.x.x', true);106testIsValidVersion('0.10.0-dev', '0.10.0', true);107testIsValidVersion('0.10.0-dev', '0.10.2', false);108testIsValidVersion('0.10.0-dev', '^0.10.2', false);109testIsValidVersion('0.10.0-dev', '0.10.x', true);110testIsValidVersion('0.10.0-dev', '^0.10.0', true);111testIsValidVersion('0.10.0-dev', '*', true);112testIsValidVersion('0.10.0-dev', '>=0.0.1', true);113testIsValidVersion('0.10.0-dev', '>=0.0.10', true);114testIsValidVersion('0.10.0-dev', '>=0.10.0', true);115testIsValidVersion('0.10.0-dev', '>=0.10.1', false);116testIsValidVersion('0.10.0-dev', '>=1.0.0', false);117118testIsValidVersion('0.10.0', 'x.x.x', true);119testIsValidVersion('0.10.0', '0.x.x', true);120testIsValidVersion('0.10.0', '0.10.0', true);121testIsValidVersion('0.10.0', '0.10.2', false);122testIsValidVersion('0.10.0', '^0.10.2', false);123testIsValidVersion('0.10.0', '0.10.x', true);124testIsValidVersion('0.10.0', '^0.10.0', true);125testIsValidVersion('0.10.0', '*', true);126127testIsValidVersion('0.10.1', 'x.x.x', true);128testIsValidVersion('0.10.1', '0.x.x', true);129testIsValidVersion('0.10.1', '0.10.0', false);130testIsValidVersion('0.10.1', '0.10.2', false);131testIsValidVersion('0.10.1', '^0.10.2', false);132testIsValidVersion('0.10.1', '0.10.x', true);133testIsValidVersion('0.10.1', '^0.10.0', true);134testIsValidVersion('0.10.1', '*', true);135136testIsValidVersion('0.10.100', 'x.x.x', true);137testIsValidVersion('0.10.100', '0.x.x', true);138testIsValidVersion('0.10.100', '0.10.0', false);139testIsValidVersion('0.10.100', '0.10.2', false);140testIsValidVersion('0.10.100', '^0.10.2', true);141testIsValidVersion('0.10.100', '0.10.x', true);142testIsValidVersion('0.10.100', '^0.10.0', true);143testIsValidVersion('0.10.100', '*', true);144145testIsValidVersion('0.11.0', 'x.x.x', true);146testIsValidVersion('0.11.0', '0.x.x', true);147testIsValidVersion('0.11.0', '0.10.0', false);148testIsValidVersion('0.11.0', '0.10.2', false);149testIsValidVersion('0.11.0', '^0.10.2', false);150testIsValidVersion('0.11.0', '0.10.x', false);151testIsValidVersion('0.11.0', '^0.10.0', false);152testIsValidVersion('0.11.0', '*', true);153154// Anything < 1.0.0 is compatible155156testIsValidVersion('1.0.0', 'x.x.x', true);157testIsValidVersion('1.0.0', '0.x.x', true);158testIsValidVersion('1.0.0', '0.10.0', false);159testIsValidVersion('1.0.0', '0.10.2', false);160testIsValidVersion('1.0.0', '^0.10.2', true);161testIsValidVersion('1.0.0', '0.10.x', true);162testIsValidVersion('1.0.0', '^0.10.0', true);163testIsValidVersion('1.0.0', '1.0.0', true);164testIsValidVersion('1.0.0', '^1.0.0', true);165testIsValidVersion('1.0.0', '^2.0.0', false);166testIsValidVersion('1.0.0', '*', true);167testIsValidVersion('1.0.0', '>=0.0.1', true);168testIsValidVersion('1.0.0', '>=0.0.10', true);169testIsValidVersion('1.0.0', '>=0.10.0', true);170testIsValidVersion('1.0.0', '>=0.10.1', true);171testIsValidVersion('1.0.0', '>=1.0.0', true);172testIsValidVersion('1.0.0', '>=1.1.0', false);173testIsValidVersion('1.0.0', '>=1.0.1', false);174testIsValidVersion('1.0.0', '>=2.0.0', false);175176testIsValidVersion('1.0.100', 'x.x.x', true);177testIsValidVersion('1.0.100', '0.x.x', true);178testIsValidVersion('1.0.100', '0.10.0', false);179testIsValidVersion('1.0.100', '0.10.2', false);180testIsValidVersion('1.0.100', '^0.10.2', true);181testIsValidVersion('1.0.100', '0.10.x', true);182testIsValidVersion('1.0.100', '^0.10.0', true);183testIsValidVersion('1.0.100', '1.0.0', false);184testIsValidVersion('1.0.100', '^1.0.0', true);185testIsValidVersion('1.0.100', '^1.0.1', true);186testIsValidVersion('1.0.100', '^2.0.0', false);187testIsValidVersion('1.0.100', '*', true);188189testIsValidVersion('1.100.0', 'x.x.x', true);190testIsValidVersion('1.100.0', '0.x.x', true);191testIsValidVersion('1.100.0', '0.10.0', false);192testIsValidVersion('1.100.0', '0.10.2', false);193testIsValidVersion('1.100.0', '^0.10.2', true);194testIsValidVersion('1.100.0', '0.10.x', true);195testIsValidVersion('1.100.0', '^0.10.0', true);196testIsValidVersion('1.100.0', '1.0.0', false);197testIsValidVersion('1.100.0', '^1.0.0', true);198testIsValidVersion('1.100.0', '^1.1.0', true);199testIsValidVersion('1.100.0', '^1.100.0', true);200testIsValidVersion('1.100.0', '^2.0.0', false);201testIsValidVersion('1.100.0', '*', true);202testIsValidVersion('1.100.0', '>=1.99.0', true);203testIsValidVersion('1.100.0', '>=1.100.0', true);204testIsValidVersion('1.100.0', '>=1.101.0', false);205206testIsValidVersion('2.0.0', 'x.x.x', true);207testIsValidVersion('2.0.0', '0.x.x', false);208testIsValidVersion('2.0.0', '0.10.0', false);209testIsValidVersion('2.0.0', '0.10.2', false);210testIsValidVersion('2.0.0', '^0.10.2', false);211testIsValidVersion('2.0.0', '0.10.x', false);212testIsValidVersion('2.0.0', '^0.10.0', false);213testIsValidVersion('2.0.0', '1.0.0', false);214testIsValidVersion('2.0.0', '^1.0.0', false);215testIsValidVersion('2.0.0', '^1.1.0', false);216testIsValidVersion('2.0.0', '^1.100.0', false);217testIsValidVersion('2.0.0', '^2.0.0', true);218testIsValidVersion('2.0.0', '*', true);219});220221test('isValidExtensionVersion', () => {222223function testExtensionVersion(version: string, desiredVersion: string, isBuiltin: boolean, hasMain: boolean, expectedResult: boolean): void {224const manifest: IExtensionManifest = {225name: 'test',226publisher: 'test',227version: '0.0.0',228engines: {229vscode: desiredVersion230},231main: hasMain ? 'something' : undefined232};233const reasons: string[] = [];234const actual = isValidExtensionVersion(version, productVersion, manifest, isBuiltin, reasons);235236assert.strictEqual(actual, expectedResult, 'version: ' + version + ', desiredVersion: ' + desiredVersion + ', desc: ' + JSON.stringify(manifest) + ', reasons: ' + JSON.stringify(reasons));237}238239function testIsInvalidExtensionVersion(version: string, desiredVersion: string, isBuiltin: boolean, hasMain: boolean): void {240testExtensionVersion(version, desiredVersion, isBuiltin, hasMain, false);241}242243function testIsValidExtensionVersion(version: string, desiredVersion: string, isBuiltin: boolean, hasMain: boolean): void {244testExtensionVersion(version, desiredVersion, isBuiltin, hasMain, true);245}246247function testIsValidVersion(version: string, desiredVersion: string, expectedResult: boolean): void {248testExtensionVersion(version, desiredVersion, false, true, expectedResult);249}250251// builtin are allowed to use * or x.x.x252testIsValidExtensionVersion('0.10.0-dev', '*', true, true);253testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', true, true);254testIsValidExtensionVersion('0.10.0-dev', '0.x.x', true, true);255testIsValidExtensionVersion('0.10.0-dev', '0.10.x', true, true);256testIsValidExtensionVersion('1.10.0-dev', '1.x.x', true, true);257testIsValidExtensionVersion('1.10.0-dev', '1.10.x', true, true);258testIsValidExtensionVersion('0.10.0-dev', '*', true, false);259testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', true, false);260testIsValidExtensionVersion('0.10.0-dev', '0.x.x', true, false);261testIsValidExtensionVersion('0.10.0-dev', '0.10.x', true, false);262testIsValidExtensionVersion('1.10.0-dev', '1.x.x', true, false);263testIsValidExtensionVersion('1.10.0-dev', '1.10.x', true, false);264265// normal extensions are allowed to use * or x.x.x only if they have no main266testIsInvalidExtensionVersion('0.10.0-dev', '*', false, true);267testIsInvalidExtensionVersion('0.10.0-dev', 'x.x.x', false, true);268testIsInvalidExtensionVersion('0.10.0-dev', '0.x.x', false, true);269testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, true);270testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, true);271testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, true);272testIsValidExtensionVersion('0.10.0-dev', '*', false, false);273testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', false, false);274testIsValidExtensionVersion('0.10.0-dev', '0.x.x', false, false);275testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, false);276testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, false);277testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, false);278279// extensions without "main" get no version check280testIsValidExtensionVersion('0.10.0-dev', '>=0.9.1-pre.1', false, false);281testIsValidExtensionVersion('0.10.0-dev', '*', false, false);282testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', false, false);283testIsValidExtensionVersion('0.10.0-dev', '0.x.x', false, false);284testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, false);285testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, false);286testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, false);287testIsValidExtensionVersion('0.10.0-dev', '*', false, false);288testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', false, false);289testIsValidExtensionVersion('0.10.0-dev', '0.x.x', false, false);290testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, false);291testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, false);292testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, false);293294// normal extensions with code295testIsValidVersion('0.10.0-dev', 'x.x.x', false); // fails due to lack of specificity296testIsValidVersion('0.10.0-dev', '0.x.x', false); // fails due to lack of specificity297testIsValidVersion('0.10.0-dev', '0.10.0', true);298testIsValidVersion('0.10.0-dev', '0.10.2', false);299testIsValidVersion('0.10.0-dev', '^0.10.2', false);300testIsValidVersion('0.10.0-dev', '0.10.x', true);301testIsValidVersion('0.10.0-dev', '^0.10.0', true);302testIsValidVersion('0.10.0-dev', '*', false); // fails due to lack of specificity303304testIsValidVersion('0.10.0', 'x.x.x', false); // fails due to lack of specificity305testIsValidVersion('0.10.0', '0.x.x', false); // fails due to lack of specificity306testIsValidVersion('0.10.0', '0.10.0', true);307testIsValidVersion('0.10.0', '0.10.2', false);308testIsValidVersion('0.10.0', '^0.10.2', false);309testIsValidVersion('0.10.0', '0.10.x', true);310testIsValidVersion('0.10.0', '^0.10.0', true);311testIsValidVersion('0.10.0', '*', false); // fails due to lack of specificity312313testIsValidVersion('0.10.1', 'x.x.x', false); // fails due to lack of specificity314testIsValidVersion('0.10.1', '0.x.x', false); // fails due to lack of specificity315testIsValidVersion('0.10.1', '0.10.0', false);316testIsValidVersion('0.10.1', '0.10.2', false);317testIsValidVersion('0.10.1', '^0.10.2', false);318testIsValidVersion('0.10.1', '0.10.x', true);319testIsValidVersion('0.10.1', '^0.10.0', true);320testIsValidVersion('0.10.1', '*', false); // fails due to lack of specificity321322testIsValidVersion('0.10.100', 'x.x.x', false); // fails due to lack of specificity323testIsValidVersion('0.10.100', '0.x.x', false); // fails due to lack of specificity324testIsValidVersion('0.10.100', '0.10.0', false);325testIsValidVersion('0.10.100', '0.10.2', false);326testIsValidVersion('0.10.100', '^0.10.2', true);327testIsValidVersion('0.10.100', '0.10.x', true);328testIsValidVersion('0.10.100', '^0.10.0', true);329testIsValidVersion('0.10.100', '*', false); // fails due to lack of specificity330331testIsValidVersion('0.11.0', 'x.x.x', false); // fails due to lack of specificity332testIsValidVersion('0.11.0', '0.x.x', false); // fails due to lack of specificity333testIsValidVersion('0.11.0', '0.10.0', false);334testIsValidVersion('0.11.0', '0.10.2', false);335testIsValidVersion('0.11.0', '^0.10.2', false);336testIsValidVersion('0.11.0', '0.10.x', false);337testIsValidVersion('0.11.0', '^0.10.0', false);338testIsValidVersion('0.11.0', '*', false); // fails due to lack of specificity339340testIsValidVersion('1.0.0', 'x.x.x', false); // fails due to lack of specificity341testIsValidVersion('1.0.0', '0.x.x', false); // fails due to lack of specificity342testIsValidVersion('1.0.0', '0.10.0', false);343testIsValidVersion('1.0.0', '0.10.2', false);344testIsValidVersion('1.0.0', '^0.10.2', true);345testIsValidVersion('1.0.0', '0.10.x', true);346testIsValidVersion('1.0.0', '^0.10.0', true);347testIsValidVersion('1.0.0', '*', false); // fails due to lack of specificity348349testIsValidVersion('1.10.0', 'x.x.x', false); // fails due to lack of specificity350testIsValidVersion('1.10.0', '1.x.x', true);351testIsValidVersion('1.10.0', '1.10.0', true);352testIsValidVersion('1.10.0', '1.10.2', false);353testIsValidVersion('1.10.0', '^1.10.2', false);354testIsValidVersion('1.10.0', '1.10.x', true);355testIsValidVersion('1.10.0', '^1.10.0', true);356testIsValidVersion('1.10.0', '*', false); // fails due to lack of specificity357358359// Anything < 1.0.0 is compatible360361testIsValidVersion('1.0.0', 'x.x.x', false); // fails due to lack of specificity362testIsValidVersion('1.0.0', '0.x.x', false); // fails due to lack of specificity363testIsValidVersion('1.0.0', '0.10.0', false);364testIsValidVersion('1.0.0', '0.10.2', false);365testIsValidVersion('1.0.0', '^0.10.2', true);366testIsValidVersion('1.0.0', '0.10.x', true);367testIsValidVersion('1.0.0', '^0.10.0', true);368testIsValidVersion('1.0.0', '1.0.0', true);369testIsValidVersion('1.0.0', '^1.0.0', true);370testIsValidVersion('1.0.0', '^2.0.0', false);371testIsValidVersion('1.0.0', '*', false); // fails due to lack of specificity372373testIsValidVersion('1.0.100', 'x.x.x', false); // fails due to lack of specificity374testIsValidVersion('1.0.100', '0.x.x', false); // fails due to lack of specificity375testIsValidVersion('1.0.100', '0.10.0', false);376testIsValidVersion('1.0.100', '0.10.2', false);377testIsValidVersion('1.0.100', '^0.10.2', true);378testIsValidVersion('1.0.100', '0.10.x', true);379testIsValidVersion('1.0.100', '^0.10.0', true);380testIsValidVersion('1.0.100', '1.0.0', false);381testIsValidVersion('1.0.100', '^1.0.0', true);382testIsValidVersion('1.0.100', '^1.0.1', true);383testIsValidVersion('1.0.100', '^2.0.0', false);384testIsValidVersion('1.0.100', '*', false); // fails due to lack of specificity385386testIsValidVersion('1.100.0', 'x.x.x', false); // fails due to lack of specificity387testIsValidVersion('1.100.0', '0.x.x', false); // fails due to lack of specificity388testIsValidVersion('1.100.0', '0.10.0', false);389testIsValidVersion('1.100.0', '0.10.2', false);390testIsValidVersion('1.100.0', '^0.10.2', true);391testIsValidVersion('1.100.0', '0.10.x', true);392testIsValidVersion('1.100.0', '^0.10.0', true);393testIsValidVersion('1.100.0', '1.0.0', false);394testIsValidVersion('1.100.0', '^1.0.0', true);395testIsValidVersion('1.100.0', '^1.1.0', true);396testIsValidVersion('1.100.0', '^1.100.0', true);397testIsValidVersion('1.100.0', '^2.0.0', false);398testIsValidVersion('1.100.0', '*', false); // fails due to lack of specificity399400testIsValidVersion('2.0.0', 'x.x.x', false); // fails due to lack of specificity401testIsValidVersion('2.0.0', '0.x.x', false); // fails due to lack of specificity402testIsValidVersion('2.0.0', '0.10.0', false);403testIsValidVersion('2.0.0', '0.10.2', false);404testIsValidVersion('2.0.0', '^0.10.2', false);405testIsValidVersion('2.0.0', '0.10.x', false);406testIsValidVersion('2.0.0', '^0.10.0', false);407testIsValidVersion('2.0.0', '1.0.0', false);408testIsValidVersion('2.0.0', '^1.0.0', false);409testIsValidVersion('2.0.0', '^1.1.0', false);410testIsValidVersion('2.0.0', '^1.100.0', false);411testIsValidVersion('2.0.0', '^2.0.0', true);412testIsValidVersion('2.0.0', '*', false); // fails due to lack of specificity413414// date tags415testIsValidVersion('1.10.0', '^1.10.0-20210511', true); // current date416testIsValidVersion('1.10.0', '^1.10.0-20210510', true); // before date417testIsValidVersion('1.10.0', '^1.10.0-20210512', false); // future date418testIsValidVersion('1.10.1', '^1.10.0-20200101', true); // before date, but ahead version419testIsValidVersion('1.11.0', '^1.10.0-20200101', true);420421// Test with HHMM date format422testIsValidVersion('1.10.0', '^1.10.0-202105111400', true); // product at beginning of day, required time at 14:00423testIsValidVersion('1.10.0', '^1.10.0-202105112359', false); // product at beginning of day, required time at 23:59424testIsValidVersion('1.10.0', '^1.10.0-202105110000', true); // product at beginning of day, required time at 00:00425});426427test('isValidExtensionVersion checks browser only extensions', () => {428const manifest = {429name: 'test',430publisher: 'test',431version: '0.0.0',432engines: {433vscode: '^1.45.0'434},435browser: 'something'436};437assert.strictEqual(isValidExtensionVersion('1.44.0', undefined, manifest, false, []), false);438});439440test('areApiProposalsCompatible', () => {441assert.strictEqual(areApiProposalsCompatible([]), true);442assert.strictEqual(areApiProposalsCompatible([], ['hello']), true);443assert.strictEqual(areApiProposalsCompatible([], {}), true);444assert.strictEqual(areApiProposalsCompatible(['proposal1'], {}), true);445assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal1': { proposal: '' } }), true);446assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal1': { proposal: '', version: 1 } }), true);447assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '', version: 1 } }), true);448assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal2': { proposal: '' } }), true);449assert.strictEqual(areApiProposalsCompatible(['proposal1', 'proposal2'], {}), true);450assert.strictEqual(areApiProposalsCompatible(['proposal1', 'proposal2'], { 'proposal1': { proposal: '' } }), true);451452assert.strictEqual(areApiProposalsCompatible(['proposal2@1'], { 'proposal1': { proposal: '' } }), false);453assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '', version: 2 } }), false);454assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '' } }), false);455});456457});458459460