Initial commit
[yaffs-website] / node_modules / semver / test / index.js
1 'use strict';
2
3 var tap = require('tap');
4 var test = tap.test;
5 var semver = require('../semver.js');
6 var eq = semver.eq;
7 var gt = semver.gt;
8 var lt = semver.lt;
9 var neq = semver.neq;
10 var cmp = semver.cmp;
11 var gte = semver.gte;
12 var lte = semver.lte;
13 var satisfies = semver.satisfies;
14 var validRange = semver.validRange;
15 var inc = semver.inc;
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;
21
22 test('\ncomparison tests', function(t) {
23   // [version1, version2]
24   // version1 should be greater than version2
25   [['0.0.0', '0.0.0-foo'],
26     ['0.0.1', '0.0.0'],
27     ['1.0.0', '0.9.9'],
28     ['0.10.0', '0.9.0'],
29     ['0.99.0', '0.10.0'],
30     ['2.0.0', '1.2.3'],
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'],
44     ['1.2.3', '1.2.3-4'],
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) {
57     var v0 = v[0];
58     var v1 = v[1];
59     var loose = v[2];
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 + "')");
71   });
72   t.end();
73 });
74
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) {
116     var v0 = v[0];
117     var v1 = v[1];
118     var loose = v[2];
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 + "')");
129   });
130   t.end();
131 });
132
133
134 test('\nrange tests', function(t) {
135   // [range, version]
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'],
147     ['1.0.0', '1.0.0'],
148     ['>=*', '0.2.4'],
149     ['', '1.0.0'],
150     ['*', '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'],
155     ['>1.0.0', '1.0.1'],
156     ['>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'],
161     ['<2.0.0', '0.2.9'],
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'],
178     ['||', '1.3.4'],
179     ['2.x.x', '2.1.3'],
180     ['1.2.x', '1.2.3'],
181     ['1.2.x || 2.x', '2.1.3'],
182     ['1.2.x || 2.x', '1.2.3'],
183     ['x', '1.2.3'],
184     ['2.*.*', '2.1.3'],
185     ['1.2.*', '1.2.3'],
186     ['1.2.* || 2.*', '2.1.3'],
187     ['1.2.* || 2.*', '1.2.3'],
188     ['*', '1.2.3'],
189     ['2', '2.1.2'],
190     ['2.3', '2.3.1'],
191     ['~2.4', '2.4.0'], // >=2.4.0 <2.5.0
192     ['~2.4', '2.4.5'],
193     ['~>3.2.1', '3.2.2'], // >=3.2.1 <3.3.0,
194     ['~1', '1.2.3'], // >=1.0.0 <2.0.0
195     ['~>1', '1.2.3'],
196     ['~> 1', '1.2.3'],
197     ['~1.0', '1.0.2'], // >=1.0.0 <1.1.0,
198     ['~ 1.0', '1.0.2'],
199     ['~ 1.0.3', '1.0.12'],
200     ['>=1', '1.0.0'],
201     ['>= 1', '1.0.0'],
202     ['<1.2', '1.1.1'],
203     ['< 1.2', '1.1.1'],
204     ['~v0.5.4-pre', '0.5.5'],
205     ['~v0.5.4-pre', '0.5.4'],
206     ['=0.7.x', '0.7.2'],
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'],
220     ['>=1.2', '1.2.8'],
221     ['^1.2.3', '1.8.1'],
222     ['^0.1.2', '0.1.2'],
223     ['^0.1', '0.1.2'],
224     ['^1.2', '1.4.2'],
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) {
230     var range = v[0];
231     var ver = v[1];
232     var loose = v[2];
233     t.ok(satisfies(ver, range, loose), range + ' satisfied by ' + ver);
234   });
235   t.end();
236 });
237
238 test('\nnegative range tests', function(t) {
239   // [range, version]
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],
256     ['1.0.0', '1.0.1'],
257     ['>=1.0.0', '0.0.0'],
258     ['>=1.0.0', '0.0.1'],
259     ['>=1.0.0', '0.1.0'],
260     ['>1.0.0', '0.0.1'],
261     ['>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'],
266     ['<2.0.0', '2.2.9'],
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'],
272     ['2.x.x', '1.1.3'],
273     ['2.x.x', '3.1.3'],
274     ['1.2.x', '1.3.3'],
275     ['1.2.x || 2.x', '3.1.3'],
276     ['1.2.x || 2.x', '1.1.3'],
277     ['2.*.*', '1.1.3'],
278     ['2.*.*', '3.1.3'],
279     ['1.2.*', '1.3.3'],
280     ['1.2.* || 2.*', '3.1.3'],
281     ['1.2.* || 2.*', '1.1.3'],
282     ['2', '1.1.2'],
283     ['2.3', '2.4.1'],
284     ['~2.4', '2.5.0'], // >=2.4.0 <2.5.0
285     ['~2.4', '2.3.9'],
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
289     ['~>1', '2.2.3'],
290     ['~1.0', '1.1.0'], // >=1.0.0 <1.1.0
291     ['<1', '1.0.0'],
292     ['>=1.2', '1.1.1'],
293     ['1', '2.0.0beta', true],
294     ['~v0.5.4-beta', '0.5.4-alpha'],
295     ['=0.7.x', '0.8.2'],
296     ['>=0.7.x', '0.6.2'],
297     ['<0.7.x', '0.7.2'],
298     ['<1.2.3', '1.2.3-beta'],
299     ['=1.2.3', '1.2.3-beta'],
300     ['>1.2', '1.2.8'],
301     ['^1.2.3', '2.0.0-alpha'],
302     ['^1.2.3', '1.2.2'],
303     ['^1.2', '1.1.9'],
304     ['*', 'v1.2.3-foo', true],
305     // invalid ranges never satisfied!
306     ['blerg', '1.2.3'],
307     ['git+https://user:password0123@github.com/foo', '123.0.0', true],
308     ['^1.2.3', '2.0.0-pre']
309   ].forEach(function(v) {
310     var range = v[0];
311     var ver = v[1];
312     var loose = v[2];
313     var found = satisfies(ver, range, loose);
314     t.ok(!found, ver + ' not satisfied by ' + range);
315   });
316   t.end();
317 });
318
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'],
361
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', 'dev'],
395     ['1.2.0-1', 'prepatch', '1.2.1-dev.0', 'dev'],
396     ['1.2.0', 'preminor', '1.3.0-dev.0', 'dev'],
397     ['1.2.3-1', 'preminor', '1.3.0-dev.0', 'dev'],
398     ['1.2.0', 'premajor', '2.0.0-dev.0', 'dev'],
399     ['1.2.3-1', 'premajor', '2.0.0-dev.0', 'dev'],
400     ['1.2.0-1', 'minor', '1.2.0', 'dev'],
401     ['1.0.0-1', 'major', '1.0.0', 'dev'],
402     ['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.0', false, 'dev']
403
404   ].forEach(function(v) {
405     var pre = v[0];
406     var what = v[1];
407     var wanted = v[2];
408     var loose = v[3];
409     var id = v[4];
410     var found = inc(pre, what, loose, id);
411     var cmd = 'inc(' + pre + ', ' + what + ', ' + id + ')';
412     t.equal(found, wanted, cmd + ' === ' + wanted);
413   });
414
415   t.end();
416 });
417
418 test('\ndiff versions test', function(t) {
419 //  [version1, version2, result]
420 //  diff(version1, version2) -> result
421   [['1.2.3', '0.2.3', 'major'],
422     ['1.4.5', '0.2.3', 'major'],
423     ['1.2.3', '2.0.0-pre', 'premajor'],
424     ['1.2.3', '1.3.3', 'minor'],
425     ['1.0.1', '1.1.0-pre', 'preminor'],
426     ['1.2.3', '1.2.4', 'patch'],
427     ['1.2.3', '1.2.4-pre', 'prepatch'],
428     ['0.0.1', '0.0.1-pre', 'prerelease'],
429     ['0.0.1', '0.0.1-pre-2', 'prerelease'],
430     ['1.1.0', '1.1.0-pre', 'prerelease'],
431     ['1.1.0-pre-1', '1.1.0-pre-2', 'prerelease'],
432     ['1.0.0', '1.0.0', null]
433
434   ].forEach(function(v) {
435     var version1 = v[0];
436     var version2 = v[1];
437     var wanted = v[2];
438     var found = diff(version1, version2);
439     var cmd = 'diff(' + version1 + ', ' + version2 + ')';
440     t.equal(found, wanted, cmd + ' === ' + wanted);
441   });
442
443   t.end();
444 });
445
446 test('\nvalid range test', function(t) {
447   // [range, result]
448   // validRange(range) -> result
449   // translate ranges into their canonical form
450   [['1.0.0 - 2.0.0', '>=1.0.0 <=2.0.0'],
451     ['1.0.0', '1.0.0'],
452     ['>=*', '*'],
453     ['', '*'],
454     ['*', '*'],
455     ['*', '*'],
456     ['>=1.0.0', '>=1.0.0'],
457     ['>1.0.0', '>1.0.0'],
458     ['<=2.0.0', '<=2.0.0'],
459     ['1', '>=1.0.0 <2.0.0'],
460     ['<=2.0.0', '<=2.0.0'],
461     ['<=2.0.0', '<=2.0.0'],
462     ['<2.0.0', '<2.0.0'],
463     ['<2.0.0', '<2.0.0'],
464     ['>= 1.0.0', '>=1.0.0'],
465     ['>=  1.0.0', '>=1.0.0'],
466     ['>=   1.0.0', '>=1.0.0'],
467     ['> 1.0.0', '>1.0.0'],
468     ['>  1.0.0', '>1.0.0'],
469     ['<=   2.0.0', '<=2.0.0'],
470     ['<= 2.0.0', '<=2.0.0'],
471     ['<=  2.0.0', '<=2.0.0'],
472     ['<    2.0.0', '<2.0.0'],
473     ['< 2.0.0', '<2.0.0'],
474     ['>=0.1.97', '>=0.1.97'],
475     ['>=0.1.97', '>=0.1.97'],
476     ['0.1.20 || 1.2.4', '0.1.20||1.2.4'],
477     ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'],
478     ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'],
479     ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'],
480     ['||', '||'],
481     ['2.x.x', '>=2.0.0 <3.0.0'],
482     ['1.2.x', '>=1.2.0 <1.3.0'],
483     ['1.2.x || 2.x', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'],
484     ['1.2.x || 2.x', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'],
485     ['x', '*'],
486     ['2.*.*', '>=2.0.0 <3.0.0'],
487     ['1.2.*', '>=1.2.0 <1.3.0'],
488     ['1.2.* || 2.*', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'],
489     ['*', '*'],
490     ['2', '>=2.0.0 <3.0.0'],
491     ['2.3', '>=2.3.0 <2.4.0'],
492     ['~2.4', '>=2.4.0 <2.5.0'],
493     ['~2.4', '>=2.4.0 <2.5.0'],
494     ['~>3.2.1', '>=3.2.1 <3.3.0'],
495     ['~1', '>=1.0.0 <2.0.0'],
496     ['~>1', '>=1.0.0 <2.0.0'],
497     ['~> 1', '>=1.0.0 <2.0.0'],
498     ['~1.0', '>=1.0.0 <1.1.0'],
499     ['~ 1.0', '>=1.0.0 <1.1.0'],
500     ['^0', '>=0.0.0 <1.0.0'],
501     ['^ 1', '>=1.0.0 <2.0.0'],
502     ['^0.1', '>=0.1.0 <0.2.0'],
503     ['^1.0', '>=1.0.0 <2.0.0'],
504     ['^1.2', '>=1.2.0 <2.0.0'],
505     ['^0.0.1', '>=0.0.1 <0.0.2'],
506     ['^0.0.1-beta', '>=0.0.1-beta <0.0.2'],
507     ['^0.1.2', '>=0.1.2 <0.2.0'],
508     ['^1.2.3', '>=1.2.3 <2.0.0'],
509     ['^1.2.3-beta.4', '>=1.2.3-beta.4 <2.0.0'],
510     ['<1', '<1.0.0'],
511     ['< 1', '<1.0.0'],
512     ['>=1', '>=1.0.0'],
513     ['>= 1', '>=1.0.0'],
514     ['<1.2', '<1.2.0'],
515     ['< 1.2', '<1.2.0'],
516     ['1', '>=1.0.0 <2.0.0'],
517     ['>01.02.03', '>1.2.3', true],
518     ['>01.02.03', null],
519     ['~1.2.3beta', '>=1.2.3-beta <1.3.0', true],
520     ['~1.2.3beta', null],
521     ['^ 1.2 ^ 1', '>=1.2.0 <2.0.0 >=1.0.0 <2.0.0']
522   ].forEach(function(v) {
523     var pre = v[0];
524     var wanted = v[1];
525     var loose = v[2];
526     var found = validRange(pre, loose);
527
528     t.equal(found, wanted, 'validRange(' + pre + ') === ' + wanted);
529   });
530
531   t.end();
532 });
533
534 test('\ncomparators test', function(t) {
535   // [range, comparators]
536   // turn range into a set of individual comparators
537   [['1.0.0 - 2.0.0', [['>=1.0.0', '<=2.0.0']]],
538     ['1.0.0', [['1.0.0']]],
539     ['>=*', [['']]],
540     ['', [['']]],
541     ['*', [['']]],
542     ['*', [['']]],
543     ['>=1.0.0', [['>=1.0.0']]],
544     ['>=1.0.0', [['>=1.0.0']]],
545     ['>=1.0.0', [['>=1.0.0']]],
546     ['>1.0.0', [['>1.0.0']]],
547     ['>1.0.0', [['>1.0.0']]],
548     ['<=2.0.0', [['<=2.0.0']]],
549     ['1', [['>=1.0.0', '<2.0.0']]],
550     ['<=2.0.0', [['<=2.0.0']]],
551     ['<=2.0.0', [['<=2.0.0']]],
552     ['<2.0.0', [['<2.0.0']]],
553     ['<2.0.0', [['<2.0.0']]],
554     ['>= 1.0.0', [['>=1.0.0']]],
555     ['>=  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     ['<=   2.0.0', [['<=2.0.0']]],
560     ['<= 2.0.0', [['<=2.0.0']]],
561     ['<=  2.0.0', [['<=2.0.0']]],
562     ['<    2.0.0', [['<2.0.0']]],
563     ['<\t2.0.0', [['<2.0.0']]],
564     ['>=0.1.97', [['>=0.1.97']]],
565     ['>=0.1.97', [['>=0.1.97']]],
566     ['0.1.20 || 1.2.4', [['0.1.20'], ['1.2.4']]],
567     ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]],
568     ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]],
569     ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]],
570     ['||', [[''], ['']]],
571     ['2.x.x', [['>=2.0.0', '<3.0.0']]],
572     ['1.2.x', [['>=1.2.0', '<1.3.0']]],
573     ['1.2.x || 2.x', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]],
574     ['1.2.x || 2.x', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]],
575     ['x', [['']]],
576     ['2.*.*', [['>=2.0.0', '<3.0.0']]],
577     ['1.2.*', [['>=1.2.0', '<1.3.0']]],
578     ['1.2.* || 2.*', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]],
579     ['1.2.* || 2.*', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]],
580     ['*', [['']]],
581     ['2', [['>=2.0.0', '<3.0.0']]],
582     ['2.3', [['>=2.3.0', '<2.4.0']]],
583     ['~2.4', [['>=2.4.0', '<2.5.0']]],
584     ['~2.4', [['>=2.4.0', '<2.5.0']]],
585     ['~>3.2.1', [['>=3.2.1', '<3.3.0']]],
586     ['~1', [['>=1.0.0', '<2.0.0']]],
587     ['~>1', [['>=1.0.0', '<2.0.0']]],
588     ['~> 1', [['>=1.0.0', '<2.0.0']]],
589     ['~1.0', [['>=1.0.0', '<1.1.0']]],
590     ['~ 1.0', [['>=1.0.0', '<1.1.0']]],
591     ['~ 1.0.3', [['>=1.0.3', '<1.1.0']]],
592     ['~> 1.0.3', [['>=1.0.3', '<1.1.0']]],
593     ['<1', [['<1.0.0']]],
594     ['< 1', [['<1.0.0']]],
595     ['>=1', [['>=1.0.0']]],
596     ['>= 1', [['>=1.0.0']]],
597     ['<1.2', [['<1.2.0']]],
598     ['< 1.2', [['<1.2.0']]],
599     ['1', [['>=1.0.0', '<2.0.0']]],
600     ['1 2', [['>=1.0.0', '<2.0.0', '>=2.0.0', '<3.0.0']]],
601     ['1.2 - 3.4.5', [['>=1.2.0', '<=3.4.5']]],
602     ['1.2.3 - 3.4', [['>=1.2.3', '<3.5.0']]],
603     ['1.2.3 - 3', [['>=1.2.3', '<4.0.0']]],
604     ['>*', [['<0.0.0']]],
605     ['<*', [['<0.0.0']]]
606   ].forEach(function(v) {
607     var pre = v[0];
608     var wanted = v[1];
609     var found = toComparators(v[0]);
610     var jw = JSON.stringify(wanted);
611     t.equivalent(found, wanted, 'toComparators(' + pre + ') === ' + jw);
612   });
613
614   t.end();
615 });
616
617 test('\ninvalid version numbers', function(t) {
618   ['1.2.3.4',
619    'NOT VALID',
620    1.2,
621    null,
622    'Infinity.NaN.Infinity'
623   ].forEach(function(v) {
624     t.throws(function() {
625       new SemVer(v);
626     }, {name:'TypeError', message:'Invalid Version: ' + v});
627   });
628
629   t.end();
630 });
631
632 test('\nstrict vs loose version numbers', function(t) {
633   [['=1.2.3', '1.2.3'],
634     ['01.02.03', '1.2.3'],
635     ['1.2.3-beta.01', '1.2.3-beta.1'],
636     ['   =1.2.3', '1.2.3'],
637     ['1.2.3foo', '1.2.3-foo']
638   ].forEach(function(v) {
639     var loose = v[0];
640     var strict = v[1];
641     t.throws(function() {
642       new SemVer(loose);
643     });
644     var lv = new SemVer(loose, true);
645     t.equal(lv.version, strict);
646     t.ok(eq(loose, strict, true));
647     t.throws(function() {
648       eq(loose, strict);
649     });
650     t.throws(function() {
651       new SemVer(strict).compare(loose);
652     });
653   });
654   t.end();
655 });
656
657 test('\nstrict vs loose ranges', function(t) {
658   [['>=01.02.03', '>=1.2.3'],
659     ['~1.02.03beta', '>=1.2.3-beta <1.3.0']
660   ].forEach(function(v) {
661     var loose = v[0];
662     var comps = v[1];
663     t.throws(function() {
664       new Range(loose);
665     });
666     t.equal(new Range(loose, true).range, comps);
667   });
668   t.end();
669 });
670
671 test('\nmax satisfying', function(t) {
672   [[['1.2.3', '1.2.4'], '1.2', '1.2.4'],
673     [['1.2.4', '1.2.3'], '1.2', '1.2.4'],
674     [['1.2.3', '1.2.4', '1.2.5', '1.2.6'], '~1.2.3', '1.2.6'],
675     [['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]
676   ].forEach(function(v) {
677     var versions = v[0];
678     var range = v[1];
679     var expect = v[2];
680     var loose = v[3];
681     var actual = semver.maxSatisfying(versions, range, loose);
682     t.equal(actual, expect);
683   });
684   t.end();
685 });