Files
kotlin-fork/libraries/stdlib/test/text/CharTest.kt
T
2020-12-31 12:07:41 +03:00

150 lines
4.5 KiB
Kotlin

/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package test.text
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFails
class CharTest {
@Test
fun charFromIntCode() {
val codes = listOf(48, 65, 122, 946, '+'.code, 'Ö'.code, 0xFFFC)
assertEquals("0Azβ+Ö\uFFFC", codes.map { Char(it) }.joinToString(separator = ""))
assertFails { Char(-1) }
assertFails { Char(0x1_0000) }
assertFails { Char(1_000_000) }
}
@Test
fun charFromUShortCode() {
val codes = listOf(48, 65, 122, 946, '+'.code, 'Ö'.code, 0xFFFC)
assertEquals("0Azβ+Ö\uFFFC", codes.map { Char(it.toUShort()) }.joinToString(separator = ""))
assertEquals('\u0000', Char(UShort.MIN_VALUE))
assertEquals('\uFFFF', Char(UShort.MAX_VALUE))
assertEquals('\uFFFF', Char((-1).toUShort()))
assertEquals('\u0000', Char(0x1_0000.toUShort()))
}
@Test
fun code() {
val codes = listOf(48, 65, 122, 946, '+'.code, 'Ö'.code, 0xFFFC)
val chars = "0Azβ+Ö\uFFFC"
assertEquals(codes, chars.map { it.code })
assertEquals(0, Char.MIN_VALUE.code)
assertEquals(0xFFFF, Char.MAX_VALUE.code)
}
@Test
fun digitToInt() {
fun testEquals(expected: Int, receiver: Char, radix: Int) {
if (radix == 10) {
assertEquals(expected, receiver.digitToInt())
assertEquals(expected, receiver.digitToIntOrNull())
}
assertEquals(expected, receiver.digitToInt(radix))
assertEquals(expected, receiver.digitToIntOrNull(radix))
}
fun testFails(receiver: Char, radix: Int) {
if (radix == 10) {
assertFails { receiver.digitToInt() }
assertEquals(null, receiver.digitToIntOrNull())
}
assertFails { receiver.digitToInt(radix) }
assertEquals(null, receiver.digitToIntOrNull(radix))
}
for (char in '0'..'9') {
val digit = char - '0'
for (radix in (digit + 1).coerceAtLeast(2)..36) {
testEquals(digit, char, radix)
}
for (radix in 2..digit) {
testFails(char, radix)
}
}
for (char in 'A'..'Z') {
val digit = 10 + (char - 'A')
val lower = char.toLowerCase()
for (radix in digit + 1..36) {
testEquals(digit, char, radix)
testEquals(digit, lower, radix)
}
for (radix in 2..digit) {
testFails(char, radix)
testFails(lower, radix)
}
}
assertFails { '0'.digitToInt(radix = 37) }
assertFails { '0'.digitToIntOrNull(radix = 37) }
assertFails { '0'.digitToInt(radix = 1) }
assertFails { '0'.digitToIntOrNull(radix = 1) }
testFails('0' - 1, radix = 10)
testFails('9' + 1, radix = 10)
testFails('β', radix = 36)
testFails('+', radix = 36)
}
@Test
fun digitToChar() {
fun testEquals(expected: Char, receiver: Int, radix: Int) {
if (radix == 10) {
assertEquals(expected, receiver.digitToChar())
}
assertEquals(expected, receiver.digitToChar(radix))
}
fun testFails(receiver: Int, radix: Int) {
if (radix == 10) {
assertFails { receiver.digitToChar() }
}
assertFails { receiver.digitToChar(radix) }
}
for (int in 0..9) {
val digit = '0' + int
for (radix in (int + 1).coerceAtLeast(2)..36) {
testEquals(digit, int, radix)
}
for (radix in 2..int) {
testFails(int, radix)
}
testFails(int, radix = 37)
}
for (int in 10..35) {
val digit = 'A' + (int - 10)
for (radix in int + 1..36) {
testEquals(digit, int, radix)
}
for (radix in 2..int) {
testFails(int, radix)
}
testFails(int, radix = 37)
}
assertFails { 0.digitToChar(radix = 37) }
assertFails { 0.digitToChar(radix = 1) }
testFails(-1, radix = 10)
testFails(100, radix = 36)
testFails(100, radix = 110)
}
}