Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/extensions/test/common/extensionValidator.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
import assert from 'assert';
6
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
7
import { IExtensionManifest } from '../../common/extensions.js';
8
import { areApiProposalsCompatible, INormalizedVersion, IParsedVersion, isValidExtensionVersion, isValidVersion, isValidVersionStr, normalizeVersion, parseVersion } from '../../common/extensionValidator.js';
9
10
suite('Extension Version Validator', () => {
11
12
ensureNoDisposablesAreLeakedInTestSuite();
13
14
const productVersion = '2021-05-11T21:54:30.577Z';
15
16
test('isValidVersionStr', () => {
17
assert.strictEqual(isValidVersionStr('0.10.0-dev'), true);
18
assert.strictEqual(isValidVersionStr('0.10.0'), true);
19
assert.strictEqual(isValidVersionStr('0.10.1'), true);
20
assert.strictEqual(isValidVersionStr('0.10.100'), true);
21
assert.strictEqual(isValidVersionStr('0.11.0'), true);
22
23
assert.strictEqual(isValidVersionStr('x.x.x'), true);
24
assert.strictEqual(isValidVersionStr('0.x.x'), true);
25
assert.strictEqual(isValidVersionStr('0.10.0'), true);
26
assert.strictEqual(isValidVersionStr('0.10.x'), true);
27
assert.strictEqual(isValidVersionStr('^0.10.0'), true);
28
assert.strictEqual(isValidVersionStr('*'), true);
29
30
assert.strictEqual(isValidVersionStr('0.x.x.x'), false);
31
assert.strictEqual(isValidVersionStr('0.10'), false);
32
assert.strictEqual(isValidVersionStr('0.10.'), false);
33
});
34
35
test('parseVersion', () => {
36
function assertParseVersion(version: string, hasCaret: boolean, hasGreaterEquals: boolean, majorBase: number, majorMustEqual: boolean, minorBase: number, minorMustEqual: boolean, patchBase: number, patchMustEqual: boolean, preRelease: string | null): void {
37
const actual = parseVersion(version);
38
const expected: IParsedVersion = { hasCaret, hasGreaterEquals, majorBase, majorMustEqual, minorBase, minorMustEqual, patchBase, patchMustEqual, preRelease };
39
40
assert.deepStrictEqual(actual, expected, 'parseVersion for ' + version);
41
}
42
43
assertParseVersion('0.10.0-dev', false, false, 0, true, 10, true, 0, true, '-dev');
44
assertParseVersion('0.10.0', false, false, 0, true, 10, true, 0, true, null);
45
assertParseVersion('0.10.1', false, false, 0, true, 10, true, 1, true, null);
46
assertParseVersion('0.10.100', false, false, 0, true, 10, true, 100, true, null);
47
assertParseVersion('0.11.0', false, false, 0, true, 11, true, 0, true, null);
48
49
assertParseVersion('x.x.x', false, false, 0, false, 0, false, 0, false, null);
50
assertParseVersion('0.x.x', false, false, 0, true, 0, false, 0, false, null);
51
assertParseVersion('0.10.x', false, false, 0, true, 10, true, 0, false, null);
52
assertParseVersion('^0.10.0', true, false, 0, true, 10, true, 0, true, null);
53
assertParseVersion('^0.10.2', true, false, 0, true, 10, true, 2, true, null);
54
assertParseVersion('^1.10.2', true, false, 1, true, 10, true, 2, true, null);
55
assertParseVersion('*', false, false, 0, false, 0, false, 0, false, null);
56
57
assertParseVersion('>=0.0.1', false, true, 0, true, 0, true, 1, true, null);
58
assertParseVersion('>=2.4.3', false, true, 2, true, 4, true, 3, true, null);
59
});
60
61
test('normalizeVersion', () => {
62
function assertNormalizeVersion(version: string, majorBase: number, majorMustEqual: boolean, minorBase: number, minorMustEqual: boolean, patchBase: number, patchMustEqual: boolean, isMinimum: boolean, notBefore = 0): void {
63
const actual = normalizeVersion(parseVersion(version));
64
const expected: INormalizedVersion = { majorBase, majorMustEqual, minorBase, minorMustEqual, patchBase, patchMustEqual, isMinimum, notBefore };
65
assert.deepStrictEqual(actual, expected, 'parseVersion for ' + version);
66
}
67
68
assertNormalizeVersion('0.10.0-dev', 0, true, 10, true, 0, true, false, 0);
69
assertNormalizeVersion('0.10.0-222222222', 0, true, 10, true, 0, true, false, 0);
70
assertNormalizeVersion('0.10.0-20210511', 0, true, 10, true, 0, true, false, new Date('2021-05-11T00:00:00Z').getTime());
71
72
assertNormalizeVersion('0.10.0', 0, true, 10, true, 0, true, false);
73
assertNormalizeVersion('0.10.1', 0, true, 10, true, 1, true, false);
74
assertNormalizeVersion('0.10.100', 0, true, 10, true, 100, true, false);
75
assertNormalizeVersion('0.11.0', 0, true, 11, true, 0, true, false);
76
77
assertNormalizeVersion('x.x.x', 0, false, 0, false, 0, false, false);
78
assertNormalizeVersion('0.x.x', 0, true, 0, false, 0, false, false);
79
assertNormalizeVersion('0.10.x', 0, true, 10, true, 0, false, false);
80
assertNormalizeVersion('^0.10.0', 0, true, 10, true, 0, false, false);
81
assertNormalizeVersion('^0.10.2', 0, true, 10, true, 2, false, false);
82
assertNormalizeVersion('^1.10.2', 1, true, 10, false, 2, false, false);
83
assertNormalizeVersion('*', 0, false, 0, false, 0, false, false);
84
85
assertNormalizeVersion('>=0.0.1', 0, true, 0, true, 1, true, true);
86
assertNormalizeVersion('>=2.4.3', 2, true, 4, true, 3, true, true);
87
assertNormalizeVersion('>=2.4.3', 2, true, 4, true, 3, true, true);
88
});
89
90
test('isValidVersion', () => {
91
function testIsValidVersion(version: string, desiredVersion: string, expectedResult: boolean): void {
92
const actual = isValidVersion(version, productVersion, desiredVersion);
93
assert.strictEqual(actual, expectedResult, 'extension - vscode: ' + version + ', desiredVersion: ' + desiredVersion + ' should be ' + expectedResult);
94
}
95
96
testIsValidVersion('0.10.0-dev', 'x.x.x', true);
97
testIsValidVersion('0.10.0-dev', '0.x.x', true);
98
testIsValidVersion('0.10.0-dev', '0.10.0', true);
99
testIsValidVersion('0.10.0-dev', '0.10.2', false);
100
testIsValidVersion('0.10.0-dev', '^0.10.2', false);
101
testIsValidVersion('0.10.0-dev', '0.10.x', true);
102
testIsValidVersion('0.10.0-dev', '^0.10.0', true);
103
testIsValidVersion('0.10.0-dev', '*', true);
104
testIsValidVersion('0.10.0-dev', '>=0.0.1', true);
105
testIsValidVersion('0.10.0-dev', '>=0.0.10', true);
106
testIsValidVersion('0.10.0-dev', '>=0.10.0', true);
107
testIsValidVersion('0.10.0-dev', '>=0.10.1', false);
108
testIsValidVersion('0.10.0-dev', '>=1.0.0', false);
109
110
testIsValidVersion('0.10.0', 'x.x.x', true);
111
testIsValidVersion('0.10.0', '0.x.x', true);
112
testIsValidVersion('0.10.0', '0.10.0', true);
113
testIsValidVersion('0.10.0', '0.10.2', false);
114
testIsValidVersion('0.10.0', '^0.10.2', false);
115
testIsValidVersion('0.10.0', '0.10.x', true);
116
testIsValidVersion('0.10.0', '^0.10.0', true);
117
testIsValidVersion('0.10.0', '*', true);
118
119
testIsValidVersion('0.10.1', 'x.x.x', true);
120
testIsValidVersion('0.10.1', '0.x.x', true);
121
testIsValidVersion('0.10.1', '0.10.0', false);
122
testIsValidVersion('0.10.1', '0.10.2', false);
123
testIsValidVersion('0.10.1', '^0.10.2', false);
124
testIsValidVersion('0.10.1', '0.10.x', true);
125
testIsValidVersion('0.10.1', '^0.10.0', true);
126
testIsValidVersion('0.10.1', '*', true);
127
128
testIsValidVersion('0.10.100', 'x.x.x', true);
129
testIsValidVersion('0.10.100', '0.x.x', true);
130
testIsValidVersion('0.10.100', '0.10.0', false);
131
testIsValidVersion('0.10.100', '0.10.2', false);
132
testIsValidVersion('0.10.100', '^0.10.2', true);
133
testIsValidVersion('0.10.100', '0.10.x', true);
134
testIsValidVersion('0.10.100', '^0.10.0', true);
135
testIsValidVersion('0.10.100', '*', true);
136
137
testIsValidVersion('0.11.0', 'x.x.x', true);
138
testIsValidVersion('0.11.0', '0.x.x', true);
139
testIsValidVersion('0.11.0', '0.10.0', false);
140
testIsValidVersion('0.11.0', '0.10.2', false);
141
testIsValidVersion('0.11.0', '^0.10.2', false);
142
testIsValidVersion('0.11.0', '0.10.x', false);
143
testIsValidVersion('0.11.0', '^0.10.0', false);
144
testIsValidVersion('0.11.0', '*', true);
145
146
// Anything < 1.0.0 is compatible
147
148
testIsValidVersion('1.0.0', 'x.x.x', true);
149
testIsValidVersion('1.0.0', '0.x.x', true);
150
testIsValidVersion('1.0.0', '0.10.0', false);
151
testIsValidVersion('1.0.0', '0.10.2', false);
152
testIsValidVersion('1.0.0', '^0.10.2', true);
153
testIsValidVersion('1.0.0', '0.10.x', true);
154
testIsValidVersion('1.0.0', '^0.10.0', true);
155
testIsValidVersion('1.0.0', '1.0.0', true);
156
testIsValidVersion('1.0.0', '^1.0.0', true);
157
testIsValidVersion('1.0.0', '^2.0.0', false);
158
testIsValidVersion('1.0.0', '*', true);
159
testIsValidVersion('1.0.0', '>=0.0.1', true);
160
testIsValidVersion('1.0.0', '>=0.0.10', true);
161
testIsValidVersion('1.0.0', '>=0.10.0', true);
162
testIsValidVersion('1.0.0', '>=0.10.1', true);
163
testIsValidVersion('1.0.0', '>=1.0.0', true);
164
testIsValidVersion('1.0.0', '>=1.1.0', false);
165
testIsValidVersion('1.0.0', '>=1.0.1', false);
166
testIsValidVersion('1.0.0', '>=2.0.0', false);
167
168
testIsValidVersion('1.0.100', 'x.x.x', true);
169
testIsValidVersion('1.0.100', '0.x.x', true);
170
testIsValidVersion('1.0.100', '0.10.0', false);
171
testIsValidVersion('1.0.100', '0.10.2', false);
172
testIsValidVersion('1.0.100', '^0.10.2', true);
173
testIsValidVersion('1.0.100', '0.10.x', true);
174
testIsValidVersion('1.0.100', '^0.10.0', true);
175
testIsValidVersion('1.0.100', '1.0.0', false);
176
testIsValidVersion('1.0.100', '^1.0.0', true);
177
testIsValidVersion('1.0.100', '^1.0.1', true);
178
testIsValidVersion('1.0.100', '^2.0.0', false);
179
testIsValidVersion('1.0.100', '*', true);
180
181
testIsValidVersion('1.100.0', 'x.x.x', true);
182
testIsValidVersion('1.100.0', '0.x.x', true);
183
testIsValidVersion('1.100.0', '0.10.0', false);
184
testIsValidVersion('1.100.0', '0.10.2', false);
185
testIsValidVersion('1.100.0', '^0.10.2', true);
186
testIsValidVersion('1.100.0', '0.10.x', true);
187
testIsValidVersion('1.100.0', '^0.10.0', true);
188
testIsValidVersion('1.100.0', '1.0.0', false);
189
testIsValidVersion('1.100.0', '^1.0.0', true);
190
testIsValidVersion('1.100.0', '^1.1.0', true);
191
testIsValidVersion('1.100.0', '^1.100.0', true);
192
testIsValidVersion('1.100.0', '^2.0.0', false);
193
testIsValidVersion('1.100.0', '*', true);
194
testIsValidVersion('1.100.0', '>=1.99.0', true);
195
testIsValidVersion('1.100.0', '>=1.100.0', true);
196
testIsValidVersion('1.100.0', '>=1.101.0', false);
197
198
testIsValidVersion('2.0.0', 'x.x.x', true);
199
testIsValidVersion('2.0.0', '0.x.x', false);
200
testIsValidVersion('2.0.0', '0.10.0', false);
201
testIsValidVersion('2.0.0', '0.10.2', false);
202
testIsValidVersion('2.0.0', '^0.10.2', false);
203
testIsValidVersion('2.0.0', '0.10.x', false);
204
testIsValidVersion('2.0.0', '^0.10.0', false);
205
testIsValidVersion('2.0.0', '1.0.0', false);
206
testIsValidVersion('2.0.0', '^1.0.0', false);
207
testIsValidVersion('2.0.0', '^1.1.0', false);
208
testIsValidVersion('2.0.0', '^1.100.0', false);
209
testIsValidVersion('2.0.0', '^2.0.0', true);
210
testIsValidVersion('2.0.0', '*', true);
211
});
212
213
test('isValidExtensionVersion', () => {
214
215
function testExtensionVersion(version: string, desiredVersion: string, isBuiltin: boolean, hasMain: boolean, expectedResult: boolean): void {
216
const manifest: IExtensionManifest = {
217
name: 'test',
218
publisher: 'test',
219
version: '0.0.0',
220
engines: {
221
vscode: desiredVersion
222
},
223
main: hasMain ? 'something' : undefined
224
};
225
const reasons: string[] = [];
226
const actual = isValidExtensionVersion(version, productVersion, manifest, isBuiltin, reasons);
227
228
assert.strictEqual(actual, expectedResult, 'version: ' + version + ', desiredVersion: ' + desiredVersion + ', desc: ' + JSON.stringify(manifest) + ', reasons: ' + JSON.stringify(reasons));
229
}
230
231
function testIsInvalidExtensionVersion(version: string, desiredVersion: string, isBuiltin: boolean, hasMain: boolean): void {
232
testExtensionVersion(version, desiredVersion, isBuiltin, hasMain, false);
233
}
234
235
function testIsValidExtensionVersion(version: string, desiredVersion: string, isBuiltin: boolean, hasMain: boolean): void {
236
testExtensionVersion(version, desiredVersion, isBuiltin, hasMain, true);
237
}
238
239
function testIsValidVersion(version: string, desiredVersion: string, expectedResult: boolean): void {
240
testExtensionVersion(version, desiredVersion, false, true, expectedResult);
241
}
242
243
// builtin are allowed to use * or x.x.x
244
testIsValidExtensionVersion('0.10.0-dev', '*', true, true);
245
testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', true, true);
246
testIsValidExtensionVersion('0.10.0-dev', '0.x.x', true, true);
247
testIsValidExtensionVersion('0.10.0-dev', '0.10.x', true, true);
248
testIsValidExtensionVersion('1.10.0-dev', '1.x.x', true, true);
249
testIsValidExtensionVersion('1.10.0-dev', '1.10.x', true, true);
250
testIsValidExtensionVersion('0.10.0-dev', '*', true, false);
251
testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', true, false);
252
testIsValidExtensionVersion('0.10.0-dev', '0.x.x', true, false);
253
testIsValidExtensionVersion('0.10.0-dev', '0.10.x', true, false);
254
testIsValidExtensionVersion('1.10.0-dev', '1.x.x', true, false);
255
testIsValidExtensionVersion('1.10.0-dev', '1.10.x', true, false);
256
257
// normal extensions are allowed to use * or x.x.x only if they have no main
258
testIsInvalidExtensionVersion('0.10.0-dev', '*', false, true);
259
testIsInvalidExtensionVersion('0.10.0-dev', 'x.x.x', false, true);
260
testIsInvalidExtensionVersion('0.10.0-dev', '0.x.x', false, true);
261
testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, true);
262
testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, true);
263
testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, true);
264
testIsValidExtensionVersion('0.10.0-dev', '*', false, false);
265
testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', false, false);
266
testIsValidExtensionVersion('0.10.0-dev', '0.x.x', false, false);
267
testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, false);
268
testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, false);
269
testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, false);
270
271
// extensions without "main" get no version check
272
testIsValidExtensionVersion('0.10.0-dev', '>=0.9.1-pre.1', false, false);
273
testIsValidExtensionVersion('0.10.0-dev', '*', false, false);
274
testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', false, false);
275
testIsValidExtensionVersion('0.10.0-dev', '0.x.x', false, false);
276
testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, false);
277
testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, false);
278
testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, false);
279
testIsValidExtensionVersion('0.10.0-dev', '*', false, false);
280
testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', false, false);
281
testIsValidExtensionVersion('0.10.0-dev', '0.x.x', false, false);
282
testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, false);
283
testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, false);
284
testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, false);
285
286
// normal extensions with code
287
testIsValidVersion('0.10.0-dev', 'x.x.x', false); // fails due to lack of specificity
288
testIsValidVersion('0.10.0-dev', '0.x.x', false); // fails due to lack of specificity
289
testIsValidVersion('0.10.0-dev', '0.10.0', true);
290
testIsValidVersion('0.10.0-dev', '0.10.2', false);
291
testIsValidVersion('0.10.0-dev', '^0.10.2', false);
292
testIsValidVersion('0.10.0-dev', '0.10.x', true);
293
testIsValidVersion('0.10.0-dev', '^0.10.0', true);
294
testIsValidVersion('0.10.0-dev', '*', false); // fails due to lack of specificity
295
296
testIsValidVersion('0.10.0', 'x.x.x', false); // fails due to lack of specificity
297
testIsValidVersion('0.10.0', '0.x.x', false); // fails due to lack of specificity
298
testIsValidVersion('0.10.0', '0.10.0', true);
299
testIsValidVersion('0.10.0', '0.10.2', false);
300
testIsValidVersion('0.10.0', '^0.10.2', false);
301
testIsValidVersion('0.10.0', '0.10.x', true);
302
testIsValidVersion('0.10.0', '^0.10.0', true);
303
testIsValidVersion('0.10.0', '*', false); // fails due to lack of specificity
304
305
testIsValidVersion('0.10.1', 'x.x.x', false); // fails due to lack of specificity
306
testIsValidVersion('0.10.1', '0.x.x', false); // fails due to lack of specificity
307
testIsValidVersion('0.10.1', '0.10.0', false);
308
testIsValidVersion('0.10.1', '0.10.2', false);
309
testIsValidVersion('0.10.1', '^0.10.2', false);
310
testIsValidVersion('0.10.1', '0.10.x', true);
311
testIsValidVersion('0.10.1', '^0.10.0', true);
312
testIsValidVersion('0.10.1', '*', false); // fails due to lack of specificity
313
314
testIsValidVersion('0.10.100', 'x.x.x', false); // fails due to lack of specificity
315
testIsValidVersion('0.10.100', '0.x.x', false); // fails due to lack of specificity
316
testIsValidVersion('0.10.100', '0.10.0', false);
317
testIsValidVersion('0.10.100', '0.10.2', false);
318
testIsValidVersion('0.10.100', '^0.10.2', true);
319
testIsValidVersion('0.10.100', '0.10.x', true);
320
testIsValidVersion('0.10.100', '^0.10.0', true);
321
testIsValidVersion('0.10.100', '*', false); // fails due to lack of specificity
322
323
testIsValidVersion('0.11.0', 'x.x.x', false); // fails due to lack of specificity
324
testIsValidVersion('0.11.0', '0.x.x', false); // fails due to lack of specificity
325
testIsValidVersion('0.11.0', '0.10.0', false);
326
testIsValidVersion('0.11.0', '0.10.2', false);
327
testIsValidVersion('0.11.0', '^0.10.2', false);
328
testIsValidVersion('0.11.0', '0.10.x', false);
329
testIsValidVersion('0.11.0', '^0.10.0', false);
330
testIsValidVersion('0.11.0', '*', false); // fails due to lack of specificity
331
332
testIsValidVersion('1.0.0', 'x.x.x', false); // fails due to lack of specificity
333
testIsValidVersion('1.0.0', '0.x.x', false); // fails due to lack of specificity
334
testIsValidVersion('1.0.0', '0.10.0', false);
335
testIsValidVersion('1.0.0', '0.10.2', false);
336
testIsValidVersion('1.0.0', '^0.10.2', true);
337
testIsValidVersion('1.0.0', '0.10.x', true);
338
testIsValidVersion('1.0.0', '^0.10.0', true);
339
testIsValidVersion('1.0.0', '*', false); // fails due to lack of specificity
340
341
testIsValidVersion('1.10.0', 'x.x.x', false); // fails due to lack of specificity
342
testIsValidVersion('1.10.0', '1.x.x', true);
343
testIsValidVersion('1.10.0', '1.10.0', true);
344
testIsValidVersion('1.10.0', '1.10.2', false);
345
testIsValidVersion('1.10.0', '^1.10.2', false);
346
testIsValidVersion('1.10.0', '1.10.x', true);
347
testIsValidVersion('1.10.0', '^1.10.0', true);
348
testIsValidVersion('1.10.0', '*', false); // fails due to lack of specificity
349
350
351
// Anything < 1.0.0 is compatible
352
353
testIsValidVersion('1.0.0', 'x.x.x', false); // fails due to lack of specificity
354
testIsValidVersion('1.0.0', '0.x.x', false); // fails due to lack of specificity
355
testIsValidVersion('1.0.0', '0.10.0', false);
356
testIsValidVersion('1.0.0', '0.10.2', false);
357
testIsValidVersion('1.0.0', '^0.10.2', true);
358
testIsValidVersion('1.0.0', '0.10.x', true);
359
testIsValidVersion('1.0.0', '^0.10.0', true);
360
testIsValidVersion('1.0.0', '1.0.0', true);
361
testIsValidVersion('1.0.0', '^1.0.0', true);
362
testIsValidVersion('1.0.0', '^2.0.0', false);
363
testIsValidVersion('1.0.0', '*', false); // fails due to lack of specificity
364
365
testIsValidVersion('1.0.100', 'x.x.x', false); // fails due to lack of specificity
366
testIsValidVersion('1.0.100', '0.x.x', false); // fails due to lack of specificity
367
testIsValidVersion('1.0.100', '0.10.0', false);
368
testIsValidVersion('1.0.100', '0.10.2', false);
369
testIsValidVersion('1.0.100', '^0.10.2', true);
370
testIsValidVersion('1.0.100', '0.10.x', true);
371
testIsValidVersion('1.0.100', '^0.10.0', true);
372
testIsValidVersion('1.0.100', '1.0.0', false);
373
testIsValidVersion('1.0.100', '^1.0.0', true);
374
testIsValidVersion('1.0.100', '^1.0.1', true);
375
testIsValidVersion('1.0.100', '^2.0.0', false);
376
testIsValidVersion('1.0.100', '*', false); // fails due to lack of specificity
377
378
testIsValidVersion('1.100.0', 'x.x.x', false); // fails due to lack of specificity
379
testIsValidVersion('1.100.0', '0.x.x', false); // fails due to lack of specificity
380
testIsValidVersion('1.100.0', '0.10.0', false);
381
testIsValidVersion('1.100.0', '0.10.2', false);
382
testIsValidVersion('1.100.0', '^0.10.2', true);
383
testIsValidVersion('1.100.0', '0.10.x', true);
384
testIsValidVersion('1.100.0', '^0.10.0', true);
385
testIsValidVersion('1.100.0', '1.0.0', false);
386
testIsValidVersion('1.100.0', '^1.0.0', true);
387
testIsValidVersion('1.100.0', '^1.1.0', true);
388
testIsValidVersion('1.100.0', '^1.100.0', true);
389
testIsValidVersion('1.100.0', '^2.0.0', false);
390
testIsValidVersion('1.100.0', '*', false); // fails due to lack of specificity
391
392
testIsValidVersion('2.0.0', 'x.x.x', false); // fails due to lack of specificity
393
testIsValidVersion('2.0.0', '0.x.x', false); // fails due to lack of specificity
394
testIsValidVersion('2.0.0', '0.10.0', false);
395
testIsValidVersion('2.0.0', '0.10.2', false);
396
testIsValidVersion('2.0.0', '^0.10.2', false);
397
testIsValidVersion('2.0.0', '0.10.x', false);
398
testIsValidVersion('2.0.0', '^0.10.0', false);
399
testIsValidVersion('2.0.0', '1.0.0', false);
400
testIsValidVersion('2.0.0', '^1.0.0', false);
401
testIsValidVersion('2.0.0', '^1.1.0', false);
402
testIsValidVersion('2.0.0', '^1.100.0', false);
403
testIsValidVersion('2.0.0', '^2.0.0', true);
404
testIsValidVersion('2.0.0', '*', false); // fails due to lack of specificity
405
406
// date tags
407
testIsValidVersion('1.10.0', '^1.10.0-20210511', true); // current date
408
testIsValidVersion('1.10.0', '^1.10.0-20210510', true); // before date
409
testIsValidVersion('1.10.0', '^1.10.0-20210512', false); // future date
410
testIsValidVersion('1.10.1', '^1.10.0-20200101', true); // before date, but ahead version
411
testIsValidVersion('1.11.0', '^1.10.0-20200101', true);
412
});
413
414
test('isValidExtensionVersion checks browser only extensions', () => {
415
const manifest = {
416
name: 'test',
417
publisher: 'test',
418
version: '0.0.0',
419
engines: {
420
vscode: '^1.45.0'
421
},
422
browser: 'something'
423
};
424
assert.strictEqual(isValidExtensionVersion('1.44.0', undefined, manifest, false, []), false);
425
});
426
427
test('areApiProposalsCompatible', () => {
428
assert.strictEqual(areApiProposalsCompatible([]), true);
429
assert.strictEqual(areApiProposalsCompatible([], ['hello']), true);
430
assert.strictEqual(areApiProposalsCompatible([], {}), true);
431
assert.strictEqual(areApiProposalsCompatible(['proposal1'], {}), true);
432
assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal1': { proposal: '' } }), true);
433
assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal1': { proposal: '', version: 1 } }), true);
434
assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '', version: 1 } }), true);
435
assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal2': { proposal: '' } }), true);
436
assert.strictEqual(areApiProposalsCompatible(['proposal1', 'proposal2'], {}), true);
437
assert.strictEqual(areApiProposalsCompatible(['proposal1', 'proposal2'], { 'proposal1': { proposal: '' } }), true);
438
439
assert.strictEqual(areApiProposalsCompatible(['proposal2@1'], { 'proposal1': { proposal: '' } }), false);
440
assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '', version: 2 } }), false);
441
assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '' } }), false);
442
});
443
444
});
445
446