From 4dae510d243104692df8fb8e77ee9cae921df932 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sat, 9 May 2020 00:31:36 +0200 Subject: [PATCH] Working + Tests --- .../java/org/mian/gitnex/helpers/Version.java | 325 ++++++++++-------- .../org/mian/gitnex/helpers/VersionTest.java | 106 +++++- 2 files changed, 276 insertions(+), 155 deletions(-) diff --git a/app/src/main/java/org/mian/gitnex/helpers/Version.java b/app/src/main/java/org/mian/gitnex/helpers/Version.java index 455e3c8b..0fd014e5 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/Version.java +++ b/app/src/main/java/org/mian/gitnex/helpers/Version.java @@ -1,5 +1,7 @@ package org.mian.gitnex.helpers; +import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -19,59 +21,6 @@ public class Version { // if its a dev release or a rc or stable ... private String type; - /** - * regex used to identify the type of version - **/ - final private Pattern pattern_major_minor_patch_release = Pattern.compile("^[v,V]?(\\d+)\\.(\\d+)\\.(\\d+)"); - final private Pattern pattern_dev_release = Pattern.compile("^[v,V]?(\\d).(\\d+).(\\d+)(\\D)(.+)"); - - /** - * public static Version check(String min, String last, String value) { - *

- * final Pattern pattern_stable_release = Pattern.compile("^(\\d)\\.(\\d+)\\.(\\d+)$"); - * final Pattern pattern_dev_release = Pattern.compile("^(\\d).(\\d+).(\\d+)(\\D)(.+)"); - * Matcher match; - *

- * if(!pattern_stable_release.matcher(min).find() || !pattern_stable_release.matcher(last).find()) { - * throw new IllegalArgumentException("VersionCheck: wrong format for min or last version given"); - * } - *

- * match = pattern_stable_release.matcher(value); - * if(match.find()) { - *

- * switch(correlate(min, last, match.group())) { - * case 0: - * return UNSUPPORTED_OLD; - * case 1: - * return SUPPORTED_OLD; - * case 2: - * return SUPPORTED_LATEST; - * default: - * return UNSUPPORTED_NEW; - * } - *

- * } - *

- * match = pattern_dev_release.matcher(value); - * if(match.find()) { - *

- * match = Pattern.compile("^(\\d)\\.(\\d+)\\.(\\d+)").matcher(value); - * match.find(); - *

- * if(correlate(min, last, match.group()) > 0) { - * return DEVELOPMENT; - * } - * else { - * return UNSUPPORTED_OLD; - * } - *

- * } - *

- * return UNKNOWN; - *

- * } - **/ - public Version(String value) { raw = value; @@ -79,128 +28,208 @@ public class Version { } - /** - * HELPER - **/ - /** * init parse and store values for other functions of an Version instance * it use the raw variable as base * * @return if parse was successfully */ - private boolean init() { + private void init() { - this.raw = raw; - // .... + /** + * regex used to identify the type of version + **/ + final Pattern pattern_valid = Pattern.compile("^[v,V]?(\\d+)+(\\.(\\d+))*([_,\\-,+][\\w,\\d,_,\\-,+]*)?$"); + // final Pattern pattern_major_minor_patch_release = Pattern.compile("^[v,V]?(\\d+)\\.(\\d+)\\.(\\d+)"); + // final Pattern pattern_dev_release = Pattern.compile("^[v,V]?(\\d).(\\d+).(\\d+)(\\D)(.+)"); + + final Pattern find_number_dot_number = Pattern.compile("^\\d+(\\.(\\d)+)*"); + + if(!pattern_valid.matcher(raw).find()) { + throw new IllegalArgumentException("Invalid version format"); + } + + if(raw.charAt(0) == 'v' || raw.charAt(0) == 'V') { + raw = raw.substring(1); + } + + values = new ArrayList(); + Matcher match = find_number_dot_number.matcher(raw); + match.find(); + for(String i : match.group().split("\\.")) { + values.add(Integer.parseInt(i)); + } + + } + + + // compare functions + + /** + * equal return true if version is the same + * + * @param value + * @return true/false + */ + public boolean equal(String value) { + + return this.equal(new Version(value)); + + } + + /** + * equal return true if version is the same + * + * @param v + * @return + */ + public boolean equal(@NotNull Version v) { + + int rounds = Math.min(this.values.size(), v.values.size()); + for(int i = 0; i < rounds; i++) { + if(this.values.get(i) != v.values.get(i)) { + return false; + } + } + return true; + + } + + + /** + * less return true if version is less + * + * @param value + * @return true/false + */ + public boolean less(String value) { + + return this.less(new Version(value)); + + } + + /** + * less return true if version is less + * + * @param v + * @return + */ + public boolean less(@NotNull Version v) { + + int rounds = Math.min(this.values.size(), v.values.size()); + for(int i = 0; i < rounds; i++) { + if(i + 1 == rounds) { + if(this.values.get(i) >= v.values.get(i)) { + return false; + } + } + else { + if(this.values.get(i) > v.values.get(i)) { + return false; + } + } + } + return true; + + } + + + /** + * higher return true if version is higher + * + * @param value + * @return true/false + */ + public boolean higher(String value) { + + return this.higher(new Version(value)); + + } + + /** + * higher return true if version is higher + * + * @param v + * @return + */ + public boolean higher(@NotNull Version v) { + + int rounds = Math.min(this.values.size(), v.values.size()); + for(int i = 0; i < rounds; i++) { + if(i + 1 == rounds) { + if(this.values.get(i) <= v.values.get(i)) { + return false; + } + } + else { + if(this.values.get(i) < v.values.get(i)) { + return false; + } + } + } return true; } /** - * @param min - * @param last + * lessOrEqual return true if version is less or equal + * * @param value - * @return 0=less; 1=in-range; 2=max; 3=above + * @return true/false */ - private static int correlate(String min, String last, String value) { + public boolean lessOrEqual(String value) { - int min_check = compareVersion(value, min); - int max_check = compareVersion(value, last); - int range_check = compareVersion(min, last); - - switch(range_check) { - case 2: - throw new IllegalArgumentException("Minimum Version higher than Last Version"); - case 1: //min == last - switch(min_check) { - case 0: - return 0; - case 1: - return 2; - default: - return 3; - } - default: - if(max_check > 1) { - return 3; - } - if(max_check == 1) { - return 2; - } - if(min_check < 1) { - return 0; - } - return 1; - } + return this.lessOrEqual(new Version(value)); } /** - * @param A doted formatted Versions - * @param B doted formatted Versions - * @return 0|1|2 - * 0 = less - * 1 = same - * 2 = more - * @description compare doted formatted Versions + * lessOrEqual return true if version is less or equal + * + * @param v + * @return */ - public static int compareVersion(String A, String B) { + public boolean lessOrEqual(@NotNull Version v) { - final Pattern pattern_stable_release = Pattern.compile("^(\\d)\\.(\\d+)\\.(\\d+)"); - final Pattern pattern_dev_release = Pattern.compile("^(\\d).(\\d+).(\\d+)(\\D)(.+)"); - Matcher match; - match = pattern_dev_release.matcher(A); - if(match.find()) { - match = pattern_stable_release.matcher(A); - match.find(); - A = match.group(); - } - match = pattern_dev_release.matcher(B); - if(match.find()) { - match = pattern_stable_release.matcher(B); - match.find(); - B = match.group(); + int rounds = Math.min(this.values.size(), v.values.size()); + for(int i = 0; i < rounds; i++) { + if(this.values.get(i) > v.values.get(i)) { + return false; + } } + return true; - //throw new IllegalArgumentException - if((!A.matches("[0-9]+(\\.[0-9]+)*")) || (!B.matches("[0-9]+(\\.[0-9]+)*"))) { - throw new IllegalArgumentException("Invalid version format"); - } + } - if(A.contains(".") || B.contains(".")) { - // example 2 vs 1.3 - if(!(A.contains(".") && B.contains("."))) { - if(A.contains(".")) { - return compareVersion(A, B + ".0"); - } - if(B.contains(".")) { - return compareVersion(A + ".0", B); - } - } - //normal compare - int a = Integer.parseInt(A.substring(0, A.indexOf("."))); - int b = Integer.parseInt(B.substring(0, B.indexOf("."))); - if(a < b) { - return 0; + /** + * higherOrEqual return true if version is higher or equal + * + * @param value + * @return true/false + */ + public boolean higherOrEqual(String value) { + + return this.higherOrEqual(new Version(value)); + + } + + /** + * higherOrEqual return true if version is higher or equal + * + * @param v + * @return + */ + public boolean higherOrEqual(@NotNull Version v) { + + int rounds = Math.min(this.values.size(), v.values.size()); + for(int i = 0; i < rounds; i++) { + if(this.values.get(i) < v.values.get(i)) { + return false; } - if(a == b) { - return compareVersion(A.substring(A.indexOf(".") + 1), B.substring(B.indexOf(".") + 1)); - } - return 2; //if (a > b) - } - else { - int a = Integer.parseInt(A); - int b = Integer.parseInt(B); - if(a < b) { - return 0; - } - if(a == b) { - return 1; - } - return 2; //if (a > b) } + return true; + } } \ No newline at end of file diff --git a/app/src/test/java/org/mian/gitnex/helpers/VersionTest.java b/app/src/test/java/org/mian/gitnex/helpers/VersionTest.java index 21e81947..ce1b0511 100644 --- a/app/src/test/java/org/mian/gitnex/helpers/VersionTest.java +++ b/app/src/test/java/org/mian/gitnex/helpers/VersionTest.java @@ -4,19 +4,111 @@ package org.mian.gitnex.helpers; * Author 6543 */ -import org.junit.Assert; import org.junit.Test; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; public class VersionTest { @Test public void equal() { - Assert.assertFalse(new Version("1.12.0").equals("1.12.0")); - Assert.assertFalse(new Version("1.12.0").equals(new Version("1.12.0"))); - Assert.assertFalse(new Version("1.12.0").equals("1.12")); - Assert.assertFalse(new Version("1.12.0").equals("1.12.0+dev-211-g316db0fe7")); - Assert.assertFalse(new Version("1.12.0").equals("v1.12")); - Assert.assertFalse(new Version("v1.12.0").equals("1.12.0")); + + assertTrue(new Version("1.12.0").equal("1.12.0")); + assertTrue(new Version("1.12.0").equal(new Version("1.12.0"))); + assertTrue(new Version("1.12.0").equal("1.12")); + assertTrue(new Version("1.12.0").equal("1.12.0+dev-211-g316db0fe7")); + assertTrue(new Version("1.12.0").equal("v1.12")); + assertTrue(new Version("v1.12.0").equal("1.12.0")); + assertTrue(new Version("0").equal("0")); + + assertFalse(new Version("1.12.1").equal("1.12.0+dev-211-g316db0fe7")); + assertFalse(new Version("v1.12.0").equal("1.10.0")); + assertFalse(new Version("2.12.0").equal("v1.12")); + assertFalse(new Version("1.12").equal("2")); + assertFalse(new Version("2").equal("1")); + assertFalse(new Version("1.2").equal("2.1")); + assertFalse(new Version("2.2").equal("2.1.120")); + + } + + @Test + public void less() { + + assertTrue(new Version("1.11.0").less("1.12")); + assertTrue(new Version("v1.11").less("1.12.0+dev-211-g316db0fe7")); + assertTrue(new Version("1.12.0").less("v2")); + assertTrue(new Version("v1.12.0").less("1.12.1-wowowow")); + assertTrue(new Version("1.2.3").less("1.2.4")); + + assertFalse(new Version("1").less("1.1.10")); + assertFalse(new Version("1.12.1").less("1.12.0+dev-211-g316db0fe7")); + assertFalse(new Version("1.12.0").less("1.12.0")); + assertFalse(new Version("v1.12.0").less("1.10.0")); + assertFalse(new Version("2.12.0").less("v1.12")); + assertFalse(new Version("2").less("1")); + assertFalse(new Version("1.2").less("2.1")); + assertFalse(new Version("2.2").less("2.1.120")); + + } + + @Test + public void lessOrEqual() { + + assertTrue(new Version("1.11.0").lessOrEqual("1.12")); + assertTrue(new Version("v1.11").lessOrEqual("1.12.0+dev-211-g316db0fe7")); + assertTrue(new Version("1.12.0").lessOrEqual("v2")); + assertTrue(new Version("v1.12.0").lessOrEqual("1.12.1-wowowow")); + assertTrue(new Version("1.2.3").lessOrEqual("1.2.4")); + assertTrue(new Version("1").lessOrEqual("1.1.10")); + assertTrue(new Version("1.12.0").lessOrEqual("1.12.0")); + + assertFalse(new Version("1.12.1").lessOrEqual("1.12.0+dev-211-g316db0fe7")); + assertFalse(new Version("v1.12.0").lessOrEqual("1.10.0")); + assertFalse(new Version("2.12.0").lessOrEqual("v1.12")); + assertFalse(new Version("2").lessOrEqual("1")); + assertFalse(new Version("1.2").lessOrEqual("2.1")); + assertFalse(new Version("2.2").lessOrEqual("2.1.120")); + + } + + + @Test + public void higher() { + + assertTrue(new Version("1.12").higher("1.11.0")); + assertTrue(new Version("1.12.0+dev-211-g316db0fe7").higher("v1.11")); + assertTrue(new Version("v2").higher("1.12.0")); + assertTrue(new Version("1.12.1-wowowow").higher("v1.12.0")); + assertTrue(new Version("1.2.4").higher("1.2.3")); + + assertFalse(new Version("1").higher("1.1.10")); + assertFalse(new Version("1.12.0+dev-211-g316db0fe7").higher("1.12.1")); + assertFalse(new Version("1.12.0").higher("1.12.0")); + assertFalse(new Version("1.10.0").higher("v1.12.0")); + assertFalse(new Version("v1.12").higher("2.12.0")); + assertFalse(new Version("1").higher("2")); + assertFalse(new Version("2.1").higher("1.2")); + assertFalse(new Version("2.1.120").higher("2.2")); + + } + + @Test + public void higherOrEqual() { + + assertTrue(new Version("1.12").higherOrEqual("1.11.0")); + assertTrue(new Version("1.12.0+dev-211-g316db0fe7").higherOrEqual("v1.11")); + assertTrue(new Version("v2").higherOrEqual("1.12.0")); + assertTrue(new Version("1.12.1-wowowow").higherOrEqual("v1.12.0")); + assertTrue(new Version("1.2.4").higherOrEqual("1.2.3")); + assertTrue(new Version("1").higherOrEqual("1.1.10")); + assertTrue(new Version("1.12.0").higherOrEqual("1.12.0")); + + assertFalse(new Version("1.12.0+dev-211-g316db0fe7").higherOrEqual("1.12.1")); + assertFalse(new Version("1.10.0").higherOrEqual("v1.12.0")); + assertFalse(new Version("v1.12").higherOrEqual("2.12.0")); + assertFalse(new Version("1").higherOrEqual("2")); + assertFalse(new Version("2.1").higherOrEqual("1.2")); + assertFalse(new Version("2.1.120").higherOrEqual("2.2")); }