From c461822c88d045c0218c6204b3c6a43721c2440e Mon Sep 17 00:00:00 2001 From: Keith McKnight Date: Fri, 13 Sep 2019 18:24:12 -0700 Subject: [PATCH] handle prereleases and big numbers --- .../com/vdurmont/semver4j/Requirement.java | 4 ++ .../java/com/vdurmont/semver4j/Semver.java | 19 +++++- .../com/vdurmont/semver4j/NpmSemverTest.java | 67 ++++++++++++++++++- 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/vdurmont/semver4j/Requirement.java b/src/main/java/com/vdurmont/semver4j/Requirement.java index 5a813c4..0fa6ef7 100644 --- a/src/main/java/com/vdurmont/semver4j/Requirement.java +++ b/src/main/java/com/vdurmont/semver4j/Requirement.java @@ -560,6 +560,10 @@ public boolean isSatisfiedBy(String version) { public boolean isSatisfiedBy(Semver version) { if (this.range != null) { // We are on a leaf + if (version.isPreRelease() && !this.range.version.isPreRelease()) { + // Disqualify pre-releases if this is not a pre-release range + return false; + } return this.range.isSatisfiedBy(version); } else { // We have several sub-requirements diff --git a/src/main/java/com/vdurmont/semver4j/Semver.java b/src/main/java/com/vdurmont/semver4j/Semver.java index 1b72a34..40105fa 100644 --- a/src/main/java/com/vdurmont/semver4j/Semver.java +++ b/src/main/java/com/vdurmont/semver4j/Semver.java @@ -178,6 +178,15 @@ public boolean satisfies(String requirement) { return this.satisfies(req); } + /** + * Checks whether the version is a pre-release + * + * @return true if the current version is a prerelease + */ + public boolean isPreRelease() { + return suffixTokens.length > 0; + } + /** * @see #isGreaterThan(Semver) * @@ -355,9 +364,15 @@ public boolean isEqualTo(String version) { */ public boolean isEqualTo(Semver version) { if (this.type == SemverType.NPM) { - if (this.getMajor() != version.getMajor()) return false; + if (!this.areSameSuffixes(version.getSuffixTokens())) return false; + + if (!Objects.equals(this.major, version.getMajor())) return false; + if (version.getMinor() == null) return true; + if (!Objects.equals(this.minor, version.getMinor())) return false; + if (version.getPatch() == null) return true; + if (!Objects.equals(this.patch, version.getPatch())) return false; } return this.equals(version); @@ -542,7 +557,7 @@ private static Semver create(SemverType type, int major, Integer minor, Integer @Override public int compareTo(Semver version) { if (this.isGreaterThan(version)) return 1; - else if(this.isLowerThan(version)) return -1; + else if (this.isLowerThan(version)) return -1; return 0; } diff --git a/src/test/java/com/vdurmont/semver4j/NpmSemverTest.java b/src/test/java/com/vdurmont/semver4j/NpmSemverTest.java index 16ad6ad..91f654c 100644 --- a/src/test/java/com/vdurmont/semver4j/NpmSemverTest.java +++ b/src/test/java/com/vdurmont/semver4j/NpmSemverTest.java @@ -30,9 +30,12 @@ public static Iterable getParameters() { // Fully-qualified versions: { "1.2.3", "1.2.3", true, }, { "1.2.4", "1.2.3", false, }, + { "1.3.3", "1.2.3", false, }, + { "2.2.3", "1.2.3", false, }, // Minor versions: { "1.2.3", "1.2", true, }, + { "1.3.3", "1.2", false, }, { "1.2.4", "1.3", false, }, // Major versions: @@ -58,7 +61,7 @@ public static Iterable getParameters() { { "3.1.5", "", true, }, { "3.1.5", "*", true, }, { "0.0.0", "*", true, }, - { "1.0.0-beta", "*", true, }, + { "1.0.0-beta", "*", false, }, { "3.1.5-beta", "3.1.x", false, }, { "3.1.5-beta+exp.sha.5114f85", "3.1.x", false, }, { "3.1.5+exp.sha.5114f85", "3.1.x", true, }, @@ -121,6 +124,8 @@ public static Iterable getParameters() { { "2.0.1", "=2.0", true, }, { "2.0.0", "=2", true, }, { "2.0.1", "=2", true, }, + { "3.0.0", "=2.0", false, }, + { "2.1.0", "=2.0", false, }, { "2.0.1", "=2.0.0", false, }, { "1.9.9", "=2.0.0", false, }, { "1.9.9", "=2.0", false, }, @@ -176,6 +181,56 @@ public static Iterable getParameters() { { "3.0.0", "<=2.0", false, }, { "3.0.0", "<=2", false, }, + // Prerelease versions: + { "2.0.0-alpha", "=2.0.0-beta", false, }, + { "2.0.0-rc.2", "=2.0.0-rc.2", true, }, + { "2.0.0-rc.2", "=2.0.0-rc.3", false, }, + { "2.0.0-rc.2", "=2.0.0-rc.2.3", false, }, + { "2.0.0-rc.2", "=2.0.0-rc.3.2", false, }, + { "2.0.0-rc.2", "=2.0.0", false, }, + { "2.0.0-rc.2", "=2.0", false, }, + { "2.0.0-rc.2", "=2", false, }, + + { "2.0.0-alpha", ">2.0.0-beta", false, }, + { "2.0.0-rc.2", ">2.0.0-rc.1", true, }, + { "2.0.0-rc.2", ">2.0.0-rc.2", false, }, + { "2.0.0-rc.2", ">2.0.0-rc.3", false, }, + { "2.0.0-rc.2", ">2.0.0-rc.2.3", false, }, + { "2.0.0-rc.2", ">2.0.0-rc.3.2", false, }, + { "2.0.0-rc.2", ">2.0.0", false, }, + { "2.0.0-rc.2", ">2.0", false, }, + { "2.0.0-rc.2", ">2", false, }, + + { "2.0.0-alpha", "<2.0.0-beta", true, }, + { "2.0.0-rc.2", "<2.0.0-rc.3", true, }, + { "2.0.0-rc.2", "<2.0.0-rc.2.3", true, }, + { "2.0.0-rc.2", "<2.0.0-rc.3.2", true, }, + { "2.0.0-rc.2", "<2.0.0-rc.1", false, }, + { "2.0.0-rc.2", "<2.0.0-rc.2", false, }, + { "2.0.0-rc.2", "<2.0.0", false, }, + { "2.0.0-rc.2", "<2.0", false, }, + { "2.0.0-rc.2", "<2", false, }, + + { "2.0.0-alpha", ">=2.0.0-beta", false, }, + { "2.0.0-rc.2", ">=2.0.0-rc.1", true, }, + { "2.0.0-rc.2", ">=2.0.0-rc.2", true, }, + { "2.0.0-rc.2", ">=2.0.0-rc.3", false, }, + { "2.0.0-rc.2", ">=2.0.0-rc.2.3", false, }, + { "2.0.0-rc.2", ">=2.0.0-rc.3.2", false, }, + { "2.0.0-rc.2", ">=2.0.0", false, }, + { "2.0.0-rc.2", ">=2.0", false, }, + { "2.0.0-rc.2", ">=2", false, }, + + { "2.0.0-alpha", "<=2.0.0-beta", true, }, + { "2.0.0-rc.2", "<=2.0.0-rc.2", true, }, + { "2.0.0-rc.2", "<=2.0.0-rc.3", true, }, + { "2.0.0-rc.2", "<=2.0.0-rc.2.3", true, }, + { "2.0.0-rc.2", "<=2.0.0-rc.3.2", true, }, + { "2.0.0-rc.2", "<=2.0.0-rc.1", false, }, + { "2.0.0-rc.2", "<=2.0.0", false, }, + { "2.0.0-rc.2", "<=2.0", false, }, + { "2.0.0-rc.2", "<=2", false, }, + // AND ranges: { "2.0.1", ">2.0.0 <3.0.0", true, }, { "2.0.1", ">2.0 <3.0", false, }, @@ -222,6 +277,16 @@ public static Iterable getParameters() { { "1.1.0", "1.2 <1.2.8 || >2.0.0", false, }, { "1.2.9", "1.2 <1.2.8 || >2.0.0", false, }, { "2.0.0", "1.2 <1.2.8 || >2.0.0", false, }, + + // Big number equality: + { "128.0.0", "=128.0.0", true, }, + { "127.127.127", "=127.128", false, }, + { "0.128.0", "=0.128.0", true, }, + { "0.0.128", "=0.0.128", true, }, + { "127.127.127", "=127.127.127", true, }, + { "128.128.128", "=128.128.128", true, }, + { "999.999.999", "=999.999.999", true, }, + { "9999.9999.9999", "=9999.9999.9999", true, }, }); }