3 var tap = require('tap');
5 var semver = require('../semver.js');
13 var satisfies = semver.satisfies;
14 var validRange = semver.validRange;
16 var diff = semver.diff;
17 var replaceStars = semver.replaceStars;
18 var toComparators = semver.toComparators;
19 var SemVer = semver.SemVer;
20 var Range = semver.Range;
22 test('\ncomparison tests', function(t) {
23 // [version1, version2]
24 // version1 should be greater than version2
25 [['0.0.0', '0.0.0-foo'],
31 ['v0.0.0', '0.0.0-foo', true],
32 ['v0.0.1', '0.0.0', true],
33 ['v1.0.0', '0.9.9', true],
34 ['v0.10.0', '0.9.0', true],
35 ['v0.99.0', '0.10.0', true],
36 ['v2.0.0', '1.2.3', true],
37 ['0.0.0', 'v0.0.0-foo', true],
38 ['0.0.1', 'v0.0.0', true],
39 ['1.0.0', 'v0.9.9', true],
40 ['0.10.0', 'v0.9.0', true],
41 ['0.99.0', 'v0.10.0', true],
42 ['2.0.0', 'v1.2.3', true],
43 ['1.2.3', '1.2.3-asdf'],
45 ['1.2.3', '1.2.3-4-foo'],
46 ['1.2.3-5-foo', '1.2.3-5'],
47 ['1.2.3-5', '1.2.3-4'],
48 ['1.2.3-5-foo', '1.2.3-5-Foo'],
49 ['3.0.0', '2.7.2+asdf'],
50 ['1.2.3-a.10', '1.2.3-a.5'],
51 ['1.2.3-a.b', '1.2.3-a.5'],
52 ['1.2.3-a.b', '1.2.3-a'],
53 ['1.2.3-a.b.c.10.d.5', '1.2.3-a.b.c.5.d.100'],
54 ['1.2.3-r2', '1.2.3-r100'],
55 ['1.2.3-r100', '1.2.3-R2']
56 ].forEach(function(v) {
60 t.ok(gt(v0, v1, loose), "gt('" + v0 + "', '" + v1 + "')");
61 t.ok(lt(v1, v0, loose), "lt('" + v1 + "', '" + v0 + "')");
62 t.ok(!gt(v1, v0, loose), "!gt('" + v1 + "', '" + v0 + "')");
63 t.ok(!lt(v0, v1, loose), "!lt('" + v0 + "', '" + v1 + "')");
64 t.ok(eq(v0, v0, loose), "eq('" + v0 + "', '" + v0 + "')");
65 t.ok(eq(v1, v1, loose), "eq('" + v1 + "', '" + v1 + "')");
66 t.ok(neq(v0, v1, loose), "neq('" + v0 + "', '" + v1 + "')");
67 t.ok(cmp(v1, '==', v1, loose), "cmp('" + v1 + "' == '" + v1 + "')");
68 t.ok(cmp(v0, '>=', v1, loose), "cmp('" + v0 + "' >= '" + v1 + "')");
69 t.ok(cmp(v1, '<=', v0, loose), "cmp('" + v1 + "' <= '" + v0 + "')");
70 t.ok(cmp(v0, '!=', v1, loose), "cmp('" + v0 + "' != '" + v1 + "')");
75 test('\nequality tests', function(t) {
76 // [version1, version2]
77 // version1 should be equivalent to version2
78 [['1.2.3', 'v1.2.3', true],
79 ['1.2.3', '=1.2.3', true],
80 ['1.2.3', 'v 1.2.3', true],
81 ['1.2.3', '= 1.2.3', true],
82 ['1.2.3', ' v1.2.3', true],
83 ['1.2.3', ' =1.2.3', true],
84 ['1.2.3', ' v 1.2.3', true],
85 ['1.2.3', ' = 1.2.3', true],
86 ['1.2.3-0', 'v1.2.3-0', true],
87 ['1.2.3-0', '=1.2.3-0', true],
88 ['1.2.3-0', 'v 1.2.3-0', true],
89 ['1.2.3-0', '= 1.2.3-0', true],
90 ['1.2.3-0', ' v1.2.3-0', true],
91 ['1.2.3-0', ' =1.2.3-0', true],
92 ['1.2.3-0', ' v 1.2.3-0', true],
93 ['1.2.3-0', ' = 1.2.3-0', true],
94 ['1.2.3-1', 'v1.2.3-1', true],
95 ['1.2.3-1', '=1.2.3-1', true],
96 ['1.2.3-1', 'v 1.2.3-1', true],
97 ['1.2.3-1', '= 1.2.3-1', true],
98 ['1.2.3-1', ' v1.2.3-1', true],
99 ['1.2.3-1', ' =1.2.3-1', true],
100 ['1.2.3-1', ' v 1.2.3-1', true],
101 ['1.2.3-1', ' = 1.2.3-1', true],
102 ['1.2.3-beta', 'v1.2.3-beta', true],
103 ['1.2.3-beta', '=1.2.3-beta', true],
104 ['1.2.3-beta', 'v 1.2.3-beta', true],
105 ['1.2.3-beta', '= 1.2.3-beta', true],
106 ['1.2.3-beta', ' v1.2.3-beta', true],
107 ['1.2.3-beta', ' =1.2.3-beta', true],
108 ['1.2.3-beta', ' v 1.2.3-beta', true],
109 ['1.2.3-beta', ' = 1.2.3-beta', true],
110 ['1.2.3-beta+build', ' = 1.2.3-beta+otherbuild', true],
111 ['1.2.3+build', ' = 1.2.3+otherbuild', true],
112 ['1.2.3-beta+build', '1.2.3-beta+otherbuild'],
113 ['1.2.3+build', '1.2.3+otherbuild'],
114 [' v1.2.3+build', '1.2.3+otherbuild']
115 ].forEach(function(v) {
119 t.ok(eq(v0, v1, loose), "eq('" + v0 + "', '" + v1 + "')");
120 t.ok(!neq(v0, v1, loose), "!neq('" + v0 + "', '" + v1 + "')");
121 t.ok(cmp(v0, '==', v1, loose), 'cmp(' + v0 + '==' + v1 + ')');
122 t.ok(!cmp(v0, '!=', v1, loose), '!cmp(' + v0 + '!=' + v1 + ')');
123 t.ok(!cmp(v0, '===', v1, loose), '!cmp(' + v0 + '===' + v1 + ')');
124 t.ok(cmp(v0, '!==', v1, loose), 'cmp(' + v0 + '!==' + v1 + ')');
125 t.ok(!gt(v0, v1, loose), "!gt('" + v0 + "', '" + v1 + "')");
126 t.ok(gte(v0, v1, loose), "gte('" + v0 + "', '" + v1 + "')");
127 t.ok(!lt(v0, v1, loose), "!lt('" + v0 + "', '" + v1 + "')");
128 t.ok(lte(v0, v1, loose), "lte('" + v0 + "', '" + v1 + "')");
134 test('\nrange tests', function(t) {
136 // version should be included by range
137 [['1.0.0 - 2.0.0', '1.2.3'],
138 ['^1.2.3+build', '1.2.3'],
139 ['^1.2.3+build', '1.3.0'],
140 ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '1.2.3'],
141 ['1.2.3pre+asdf - 2.4.3-pre+asdf', '1.2.3', true],
142 ['1.2.3-pre+asdf - 2.4.3pre+asdf', '1.2.3', true],
143 ['1.2.3pre+asdf - 2.4.3pre+asdf', '1.2.3', true],
144 ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '1.2.3-pre.2'],
145 ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '2.4.3-alpha'],
146 ['1.2.3+asdf - 2.4.3+asdf', '1.2.3'],
151 ['*', 'v1.2.3', true],
152 ['>=1.0.0', '1.0.0'],
153 ['>=1.0.0', '1.0.1'],
154 ['>=1.0.0', '1.1.0'],
157 ['<=2.0.0', '2.0.0'],
158 ['<=2.0.0', '1.9999.9999'],
159 ['<=2.0.0', '0.2.9'],
160 ['<2.0.0', '1.9999.9999'],
162 ['>= 1.0.0', '1.0.0'],
163 ['>= 1.0.0', '1.0.1'],
164 ['>= 1.0.0', '1.1.0'],
165 ['> 1.0.0', '1.0.1'],
166 ['> 1.0.0', '1.1.0'],
167 ['<= 2.0.0', '2.0.0'],
168 ['<= 2.0.0', '1.9999.9999'],
169 ['<= 2.0.0', '0.2.9'],
170 ['< 2.0.0', '1.9999.9999'],
171 ['<\t2.0.0', '0.2.9'],
172 ['>=0.1.97', 'v0.1.97', true],
173 ['>=0.1.97', '0.1.97'],
174 ['0.1.20 || 1.2.4', '1.2.4'],
175 ['>=0.2.3 || <0.0.1', '0.0.0'],
176 ['>=0.2.3 || <0.0.1', '0.2.3'],
177 ['>=0.2.3 || <0.0.1', '0.2.4'],
181 ['1.2.x || 2.x', '2.1.3'],
182 ['1.2.x || 2.x', '1.2.3'],
186 ['1.2.* || 2.*', '2.1.3'],
187 ['1.2.* || 2.*', '1.2.3'],
191 ['~2.4', '2.4.0'], // >=2.4.0 <2.5.0
193 ['~>3.2.1', '3.2.2'], // >=3.2.1 <3.3.0,
194 ['~1', '1.2.3'], // >=1.0.0 <2.0.0
197 ['~1.0', '1.0.2'], // >=1.0.0 <1.1.0,
199 ['~ 1.0.3', '1.0.12'],
204 ['~v0.5.4-pre', '0.5.5'],
205 ['~v0.5.4-pre', '0.5.4'],
207 ['<=0.7.x', '0.7.2'],
208 ['>=0.7.x', '0.7.2'],
209 ['<=0.7.x', '0.6.2'],
210 ['~1.2.1 >=1.2.3', '1.2.3'],
211 ['~1.2.1 =1.2.3', '1.2.3'],
212 ['~1.2.1 1.2.3', '1.2.3'],
213 ['~1.2.1 >=1.2.3 1.2.3', '1.2.3'],
214 ['~1.2.1 1.2.3 >=1.2.3', '1.2.3'],
215 ['~1.2.1 1.2.3', '1.2.3'],
216 ['>=1.2.1 1.2.3', '1.2.3'],
217 ['1.2.3 >=1.2.1', '1.2.3'],
218 ['>=1.2.3 >=1.2.1', '1.2.3'],
219 ['>=1.2.1 >=1.2.3', '1.2.3'],
225 ['^1.2 ^1', '1.4.2'],
226 ['^1.2.3-alpha', '1.2.3-pre'],
227 ['^1.2.0-alpha', '1.2.0-pre'],
228 ['^0.0.1-alpha', '0.0.1-beta']
229 ].forEach(function(v) {
233 t.ok(satisfies(ver, range, loose), range + ' satisfied by ' + ver);
238 test('\nnegative range tests', function(t) {
240 // version should not be included by range
241 [['1.0.0 - 2.0.0', '2.2.3'],
242 ['1.2.3+asdf - 2.4.3+asdf', '1.2.3-pre.2'],
243 ['1.2.3+asdf - 2.4.3+asdf', '2.4.3-alpha'],
244 ['^1.2.3+build', '2.0.0'],
245 ['^1.2.3+build', '1.2.0'],
246 ['^1.2.3', '1.2.3-pre'],
247 ['^1.2', '1.2.0-pre'],
248 ['>1.2', '1.3.0-beta'],
249 ['<=1.2.3', '1.2.3-beta'],
250 ['^1.2.3', '1.2.3-beta'],
251 ['=0.7.x', '0.7.0-asdf'],
252 ['>=0.7.x', '0.7.0-asdf'],
253 ['1', '1.0.0beta', true],
254 ['<1', '1.0.0beta', true],
255 ['< 1', '1.0.0beta', true],
257 ['>=1.0.0', '0.0.0'],
258 ['>=1.0.0', '0.0.1'],
259 ['>=1.0.0', '0.1.0'],
262 ['<=2.0.0', '3.0.0'],
263 ['<=2.0.0', '2.9999.9999'],
264 ['<=2.0.0', '2.2.9'],
265 ['<2.0.0', '2.9999.9999'],
267 ['>=0.1.97', 'v0.1.93', true],
268 ['>=0.1.97', '0.1.93'],
269 ['0.1.20 || 1.2.4', '1.2.3'],
270 ['>=0.2.3 || <0.0.1', '0.0.3'],
271 ['>=0.2.3 || <0.0.1', '0.2.2'],
275 ['1.2.x || 2.x', '3.1.3'],
276 ['1.2.x || 2.x', '1.1.3'],
280 ['1.2.* || 2.*', '3.1.3'],
281 ['1.2.* || 2.*', '1.1.3'],
284 ['~2.4', '2.5.0'], // >=2.4.0 <2.5.0
286 ['~>3.2.1', '3.3.2'], // >=3.2.1 <3.3.0
287 ['~>3.2.1', '3.2.0'], // >=3.2.1 <3.3.0
288 ['~1', '0.2.3'], // >=1.0.0 <2.0.0
290 ['~1.0', '1.1.0'], // >=1.0.0 <1.1.0
293 ['1', '2.0.0beta', true],
294 ['~v0.5.4-beta', '0.5.4-alpha'],
296 ['>=0.7.x', '0.6.2'],
298 ['<1.2.3', '1.2.3-beta'],
299 ['=1.2.3', '1.2.3-beta'],
301 ['^1.2.3', '2.0.0-alpha'],
304 ['*', 'v1.2.3-foo', true],
305 // invalid ranges never satisfied!
307 ['git+https://user:password0123@github.com/foo', '123.0.0', true],
308 ['^1.2.3', '2.0.0-pre']
309 ].forEach(function(v) {
313 var found = satisfies(ver, range, loose);
314 t.ok(!found, ver + ' not satisfied by ' + range);
319 test('\nincrement versions test', function(t) {
320 // [version, inc, result, identifier]
321 // inc(version, inc) -> result
322 [['1.2.3', 'major', '2.0.0'],
323 ['1.2.3', 'minor', '1.3.0'],
324 ['1.2.3', 'patch', '1.2.4'],
325 ['1.2.3tag', 'major', '2.0.0', true],
326 ['1.2.3-tag', 'major', '2.0.0'],
327 ['1.2.3', 'fake', null],
328 ['1.2.0-0', 'patch', '1.2.0'],
329 ['fake', 'major', null],
330 ['1.2.3-4', 'major', '2.0.0'],
331 ['1.2.3-4', 'minor', '1.3.0'],
332 ['1.2.3-4', 'patch', '1.2.3'],
333 ['1.2.3-alpha.0.beta', 'major', '2.0.0'],
334 ['1.2.3-alpha.0.beta', 'minor', '1.3.0'],
335 ['1.2.3-alpha.0.beta', 'patch', '1.2.3'],
336 ['1.2.4', 'prerelease', '1.2.5-0'],
337 ['1.2.3-0', 'prerelease', '1.2.3-1'],
338 ['1.2.3-alpha.0', 'prerelease', '1.2.3-alpha.1'],
339 ['1.2.3-alpha.1', 'prerelease', '1.2.3-alpha.2'],
340 ['1.2.3-alpha.2', 'prerelease', '1.2.3-alpha.3'],
341 ['1.2.3-alpha.0.beta', 'prerelease', '1.2.3-alpha.1.beta'],
342 ['1.2.3-alpha.1.beta', 'prerelease', '1.2.3-alpha.2.beta'],
343 ['1.2.3-alpha.2.beta', 'prerelease', '1.2.3-alpha.3.beta'],
344 ['1.2.3-alpha.10.0.beta', 'prerelease', '1.2.3-alpha.10.1.beta'],
345 ['1.2.3-alpha.10.1.beta', 'prerelease', '1.2.3-alpha.10.2.beta'],
346 ['1.2.3-alpha.10.2.beta', 'prerelease', '1.2.3-alpha.10.3.beta'],
347 ['1.2.3-alpha.10.beta.0', 'prerelease', '1.2.3-alpha.10.beta.1'],
348 ['1.2.3-alpha.10.beta.1', 'prerelease', '1.2.3-alpha.10.beta.2'],
349 ['1.2.3-alpha.10.beta.2', 'prerelease', '1.2.3-alpha.10.beta.3'],
350 ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta'],
351 ['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta'],
352 ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta'],
353 ['1.2.0', 'prepatch', '1.2.1-0'],
354 ['1.2.0-1', 'prepatch', '1.2.1-0'],
355 ['1.2.0', 'preminor', '1.3.0-0'],
356 ['1.2.3-1', 'preminor', '1.3.0-0'],
357 ['1.2.0', 'premajor', '2.0.0-0'],
358 ['1.2.3-1', 'premajor', '2.0.0-0'],
359 ['1.2.0-1', 'minor', '1.2.0'],
360 ['1.0.0-1', 'major', '1.0.0'],
362 ['1.2.3', 'major', '2.0.0', false, 'dev'],
363 ['1.2.3', 'minor', '1.3.0', false, 'dev'],
364 ['1.2.3', 'patch', '1.2.4', false, 'dev'],
365 ['1.2.3tag', 'major', '2.0.0', true, 'dev'],
366 ['1.2.3-tag', 'major', '2.0.0', false, 'dev'],
367 ['1.2.3', 'fake', null, false, 'dev'],
368 ['1.2.0-0', 'patch', '1.2.0', false, 'dev'],
369 ['fake', 'major', null, false, 'dev'],
370 ['1.2.3-4', 'major', '2.0.0', false, 'dev'],
371 ['1.2.3-4', 'minor', '1.3.0', false, 'dev'],
372 ['1.2.3-4', 'patch', '1.2.3', false, 'dev'],
373 ['1.2.3-alpha.0.beta', 'major', '2.0.0', false, 'dev'],
374 ['1.2.3-alpha.0.beta', 'minor', '1.3.0', false, 'dev'],
375 ['1.2.3-alpha.0.beta', 'patch', '1.2.3', false, 'dev'],
376 ['1.2.4', 'prerelease', '1.2.5-dev.0', false, 'dev'],
377 ['1.2.3-0', 'prerelease', '1.2.3-dev.0', false, 'dev'],
378 ['1.2.3-alpha.0', 'prerelease', '1.2.3-dev.0', false, 'dev'],
379 ['1.2.3-alpha.0', 'prerelease', '1.2.3-alpha.1', false, 'alpha'],
380 ['1.2.3-alpha.0.beta', 'prerelease', '1.2.3-dev.0', false, 'dev'],
381 ['1.2.3-alpha.0.beta', 'prerelease', '1.2.3-alpha.1.beta', false, 'alpha'],
382 ['1.2.3-alpha.10.0.beta', 'prerelease', '1.2.3-dev.0', false, 'dev'],
383 ['1.2.3-alpha.10.0.beta', 'prerelease', '1.2.3-alpha.10.1.beta', false, 'alpha'],
384 ['1.2.3-alpha.10.1.beta', 'prerelease', '1.2.3-alpha.10.2.beta', false, 'alpha'],
385 ['1.2.3-alpha.10.2.beta', 'prerelease', '1.2.3-alpha.10.3.beta', false, 'alpha'],
386 ['1.2.3-alpha.10.beta.0', 'prerelease', '1.2.3-dev.0', false, 'dev'],
387 ['1.2.3-alpha.10.beta.0', 'prerelease', '1.2.3-alpha.10.beta.1', false, 'alpha'],
388 ['1.2.3-alpha.10.beta.1', 'prerelease', '1.2.3-alpha.10.beta.2', false, 'alpha'],
389 ['1.2.3-alpha.10.beta.2', 'prerelease', '1.2.3-alpha.10.beta.3', false, 'alpha'],
390 ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-dev.0', false, 'dev'],
391 ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta', false, 'alpha'],
392 ['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta', false, 'alpha'],
393 ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta', false, 'alpha'],
394 ['1.2.0', 'prepatch', '1.2.1-dev.0', false, 'dev'],
395 ['1.2.0-1', 'prepatch', '1.2.1-dev.0', false, 'dev'],
396 ['1.2.0', 'preminor', '1.3.0-dev.0', false, 'dev'],
397 ['1.2.3-1', 'preminor', '1.3.0-dev.0', false, 'dev'],
398 ['1.2.0', 'premajor', '2.0.0-dev.0', false, 'dev'],
399 ['1.2.3-1', 'premajor', '2.0.0-dev.0', false, 'dev'],
400 ['1.2.0-1', 'minor', '1.2.0', false, 'dev'],
401 ['1.0.0-1', 'major', '1.0.0', false, 'dev'],
402 ['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.0', false, 'dev']
404 ].forEach(function(v) {
410 var found = inc(pre, what, loose, id);
411 var cmd = 'inc(' + pre + ', ' + what + ', ' + id + ')';
412 t.equal(found, wanted, cmd + ' === ' + wanted);
414 var parsed = semver.parse(pre, loose);
416 parsed.inc(what, id);
417 t.equal(parsed.version, wanted, cmd + ' object version updated');
418 t.equal(parsed.raw, wanted, cmd + ' object raw field updated');
420 t.throws(function () {
424 t.equal(parsed, null)
431 test('\ndiff versions test', function(t) {
432 // [version1, version2, result]
433 // diff(version1, version2) -> result
434 [['1.2.3', '0.2.3', 'major'],
435 ['1.4.5', '0.2.3', 'major'],
436 ['1.2.3', '2.0.0-pre', 'premajor'],
437 ['1.2.3', '1.3.3', 'minor'],
438 ['1.0.1', '1.1.0-pre', 'preminor'],
439 ['1.2.3', '1.2.4', 'patch'],
440 ['1.2.3', '1.2.4-pre', 'prepatch'],
441 ['0.0.1', '0.0.1-pre', 'prerelease'],
442 ['0.0.1', '0.0.1-pre-2', 'prerelease'],
443 ['1.1.0', '1.1.0-pre', 'prerelease'],
444 ['1.1.0-pre-1', '1.1.0-pre-2', 'prerelease'],
445 ['1.0.0', '1.0.0', null]
447 ].forEach(function(v) {
451 var found = diff(version1, version2);
452 var cmd = 'diff(' + version1 + ', ' + version2 + ')';
453 t.equal(found, wanted, cmd + ' === ' + wanted);
459 test('\nvalid range test', function(t) {
461 // validRange(range) -> result
462 // translate ranges into their canonical form
463 [['1.0.0 - 2.0.0', '>=1.0.0 <=2.0.0'],
469 ['>=1.0.0', '>=1.0.0'],
470 ['>1.0.0', '>1.0.0'],
471 ['<=2.0.0', '<=2.0.0'],
472 ['1', '>=1.0.0 <2.0.0'],
473 ['<=2.0.0', '<=2.0.0'],
474 ['<=2.0.0', '<=2.0.0'],
475 ['<2.0.0', '<2.0.0'],
476 ['<2.0.0', '<2.0.0'],
477 ['>= 1.0.0', '>=1.0.0'],
478 ['>= 1.0.0', '>=1.0.0'],
479 ['>= 1.0.0', '>=1.0.0'],
480 ['> 1.0.0', '>1.0.0'],
481 ['> 1.0.0', '>1.0.0'],
482 ['<= 2.0.0', '<=2.0.0'],
483 ['<= 2.0.0', '<=2.0.0'],
484 ['<= 2.0.0', '<=2.0.0'],
485 ['< 2.0.0', '<2.0.0'],
486 ['< 2.0.0', '<2.0.0'],
487 ['>=0.1.97', '>=0.1.97'],
488 ['>=0.1.97', '>=0.1.97'],
489 ['0.1.20 || 1.2.4', '0.1.20||1.2.4'],
490 ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'],
491 ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'],
492 ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'],
494 ['2.x.x', '>=2.0.0 <3.0.0'],
495 ['1.2.x', '>=1.2.0 <1.3.0'],
496 ['1.2.x || 2.x', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'],
497 ['1.2.x || 2.x', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'],
499 ['2.*.*', '>=2.0.0 <3.0.0'],
500 ['1.2.*', '>=1.2.0 <1.3.0'],
501 ['1.2.* || 2.*', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'],
503 ['2', '>=2.0.0 <3.0.0'],
504 ['2.3', '>=2.3.0 <2.4.0'],
505 ['~2.4', '>=2.4.0 <2.5.0'],
506 ['~2.4', '>=2.4.0 <2.5.0'],
507 ['~>3.2.1', '>=3.2.1 <3.3.0'],
508 ['~1', '>=1.0.0 <2.0.0'],
509 ['~>1', '>=1.0.0 <2.0.0'],
510 ['~> 1', '>=1.0.0 <2.0.0'],
511 ['~1.0', '>=1.0.0 <1.1.0'],
512 ['~ 1.0', '>=1.0.0 <1.1.0'],
513 ['^0', '>=0.0.0 <1.0.0'],
514 ['^ 1', '>=1.0.0 <2.0.0'],
515 ['^0.1', '>=0.1.0 <0.2.0'],
516 ['^1.0', '>=1.0.0 <2.0.0'],
517 ['^1.2', '>=1.2.0 <2.0.0'],
518 ['^0.0.1', '>=0.0.1 <0.0.2'],
519 ['^0.0.1-beta', '>=0.0.1-beta <0.0.2'],
520 ['^0.1.2', '>=0.1.2 <0.2.0'],
521 ['^1.2.3', '>=1.2.3 <2.0.0'],
522 ['^1.2.3-beta.4', '>=1.2.3-beta.4 <2.0.0'],
529 ['1', '>=1.0.0 <2.0.0'],
530 ['>01.02.03', '>1.2.3', true],
532 ['~1.2.3beta', '>=1.2.3-beta <1.3.0', true],
533 ['~1.2.3beta', null],
534 ['^ 1.2 ^ 1', '>=1.2.0 <2.0.0 >=1.0.0 <2.0.0']
535 ].forEach(function(v) {
539 var found = validRange(pre, loose);
541 t.equal(found, wanted, 'validRange(' + pre + ') === ' + wanted);
547 test('\ncomparators test', function(t) {
548 // [range, comparators]
549 // turn range into a set of individual comparators
550 [['1.0.0 - 2.0.0', [['>=1.0.0', '<=2.0.0']]],
551 ['1.0.0', [['1.0.0']]],
556 ['>=1.0.0', [['>=1.0.0']]],
557 ['>=1.0.0', [['>=1.0.0']]],
558 ['>=1.0.0', [['>=1.0.0']]],
559 ['>1.0.0', [['>1.0.0']]],
560 ['>1.0.0', [['>1.0.0']]],
561 ['<=2.0.0', [['<=2.0.0']]],
562 ['1', [['>=1.0.0', '<2.0.0']]],
563 ['<=2.0.0', [['<=2.0.0']]],
564 ['<=2.0.0', [['<=2.0.0']]],
565 ['<2.0.0', [['<2.0.0']]],
566 ['<2.0.0', [['<2.0.0']]],
567 ['>= 1.0.0', [['>=1.0.0']]],
568 ['>= 1.0.0', [['>=1.0.0']]],
569 ['>= 1.0.0', [['>=1.0.0']]],
570 ['> 1.0.0', [['>1.0.0']]],
571 ['> 1.0.0', [['>1.0.0']]],
572 ['<= 2.0.0', [['<=2.0.0']]],
573 ['<= 2.0.0', [['<=2.0.0']]],
574 ['<= 2.0.0', [['<=2.0.0']]],
575 ['< 2.0.0', [['<2.0.0']]],
576 ['<\t2.0.0', [['<2.0.0']]],
577 ['>=0.1.97', [['>=0.1.97']]],
578 ['>=0.1.97', [['>=0.1.97']]],
579 ['0.1.20 || 1.2.4', [['0.1.20'], ['1.2.4']]],
580 ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]],
581 ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]],
582 ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]],
583 ['||', [[''], ['']]],
584 ['2.x.x', [['>=2.0.0', '<3.0.0']]],
585 ['1.2.x', [['>=1.2.0', '<1.3.0']]],
586 ['1.2.x || 2.x', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]],
587 ['1.2.x || 2.x', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]],
589 ['2.*.*', [['>=2.0.0', '<3.0.0']]],
590 ['1.2.*', [['>=1.2.0', '<1.3.0']]],
591 ['1.2.* || 2.*', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]],
592 ['1.2.* || 2.*', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]],
594 ['2', [['>=2.0.0', '<3.0.0']]],
595 ['2.3', [['>=2.3.0', '<2.4.0']]],
596 ['~2.4', [['>=2.4.0', '<2.5.0']]],
597 ['~2.4', [['>=2.4.0', '<2.5.0']]],
598 ['~>3.2.1', [['>=3.2.1', '<3.3.0']]],
599 ['~1', [['>=1.0.0', '<2.0.0']]],
600 ['~>1', [['>=1.0.0', '<2.0.0']]],
601 ['~> 1', [['>=1.0.0', '<2.0.0']]],
602 ['~1.0', [['>=1.0.0', '<1.1.0']]],
603 ['~ 1.0', [['>=1.0.0', '<1.1.0']]],
604 ['~ 1.0.3', [['>=1.0.3', '<1.1.0']]],
605 ['~> 1.0.3', [['>=1.0.3', '<1.1.0']]],
606 ['<1', [['<1.0.0']]],
607 ['< 1', [['<1.0.0']]],
608 ['>=1', [['>=1.0.0']]],
609 ['>= 1', [['>=1.0.0']]],
610 ['<1.2', [['<1.2.0']]],
611 ['< 1.2', [['<1.2.0']]],
612 ['1', [['>=1.0.0', '<2.0.0']]],
613 ['1 2', [['>=1.0.0', '<2.0.0', '>=2.0.0', '<3.0.0']]],
614 ['1.2 - 3.4.5', [['>=1.2.0', '<=3.4.5']]],
615 ['1.2.3 - 3.4', [['>=1.2.3', '<3.5.0']]],
616 ['1.2.3 - 3', [['>=1.2.3', '<4.0.0']]],
617 ['>*', [['<0.0.0']]],
619 ].forEach(function(v) {
622 var found = toComparators(v[0]);
623 var jw = JSON.stringify(wanted);
624 t.equivalent(found, wanted, 'toComparators(' + pre + ') === ' + jw);
630 test('\ninvalid version numbers', function(t) {
635 'Infinity.NaN.Infinity'
636 ].forEach(function(v) {
637 t.throws(function() {
639 }, {name:'TypeError', message:'Invalid Version: ' + v});
645 test('\nstrict vs loose version numbers', function(t) {
646 [['=1.2.3', '1.2.3'],
647 ['01.02.03', '1.2.3'],
648 ['1.2.3-beta.01', '1.2.3-beta.1'],
649 [' =1.2.3', '1.2.3'],
650 ['1.2.3foo', '1.2.3-foo']
651 ].forEach(function(v) {
654 t.throws(function() {
657 var lv = new SemVer(loose, true);
658 t.equal(lv.version, strict);
659 t.ok(eq(loose, strict, true));
660 t.throws(function() {
663 t.throws(function() {
664 new SemVer(strict).compare(loose);
670 test('\nstrict vs loose ranges', function(t) {
671 [['>=01.02.03', '>=1.2.3'],
672 ['~1.02.03beta', '>=1.2.3-beta <1.3.0']
673 ].forEach(function(v) {
676 t.throws(function() {
679 t.equal(new Range(loose, true).range, comps);
684 test('\nmax satisfying', function(t) {
685 [[['1.2.3', '1.2.4'], '1.2', '1.2.4'],
686 [['1.2.4', '1.2.3'], '1.2', '1.2.4'],
687 [['1.2.3', '1.2.4', '1.2.5', '1.2.6'], '~1.2.3', '1.2.6'],
688 [['1.1.0', '1.2.0', '1.2.1', '1.3.0', '2.0.0b1', '2.0.0b2', '2.0.0b3', '2.0.0', '2.1.0'], '~2.0.0', '2.0.0', true]
689 ].forEach(function(v) {
694 var actual = semver.maxSatisfying(versions, range, loose);
695 t.equal(actual, expect);