Recently Written · git

ink-update

Ink Update: tells you when Rebind, Ink Recents or Ink Dim has a new version. F-Droid, then Google Play, then GitHub.

git clone https://github.com/equwal/ink-update

Log | Files | Refs


app/src/test/java/dev/equwal/inkupdate/VersionTest.kt (3850 bytes)

1 // SPDX-License-Identifier: GPL-3.0-or-later
2 // Copyright (c) 2026 equwal
3 package dev.equwal.inkupdate
4 
5 import org.junit.Assert.assertEquals
6 import org.junit.Assert.assertNotNull
7 import org.junit.Assert.assertNull
8 import org.junit.Assert.assertTrue
9 import org.junit.Test
10 import java.util.Random
11 
12 /** [Version.parse] and the order of two versions. */
13 class VersionTest {
14 
15     private fun v(text: String): Version {
16         val p = Version.parse(text)
17         assertNotNull("parse failed: " + text, p)
18         return p!!
19     }
20 
21     @Test
22     fun readsTheParts() {
23         assertEquals(listOf(0, 0, 15, 0), v("v0.0.15-alpha").parts)
24         assertEquals(Version.ALPHA, v("v0.0.15-alpha").stage)
25         assertEquals(listOf(3, 7, 0, 0), v("V3.7").parts)
26         assertEquals(Version.FINAL, v("V3.7").stage)
27         assertEquals(listOf(5, 3, 0, 0), v("v5.3.0").parts)
28         assertEquals(Version.BETA, v("0.1.0-beta").stage)
29         assertEquals(Version.RC, v("2.0-rc1").stage)
30         assertEquals(listOf(1, 2, 3, 4), v("1.2.3.4").parts)
31     }
32 
33     /** A tag and an installed versionName must give the same version. */
34     @Test
35     fun theTagEqualsTheInstalledName() {
36         assertEquals(v("v0.0.15-alpha"), v("0.0.15-alpha-full"))
37         assertEquals(v("v0.1.0"), v("0.1.0-debug"))
38         assertEquals(v("0.1.0"), v("0.1.0.0"))
39     }
40 
41     @Test
42     fun ordersByNumberThenStage() {
43         assertTrue(v("0.1.0-beta") > v("0.0.15-alpha"))
44         assertTrue(v("0.1.0") > v("0.1.0-beta"))
45         assertTrue(v("0.1.0-beta") > v("0.1.0-alpha"))
46         assertTrue(v("0.1.0") > v("0.1.0-rc1"))
47         assertTrue(v("v5.3.0") > v("v5.2.11"))
48         assertTrue(v("3.7") < v("3.10"))
49         assertTrue(v("0.0.16-alpha") > v("0.0.15-alpha-full"))
50         assertEquals(0, v("1.2.3").compareTo(v("v1.2.3")))
51     }
52 
53     @Test
54     fun junkIsNotAVersion() {
55         for (s in listOf("", "   ", "v", "alpha", "-1.0", "latest", "v.1.2", "x1.2")) {
56             assertNull("must be null: " + s, Version.parse(s))
57         }
58         assertNull(Version.parse(null))
59     }
60 
61     /** A part of more than nine digits is not a version number. */
62     @Test
63     fun aVeryLongNumberIsNotAVersion() {
64         assertNull(Version.parse("12345678901234567890.1"))
65     }
66 
67     @Test
68     fun parseNeverThrows() {
69         val r = Random(20260921L)
70         val letters = "0123456789.-vV abcRC+/\\\"{}é中"
71         for (i in 0 until 5000) {
72             val n = r.nextInt(12)
73             val sb = StringBuilder()
74             for (j in 0 until n) sb.append(letters[r.nextInt(letters.length)])
75             Version.parse(sb.toString())
76         }
77     }
78 
79     // ---- properties --------------------------------------------------------
80 
81     private fun random(r: Random): Version = Version(
82         List(Version.PARTS) { r.nextInt(12) },
83         r.nextInt(4)
84     )
85 
86     private fun sign(n: Int): Int = if (n < 0) -1 else if (n > 0) 1 else 0
87 
88     @Test
89     fun compareIsAntisymmetric() {
90         val r = Random(4242L)
91         for (i in 0 until 20000) {
92             val a = random(r)
93             val b = random(r)
94             assertEquals(
95                 a.toString() + " vs " + b,
96                 sign(a.compareTo(b)),
97                 -sign(b.compareTo(a))
98             )
99         }
100     }
101 
102     @Test
103     fun compareIsTransitive() {
104         val r = Random(99L)
105         for (i in 0 until 20000) {
106             val a = random(r)
107             val b = random(r)
108             val c = random(r)
109             if (a <= b && b <= c) {
110                 assertTrue(a.toString() + " " + b + " " + c, a <= c)
111             }
112         }
113     }
114 
115     /** Text made from a version parses back to the same version. */
116     @Test
117     fun theTextRoundTrips() {
118         val r = Random(7L)
119         for (i in 0 until 20000) {
120             val a = random(r)
121             assertEquals(a, Version.parse("v" + a))
122         }
123     }
124 }