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 }