package bintools import net.sergeych.bintools.* import kotlin.test.Test import kotlin.test.assertEquals class SmartintTest { inline fun testValue(x: T) { assertEquals(x, Smartint.decode(Smartint.encode(x))) println("+ ${x}: ${Smartint.encode(x).encodeToHex()}") } fun testAround(bits: Int) { println("----- $bits -----") val window = 5 var median: Long = (1.toULong() shl bits).toLong() for (x in (median - 2)..(median + 2)) { testValue(x) testValue(-x) } median = median * 3 / 2 for (x in (median - 5)..(median + 5)) { testValue(x) testValue(-x) } } @Test fun encode() { for (i in 0..70) testValue(i.toLong()) testAround(6) testAround(14) testAround(22) testAround(29) testAround(36) testValue(-1) // testAround(28) } // @Test fun compareTest() { // for( x in listOf(0uL, 1uL, 66uL, 129uL, 219uL, 0x1122uL, 0xFFEEuL, 0xAAbbCCdduL, // 0x1111222233334444uL, (1UL shl 63))) { var lastDelta = 0 for (x in 0..3000000000) { val n1 = Varint.encode(x).size val n2 = Smartint.encode(x).size val delta = n1 - n2 if (delta != lastDelta) { when { delta < 0 -> println("LOSS: $delta from $x") delta > 0 -> println("GAIN: $delta from $x") delta == 0 -> println("SAME: from $x") } lastDelta = delta } // for( x in listOf(0uL, 1uL, (1UL shl 17)+11UL)) { // 0x1111222233334444uL, (1UL shl 63))) { // 1--12--23--34--4 // println("--- $x / 0x${x.encodeToHex(8)}") // println("V: ${Varint.encode(x).encodeToHex()}") // println("S: ${Smartint.encode(x).encodeToHex()}") // } } } @Test fun testCustom() { val x = 64000.toULong() val p = Smartint.encodeUnsigned(x) println(p.toDump()) val y = Smartint.decodeUnsigned(p) println(y) assertEquals(y, x) } }