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
5251 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
// Parse versions with HHMM date format
61
assertParseVersion('1.10.0-202105111430', false, false, 1, true, 10, true, 0, true, '-202105111430');
62
assertParseVersion('^1.10.0-202105112359', true, false, 1, true, 10, true, 0, true, '-202105112359');
63
});
64
65
test('normalizeVersion', () => {
66
function assertNormalizeVersion(version: string, majorBase: number, majorMustEqual: boolean, minorBase: number, minorMustEqual: boolean, patchBase: number, patchMustEqual: boolean, isMinimum: boolean, notBefore = 0): void {
67
const actual = normalizeVersion(parseVersion(version));
68
const expected: INormalizedVersion = { majorBase, majorMustEqual, minorBase, minorMustEqual, patchBase, patchMustEqual, isMinimum, notBefore };
69
assert.deepStrictEqual(actual, expected, 'parseVersion for ' + version);
70
}
71
72
assertNormalizeVersion('0.10.0-dev', 0, true, 10, true, 0, true, false, 0);
73
assertNormalizeVersion('0.10.0-222222222', 0, true, 10, true, 0, true, false, 0);
74
assertNormalizeVersion('0.10.0-20210511', 0, true, 10, true, 0, true, false, new Date('2021-05-11T00:00:00Z').getTime());
75
76
// Normalize versions with HHMM date format
77
assertNormalizeVersion('1.10.0-202105111430', 1, true, 10, true, 0, true, false, new Date('2021-05-11T14:30:00Z').getTime());
78
assertNormalizeVersion('1.10.0-202105112359', 1, true, 10, true, 0, true, false, new Date('2021-05-11T23:59:00Z').getTime());
79
assertNormalizeVersion('1.10.0-202105110000', 1, true, 10, true, 0, true, false, new Date('2021-05-11T00:00:00Z').getTime());
80
81
assertNormalizeVersion('0.10.0', 0, true, 10, true, 0, true, false);
82
assertNormalizeVersion('0.10.1', 0, true, 10, true, 1, true, false);
83
assertNormalizeVersion('0.10.100', 0, true, 10, true, 100, true, false);
84
assertNormalizeVersion('0.11.0', 0, true, 11, true, 0, true, false);
85
86
assertNormalizeVersion('x.x.x', 0, false, 0, false, 0, false, false);
87
assertNormalizeVersion('0.x.x', 0, true, 0, false, 0, false, false);
88
assertNormalizeVersion('0.10.x', 0, true, 10, true, 0, false, false);
89
assertNormalizeVersion('^0.10.0', 0, true, 10, true, 0, false, false);
90
assertNormalizeVersion('^0.10.2', 0, true, 10, true, 2, false, false);
91
assertNormalizeVersion('^1.10.2', 1, true, 10, false, 2, false, false);
92
assertNormalizeVersion('*', 0, false, 0, false, 0, false, false);
93
94
assertNormalizeVersion('>=0.0.1', 0, true, 0, true, 1, true, true);
95
assertNormalizeVersion('>=2.4.3', 2, true, 4, true, 3, true, true);
96
assertNormalizeVersion('>=2.4.3', 2, true, 4, true, 3, true, true);
97
});
98
99
test('isValidVersion', () => {
100
function testIsValidVersion(version: string, desiredVersion: string, expectedResult: boolean): void {
101
const actual = isValidVersion(version, productVersion, desiredVersion);
102
assert.strictEqual(actual, expectedResult, 'extension - vscode: ' + version + ', desiredVersion: ' + desiredVersion + ' should be ' + expectedResult);
103
}
104
105
testIsValidVersion('0.10.0-dev', 'x.x.x', true);
106
testIsValidVersion('0.10.0-dev', '0.x.x', true);
107
testIsValidVersion('0.10.0-dev', '0.10.0', true);
108
testIsValidVersion('0.10.0-dev', '0.10.2', false);
109
testIsValidVersion('0.10.0-dev', '^0.10.2', false);
110
testIsValidVersion('0.10.0-dev', '0.10.x', true);
111
testIsValidVersion('0.10.0-dev', '^0.10.0', true);
112
testIsValidVersion('0.10.0-dev', '*', true);
113
testIsValidVersion('0.10.0-dev', '>=0.0.1', true);
114
testIsValidVersion('0.10.0-dev', '>=0.0.10', true);
115
testIsValidVersion('0.10.0-dev', '>=0.10.0', true);
116
testIsValidVersion('0.10.0-dev', '>=0.10.1', false);
117
testIsValidVersion('0.10.0-dev', '>=1.0.0', false);
118
119
testIsValidVersion('0.10.0', 'x.x.x', true);
120
testIsValidVersion('0.10.0', '0.x.x', true);
121
testIsValidVersion('0.10.0', '0.10.0', true);
122
testIsValidVersion('0.10.0', '0.10.2', false);
123
testIsValidVersion('0.10.0', '^0.10.2', false);
124
testIsValidVersion('0.10.0', '0.10.x', true);
125
testIsValidVersion('0.10.0', '^0.10.0', true);
126
testIsValidVersion('0.10.0', '*', true);
127
128
testIsValidVersion('0.10.1', 'x.x.x', true);
129
testIsValidVersion('0.10.1', '0.x.x', true);
130
testIsValidVersion('0.10.1', '0.10.0', false);
131
testIsValidVersion('0.10.1', '0.10.2', false);
132
testIsValidVersion('0.10.1', '^0.10.2', false);
133
testIsValidVersion('0.10.1', '0.10.x', true);
134
testIsValidVersion('0.10.1', '^0.10.0', true);
135
testIsValidVersion('0.10.1', '*', true);
136
137
testIsValidVersion('0.10.100', 'x.x.x', true);
138
testIsValidVersion('0.10.100', '0.x.x', true);
139
testIsValidVersion('0.10.100', '0.10.0', false);
140
testIsValidVersion('0.10.100', '0.10.2', false);
141
testIsValidVersion('0.10.100', '^0.10.2', true);
142
testIsValidVersion('0.10.100', '0.10.x', true);
143
testIsValidVersion('0.10.100', '^0.10.0', true);
144
testIsValidVersion('0.10.100', '*', true);
145
146
testIsValidVersion('0.11.0', 'x.x.x', true);
147
testIsValidVersion('0.11.0', '0.x.x', true);
148
testIsValidVersion('0.11.0', '0.10.0', false);
149
testIsValidVersion('0.11.0', '0.10.2', false);
150
testIsValidVersion('0.11.0', '^0.10.2', false);
151
testIsValidVersion('0.11.0', '0.10.x', false);
152
testIsValidVersion('0.11.0', '^0.10.0', false);
153
testIsValidVersion('0.11.0', '*', true);
154
155
// Anything < 1.0.0 is compatible
156
157
testIsValidVersion('1.0.0', 'x.x.x', true);
158
testIsValidVersion('1.0.0', '0.x.x', true);
159
testIsValidVersion('1.0.0', '0.10.0', false);
160
testIsValidVersion('1.0.0', '0.10.2', false);
161
testIsValidVersion('1.0.0', '^0.10.2', true);
162
testIsValidVersion('1.0.0', '0.10.x', true);
163
testIsValidVersion('1.0.0', '^0.10.0', true);
164
testIsValidVersion('1.0.0', '1.0.0', true);
165
testIsValidVersion('1.0.0', '^1.0.0', true);
166
testIsValidVersion('1.0.0', '^2.0.0', false);
167
testIsValidVersion('1.0.0', '*', true);
168
testIsValidVersion('1.0.0', '>=0.0.1', true);
169
testIsValidVersion('1.0.0', '>=0.0.10', true);
170
testIsValidVersion('1.0.0', '>=0.10.0', true);
171
testIsValidVersion('1.0.0', '>=0.10.1', true);
172
testIsValidVersion('1.0.0', '>=1.0.0', true);
173
testIsValidVersion('1.0.0', '>=1.1.0', false);
174
testIsValidVersion('1.0.0', '>=1.0.1', false);
175
testIsValidVersion('1.0.0', '>=2.0.0', false);
176
177
testIsValidVersion('1.0.100', 'x.x.x', true);
178
testIsValidVersion('1.0.100', '0.x.x', true);
179
testIsValidVersion('1.0.100', '0.10.0', false);
180
testIsValidVersion('1.0.100', '0.10.2', false);
181
testIsValidVersion('1.0.100', '^0.10.2', true);
182
testIsValidVersion('1.0.100', '0.10.x', true);
183
testIsValidVersion('1.0.100', '^0.10.0', true);
184
testIsValidVersion('1.0.100', '1.0.0', false);
185
testIsValidVersion('1.0.100', '^1.0.0', true);
186
testIsValidVersion('1.0.100', '^1.0.1', true);
187
testIsValidVersion('1.0.100', '^2.0.0', false);
188
testIsValidVersion('1.0.100', '*', true);
189
190
testIsValidVersion('1.100.0', 'x.x.x', true);
191
testIsValidVersion('1.100.0', '0.x.x', true);
192
testIsValidVersion('1.100.0', '0.10.0', false);
193
testIsValidVersion('1.100.0', '0.10.2', false);
194
testIsValidVersion('1.100.0', '^0.10.2', true);
195
testIsValidVersion('1.100.0', '0.10.x', true);
196
testIsValidVersion('1.100.0', '^0.10.0', true);
197
testIsValidVersion('1.100.0', '1.0.0', false);
198
testIsValidVersion('1.100.0', '^1.0.0', true);
199
testIsValidVersion('1.100.0', '^1.1.0', true);
200
testIsValidVersion('1.100.0', '^1.100.0', true);
201
testIsValidVersion('1.100.0', '^2.0.0', false);
202
testIsValidVersion('1.100.0', '*', true);
203
testIsValidVersion('1.100.0', '>=1.99.0', true);
204
testIsValidVersion('1.100.0', '>=1.100.0', true);
205
testIsValidVersion('1.100.0', '>=1.101.0', false);
206
207
testIsValidVersion('2.0.0', 'x.x.x', true);
208
testIsValidVersion('2.0.0', '0.x.x', false);
209
testIsValidVersion('2.0.0', '0.10.0', false);
210
testIsValidVersion('2.0.0', '0.10.2', false);
211
testIsValidVersion('2.0.0', '^0.10.2', false);
212
testIsValidVersion('2.0.0', '0.10.x', false);
213
testIsValidVersion('2.0.0', '^0.10.0', false);
214
testIsValidVersion('2.0.0', '1.0.0', false);
215
testIsValidVersion('2.0.0', '^1.0.0', false);
216
testIsValidVersion('2.0.0', '^1.1.0', false);
217
testIsValidVersion('2.0.0', '^1.100.0', false);
218
testIsValidVersion('2.0.0', '^2.0.0', true);
219
testIsValidVersion('2.0.0', '*', true);
220
});
221
222
test('isValidExtensionVersion', () => {
223
224
function testExtensionVersion(version: string, desiredVersion: string, isBuiltin: boolean, hasMain: boolean, expectedResult: boolean): void {
225
const manifest: IExtensionManifest = {
226
name: 'test',
227
publisher: 'test',
228
version: '0.0.0',
229
engines: {
230
vscode: desiredVersion
231
},
232
main: hasMain ? 'something' : undefined
233
};
234
const reasons: string[] = [];
235
const actual = isValidExtensionVersion(version, productVersion, manifest, isBuiltin, reasons);
236
237
assert.strictEqual(actual, expectedResult, 'version: ' + version + ', desiredVersion: ' + desiredVersion + ', desc: ' + JSON.stringify(manifest) + ', reasons: ' + JSON.stringify(reasons));
238
}
239
240
function testIsInvalidExtensionVersion(version: string, desiredVersion: string, isBuiltin: boolean, hasMain: boolean): void {
241
testExtensionVersion(version, desiredVersion, isBuiltin, hasMain, false);
242
}
243
244
function testIsValidExtensionVersion(version: string, desiredVersion: string, isBuiltin: boolean, hasMain: boolean): void {
245
testExtensionVersion(version, desiredVersion, isBuiltin, hasMain, true);
246
}
247
248
function testIsValidVersion(version: string, desiredVersion: string, expectedResult: boolean): void {
249
testExtensionVersion(version, desiredVersion, false, true, expectedResult);
250
}
251
252
// builtin are allowed to use * or x.x.x
253
testIsValidExtensionVersion('0.10.0-dev', '*', true, true);
254
testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', true, true);
255
testIsValidExtensionVersion('0.10.0-dev', '0.x.x', true, true);
256
testIsValidExtensionVersion('0.10.0-dev', '0.10.x', true, true);
257
testIsValidExtensionVersion('1.10.0-dev', '1.x.x', true, true);
258
testIsValidExtensionVersion('1.10.0-dev', '1.10.x', true, true);
259
testIsValidExtensionVersion('0.10.0-dev', '*', true, false);
260
testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', true, false);
261
testIsValidExtensionVersion('0.10.0-dev', '0.x.x', true, false);
262
testIsValidExtensionVersion('0.10.0-dev', '0.10.x', true, false);
263
testIsValidExtensionVersion('1.10.0-dev', '1.x.x', true, false);
264
testIsValidExtensionVersion('1.10.0-dev', '1.10.x', true, false);
265
266
// normal extensions are allowed to use * or x.x.x only if they have no main
267
testIsInvalidExtensionVersion('0.10.0-dev', '*', false, true);
268
testIsInvalidExtensionVersion('0.10.0-dev', 'x.x.x', false, true);
269
testIsInvalidExtensionVersion('0.10.0-dev', '0.x.x', false, true);
270
testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, true);
271
testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, true);
272
testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, true);
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
280
// extensions without "main" get no version check
281
testIsValidExtensionVersion('0.10.0-dev', '>=0.9.1-pre.1', false, false);
282
testIsValidExtensionVersion('0.10.0-dev', '*', false, false);
283
testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', false, false);
284
testIsValidExtensionVersion('0.10.0-dev', '0.x.x', false, false);
285
testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, false);
286
testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, false);
287
testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, false);
288
testIsValidExtensionVersion('0.10.0-dev', '*', false, false);
289
testIsValidExtensionVersion('0.10.0-dev', 'x.x.x', false, false);
290
testIsValidExtensionVersion('0.10.0-dev', '0.x.x', false, false);
291
testIsValidExtensionVersion('0.10.0-dev', '0.10.x', false, false);
292
testIsValidExtensionVersion('1.10.0-dev', '1.x.x', false, false);
293
testIsValidExtensionVersion('1.10.0-dev', '1.10.x', false, false);
294
295
// normal extensions with code
296
testIsValidVersion('0.10.0-dev', 'x.x.x', false); // fails due to lack of specificity
297
testIsValidVersion('0.10.0-dev', '0.x.x', false); // fails due to lack of specificity
298
testIsValidVersion('0.10.0-dev', '0.10.0', true);
299
testIsValidVersion('0.10.0-dev', '0.10.2', false);
300
testIsValidVersion('0.10.0-dev', '^0.10.2', false);
301
testIsValidVersion('0.10.0-dev', '0.10.x', true);
302
testIsValidVersion('0.10.0-dev', '^0.10.0', true);
303
testIsValidVersion('0.10.0-dev', '*', false); // fails due to lack of specificity
304
305
testIsValidVersion('0.10.0', 'x.x.x', false); // fails due to lack of specificity
306
testIsValidVersion('0.10.0', '0.x.x', false); // fails due to lack of specificity
307
testIsValidVersion('0.10.0', '0.10.0', true);
308
testIsValidVersion('0.10.0', '0.10.2', false);
309
testIsValidVersion('0.10.0', '^0.10.2', false);
310
testIsValidVersion('0.10.0', '0.10.x', true);
311
testIsValidVersion('0.10.0', '^0.10.0', true);
312
testIsValidVersion('0.10.0', '*', false); // fails due to lack of specificity
313
314
testIsValidVersion('0.10.1', 'x.x.x', false); // fails due to lack of specificity
315
testIsValidVersion('0.10.1', '0.x.x', false); // fails due to lack of specificity
316
testIsValidVersion('0.10.1', '0.10.0', false);
317
testIsValidVersion('0.10.1', '0.10.2', false);
318
testIsValidVersion('0.10.1', '^0.10.2', false);
319
testIsValidVersion('0.10.1', '0.10.x', true);
320
testIsValidVersion('0.10.1', '^0.10.0', true);
321
testIsValidVersion('0.10.1', '*', false); // fails due to lack of specificity
322
323
testIsValidVersion('0.10.100', 'x.x.x', false); // fails due to lack of specificity
324
testIsValidVersion('0.10.100', '0.x.x', false); // fails due to lack of specificity
325
testIsValidVersion('0.10.100', '0.10.0', false);
326
testIsValidVersion('0.10.100', '0.10.2', false);
327
testIsValidVersion('0.10.100', '^0.10.2', true);
328
testIsValidVersion('0.10.100', '0.10.x', true);
329
testIsValidVersion('0.10.100', '^0.10.0', true);
330
testIsValidVersion('0.10.100', '*', false); // fails due to lack of specificity
331
332
testIsValidVersion('0.11.0', 'x.x.x', false); // fails due to lack of specificity
333
testIsValidVersion('0.11.0', '0.x.x', false); // fails due to lack of specificity
334
testIsValidVersion('0.11.0', '0.10.0', false);
335
testIsValidVersion('0.11.0', '0.10.2', false);
336
testIsValidVersion('0.11.0', '^0.10.2', false);
337
testIsValidVersion('0.11.0', '0.10.x', false);
338
testIsValidVersion('0.11.0', '^0.10.0', false);
339
testIsValidVersion('0.11.0', '*', false); // fails due to lack of specificity
340
341
testIsValidVersion('1.0.0', 'x.x.x', false); // fails due to lack of specificity
342
testIsValidVersion('1.0.0', '0.x.x', false); // fails due to lack of specificity
343
testIsValidVersion('1.0.0', '0.10.0', false);
344
testIsValidVersion('1.0.0', '0.10.2', false);
345
testIsValidVersion('1.0.0', '^0.10.2', true);
346
testIsValidVersion('1.0.0', '0.10.x', true);
347
testIsValidVersion('1.0.0', '^0.10.0', true);
348
testIsValidVersion('1.0.0', '*', false); // fails due to lack of specificity
349
350
testIsValidVersion('1.10.0', 'x.x.x', false); // fails due to lack of specificity
351
testIsValidVersion('1.10.0', '1.x.x', true);
352
testIsValidVersion('1.10.0', '1.10.0', true);
353
testIsValidVersion('1.10.0', '1.10.2', false);
354
testIsValidVersion('1.10.0', '^1.10.2', false);
355
testIsValidVersion('1.10.0', '1.10.x', true);
356
testIsValidVersion('1.10.0', '^1.10.0', true);
357
testIsValidVersion('1.10.0', '*', false); // fails due to lack of specificity
358
359
360
// Anything < 1.0.0 is compatible
361
362
testIsValidVersion('1.0.0', 'x.x.x', false); // fails due to lack of specificity
363
testIsValidVersion('1.0.0', '0.x.x', false); // fails due to lack of specificity
364
testIsValidVersion('1.0.0', '0.10.0', false);
365
testIsValidVersion('1.0.0', '0.10.2', false);
366
testIsValidVersion('1.0.0', '^0.10.2', true);
367
testIsValidVersion('1.0.0', '0.10.x', true);
368
testIsValidVersion('1.0.0', '^0.10.0', true);
369
testIsValidVersion('1.0.0', '1.0.0', true);
370
testIsValidVersion('1.0.0', '^1.0.0', true);
371
testIsValidVersion('1.0.0', '^2.0.0', false);
372
testIsValidVersion('1.0.0', '*', false); // fails due to lack of specificity
373
374
testIsValidVersion('1.0.100', 'x.x.x', false); // fails due to lack of specificity
375
testIsValidVersion('1.0.100', '0.x.x', false); // fails due to lack of specificity
376
testIsValidVersion('1.0.100', '0.10.0', false);
377
testIsValidVersion('1.0.100', '0.10.2', false);
378
testIsValidVersion('1.0.100', '^0.10.2', true);
379
testIsValidVersion('1.0.100', '0.10.x', true);
380
testIsValidVersion('1.0.100', '^0.10.0', true);
381
testIsValidVersion('1.0.100', '1.0.0', false);
382
testIsValidVersion('1.0.100', '^1.0.0', true);
383
testIsValidVersion('1.0.100', '^1.0.1', true);
384
testIsValidVersion('1.0.100', '^2.0.0', false);
385
testIsValidVersion('1.0.100', '*', false); // fails due to lack of specificity
386
387
testIsValidVersion('1.100.0', 'x.x.x', false); // fails due to lack of specificity
388
testIsValidVersion('1.100.0', '0.x.x', false); // fails due to lack of specificity
389
testIsValidVersion('1.100.0', '0.10.0', false);
390
testIsValidVersion('1.100.0', '0.10.2', false);
391
testIsValidVersion('1.100.0', '^0.10.2', true);
392
testIsValidVersion('1.100.0', '0.10.x', true);
393
testIsValidVersion('1.100.0', '^0.10.0', true);
394
testIsValidVersion('1.100.0', '1.0.0', false);
395
testIsValidVersion('1.100.0', '^1.0.0', true);
396
testIsValidVersion('1.100.0', '^1.1.0', true);
397
testIsValidVersion('1.100.0', '^1.100.0', true);
398
testIsValidVersion('1.100.0', '^2.0.0', false);
399
testIsValidVersion('1.100.0', '*', false); // fails due to lack of specificity
400
401
testIsValidVersion('2.0.0', 'x.x.x', false); // fails due to lack of specificity
402
testIsValidVersion('2.0.0', '0.x.x', false); // fails due to lack of specificity
403
testIsValidVersion('2.0.0', '0.10.0', false);
404
testIsValidVersion('2.0.0', '0.10.2', false);
405
testIsValidVersion('2.0.0', '^0.10.2', false);
406
testIsValidVersion('2.0.0', '0.10.x', false);
407
testIsValidVersion('2.0.0', '^0.10.0', false);
408
testIsValidVersion('2.0.0', '1.0.0', false);
409
testIsValidVersion('2.0.0', '^1.0.0', false);
410
testIsValidVersion('2.0.0', '^1.1.0', false);
411
testIsValidVersion('2.0.0', '^1.100.0', false);
412
testIsValidVersion('2.0.0', '^2.0.0', true);
413
testIsValidVersion('2.0.0', '*', false); // fails due to lack of specificity
414
415
// date tags
416
testIsValidVersion('1.10.0', '^1.10.0-20210511', true); // current date
417
testIsValidVersion('1.10.0', '^1.10.0-20210510', true); // before date
418
testIsValidVersion('1.10.0', '^1.10.0-20210512', false); // future date
419
testIsValidVersion('1.10.1', '^1.10.0-20200101', true); // before date, but ahead version
420
testIsValidVersion('1.11.0', '^1.10.0-20200101', true);
421
422
// Test with HHMM date format
423
testIsValidVersion('1.10.0', '^1.10.0-202105111400', true); // product at beginning of day, required time at 14:00
424
testIsValidVersion('1.10.0', '^1.10.0-202105112359', false); // product at beginning of day, required time at 23:59
425
testIsValidVersion('1.10.0', '^1.10.0-202105110000', true); // product at beginning of day, required time at 00:00
426
});
427
428
test('isValidExtensionVersion checks browser only extensions', () => {
429
const manifest = {
430
name: 'test',
431
publisher: 'test',
432
version: '0.0.0',
433
engines: {
434
vscode: '^1.45.0'
435
},
436
browser: 'something'
437
};
438
assert.strictEqual(isValidExtensionVersion('1.44.0', undefined, manifest, false, []), false);
439
});
440
441
test('areApiProposalsCompatible', () => {
442
assert.strictEqual(areApiProposalsCompatible([]), true);
443
assert.strictEqual(areApiProposalsCompatible([], ['hello']), true);
444
assert.strictEqual(areApiProposalsCompatible([], {}), true);
445
assert.strictEqual(areApiProposalsCompatible(['proposal1'], {}), true);
446
assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal1': { proposal: '' } }), true);
447
assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal1': { proposal: '', version: 1 } }), true);
448
assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '', version: 1 } }), true);
449
assert.strictEqual(areApiProposalsCompatible(['proposal1'], { 'proposal2': { proposal: '' } }), true);
450
assert.strictEqual(areApiProposalsCompatible(['proposal1', 'proposal2'], {}), true);
451
assert.strictEqual(areApiProposalsCompatible(['proposal1', 'proposal2'], { 'proposal1': { proposal: '' } }), true);
452
453
assert.strictEqual(areApiProposalsCompatible(['proposal2@1'], { 'proposal1': { proposal: '' } }), false);
454
assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '', version: 2 } }), false);
455
assert.strictEqual(areApiProposalsCompatible(['proposal1@1'], { 'proposal1': { proposal: '' } }), false);
456
});
457
458
});
459
460