Path: blob/main/src/vs/platform/extensions/test/common/extensionValidator.test.ts
3296 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);58});5960test('normalizeVersion', () => {61function assertNormalizeVersion(version: string, majorBase: number, majorMustEqual: boolean, minorBase: number, minorMustEqual: boolean, patchBase: number, patchMustEqual: boolean, isMinimum: boolean, notBefore = 0): void {62const actual = normalizeVersion(parseVersion(version));63const expected: INormalizedVersion = { majorBase, majorMustEqual, minorBase, minorMustEqual, patchBase, patchMustEqual, isMinimum, notBefore };64assert.deepStrictEqual(actual, expected, 'parseVersion for ' + version);65}6667assertNormalizeVersion('0.10.0-dev', 0, true, 10, true, 0, true, false, 0);68assertNormalizeVersion('0.10.0-222222222', 0, true, 10, true, 0, true, false, 0);69assertNormalizeVersion('0.10.0-20210511', 0, true, 10, true, 0, true, false, new Date('2021-05-11T00:00:00Z').getTime());7071assertNormalizeVersion('0.10.0', 0, true, 10, true, 0, true, false);72assertNormalizeVersion('0.10.1', 0, true, 10, true, 1, true, false);73assertNormalizeVersion('0.10.100', 0, true, 10, true, 100, true, false);74assertNormalizeVersion('0.11.0', 0, true, 11, true, 0, true, false);7576assertNormalizeVersion('x.x.x', 0, false, 0, false, 0, false, false);77assertNormalizeVersion('0.x.x', 0, true, 0, false, 0, false, false);78assertNormalizeVersion('0.10.x', 0, true, 10, true, 0, false, false);79assertNormalizeVersion('^0.10.0', 0, true, 10, true, 0, false, false);80assertNormalizeVersion('^0.10.2', 0, true, 10, true, 2, false, false);81assertNormalizeVersion('^1.10.2', 1, true, 10, false, 2, false, false);82assertNormalizeVersion('*', 0, false, 0, false, 0, false, false);8384assertNormalizeVersion('>=0.0.1', 0, true, 0, true, 1, true, true);85assertNormalizeVersion('>=2.4.3', 2, true, 4, true, 3, true, true);86assertNormalizeVersion('>=2.4.3', 2, true, 4, true, 3, true, true);87});8889test('isValidVersion', () => {90function testIsValidVersion(version: string, desiredVersion: string, expectedResult: boolean): void {91const actual = isValidVersion(version, productVersion, desiredVersion);92assert.strictEqual(actual, expectedResult, 'extension - vscode: ' + version + ', desiredVersion: ' + desiredVersion + ' should be ' + expectedResult);93}9495testIsValidVersion('0.10.0-dev', 'x.x.x', true);96testIsValidVersion('0.10.0-dev', '0.x.x', true);97testIsValidVersion('0.10.0-dev', '0.10.0', true);98testIsValidVersion('0.10.0-dev', '0.10.2', false);99testIsValidVersion('0.10.0-dev', '^0.10.2', false);100testIsValidVersion('0.10.0-dev', '0.10.x', true);101testIsValidVersion('0.10.0-dev', '^0.10.0', true);102testIsValidVersion('0.10.0-dev', '*', true);103testIsValidVersion('0.10.0-dev', '>=0.0.1', true);104testIsValidVersion('0.10.0-dev', '>=0.0.10', true);105testIsValidVersion('0.10.0-dev', '>=0.10.0', true);106testIsValidVersion('0.10.0-dev', '>=0.10.1', false);107testIsValidVersion('0.10.0-dev', '>=1.0.0', false);108109testIsValidVersion('0.10.0', 'x.x.x', true);110testIsValidVersion('0.10.0', '0.x.x', true);111testIsValidVersion('0.10.0', '0.10.0', true);112testIsValidVersion('0.10.0', '0.10.2', false);113testIsValidVersion('0.10.0', '^0.10.2', false);114testIsValidVersion('0.10.0', '0.10.x', true);115testIsValidVersion('0.10.0', '^0.10.0', true);116testIsValidVersion('0.10.0', '*', true);117118testIsValidVersion('0.10.1', 'x.x.x', true);119testIsValidVersion('0.10.1', '0.x.x', true);120testIsValidVersion('0.10.1', '0.10.0', false);121testIsValidVersion('0.10.1', '0.10.2', false);122testIsValidVersion('0.10.1', '^0.10.2', false);123testIsValidVersion('0.10.1', '0.10.x', true);124testIsValidVersion('0.10.1', '^0.10.0', true);125testIsValidVersion('0.10.1', '*', true);126127testIsValidVersion('0.10.100', 'x.x.x', true);128testIsValidVersion('0.10.100', '0.x.x', true);129testIsValidVersion('0.10.100', '0.10.0', false);130testIsValidVersion('0.10.100', '0.10.2', false);131testIsValidVersion('0.10.100', '^0.10.2', true);132testIsValidVersion('0.10.100', '0.10.x', true);133testIsValidVersion('0.10.100', '^0.10.0', true);134testIsValidVersion('0.10.100', '*', true);135136testIsValidVersion('0.11.0', 'x.x.x', true);137testIsValidVersion('0.11.0', '0.x.x', true);138testIsValidVersion('0.11.0', '0.10.0', false);139testIsValidVersion('0.11.0', '0.10.2', false);140testIsValidVersion('0.11.0', '^0.10.2', false);141testIsValidVersion('0.11.0', '0.10.x', false);142testIsValidVersion('0.11.0', '^0.10.0', false);143testIsValidVersion('0.11.0', '*', true);144145// Anything < 1.0.0 is compatible146147testIsValidVersion('1.0.0', 'x.x.x', true);148testIsValidVersion('1.0.0', '0.x.x', true);149testIsValidVersion('1.0.0', '0.10.0', false);150testIsValidVersion('1.0.0', '0.10.2', false);151testIsValidVersion('1.0.0', '^0.10.2', true);152testIsValidVersion('1.0.0', '0.10.x', true);153testIsValidVersion('1.0.0', '^0.10.0', true);154testIsValidVersion('1.0.0', '1.0.0', true);155testIsValidVersion('1.0.0', '^1.0.0', true);156testIsValidVersion('1.0.0', '^2.0.0', false);157testIsValidVersion('1.0.0', '*', true);158testIsValidVersion('1.0.0', '>=0.0.1', true);159testIsValidVersion('1.0.0', '>=0.0.10', true);160testIsValidVersion('1.0.0', '>=0.10.0', true);161testIsValidVersion('1.0.0', '>=0.10.1', true);162testIsValidVersion('1.0.0', '>=1.0.0', true);163testIsValidVersion('1.0.0', '>=1.1.0', false);164testIsValidVersion('1.0.0', '>=1.0.1', false);165testIsValidVersion('1.0.0', '>=2.0.0', false);166167testIsValidVersion('1.0.100', 'x.x.x', true);168testIsValidVersion('1.0.100', '0.x.x', true);169testIsValidVersion('1.0.100', '0.10.0', false);170testIsValidVersion('1.0.100', '0.10.2', false);171testIsValidVersion('1.0.100', '^0.10.2', true);172testIsValidVersion('1.0.100', '0.10.x', true);173testIsValidVersion('1.0.100', '^0.10.0', true);174testIsValidVersion('1.0.100', '1.0.0', false);175testIsValidVersion('1.0.100', '^1.0.0', true);176testIsValidVersion('1.0.100', '^1.0.1', true);177testIsValidVersion('1.0.100', '^2.0.0', false);178testIsValidVersion('1.0.100', '*', true);179180testIsValidVersion('1.100.0', 'x.x.x', true);181testIsValidVersion('1.100.0', '0.x.x', true);182testIsValidVersion('1.100.0', '0.10.0', false);183testIsValidVersion('1.100.0', '0.10.2', false);184testIsValidVersion('1.100.0', '^0.10.2', true);185testIsValidVersion('1.100.0', '0.10.x', true);186testIsValidVersion('1.100.0', '^0.10.0', true);187testIsValidVersion('1.100.0', '1.0.0', false);188testIsValidVersion('1.100.0', '^1.0.0', true);189testIsValidVersion('1.100.0', '^1.1.0', true);190testIsValidVersion('1.100.0', '^1.100.0', true);191testIsValidVersion('1.100.0', '^2.0.0', false);192testIsValidVersion('1.100.0', '*', true);193testIsValidVersion('1.100.0', '>=1.99.0', true);194testIsValidVersion('1.100.0', '>=1.100.0', true);195testIsValidVersion('1.100.0', '>=1.101.0', false);196197testIsValidVersion('2.0.0', 'x.x.x', true);198testIsValidVersion('2.0.0', '0.x.x', false);199testIsValidVersion('2.0.0', '0.10.0', false);200testIsValidVersion('2.0.0', '0.10.2', false);201testIsValidVersion('2.0.0', '^0.10.2', false);202testIsValidVersion('2.0.0', '0.10.x', false);203testIsValidVersion('2.0.0', '^0.10.0', false);204testIsValidVersion('2.0.0', '1.0.0', false);205testIsValidVersion('2.0.0', '^1.0.0', false);206testIsValidVersion('2.0.0', '^1.1.0', false);207testIsValidVersion('2.0.0', '^1.100.0', false);208testIsValidVersion('2.0.0', '^2.0.0', true);209testIsValidVersion('2.0.0', '*', true);210});211212test('isValidExtensionVersion', () => {213214function testExtensionVersion(version: string, desiredVersion: string, isBuiltin: boolean, hasMain: boolean, expectedResult: boolean): void {215const manifest: IExtensionManifest = {216name: 'test',217publisher: 'test',218version: '0.0.0',219engines: {220vscode: desiredVersion221},222main: hasMain ? 'something' : undefined223};224const reasons: string[] = [];225const actual = isValidExtensionVersion(version, productVersion, manifest, isBuiltin, reasons);226227assert.strictEqual(actual, expectedResult, 'version: ' + version + ', desiredVersion: ' + desiredVersion + ', desc: ' + JSON.stringify(manifest) + ', reasons: ' + JSON.stringify(reasons));228}229230function testIsInvalidExtensionVersion(version: string, desiredVersion: string, isBuiltin: boolean, hasMain: boolean): void {231testExtensionVersion(version, desiredVersion, isBuiltin, hasMain, false);232}233234function testIsValidExtensionVersion(version: string, desiredVersion: string, isBuiltin: boolean, hasMain: boolean): void {235testExtensionVersion(version, desiredVersion, isBuiltin, hasMain, true);236}237238function testIsValidVersion(version: string, desiredVersion: string, expectedResult: boolean): void {239testExtensionVersion(version, desiredVersion, false, true, expectedResult);240}241242// builtin are allowed to use * or x.x.x243testIsValidExtensionVersion('0.10.0-dev', '*', true, true);244testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', true, true);245testIsValidExtensionVersion('0.10.0-dev', '0.x.x', true, true);246testIsValidExtensionVersion('0.10.0-dev', '0.10.x', true, true);247testIsValidExtensionVersion('1.10.0-dev', '1.x.x', true, true);248testIsValidExtensionVersion('1.10.0-dev', '1.10.x', true, true);249testIsValidExtensionVersion('0.10.0-dev', '*', true, false);250testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', true, false);251testIsValidExtensionVersion('0.10.0-dev', '0.x.x', true, false);252testIsValidExtensionVersion('0.10.0-dev', '0.10.x', true, false);253testIsValidExtensionVersion('1.10.0-dev', '1.x.x', true, false);254testIsValidExtensionVersion('1.10.0-dev', '1.10.x', true, false);255256// normal extensions are allowed to use * or x.x.x only if they have no main257testIsInvalidExtensionVersion('0.10.0-dev', '*', false, true);258testIsInvalidExtensionVersion('0.10.0-dev', 'x.x.x', false, true);259testIsInvalidExtensionVersion('0.10.0-dev', '0.x.x', false, true);260testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, true);261testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, true);262testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, true);263testIsValidExtensionVersion('0.10.0-dev', '*', false, false);264testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', false, false);265testIsValidExtensionVersion('0.10.0-dev', '0.x.x', false, false);266testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, false);267testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, false);268testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, false);269270// extensions without "main" get no version check271testIsValidExtensionVersion('0.10.0-dev', '>=0.9.1-pre.1', false, false);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);278testIsValidExtensionVersion('0.10.0-dev', '*', false, false);279testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', false, false);280testIsValidExtensionVersion('0.10.0-dev', '0.x.x', false, false);281testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, false);282testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, false);283testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, false);284285// normal extensions with code286testIsValidVersion('0.10.0-dev', 'x.x.x', false); // fails due to lack of specificity287testIsValidVersion('0.10.0-dev', '0.x.x', false); // fails due to lack of specificity288testIsValidVersion('0.10.0-dev', '0.10.0', true);289testIsValidVersion('0.10.0-dev', '0.10.2', false);290testIsValidVersion('0.10.0-dev', '^0.10.2', false);291testIsValidVersion('0.10.0-dev', '0.10.x', true);292testIsValidVersion('0.10.0-dev', '^0.10.0', true);293testIsValidVersion('0.10.0-dev', '*', false); // fails due to lack of specificity294295testIsValidVersion('0.10.0', 'x.x.x', false); // fails due to lack of specificity296testIsValidVersion('0.10.0', '0.x.x', false); // fails due to lack of specificity297testIsValidVersion('0.10.0', '0.10.0', true);298testIsValidVersion('0.10.0', '0.10.2', false);299testIsValidVersion('0.10.0', '^0.10.2', false);300testIsValidVersion('0.10.0', '0.10.x', true);301testIsValidVersion('0.10.0', '^0.10.0', true);302testIsValidVersion('0.10.0', '*', false); // fails due to lack of specificity303304testIsValidVersion('0.10.1', 'x.x.x', false); // fails due to lack of specificity305testIsValidVersion('0.10.1', '0.x.x', false); // fails due to lack of specificity306testIsValidVersion('0.10.1', '0.10.0', false);307testIsValidVersion('0.10.1', '0.10.2', false);308testIsValidVersion('0.10.1', '^0.10.2', false);309testIsValidVersion('0.10.1', '0.10.x', true);310testIsValidVersion('0.10.1', '^0.10.0', true);311testIsValidVersion('0.10.1', '*', false); // fails due to lack of specificity312313testIsValidVersion('0.10.100', 'x.x.x', false); // fails due to lack of specificity314testIsValidVersion('0.10.100', '0.x.x', false); // fails due to lack of specificity315testIsValidVersion('0.10.100', '0.10.0', false);316testIsValidVersion('0.10.100', '0.10.2', false);317testIsValidVersion('0.10.100', '^0.10.2', true);318testIsValidVersion('0.10.100', '0.10.x', true);319testIsValidVersion('0.10.100', '^0.10.0', true);320testIsValidVersion('0.10.100', '*', false); // fails due to lack of specificity321322testIsValidVersion('0.11.0', 'x.x.x', false); // fails due to lack of specificity323testIsValidVersion('0.11.0', '0.x.x', false); // fails due to lack of specificity324testIsValidVersion('0.11.0', '0.10.0', false);325testIsValidVersion('0.11.0', '0.10.2', false);326testIsValidVersion('0.11.0', '^0.10.2', false);327testIsValidVersion('0.11.0', '0.10.x', false);328testIsValidVersion('0.11.0', '^0.10.0', false);329testIsValidVersion('0.11.0', '*', false); // fails due to lack of specificity330331testIsValidVersion('1.0.0', 'x.x.x', false); // fails due to lack of specificity332testIsValidVersion('1.0.0', '0.x.x', false); // fails due to lack of specificity333testIsValidVersion('1.0.0', '0.10.0', false);334testIsValidVersion('1.0.0', '0.10.2', false);335testIsValidVersion('1.0.0', '^0.10.2', true);336testIsValidVersion('1.0.0', '0.10.x', true);337testIsValidVersion('1.0.0', '^0.10.0', true);338testIsValidVersion('1.0.0', '*', false); // fails due to lack of specificity339340testIsValidVersion('1.10.0', 'x.x.x', false); // fails due to lack of specificity341testIsValidVersion('1.10.0', '1.x.x', true);342testIsValidVersion('1.10.0', '1.10.0', true);343testIsValidVersion('1.10.0', '1.10.2', false);344testIsValidVersion('1.10.0', '^1.10.2', false);345testIsValidVersion('1.10.0', '1.10.x', true);346testIsValidVersion('1.10.0', '^1.10.0', true);347testIsValidVersion('1.10.0', '*', false); // fails due to lack of specificity348349350// Anything < 1.0.0 is compatible351352testIsValidVersion('1.0.0', 'x.x.x', false); // fails due to lack of specificity353testIsValidVersion('1.0.0', '0.x.x', false); // fails due to lack of specificity354testIsValidVersion('1.0.0', '0.10.0', false);355testIsValidVersion('1.0.0', '0.10.2', false);356testIsValidVersion('1.0.0', '^0.10.2', true);357testIsValidVersion('1.0.0', '0.10.x', true);358testIsValidVersion('1.0.0', '^0.10.0', true);359testIsValidVersion('1.0.0', '1.0.0', true);360testIsValidVersion('1.0.0', '^1.0.0', true);361testIsValidVersion('1.0.0', '^2.0.0', false);362testIsValidVersion('1.0.0', '*', false); // fails due to lack of specificity363364testIsValidVersion('1.0.100', 'x.x.x', false); // fails due to lack of specificity365testIsValidVersion('1.0.100', '0.x.x', false); // fails due to lack of specificity366testIsValidVersion('1.0.100', '0.10.0', false);367testIsValidVersion('1.0.100', '0.10.2', false);368testIsValidVersion('1.0.100', '^0.10.2', true);369testIsValidVersion('1.0.100', '0.10.x', true);370testIsValidVersion('1.0.100', '^0.10.0', true);371testIsValidVersion('1.0.100', '1.0.0', false);372testIsValidVersion('1.0.100', '^1.0.0', true);373testIsValidVersion('1.0.100', '^1.0.1', true);374testIsValidVersion('1.0.100', '^2.0.0', false);375testIsValidVersion('1.0.100', '*', false); // fails due to lack of specificity376377testIsValidVersion('1.100.0', 'x.x.x', false); // fails due to lack of specificity378testIsValidVersion('1.100.0', '0.x.x', false); // fails due to lack of specificity379testIsValidVersion('1.100.0', '0.10.0', false);380testIsValidVersion('1.100.0', '0.10.2', false);381testIsValidVersion('1.100.0', '^0.10.2', true);382testIsValidVersion('1.100.0', '0.10.x', true);383testIsValidVersion('1.100.0', '^0.10.0', true);384testIsValidVersion('1.100.0', '1.0.0', false);385testIsValidVersion('1.100.0', '^1.0.0', true);386testIsValidVersion('1.100.0', '^1.1.0', true);387testIsValidVersion('1.100.0', '^1.100.0', true);388testIsValidVersion('1.100.0', '^2.0.0', false);389testIsValidVersion('1.100.0', '*', false); // fails due to lack of specificity390391testIsValidVersion('2.0.0', 'x.x.x', false); // fails due to lack of specificity392testIsValidVersion('2.0.0', '0.x.x', false); // fails due to lack of specificity393testIsValidVersion('2.0.0', '0.10.0', false);394testIsValidVersion('2.0.0', '0.10.2', false);395testIsValidVersion('2.0.0', '^0.10.2', false);396testIsValidVersion('2.0.0', '0.10.x', false);397testIsValidVersion('2.0.0', '^0.10.0', false);398testIsValidVersion('2.0.0', '1.0.0', false);399testIsValidVersion('2.0.0', '^1.0.0', false);400testIsValidVersion('2.0.0', '^1.1.0', false);401testIsValidVersion('2.0.0', '^1.100.0', false);402testIsValidVersion('2.0.0', '^2.0.0', true);403testIsValidVersion('2.0.0', '*', false); // fails due to lack of specificity404405// date tags406testIsValidVersion('1.10.0', '^1.10.0-20210511', true); // current date407testIsValidVersion('1.10.0', '^1.10.0-20210510', true); // before date408testIsValidVersion('1.10.0', '^1.10.0-20210512', false); // future date409testIsValidVersion('1.10.1', '^1.10.0-20200101', true); // before date, but ahead version410testIsValidVersion('1.11.0', '^1.10.0-20200101', true);411});412413test('isValidExtensionVersion checks browser only extensions', () => {414const manifest = {415name: 'test',416publisher: 'test',417version: '0.0.0',418engines: {419vscode: '^1.45.0'420},421browser: 'something'422};423assert.strictEqual(isValidExtensionVersion('1.44.0', undefined, manifest, false, []), false);424});425426test('areApiProposalsCompatible', () => {427assert.strictEqual(areApiProposalsCompatible([]), true);428assert.strictEqual(areApiProposalsCompatible([], ['hello']), true);429assert.strictEqual(areApiProposalsCompatible([], {}), true);430assert.strictEqual(areApiProposalsCompatible(['proposal1'], {}), true);431assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal1': { proposal: '' } }), true);432assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal1': { proposal: '', version: 1 } }), true);433assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '', version: 1 } }), true);434assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal2': { proposal: '' } }), true);435assert.strictEqual(areApiProposalsCompatible(['proposal1', 'proposal2'], {}), true);436assert.strictEqual(areApiProposalsCompatible(['proposal1', 'proposal2'], { 'proposal1': { proposal: '' } }), true);437438assert.strictEqual(areApiProposalsCompatible(['proposal2@1'], { 'proposal1': { proposal: '' } }), false);439assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '', version: 2 } }), false);440assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '' } }), false);441});442443});444445446