Provide unsigned string to number conversion in arbitrary base

#KT-26161
This commit is contained in:
Ilya Gorbunov
2018-08-17 05:22:01 +03:00
parent c1d1a7108f
commit 2530a8e98c
5 changed files with 350 additions and 2 deletions
@@ -154,6 +154,128 @@ class StringNumberConversionTest {
}
}
@Test fun toUByte() {
compareConversion({it.toUByte()}, {it.toUByteOrNull()}) {
assertProduces("255", UByte.MAX_VALUE)
// assertProduces("+77", 77.toUByte())
assertProduces("128", 128u.toUByte())
assertFailsOrNull("-1")
assertFailsOrNull("256")
assertFailsOrNull("")
assertFailsOrNull(" ")
}
compareConversionWithRadix(String::toUByte, String::toUByteOrNull) {
assertProduces(16, "7a", 0x7a.toUByte())
// assertProduces(16, "+7F", 127.toByte())
assertProduces(16, "80", 128u.toUByte())
assertProduces(16, "Ff", 255u.toUByte())
assertFailsOrNull(2, "100000000")
assertFailsOrNull(8, "")
assertFailsOrNull(8, " ")
}
}
@Test fun toUShort() {
compareConversion({it.toUShort()}, {it.toUShortOrNull()}) {
// assertProduces("+77", 77.toUShort())
assertProduces("65535", UShort.MAX_VALUE)
assertFailsOrNull("+65536")
assertFailsOrNull("-32768")
assertFailsOrNull("")
assertFailsOrNull(" ")
}
compareConversionWithRadix(String::toUShort, String::toUShortOrNull) {
assertProduces(16, "7FFF", 0x7FFF.toUShort())
assertProduces(16, "FfFf", UShort.MAX_VALUE)
assertFailsOrNull(16, "-8000")
assertFailsOrNull(5, "10000000")
assertFailsOrNull(2, "")
assertFailsOrNull(2, " ")
}
}
@Test fun toUInt() {
compareConversion({it.toUInt()}, {it.toUIntOrNull()}) {
assertProduces("77", 77u)
assertProduces("4294967295", UInt.MAX_VALUE)
assertFailsOrNull("-1")
assertFailsOrNull("4294967296")
assertFailsOrNull("42949672940")
assertFailsOrNull("-2147483649")
assertFailsOrNull("239239kotlin")
assertFailsOrNull("")
assertFailsOrNull(" ")
}
compareConversionWithRadix(String::toUInt, String::toUIntOrNull) {
assertProduces(10, "0", 0u)
assertProduces(10, "473", 473u)
// assertProduces(10, "+42", 42u)
assertProduces(10, "2147483647", 2147483647u)
assertProduces(16, "FF", 255)
assertProduces(16, "ffFFff01", 0u - 255u)
assertProduces(2, "1100110", 102)
assertProduces(27, "Kona", 411787)
assertFailsOrNull(10, "-0")
assertFailsOrNull(10, "42949672940")
assertFailsOrNull(8, "99")
assertFailsOrNull(10, "Kona")
assertFailsOrNull(16, "")
assertFailsOrNull(16, " ")
}
assertFailsWith<IllegalArgumentException>("Expected to fail with radix 1") { "1".toUInt(radix = 1) }
assertFailsWith<IllegalArgumentException>("Expected to fail with radix 37") { "37".toUIntOrNull(radix = 37) }
}
@Test fun toULong() {
compareConversion({it.toULong()}, {it.toULongOrNull()}) {
assertProduces("77", 77uL)
assertProduces("18446744073709551615", ULong.MAX_VALUE)
assertFailsOrNull("-1")
assertFailsOrNull("18446744073709551616")
assertFailsOrNull("922337 75809")
assertFailsOrNull("92233,75809")
assertFailsOrNull("92233`75809")
assertFailsOrNull("-922337KOTLIN775809")
assertFailsOrNull("")
assertFailsOrNull(" ")
}
compareConversionWithRadix(String::toULong, String::toULongOrNull) {
assertProduces(10, "0", 0uL)
assertProduces(10, "473", 473uL)
// assertProduces(10, "+42", 42uL)
assertProduces(16, "7F11223344556677", 0x7F11223344556677uL)
// assertProduces(16, "+7faabbccddeeff00", 0x7faabbccddeeff00uL)
assertProduces(16, "8000000000000000", Long.MIN_VALUE.toULong())
assertProduces(16, "FFFFffffFFFFffff", ULong.MAX_VALUE)
assertProduces(2, "1100110", 102uL)
assertProduces(36, "Hazelnut", 1356099454469uL)
assertFailsOrNull(8, "-7")
assertFailsOrNull(8, "99")
assertFailsOrNull(10, "Hazelnut")
assertFailsOrNull(4, "")
assertFailsOrNull(4, " ")
}
assertFailsWith<IllegalArgumentException>("Expected to fail with radix 37") { "37".toULong(radix = 37) }
assertFailsWith<IllegalArgumentException>("Expected to fail with radix 1") { "1".toULongOrNull(radix = 1) }
}
@Test fun byteToStringWithRadix() {
assertEquals("7a", 0x7a.toByte().toString(16))
assertEquals("-80", Byte.MIN_VALUE.toString(radix = 16))