Files
meteor/packages/package-version-parser/package-version-parser-tests.js
Avital Oliver 0d128ffbb5 Change output range for PackageVersionParser.versionMagnitude
It's now back to returning 10000 for "1.0.0", as it was before
the recent changes to allow for wrapped package version numbers
and prerelease versions. Given that there are other constants
in the cost function used in the constraint solver, this gives
us much more confidence that we haven't fundamentally changed
the behavior of `meteor add` or `meteor update` in 0.9.3.
2014-09-24 17:47:18 -07:00

213 lines
7.2 KiB
JavaScript

var currentTest = null;
var t = function (versionString, expected, descr) {
currentTest.equal(
_.omit(PackageVersion.parseConstraint(versionString),
'constraintString'),
expected,
descr);
};
var FAIL = function (versionString) {
currentTest.throws(function () {
PackageVersion.parseConstraint(versionString);
});
};
Tinytest.add("Smart Package version string parsing - old format", function (test) {
currentTest = test;
t("foo", { name: "foo", constraints: [{
version: null, type: "any-reasonable" } ]});
t("foo-1234", { name: "foo-1234", constraints: [{
version: null, type: "any-reasonable" } ]});
FAIL("my_awesome_InconsitentPackage123");
});
Tinytest.add("Smart Package version string parsing - compatible version, compatible-with", function (test) {
currentTest = test;
t("foo@1.2.3", { name: "foo", constraints: [{
version: "1.2.3", type: "compatible-with" } ]});
t("foo-1233@1.2.3", { name: "foo-1233", constraints: [{
version: "1.2.3", type: "compatible-with" } ]});
t("foo-bar@3.2.1", { name: "foo-bar", constraints: [{
version: "3.2.1", type: "compatible-with" } ]});
FAIL("42@0.2.0");
FAIL("foo@1.2.3.4");
FAIL("foo@1.4");
FAIL("foo@1");
FAIL("foo@");
FAIL("foo@@");
FAIL("foo@x.y.z");
FAIL("foo@<1.2");
FAIL("foo<1.2");
FAIL("foo@1.2.3_abc");
FAIL("foo@1.2.3+1234_1");
FAIL("foo@1.2.3_1-rc1");
FAIL("foo-1233@1.2.3_0");
FAIL("foo-1233@1.2.3_");
FAIL("foo-1233@1.2.3_0123");
t("foo@1.2.3_1", { name: "foo", constraints: [{
version: "1.2.3_1", type: "compatible-with" } ]});
t("foo-bar@3.2.1-rc0_123", { name: "foo-bar", constraints: [{
version: "3.2.1-rc0_123", type: "compatible-with" } ]});
t("foo-1233@1.2.3_5+1234", { name: "foo-1233", constraints: [{
version: "1.2.3_5+1234", type: "compatible-with" } ]});
t("foo", { name: "foo", constraints: [{
version: null, type: "any-reasonable" } ]});
});
Tinytest.add("Smart Package version string parsing - compatible version, exactly", function (test) {
currentTest = test;
t("foo@=1.2.3", { name: "foo", constraints: [
{ version: "1.2.3", type: "exactly" } ]});
t("foo-bar@=3.2.1", { name: "foo-bar", constraints: [{
version: "3.2.1", type: "exactly" } ]});
t("foo@=1.2.3_1", { name: "foo", constraints: [{
version: "1.2.3_1", type: "exactly" } ]});
t("foo-bar@=3.2.1_34", { name: "foo-bar", constraints: [{
version: "3.2.1_34", type: "exactly" } ]});
FAIL("42@=0.2.0");
FAIL("foo@=1.2.3.4");
FAIL("foo@=1.4");
FAIL("foo@=1");
FAIL("foo@@=");
FAIL("foo@=@");
FAIL("foo@=x.y.z");
FAIL("foo@=<1.2");
FAIL("foo@<=1.2");
FAIL("foo<=1.2");
FAIL("foo@=1.2.3_rc0");
// We no longer support @>=.
FAIL("foo@>=1.2.3");
FAIL("foo-bar@>=3.2.1");
FAIL("42@>=0.2.0");
FAIL("foo@>=1.2.3.4");
FAIL("foo@>=1.4");
FAIL("foo@>=1");
FAIL("foo@@>=");
FAIL("foo@>=@");
FAIL("foo@>=x.y.z");
FAIL("foo@=>12.3.11");
});
Tinytest.add("Smart Package version string parsing - or", function (test) {
currentTest = test;
t("foo@1.0.0 || 2.0.0 || 3.0.0 || =4.0.0-rc1",
{ name: "foo", constraints:
[{ version: "1.0.0", type: "compatible-with"},
{ version: "2.0.0", type: "compatible-with"},
{ version: "3.0.0", type: "compatible-with"},
{ version: "4.0.0-rc1", type: "exactly"}]
});
t("foo-bar@=3.2.1 || 1.0.0",
{ name: "foo-bar", constraints:
[{ version: "3.2.1", type: "exactly"},
{ version: "1.0.0", type: "compatible-with"}]
});
t("foo@=1.2.3_1 || 1.2.4",
{ name: "foo", constraints:
[{ version: "1.2.3_1", type: "exactly"},
{ version: "1.2.4", type: "compatible-with"}]
});
t("foo-bar@=3.2.1_34 || =3.2.1-rc1",
{ name: "foo-bar", constraints:
[{ version: "3.2.1_34", type: "exactly"},
{ version: "3.2.1-rc1", type: "exactly"}]
});
FAIL("foo@1.0.0 1.0.0");
FAIL("foo@1.0.0||1.0.0");
FAIL("foo@1.0.0 | 1.0.0");
FAIL("foo || bar");
FAIL("foo@1.0.0-rc|1.0.0");
});
Tinytest.add(
"Meteor Version string parsing - less than, compare, version magnitude",
function (test) {
var compare = function (v1, v2, expected) {
if (expected === '<') {
test.isTrue(PackageVersion.lessThan(v1, v2));
test.isTrue(PackageVersion.versionMagnitude(v1) < PackageVersion.versionMagnitude(v2));
test.isTrue(PackageVersion.compare(v1, v2) < 0);
} else if (expected === '=') {
test.isFalse(PackageVersion.lessThan(v1, v2));
test.isFalse(PackageVersion.lessThan(v2, v1));
test.isTrue(PackageVersion.versionMagnitude(v1) === PackageVersion.versionMagnitude(v2));
test.isTrue(PackageVersion.compare(v1, v2) === 0);
} else if (expected === '>') {
test.isTrue(PackageVersion.lessThan(v2, v1));
test.isTrue(PackageVersion.versionMagnitude(v1) > PackageVersion.versionMagnitude(v2));
test.isTrue(PackageVersion.compare(v1, v2) > 0);
} else {
throw new Error("expected should be '<', '=' or '>'");
}
};
compare("1.0.0", "1.2.0", "<");
compare("1.0.0_50", "1.0.1", "<");
compare("1.0.0_50", "1.2.0", "<");
compare("1.0.0_1", "1.0.0_2", "<");
compare("1.0.0_2", "1.0.0_10", "<"); // verify that we compare ~N as numbers, not strings
compare("1.0.0", "1.0.0_2", "<");
compare("1.99.0_99", "3.0.0_2", "<");
compare("1.99.0", "2.0.0", "<");
compare("1.0.0_5", "1.0.0_2", ">");
compare("1.0.0_99", "1.2.0", "<");
compare("1.0.0_99", "1.0.1", "<");
compare("1.0.0_1", "1.0.0_2", "<");
compare("1.0.0", "1.0.0_2", "<");
compare("1.99.0_99", "3.0.0_2", "<");
compare("1.0.0_5", "1.0.0_2", ">");
compare("1.0.0", "1.0.0", "=");
compare("1.0.0_5", "1.0.0_5", "=");
compare("1.2.0", "1.0.0", ">");
compare("1.0.1", "1.0.0_5", ">");
// Rule 11 from http://semver.org
compare("0.99.99", "1.0.0-alpha.1", "<");
compare("1.0.0-alpha", "1.0.0-alpha.1", "<");
compare("1.0.0-alpha.1", "1.0.0-alpha.beta", "<");
compare("1.0.0-alpha.beta", "1.0.0-beta", "<");
compare("1.0.0-beta", "1.0.0-beta.2", "<");
compare("1.0.0-beta.2", "1.0.0-beta.11", "<");
compare("1.0.0-beta.11", "1.0.0-rc.1", "<");
compare("1.0.0-rc.1", "1.0.0", "<");
compare("1.0.0-r.1", "1.0.0", "<"); // test single character prerelease parts
// Our broken implementation of Rule 11 (see [*] above the
// declaration of PackageVersion.versionMagnitude). Maybe one day
// we'll fix it, in which case replace "===" with ">"
test.isTrue(PackageVersion.versionMagnitude("1.0.0-beta.0") ===
PackageVersion.versionMagnitude("1.0.0-bear.0"));
});
Tinytest.add("Invalid in 0.9.2", function (test) {
// Note that invalidFirstFormatConstraint assumes that the initial version
// passed in has been previously checked to be valid in 0.9.3.
// These are invalid in 0.9.2, but valid in 0.9.3 and above.
var invalidVersions =
["1.0.0_1", "1.0.0 || 2.0.0", "1.0.0-rc1_1",
"3.4.0-rc1 || =1.0.0"];
_.each(invalidVersions, function (v) {
test.isTrue(PackageVersion.invalidFirstFormatConstraint(v));
});
// These are all valid in 0.9.2.
var validVersions =
["1.0.0", "2.0.0-rc1", "=2.5.0"];
_.each(validVersions, function (v) {
test.isFalse(PackageVersion.invalidFirstFormatConstraint(v));
});
});