diff --git a/docs/org/camunda/latera/bss/internal/Version.html b/docs/org/camunda/latera/bss/internal/Version.html new file mode 100644 index 00000000..7131b1c9 --- /dev/null +++ b/docs/org/camunda/latera/bss/internal/Version.html @@ -0,0 +1,451 @@ + + + + + + + + +
+@EqualsAndHashCode +class Version + ++ + + +
org.camunda.latera:bss:1.3
+ + + +Executed features | +Failures | +Errors | +Skipped | +Success rate | + + +
---|---|---|---|---|
6 | +0 | +0 | +0 | +100,0% | +
+
+Default constructor
+
+Return
+
+
+ |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Expect:
+ |
+
+(new Version( main, major, minor, mod) as String) == result +(new Version(main: main, major: major, minor: minor, mod: mod) as String) == result+ |
+||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Examples:
+ |
+
+
+
+
|
+
+ 30/30 passed
+ |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
+Constructor for String input
+
+Return
+
+
+ |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Expect:
+ |
+
+(new Version(input) as String) == result+ |
+||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Examples:
+ |
+
+
+
+
|
+
+ 10/10 passed
+ |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
+Constructor for Number input
+
+Return
+
+
+ |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Expect:
+ |
+
+(new Version(input) as String) == result+ |
+||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Examples:
+ |
+
+
+
+
|
+
+ 4/4 passed
+ |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
+#toNumber
+
+Return
+
+
+ |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Expect:
+ |
+
+(new Version(input).toNumber()) == result+ |
+||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Examples:
+ |
+
+
+
+
|
+
+ 10/10 passed
+ |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
+#compareTo with Version or String input
+
+Return
+
+
+ |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Expect:
+ |
+
+(new Version(first)).compareTo(new Version(second)) == result +(new Version(first)).compareTo(second) == result+ |
+||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Examples:
+ |
+
+
+
+
|
+
+ 86/86 passed
+ |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
+#compareTo with Number input
+
+Return
+
+
+ |
+|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Expect:
+ |
+
+(new Version(first)).compareTo(second) == result+ |
+||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ Examples:
+ |
+
+
+
+
|
+
+ 48/48 passed
+ |
+
+ Examples: + + @param main @see #main + @param major @see #major + @param minor @see #minor + @param mod @see #mod + */ + Version(def main, def major, def minor = null, def mod = null) { + if (main != null) { + this.main = toIntSafe(main) + if (isIntegerStrict(main)) { // 5 + this.major = toIntSafe(major) + } else if (isFloat(main)) { // 5.0, 5.1 + this.major = toIntSafe((round(toFloatSafe(main), 1) - this.main)*10) // 0, 1 + //DON'T USE MORE THAN 1 DIGIT AFTER DECIMAL POINT + } + } else if (major != null) { + this.main = toIntSafe(major) + if (isIntegerStrict(major)) { // 5 + this.major = 0 + } else if (isFloat(major)) { // 5.0, 5.1 + this.major = toIntSafe((round(toFloatSafe(major), 1) - this.main)*10) // 0, 1 + //DON'T USE MORE THAN 1 DIGIT AFTER DECIMAL POINT + } + } + this.minor = toIntSafe(minor) + this.mod = toIntSafe(mod) + setScale() + } + + /** + Constructor overload with named arguments. +
+ Examples: + + @param input Map with named arguments. + @see Version(def) + */ + Version(Map input) { + this(input.main, input.major, input.minor, input.mod) + } + + /** + Constructor overload for Number input. +
+ Examples: + + @param input Number with version data. + @see Version(def) + */ + Version(Number input) { + this(main: input) + } + + /** + Constructor overload for String input. +
+ Examples: + + @param input String or GStringImpl with version data. + @see Version(def) + */ + Version(CharSequence input) { + List parts = trim(input).tokenize('.') + if (parts.size() > 0) { + this.main = toIntSafe(parts[0]) + if (parts.size() > 1) { + this.major = toIntSafe(parts[1]) + if (parts.size() > 2) { + this.minor = toIntSafe(parts[2]) + if (parts.size() > 3) { + this.mod = toIntSafe(parts[3]) + } + } + } + } + setScale() + } + + private setScale() { + scale = 0 + if (mod != null) { + scale = 4 + } else { + if (minor != null) { + scale = 3 + } else { + if (major != null) { + scale = 2 + } else { + if (main != null) { + scale = 1 + } + } + } + } + if (scale == 0) { + throw new Exception('Version should have at least one number') + } + } + + private Integer toInteger() { + return toIntSafe(main*1000000000 + (major ?: 0)*1000000 + (minor ?: 0)*1000 + (mod ?: 0)) + } + + private Integer toIntegerRound(Version v) { + return toIntSafe(this.main*1000000000 + (this.major != null && v.major != null ? this.major : 0)*1000000 + (this.major != null && v.major != null && this.minor != null && v.minor != null ? this.minor : 0)*1000 + (this.major != null && v.major != null && this.minor != null && v.minor != null && this.mod != null && v.mod != null ? this.mod : 0)) + } + + /** + Get version as string. +
+ Examples: + + @returns String with version. + */ + String toString() { + String result = "${main}" + if (scale > 1) { + result += ".${major ?: 0}" + if (scale > 2) { + result += ".${minor ?: 0}" + if (scale > 3) { + result += ".${mod}" + } + } + } + return result + } + + /** + Get version as integer of decimal number (only main.major, without other parts). +
+ Examples: + + @returns BigInteger or BigDecimal with version. + */ + Number toNumber() { + if (major == null) { + return main + } + return toFloatSafe("${this.main}.${this.major}") + } + + /** + Compare two versions. +
+ Examples: + + @param input Version, Number or String with version to compare. + @returns 0 if source satisfies target (5.1.2 == 5.1), -1 if source less than target (5.0.0 < 5.1) or 1 if source more than target (5.1.2 > 5.0) + */ + int compareTo(def v) { + if (isString(v) || isNumber(v)) { + v = new Version(v) + } + Integer v1 = toIntegerRound(v) + Integer v2 = v.toInteger() + int result = v1.compareTo(v2) + + if (result == 0 && scale < v.scale) { // 5.0 == 5 but 5 < 5.0 because 5.0 is more precise + return -1 + } + return result + } +} \ No newline at end of file diff --git a/test/org/camunda/latera/bss/internal/VersionSpec.groovy b/test/org/camunda/latera/bss/internal/VersionSpec.groovy new file mode 100644 index 00000000..82656ee7 --- /dev/null +++ b/test/org/camunda/latera/bss/internal/VersionSpec.groovy @@ -0,0 +1,243 @@ +package org.camunda.latera.bss.internal + +import spock.lang.* +import org.camunda.latera.bss.internal.Version + +class VersionSpec extends Specification { + def "Default constructor"() { + expect: + (new Version( main, major, minor, mod) as String) == result + (new Version(main: main, major: major, minor: minor, mod: mod) as String) == result + + where: + main |major |minor|mod |result + 5 |1 |2 |5 |'5.1.2.5' + '5' |'1' |'2' |'5' |'5.1.2.5' + 5 |1 |null |5 |'5.1.0.5' + '5' |'1' |null |'5' |'5.1.0.5' + 5 |null |null |5 |'5.0.0.5' + '5' |null |null |'5' |'5.0.0.5' + 5 |1 |2 |null |'5.1.2' + '5' |'1' |'2' |null |'5.1.2' + 5 |null |2 |null |'5.0.2' + '5' |null |'2' |null |'5.0.2' + 5 |1 |null |null |'5.1' + '5' |'1' |null |null |'5.1' + 5 |null |null |null |'5' + '5' |null |null |null |'5' + 5.1 |null |2 |5 |'5.1.2.5' + '5.1'|null |'2' |'5' |'5.1.2.5' + 5.1 |null |null |5 |'5.1.0.5' + '5.1'|null |null |'5' |'5.1.0.5' + 5.1 |null |2 |null |'5.1.2' + '5.1'|null |'2' |null |'5.1.2' + 5.1 |null |null |null |'5.1' + '5.1'|null |null |null |'5.1' + null |5.1 |2 |5 |'5.1.2.5' + null |'5.1' |'2' |'5' |'5.1.2.5' + null |5.1 |null |5 |'5.1.0.5' + null |'5.1' |null |'5' |'5.1.0.5' + null |5.1 |2 |null |'5.1.2' + null |'5.1' |'2' |null |'5.1.2' + null |5.1 |null |null |'5.1' + null |'5.1' |null |null |'5.1' + } + + def "Constructor for String input"() { + expect: + (new Version(input) as String) == result + + where: + input|result + '5.1.2.5'|'5.1.2.5' + '5.1.0.5'|'5.1.0.5' + '5.0.2.5'|'5.0.2.5' + '5.0.0.5'|'5.0.0.5' + '5.1.2' |'5.1.2' + '5.0.2' |'5.0.2' + '5.1.0' |'5.1.0' + '5.1' |'5.1' + '5.0' |'5.0' + '5' |'5' + } + + def "Constructor for Number input"() { + expect: + (new Version(input) as String) == result + + where: + input|result + 5 |'5' + 5.1 |'5.1' + 5.12 |'5.1' //more than 1 digits after decimal point are being dropped + 5.125|'5.1' //more than 1 digits after decimal point are being dropped + } + + def "#toNumber"() { + expect: + (new Version(input).toNumber()) == result + + where: + input|result + '5.1.2.5'|5.1 + '5.1.0.5'|5.1 + '5.0.2.5'|5.0 + '5.0.0.5'|5.0 + '5.1.2' |5.1 + '5.0.2' |5.0 + '5.1.0' |5.1 + '5.1' |5.1 + '5.0' |5.0 + '5' |5 + } + + def "#compareTo with Version or String input"() { + expect: + (new Version(first)).compareTo(new Version(second)) == result + (new Version(first)).compareTo(second) == result + + where: + first |second |result + '5.1.2.5'|'5.1.2.5'| 0 + '5.1.2.5'|'4.1.2.5'| 1 + '5.1.2.5'|'5.1.2' | 0 + '5.1.2.5'|'4.1.2' | 1 + '5.1.2.5'|'5.1' | 0 + '5.1.2.5'|'4.1' | 1 + '5.1.2.5'|'5.0' | 1 + '5.1.2.5'|'4.0' | 1 + '5.1.2.5'|'5' | 0 + '5.1.2.5'|'4' | 1 + '4.1.2.5'|'5.1.2.5'|-1 + '4.1.2.5'|'5.1.2' |-1 + '4.1.2.5'|'5.1' |-1 + '4.1.2.5'|'5.0' |-1 + '4.1.2.5'|'5' |-1 + '4.1.2.5'|'4' | 0 + '5.1.0.5'|'5.1.2.5'|-1 + '5.1.0.5'|'4.1.2.5'| 1 + '5.1.0.5'|'5.1.2' |-1 + '5.1.0.5'|'4.1.2' | 1 + '5.1.0.5'|'5.1' | 0 + '5.1.0.5'|'4.1' | 1 + '5.1.0.5'|'5.0' | 1 + '5.1.0.5'|'4.0' | 1 + '5.1.0.5'|'5' | 0 + '5.1.0.5'|'4' | 1 + '5.0.2.5'|'5.1.2.5'|-1 + '5.0.2.5'|'4.1.2.5'| 1 + '5.0.2.5'|'5.1.2' |-1 + '5.0.2.5'|'4.1.2' | 1 + '5.0.2.5'|'5.1' |-1 + '5.0.2.5'|'4.1' | 1 + '5.0.2.5'|'5.0' | 0 + '5.0.2.5'|'4.0' | 1 + '5.0.2.5'|'5' | 0 + '5.0.2.5'|'4' | 1 + '5.1.2' |'5.1.2.5'|-1 + '5.1.2' |'4.1.2.5'| 1 + '5.1.2' |'5.1.2' | 0 + '5.1.2' |'4.1.2' | 1 + '5.1.2' |'5.1' | 0 + '5.1.2' |'4.1' | 1 + '5.1.2' |'5.0' | 1 + '5.1.2' |'4.0' | 1 + '5.1.2' |'5' | 0 + '5.1.2' |'4' | 1 + '5.0.2' |'5.1.2.5'|-1 + '5.0.2' |'4.1.2.5'| 1 + '5.0.2' |'5.1.2' |-1 + '5.0.2' |'4.1.2' | 1 + '5.0.2' |'5.1' |-1 + '5.0.2' |'4.1' | 1 + '5.0.2' |'5.0' | 0 + '5.0.2' |'4.0' | 1 + '5.0.2' |'5' | 0 + '5.0.2' |'4' | 1 + '5.1' |'5.1.2.5'|-1 + '5.1' |'4.1.2.5'| 1 + '5.1' |'5.1.2' |-1 + '5.1' |'4.1.2' | 1 + '5.1' |'5.1' | 0 + '5.1' |'4.1' | 1 + '5.1' |'5.0' | 1 + '5.1' |'4.0' | 1 + '5.1' |'5' | 0 + '5.1' |'4' | 1 + '5.0' |'5.1.2.5'|-1 + '5.0' |'4.1.2.5'| 1 + '5.0' |'5.1.2' |-1 + '5.0' |'4.1.2' | 1 + '5.0' |'5.1' |-1 + '5.0' |'4.1' | 1 + '5.0' |'5.0' | 0 + '5.0' |'4.0' | 1 + '5.0' |'5' | 0 + '5.0' |'4' | 1 + '5' |'5.1.2.5'|-1 + '5' |'4.1.2.5'| 1 + '5' |'5.1.2' |-1 + '5' |'4.1.2' | 1 + '5' |'5.1' |-1 + '5' |'4.1' | 1 + '5' |'5.0' |-1 + '5' |'4.0' | 1 + '5' |'5' | 0 + '5' |'4' | 1 + } + def "#compareTo with Number input"() { + expect: + (new Version(first)).compareTo(second) == result + + where: + first |second |result + '5.1.2.5'|5.1 | 0 + '5.1.2.5'|4.1 | 1 + '5.1.2.5'|5.0 | 1 + '5.1.2.5'|4.0 | 1 + '5.1.2.5'|5 | 0 + '5.1.2.5'|4 | 1 + '5.1.0.5'|5.1 | 0 + '5.1.0.5'|4.1 | 1 + '5.1.0.5'|5.0 | 1 + '5.1.0.5'|4.0 | 1 + '5.1.0.5'|5 | 0 + '5.1.0.5'|4 | 1 + '5.0.2.5'|5.1 |-1 + '5.0.2.5'|4.1 | 1 + '5.0.2.5'|5.0 | 0 + '5.0.2.5'|4.0 | 1 + '5.0.2.5'|5 | 0 + '5.0.2.5'|4 | 1 + '5.1.2' |5.1 | 0 + '5.1.2' |4.1 | 1 + '5.1.2' |5.0 | 1 + '5.1.2' |4.0 | 1 + '5.1.2' |5 | 0 + '5.1.2' |4 | 1 + '5.0.2' |5.1 |-1 + '5.0.2' |4.1 | 1 + '5.0.2' |5.0 | 0 + '5.0.2' |4.0 | 1 + '5.0.2' |5 | 0 + '5.0.2' |4 | 1 + '5.1' |5.1 | 0 + '5.1' |4.1 | 1 + '5.1' |5.0 | 1 + '5.1' |4.0 | 1 + '5.1' |5 | 0 + '5.1' |4 | 1 + '5.0' |5.1 |-1 + '5.0' |4.1 | 1 + '5.0' |5.0 | 0 + '5.0' |4.0 | 1 + '5.0' |5 | 0 + '5.0' |4 | 1 + '5' |5.1 |-1 + '5' |4.1 | 1 + '5' |5.0 |-1 + '5' |4.0 | 1 + '5' |5 | 0 + '5' |4 | 1 + } +} \ No newline at end of file