gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-kotlin] 01/02: Add class to handle libtool-style semantic


From: gnunet
Subject: [taler-wallet-kotlin] 01/02: Add class to handle libtool-style semantic versioning with test
Date: Thu, 09 Jul 2020 21:10:19 +0200

This is an automated email from the git hooks/post-receive script.

torsten-grote pushed a commit to branch master
in repository wallet-kotlin.

commit 2ee6b0d4cc3871237d24e28d09d2f526d1304da1
Author: Torsten Grote <t@grobox.de>
AuthorDate: Wed Jul 8 11:56:55 2020 -0300

    Add class to handle libtool-style semantic versioning with test
---
 .../kotlin/net/taler/wallet/kotlin/Version.kt      | 71 ++++++++++++++++++++++
 .../kotlin/net/taler/wallet/kotlin/VersionTest.kt  | 57 +++++++++++++++++
 2 files changed, 128 insertions(+)

diff --git a/src/commonMain/kotlin/net/taler/wallet/kotlin/Version.kt 
b/src/commonMain/kotlin/net/taler/wallet/kotlin/Version.kt
new file mode 100644
index 0000000..457fb07
--- /dev/null
+++ b/src/commonMain/kotlin/net/taler/wallet/kotlin/Version.kt
@@ -0,0 +1,71 @@
+/*
+ * This file is part of GNU Taler
+ * (C) 2020 Taler Systems S.A.
+ *
+ * GNU Taler is free software; you can redistribute it and/or modify it under 
the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 3, or (at your option) any later version.
+ *
+ * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
+ * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+package net.taler.wallet.kotlin
+
+import kotlin.math.sign
+
+/**
+ * Semantic versioning, but libtool-style.
+ * See 
https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
+ */
+
+/**
+ * Result of comparing two libtool versions.
+ */
+data class VersionMatchResult(
+    /**
+     * Is the first version compatible with the second?
+     */
+    val compatible: Boolean,
+    /**
+     * Is the first version older (-1), newer (+1) or identical (0)?
+     */
+    val currentCmp: Int
+)
+
+data class Version(
+    val current: Int,
+    val revision: Int,
+    val age: Int
+)
+
+/**
+ * Compare two libtool-style version strings.
+ */
+fun compareVersions(me: String,other: String): VersionMatchResult? {
+    val meVer = parseVersion (me)
+    val otherVer = parseVersion (other)
+    if (meVer == null || otherVer == null) return null
+
+    val compatible = meVer.current - meVer.age <= otherVer.current &&
+            meVer.current >= otherVer.current - otherVer.age
+
+    val currentCmp = sign((meVer.current - 
otherVer.current).toDouble()).toInt()
+
+    return VersionMatchResult(compatible, currentCmp)
+}
+
+fun parseVersion(v: String): Version? {
+    val elements = v.split(":")
+    if (elements.size != 3) return null
+    val (currentStr, revisionStr, ageStr) = elements
+    val current = currentStr.toIntOrNull()
+    val revision = revisionStr.toIntOrNull()
+    val age = ageStr.toIntOrNull()
+    if (current == null || revision == null || age == null) return null
+    return Version(current, revision, age)
+}
diff --git a/src/commonTest/kotlin/net/taler/wallet/kotlin/VersionTest.kt 
b/src/commonTest/kotlin/net/taler/wallet/kotlin/VersionTest.kt
new file mode 100644
index 0000000..d445ebc
--- /dev/null
+++ b/src/commonTest/kotlin/net/taler/wallet/kotlin/VersionTest.kt
@@ -0,0 +1,57 @@
+/*
+ * This file is part of GNU Taler
+ * (C) 2020 Taler Systems S.A.
+ *
+ * GNU Taler is free software; you can redistribute it and/or modify it under 
the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 3, or (at your option) any later version.
+ *
+ * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
+ * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+package net.taler.wallet.kotlin
+
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertNull
+
+class VersionTest {
+
+    @Test
+    fun testComparision() {
+        assertNull(compareVersions("0:0:0", ""))
+        assertNull(compareVersions("", "0:0:0"))
+        assertNull(compareVersions("foo", "0:0:0"))
+        assertNull(compareVersions("0:0:0", "foo"))
+        assertEquals(
+            VersionMatchResult(true, 0),
+            compareVersions("0:0:0", "0:0:0")
+        )
+        assertEquals(
+            VersionMatchResult(true, -1),
+            compareVersions("0:0:0", "1:0:1")
+        )
+        assertEquals(
+            VersionMatchResult(true, -1),
+            compareVersions("0:0:0", "1:5:1")
+        )
+        assertEquals(
+            VersionMatchResult(false, -1),
+            compareVersions("0:0:0", "1:5:0")
+        )
+        assertEquals(
+            VersionMatchResult(false, 1),
+            compareVersions("1:0:0", "0:5:0")
+        )
+        assertEquals(
+            VersionMatchResult(true, 0),
+            compareVersions("1:0:1", "1:5:1")
+        )
+    }
+
+}

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]