| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685 | 'use strict';var tap = require('tap');var test = tap.test;var semver = require('../semver.js');var eq = semver.eq;var gt = semver.gt;var lt = semver.lt;var neq = semver.neq;var cmp = semver.cmp;var gte = semver.gte;var lte = semver.lte;var satisfies = semver.satisfies;var validRange = semver.validRange;var inc = semver.inc;var diff = semver.diff;var replaceStars = semver.replaceStars;var toComparators = semver.toComparators;var SemVer = semver.SemVer;var Range = semver.Range;test('\ncomparison tests', function(t) {  // [version1, version2]  // version1 should be greater than version2  [['0.0.0', '0.0.0-foo'],    ['0.0.1', '0.0.0'],    ['1.0.0', '0.9.9'],    ['0.10.0', '0.9.0'],    ['0.99.0', '0.10.0'],    ['2.0.0', '1.2.3'],    ['v0.0.0', '0.0.0-foo', true],    ['v0.0.1', '0.0.0', true],    ['v1.0.0', '0.9.9', true],    ['v0.10.0', '0.9.0', true],    ['v0.99.0', '0.10.0', true],    ['v2.0.0', '1.2.3', true],    ['0.0.0', 'v0.0.0-foo', true],    ['0.0.1', 'v0.0.0', true],    ['1.0.0', 'v0.9.9', true],    ['0.10.0', 'v0.9.0', true],    ['0.99.0', 'v0.10.0', true],    ['2.0.0', 'v1.2.3', true],    ['1.2.3', '1.2.3-asdf'],    ['1.2.3', '1.2.3-4'],    ['1.2.3', '1.2.3-4-foo'],    ['1.2.3-5-foo', '1.2.3-5'],    ['1.2.3-5', '1.2.3-4'],    ['1.2.3-5-foo', '1.2.3-5-Foo'],    ['3.0.0', '2.7.2+asdf'],    ['1.2.3-a.10', '1.2.3-a.5'],    ['1.2.3-a.b', '1.2.3-a.5'],    ['1.2.3-a.b', '1.2.3-a'],    ['1.2.3-a.b.c.10.d.5', '1.2.3-a.b.c.5.d.100'],    ['1.2.3-r2', '1.2.3-r100'],    ['1.2.3-r100', '1.2.3-R2']  ].forEach(function(v) {    var v0 = v[0];    var v1 = v[1];    var loose = v[2];    t.ok(gt(v0, v1, loose), "gt('" + v0 + "', '" + v1 + "')");    t.ok(lt(v1, v0, loose), "lt('" + v1 + "', '" + v0 + "')");    t.ok(!gt(v1, v0, loose), "!gt('" + v1 + "', '" + v0 + "')");    t.ok(!lt(v0, v1, loose), "!lt('" + v0 + "', '" + v1 + "')");    t.ok(eq(v0, v0, loose), "eq('" + v0 + "', '" + v0 + "')");    t.ok(eq(v1, v1, loose), "eq('" + v1 + "', '" + v1 + "')");    t.ok(neq(v0, v1, loose), "neq('" + v0 + "', '" + v1 + "')");    t.ok(cmp(v1, '==', v1, loose), "cmp('" + v1 + "' == '" + v1 + "')");    t.ok(cmp(v0, '>=', v1, loose), "cmp('" + v0 + "' >= '" + v1 + "')");    t.ok(cmp(v1, '<=', v0, loose), "cmp('" + v1 + "' <= '" + v0 + "')");    t.ok(cmp(v0, '!=', v1, loose), "cmp('" + v0 + "' != '" + v1 + "')");  });  t.end();});test('\nequality tests', function(t) {  // [version1, version2]  // version1 should be equivalent to version2  [['1.2.3', 'v1.2.3', true],    ['1.2.3', '=1.2.3', true],    ['1.2.3', 'v 1.2.3', true],    ['1.2.3', '= 1.2.3', true],    ['1.2.3', ' v1.2.3', true],    ['1.2.3', ' =1.2.3', true],    ['1.2.3', ' v 1.2.3', true],    ['1.2.3', ' = 1.2.3', true],    ['1.2.3-0', 'v1.2.3-0', true],    ['1.2.3-0', '=1.2.3-0', true],    ['1.2.3-0', 'v 1.2.3-0', true],    ['1.2.3-0', '= 1.2.3-0', true],    ['1.2.3-0', ' v1.2.3-0', true],    ['1.2.3-0', ' =1.2.3-0', true],    ['1.2.3-0', ' v 1.2.3-0', true],    ['1.2.3-0', ' = 1.2.3-0', true],    ['1.2.3-1', 'v1.2.3-1', true],    ['1.2.3-1', '=1.2.3-1', true],    ['1.2.3-1', 'v 1.2.3-1', true],    ['1.2.3-1', '= 1.2.3-1', true],    ['1.2.3-1', ' v1.2.3-1', true],    ['1.2.3-1', ' =1.2.3-1', true],    ['1.2.3-1', ' v 1.2.3-1', true],    ['1.2.3-1', ' = 1.2.3-1', true],    ['1.2.3-beta', 'v1.2.3-beta', true],    ['1.2.3-beta', '=1.2.3-beta', true],    ['1.2.3-beta', 'v 1.2.3-beta', true],    ['1.2.3-beta', '= 1.2.3-beta', true],    ['1.2.3-beta', ' v1.2.3-beta', true],    ['1.2.3-beta', ' =1.2.3-beta', true],    ['1.2.3-beta', ' v 1.2.3-beta', true],    ['1.2.3-beta', ' = 1.2.3-beta', true],    ['1.2.3-beta+build', ' = 1.2.3-beta+otherbuild', true],    ['1.2.3+build', ' = 1.2.3+otherbuild', true],    ['1.2.3-beta+build', '1.2.3-beta+otherbuild'],    ['1.2.3+build', '1.2.3+otherbuild'],    ['  v1.2.3+build', '1.2.3+otherbuild']  ].forEach(function(v) {    var v0 = v[0];    var v1 = v[1];    var loose = v[2];    t.ok(eq(v0, v1, loose), "eq('" + v0 + "', '" + v1 + "')");    t.ok(!neq(v0, v1, loose), "!neq('" + v0 + "', '" + v1 + "')");    t.ok(cmp(v0, '==', v1, loose), 'cmp(' + v0 + '==' + v1 + ')');    t.ok(!cmp(v0, '!=', v1, loose), '!cmp(' + v0 + '!=' + v1 + ')');    t.ok(!cmp(v0, '===', v1, loose), '!cmp(' + v0 + '===' + v1 + ')');    t.ok(cmp(v0, '!==', v1, loose), 'cmp(' + v0 + '!==' + v1 + ')');    t.ok(!gt(v0, v1, loose), "!gt('" + v0 + "', '" + v1 + "')");    t.ok(gte(v0, v1, loose), "gte('" + v0 + "', '" + v1 + "')");    t.ok(!lt(v0, v1, loose), "!lt('" + v0 + "', '" + v1 + "')");    t.ok(lte(v0, v1, loose), "lte('" + v0 + "', '" + v1 + "')");  });  t.end();});test('\nrange tests', function(t) {  // [range, version]  // version should be included by range  [['1.0.0 - 2.0.0', '1.2.3'],    ['^1.2.3+build', '1.2.3'],    ['^1.2.3+build', '1.3.0'],    ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '1.2.3'],    ['1.2.3pre+asdf - 2.4.3-pre+asdf', '1.2.3', true],    ['1.2.3-pre+asdf - 2.4.3pre+asdf', '1.2.3', true],    ['1.2.3pre+asdf - 2.4.3pre+asdf', '1.2.3', true],    ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '1.2.3-pre.2'],    ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '2.4.3-alpha'],    ['1.2.3+asdf - 2.4.3+asdf', '1.2.3'],    ['1.0.0', '1.0.0'],    ['>=*', '0.2.4'],    ['', '1.0.0'],    ['*', '1.2.3'],    ['*', 'v1.2.3', true],    ['>=1.0.0', '1.0.0'],    ['>=1.0.0', '1.0.1'],    ['>=1.0.0', '1.1.0'],    ['>1.0.0', '1.0.1'],    ['>1.0.0', '1.1.0'],    ['<=2.0.0', '2.0.0'],    ['<=2.0.0', '1.9999.9999'],    ['<=2.0.0', '0.2.9'],    ['<2.0.0', '1.9999.9999'],    ['<2.0.0', '0.2.9'],    ['>= 1.0.0', '1.0.0'],    ['>=  1.0.0', '1.0.1'],    ['>=   1.0.0', '1.1.0'],    ['> 1.0.0', '1.0.1'],    ['>  1.0.0', '1.1.0'],    ['<=   2.0.0', '2.0.0'],    ['<= 2.0.0', '1.9999.9999'],    ['<=  2.0.0', '0.2.9'],    ['<    2.0.0', '1.9999.9999'],    ['<\t2.0.0', '0.2.9'],    ['>=0.1.97', 'v0.1.97', true],    ['>=0.1.97', '0.1.97'],    ['0.1.20 || 1.2.4', '1.2.4'],    ['>=0.2.3 || <0.0.1', '0.0.0'],    ['>=0.2.3 || <0.0.1', '0.2.3'],    ['>=0.2.3 || <0.0.1', '0.2.4'],    ['||', '1.3.4'],    ['2.x.x', '2.1.3'],    ['1.2.x', '1.2.3'],    ['1.2.x || 2.x', '2.1.3'],    ['1.2.x || 2.x', '1.2.3'],    ['x', '1.2.3'],    ['2.*.*', '2.1.3'],    ['1.2.*', '1.2.3'],    ['1.2.* || 2.*', '2.1.3'],    ['1.2.* || 2.*', '1.2.3'],    ['*', '1.2.3'],    ['2', '2.1.2'],    ['2.3', '2.3.1'],    ['~2.4', '2.4.0'], // >=2.4.0 <2.5.0    ['~2.4', '2.4.5'],    ['~>3.2.1', '3.2.2'], // >=3.2.1 <3.3.0,    ['~1', '1.2.3'], // >=1.0.0 <2.0.0    ['~>1', '1.2.3'],    ['~> 1', '1.2.3'],    ['~1.0', '1.0.2'], // >=1.0.0 <1.1.0,    ['~ 1.0', '1.0.2'],    ['~ 1.0.3', '1.0.12'],    ['>=1', '1.0.0'],    ['>= 1', '1.0.0'],    ['<1.2', '1.1.1'],    ['< 1.2', '1.1.1'],    ['~v0.5.4-pre', '0.5.5'],    ['~v0.5.4-pre', '0.5.4'],    ['=0.7.x', '0.7.2'],    ['<=0.7.x', '0.7.2'],    ['>=0.7.x', '0.7.2'],    ['<=0.7.x', '0.6.2'],    ['~1.2.1 >=1.2.3', '1.2.3'],    ['~1.2.1 =1.2.3', '1.2.3'],    ['~1.2.1 1.2.3', '1.2.3'],    ['~1.2.1 >=1.2.3 1.2.3', '1.2.3'],    ['~1.2.1 1.2.3 >=1.2.3', '1.2.3'],    ['~1.2.1 1.2.3', '1.2.3'],    ['>=1.2.1 1.2.3', '1.2.3'],    ['1.2.3 >=1.2.1', '1.2.3'],    ['>=1.2.3 >=1.2.1', '1.2.3'],    ['>=1.2.1 >=1.2.3', '1.2.3'],    ['>=1.2', '1.2.8'],    ['^1.2.3', '1.8.1'],    ['^0.1.2', '0.1.2'],    ['^0.1', '0.1.2'],    ['^1.2', '1.4.2'],    ['^1.2 ^1', '1.4.2'],    ['^1.2.3-alpha', '1.2.3-pre'],    ['^1.2.0-alpha', '1.2.0-pre'],    ['^0.0.1-alpha', '0.0.1-beta']  ].forEach(function(v) {    var range = v[0];    var ver = v[1];    var loose = v[2];    t.ok(satisfies(ver, range, loose), range + ' satisfied by ' + ver);  });  t.end();});test('\nnegative range tests', function(t) {  // [range, version]  // version should not be included by range  [['1.0.0 - 2.0.0', '2.2.3'],    ['1.2.3+asdf - 2.4.3+asdf', '1.2.3-pre.2'],    ['1.2.3+asdf - 2.4.3+asdf', '2.4.3-alpha'],    ['^1.2.3+build', '2.0.0'],    ['^1.2.3+build', '1.2.0'],    ['^1.2.3', '1.2.3-pre'],    ['^1.2', '1.2.0-pre'],    ['>1.2', '1.3.0-beta'],    ['<=1.2.3', '1.2.3-beta'],    ['^1.2.3', '1.2.3-beta'],    ['=0.7.x', '0.7.0-asdf'],    ['>=0.7.x', '0.7.0-asdf'],    ['1', '1.0.0beta', true],    ['<1', '1.0.0beta', true],    ['< 1', '1.0.0beta', true],    ['1.0.0', '1.0.1'],    ['>=1.0.0', '0.0.0'],    ['>=1.0.0', '0.0.1'],    ['>=1.0.0', '0.1.0'],    ['>1.0.0', '0.0.1'],    ['>1.0.0', '0.1.0'],    ['<=2.0.0', '3.0.0'],    ['<=2.0.0', '2.9999.9999'],    ['<=2.0.0', '2.2.9'],    ['<2.0.0', '2.9999.9999'],    ['<2.0.0', '2.2.9'],    ['>=0.1.97', 'v0.1.93', true],    ['>=0.1.97', '0.1.93'],    ['0.1.20 || 1.2.4', '1.2.3'],    ['>=0.2.3 || <0.0.1', '0.0.3'],    ['>=0.2.3 || <0.0.1', '0.2.2'],    ['2.x.x', '1.1.3'],    ['2.x.x', '3.1.3'],    ['1.2.x', '1.3.3'],    ['1.2.x || 2.x', '3.1.3'],    ['1.2.x || 2.x', '1.1.3'],    ['2.*.*', '1.1.3'],    ['2.*.*', '3.1.3'],    ['1.2.*', '1.3.3'],    ['1.2.* || 2.*', '3.1.3'],    ['1.2.* || 2.*', '1.1.3'],    ['2', '1.1.2'],    ['2.3', '2.4.1'],    ['~2.4', '2.5.0'], // >=2.4.0 <2.5.0    ['~2.4', '2.3.9'],    ['~>3.2.1', '3.3.2'], // >=3.2.1 <3.3.0    ['~>3.2.1', '3.2.0'], // >=3.2.1 <3.3.0    ['~1', '0.2.3'], // >=1.0.0 <2.0.0    ['~>1', '2.2.3'],    ['~1.0', '1.1.0'], // >=1.0.0 <1.1.0    ['<1', '1.0.0'],    ['>=1.2', '1.1.1'],    ['1', '2.0.0beta', true],    ['~v0.5.4-beta', '0.5.4-alpha'],    ['=0.7.x', '0.8.2'],    ['>=0.7.x', '0.6.2'],    ['<0.7.x', '0.7.2'],    ['<1.2.3', '1.2.3-beta'],    ['=1.2.3', '1.2.3-beta'],    ['>1.2', '1.2.8'],    ['^1.2.3', '2.0.0-alpha'],    ['^1.2.3', '1.2.2'],    ['^1.2', '1.1.9'],    ['*', 'v1.2.3-foo', true],    // invalid ranges never satisfied!    ['blerg', '1.2.3'],    ['git+https://user:password0123@github.com/foo', '123.0.0', true],    ['^1.2.3', '2.0.0-pre']  ].forEach(function(v) {    var range = v[0];    var ver = v[1];    var loose = v[2];    var found = satisfies(ver, range, loose);    t.ok(!found, ver + ' not satisfied by ' + range);  });  t.end();});test('\nincrement versions test', function(t) {//  [version, inc, result, identifier]//  inc(version, inc) -> result  [['1.2.3', 'major', '2.0.0'],    ['1.2.3', 'minor', '1.3.0'],    ['1.2.3', 'patch', '1.2.4'],    ['1.2.3tag', 'major', '2.0.0', true],    ['1.2.3-tag', 'major', '2.0.0'],    ['1.2.3', 'fake', null],    ['1.2.0-0', 'patch', '1.2.0'],    ['fake', 'major', null],    ['1.2.3-4', 'major', '2.0.0'],    ['1.2.3-4', 'minor', '1.3.0'],    ['1.2.3-4', 'patch', '1.2.3'],    ['1.2.3-alpha.0.beta', 'major', '2.0.0'],    ['1.2.3-alpha.0.beta', 'minor', '1.3.0'],    ['1.2.3-alpha.0.beta', 'patch', '1.2.3'],    ['1.2.4', 'prerelease', '1.2.5-0'],    ['1.2.3-0', 'prerelease', '1.2.3-1'],    ['1.2.3-alpha.0', 'prerelease', '1.2.3-alpha.1'],    ['1.2.3-alpha.1', 'prerelease', '1.2.3-alpha.2'],    ['1.2.3-alpha.2', 'prerelease', '1.2.3-alpha.3'],    ['1.2.3-alpha.0.beta', 'prerelease', '1.2.3-alpha.1.beta'],    ['1.2.3-alpha.1.beta', 'prerelease', '1.2.3-alpha.2.beta'],    ['1.2.3-alpha.2.beta', 'prerelease', '1.2.3-alpha.3.beta'],    ['1.2.3-alpha.10.0.beta', 'prerelease', '1.2.3-alpha.10.1.beta'],    ['1.2.3-alpha.10.1.beta', 'prerelease', '1.2.3-alpha.10.2.beta'],    ['1.2.3-alpha.10.2.beta', 'prerelease', '1.2.3-alpha.10.3.beta'],    ['1.2.3-alpha.10.beta.0', 'prerelease', '1.2.3-alpha.10.beta.1'],    ['1.2.3-alpha.10.beta.1', 'prerelease', '1.2.3-alpha.10.beta.2'],    ['1.2.3-alpha.10.beta.2', 'prerelease', '1.2.3-alpha.10.beta.3'],    ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta'],    ['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta'],    ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta'],    ['1.2.0', 'prepatch', '1.2.1-0'],    ['1.2.0-1', 'prepatch', '1.2.1-0'],    ['1.2.0', 'preminor', '1.3.0-0'],    ['1.2.3-1', 'preminor', '1.3.0-0'],    ['1.2.0', 'premajor', '2.0.0-0'],    ['1.2.3-1', 'premajor', '2.0.0-0'],    ['1.2.0-1', 'minor', '1.2.0'],    ['1.0.0-1', 'major', '1.0.0'],    ['1.2.3', 'major', '2.0.0', false, 'dev'],    ['1.2.3', 'minor', '1.3.0', false, 'dev'],    ['1.2.3', 'patch', '1.2.4', false, 'dev'],    ['1.2.3tag', 'major', '2.0.0', true, 'dev'],    ['1.2.3-tag', 'major', '2.0.0', false, 'dev'],    ['1.2.3', 'fake', null, false, 'dev'],    ['1.2.0-0', 'patch', '1.2.0', false, 'dev'],    ['fake', 'major', null, false, 'dev'],    ['1.2.3-4', 'major', '2.0.0', false, 'dev'],    ['1.2.3-4', 'minor', '1.3.0', false, 'dev'],    ['1.2.3-4', 'patch', '1.2.3', false, 'dev'],    ['1.2.3-alpha.0.beta', 'major', '2.0.0', false, 'dev'],    ['1.2.3-alpha.0.beta', 'minor', '1.3.0', false, 'dev'],    ['1.2.3-alpha.0.beta', 'patch', '1.2.3', false, 'dev'],    ['1.2.4', 'prerelease', '1.2.5-dev.0', false, 'dev'],    ['1.2.3-0', 'prerelease', '1.2.3-dev.0', false, 'dev'],    ['1.2.3-alpha.0', 'prerelease', '1.2.3-dev.0', false, 'dev'],    ['1.2.3-alpha.0', 'prerelease', '1.2.3-alpha.1', false, 'alpha'],    ['1.2.3-alpha.0.beta', 'prerelease', '1.2.3-dev.0', false, 'dev'],    ['1.2.3-alpha.0.beta', 'prerelease', '1.2.3-alpha.1.beta', false, 'alpha'],    ['1.2.3-alpha.10.0.beta', 'prerelease', '1.2.3-dev.0', false, 'dev'],    ['1.2.3-alpha.10.0.beta', 'prerelease', '1.2.3-alpha.10.1.beta', false, 'alpha'],    ['1.2.3-alpha.10.1.beta', 'prerelease', '1.2.3-alpha.10.2.beta', false, 'alpha'],    ['1.2.3-alpha.10.2.beta', 'prerelease', '1.2.3-alpha.10.3.beta', false, 'alpha'],    ['1.2.3-alpha.10.beta.0', 'prerelease', '1.2.3-dev.0', false, 'dev'],    ['1.2.3-alpha.10.beta.0', 'prerelease', '1.2.3-alpha.10.beta.1', false, 'alpha'],    ['1.2.3-alpha.10.beta.1', 'prerelease', '1.2.3-alpha.10.beta.2', false, 'alpha'],    ['1.2.3-alpha.10.beta.2', 'prerelease', '1.2.3-alpha.10.beta.3', false, 'alpha'],    ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-dev.0', false, 'dev'],    ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta', false, 'alpha'],    ['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta', false, 'alpha'],    ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta', false, 'alpha'],    ['1.2.0', 'prepatch', '1.2.1-dev.0', 'dev'],    ['1.2.0-1', 'prepatch', '1.2.1-dev.0', 'dev'],    ['1.2.0', 'preminor', '1.3.0-dev.0', 'dev'],    ['1.2.3-1', 'preminor', '1.3.0-dev.0', 'dev'],    ['1.2.0', 'premajor', '2.0.0-dev.0', 'dev'],    ['1.2.3-1', 'premajor', '2.0.0-dev.0', 'dev'],    ['1.2.0-1', 'minor', '1.2.0', 'dev'],    ['1.0.0-1', 'major', '1.0.0', 'dev'],    ['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.0', false, 'dev']  ].forEach(function(v) {    var pre = v[0];    var what = v[1];    var wanted = v[2];    var loose = v[3];    var id = v[4];    var found = inc(pre, what, loose, id);    var cmd = 'inc(' + pre + ', ' + what + ', ' + id + ')';    t.equal(found, wanted, cmd + ' === ' + wanted);  });  t.end();});test('\ndiff versions test', function(t) {//  [version1, version2, result]//  diff(version1, version2) -> result  [['1.2.3', '0.2.3', 'major'],    ['1.4.5', '0.2.3', 'major'],    ['1.2.3', '2.0.0-pre', 'premajor'],    ['1.2.3', '1.3.3', 'minor'],    ['1.0.1', '1.1.0-pre', 'preminor'],    ['1.2.3', '1.2.4', 'patch'],    ['1.2.3', '1.2.4-pre', 'prepatch'],    ['0.0.1', '0.0.1-pre', 'prerelease'],    ['0.0.1', '0.0.1-pre-2', 'prerelease'],    ['1.1.0', '1.1.0-pre', 'prerelease'],    ['1.1.0-pre-1', '1.1.0-pre-2', 'prerelease'],    ['1.0.0', '1.0.0', null]  ].forEach(function(v) {    var version1 = v[0];    var version2 = v[1];    var wanted = v[2];    var found = diff(version1, version2);    var cmd = 'diff(' + version1 + ', ' + version2 + ')';    t.equal(found, wanted, cmd + ' === ' + wanted);  });  t.end();});test('\nvalid range test', function(t) {  // [range, result]  // validRange(range) -> result  // translate ranges into their canonical form  [['1.0.0 - 2.0.0', '>=1.0.0 <=2.0.0'],    ['1.0.0', '1.0.0'],    ['>=*', '*'],    ['', '*'],    ['*', '*'],    ['*', '*'],    ['>=1.0.0', '>=1.0.0'],    ['>1.0.0', '>1.0.0'],    ['<=2.0.0', '<=2.0.0'],    ['1', '>=1.0.0 <2.0.0'],    ['<=2.0.0', '<=2.0.0'],    ['<=2.0.0', '<=2.0.0'],    ['<2.0.0', '<2.0.0'],    ['<2.0.0', '<2.0.0'],    ['>= 1.0.0', '>=1.0.0'],    ['>=  1.0.0', '>=1.0.0'],    ['>=   1.0.0', '>=1.0.0'],    ['> 1.0.0', '>1.0.0'],    ['>  1.0.0', '>1.0.0'],    ['<=   2.0.0', '<=2.0.0'],    ['<= 2.0.0', '<=2.0.0'],    ['<=  2.0.0', '<=2.0.0'],    ['<    2.0.0', '<2.0.0'],    ['<	2.0.0', '<2.0.0'],    ['>=0.1.97', '>=0.1.97'],    ['>=0.1.97', '>=0.1.97'],    ['0.1.20 || 1.2.4', '0.1.20||1.2.4'],    ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'],    ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'],    ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'],    ['||', '||'],    ['2.x.x', '>=2.0.0 <3.0.0'],    ['1.2.x', '>=1.2.0 <1.3.0'],    ['1.2.x || 2.x', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'],    ['1.2.x || 2.x', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'],    ['x', '*'],    ['2.*.*', '>=2.0.0 <3.0.0'],    ['1.2.*', '>=1.2.0 <1.3.0'],    ['1.2.* || 2.*', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'],    ['*', '*'],    ['2', '>=2.0.0 <3.0.0'],    ['2.3', '>=2.3.0 <2.4.0'],    ['~2.4', '>=2.4.0 <2.5.0'],    ['~2.4', '>=2.4.0 <2.5.0'],    ['~>3.2.1', '>=3.2.1 <3.3.0'],    ['~1', '>=1.0.0 <2.0.0'],    ['~>1', '>=1.0.0 <2.0.0'],    ['~> 1', '>=1.0.0 <2.0.0'],    ['~1.0', '>=1.0.0 <1.1.0'],    ['~ 1.0', '>=1.0.0 <1.1.0'],    ['^0', '>=0.0.0 <1.0.0'],    ['^ 1', '>=1.0.0 <2.0.0'],    ['^0.1', '>=0.1.0 <0.2.0'],    ['^1.0', '>=1.0.0 <2.0.0'],    ['^1.2', '>=1.2.0 <2.0.0'],    ['^0.0.1', '>=0.0.1 <0.0.2'],    ['^0.0.1-beta', '>=0.0.1-beta <0.0.2'],    ['^0.1.2', '>=0.1.2 <0.2.0'],    ['^1.2.3', '>=1.2.3 <2.0.0'],    ['^1.2.3-beta.4', '>=1.2.3-beta.4 <2.0.0'],    ['<1', '<1.0.0'],    ['< 1', '<1.0.0'],    ['>=1', '>=1.0.0'],    ['>= 1', '>=1.0.0'],    ['<1.2', '<1.2.0'],    ['< 1.2', '<1.2.0'],    ['1', '>=1.0.0 <2.0.0'],    ['>01.02.03', '>1.2.3', true],    ['>01.02.03', null],    ['~1.2.3beta', '>=1.2.3-beta <1.3.0', true],    ['~1.2.3beta', null],    ['^ 1.2 ^ 1', '>=1.2.0 <2.0.0 >=1.0.0 <2.0.0']  ].forEach(function(v) {    var pre = v[0];    var wanted = v[1];    var loose = v[2];    var found = validRange(pre, loose);    t.equal(found, wanted, 'validRange(' + pre + ') === ' + wanted);  });  t.end();});test('\ncomparators test', function(t) {  // [range, comparators]  // turn range into a set of individual comparators  [['1.0.0 - 2.0.0', [['>=1.0.0', '<=2.0.0']]],    ['1.0.0', [['1.0.0']]],    ['>=*', [['']]],    ['', [['']]],    ['*', [['']]],    ['*', [['']]],    ['>=1.0.0', [['>=1.0.0']]],    ['>=1.0.0', [['>=1.0.0']]],    ['>=1.0.0', [['>=1.0.0']]],    ['>1.0.0', [['>1.0.0']]],    ['>1.0.0', [['>1.0.0']]],    ['<=2.0.0', [['<=2.0.0']]],    ['1', [['>=1.0.0', '<2.0.0']]],    ['<=2.0.0', [['<=2.0.0']]],    ['<=2.0.0', [['<=2.0.0']]],    ['<2.0.0', [['<2.0.0']]],    ['<2.0.0', [['<2.0.0']]],    ['>= 1.0.0', [['>=1.0.0']]],    ['>=  1.0.0', [['>=1.0.0']]],    ['>=   1.0.0', [['>=1.0.0']]],    ['> 1.0.0', [['>1.0.0']]],    ['>  1.0.0', [['>1.0.0']]],    ['<=   2.0.0', [['<=2.0.0']]],    ['<= 2.0.0', [['<=2.0.0']]],    ['<=  2.0.0', [['<=2.0.0']]],    ['<    2.0.0', [['<2.0.0']]],    ['<\t2.0.0', [['<2.0.0']]],    ['>=0.1.97', [['>=0.1.97']]],    ['>=0.1.97', [['>=0.1.97']]],    ['0.1.20 || 1.2.4', [['0.1.20'], ['1.2.4']]],    ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]],    ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]],    ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]],    ['||', [[''], ['']]],    ['2.x.x', [['>=2.0.0', '<3.0.0']]],    ['1.2.x', [['>=1.2.0', '<1.3.0']]],    ['1.2.x || 2.x', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]],    ['1.2.x || 2.x', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]],    ['x', [['']]],    ['2.*.*', [['>=2.0.0', '<3.0.0']]],    ['1.2.*', [['>=1.2.0', '<1.3.0']]],    ['1.2.* || 2.*', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]],    ['1.2.* || 2.*', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]],    ['*', [['']]],    ['2', [['>=2.0.0', '<3.0.0']]],    ['2.3', [['>=2.3.0', '<2.4.0']]],    ['~2.4', [['>=2.4.0', '<2.5.0']]],    ['~2.4', [['>=2.4.0', '<2.5.0']]],    ['~>3.2.1', [['>=3.2.1', '<3.3.0']]],    ['~1', [['>=1.0.0', '<2.0.0']]],    ['~>1', [['>=1.0.0', '<2.0.0']]],    ['~> 1', [['>=1.0.0', '<2.0.0']]],    ['~1.0', [['>=1.0.0', '<1.1.0']]],    ['~ 1.0', [['>=1.0.0', '<1.1.0']]],    ['~ 1.0.3', [['>=1.0.3', '<1.1.0']]],    ['~> 1.0.3', [['>=1.0.3', '<1.1.0']]],    ['<1', [['<1.0.0']]],    ['< 1', [['<1.0.0']]],    ['>=1', [['>=1.0.0']]],    ['>= 1', [['>=1.0.0']]],    ['<1.2', [['<1.2.0']]],    ['< 1.2', [['<1.2.0']]],    ['1', [['>=1.0.0', '<2.0.0']]],    ['1 2', [['>=1.0.0', '<2.0.0', '>=2.0.0', '<3.0.0']]],    ['1.2 - 3.4.5', [['>=1.2.0', '<=3.4.5']]],    ['1.2.3 - 3.4', [['>=1.2.3', '<3.5.0']]],    ['1.2.3 - 3', [['>=1.2.3', '<4.0.0']]],    ['>*', [['<0.0.0']]],    ['<*', [['<0.0.0']]]  ].forEach(function(v) {    var pre = v[0];    var wanted = v[1];    var found = toComparators(v[0]);    var jw = JSON.stringify(wanted);    t.equivalent(found, wanted, 'toComparators(' + pre + ') === ' + jw);  });  t.end();});test('\ninvalid version numbers', function(t) {  ['1.2.3.4',   'NOT VALID',   1.2,   null,   'Infinity.NaN.Infinity'  ].forEach(function(v) {    t.throws(function() {      new SemVer(v);    }, {name:'TypeError', message:'Invalid Version: ' + v});  });  t.end();});test('\nstrict vs loose version numbers', function(t) {  [['=1.2.3', '1.2.3'],    ['01.02.03', '1.2.3'],    ['1.2.3-beta.01', '1.2.3-beta.1'],    ['   =1.2.3', '1.2.3'],    ['1.2.3foo', '1.2.3-foo']  ].forEach(function(v) {    var loose = v[0];    var strict = v[1];    t.throws(function() {      new SemVer(loose);    });    var lv = new SemVer(loose, true);    t.equal(lv.version, strict);    t.ok(eq(loose, strict, true));    t.throws(function() {      eq(loose, strict);    });    t.throws(function() {      new SemVer(strict).compare(loose);    });  });  t.end();});test('\nstrict vs loose ranges', function(t) {  [['>=01.02.03', '>=1.2.3'],    ['~1.02.03beta', '>=1.2.3-beta <1.3.0']  ].forEach(function(v) {    var loose = v[0];    var comps = v[1];    t.throws(function() {      new Range(loose);    });    t.equal(new Range(loose, true).range, comps);  });  t.end();});test('\nmax satisfying', function(t) {  [[['1.2.3', '1.2.4'], '1.2', '1.2.4'],    [['1.2.4', '1.2.3'], '1.2', '1.2.4'],    [['1.2.3', '1.2.4', '1.2.5', '1.2.6'], '~1.2.3', '1.2.6'],    [['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]  ].forEach(function(v) {    var versions = v[0];    var range = v[1];    var expect = v[2];    var loose = v[3];    var actual = semver.maxSatisfying(versions, range, loose);    t.equal(actual, expect);  });  t.end();});
 |