mirror of
https://github.com/irmen/prog8.git
synced 2026-10-22 05:02:58 +00:00
110 lines
3.2 KiB
Kotlin
110 lines
3.2 KiB
Kotlin
package prog8tests.codecore
|
|
|
|
import io.kotest.core.spec.style.FunSpec
|
|
import io.kotest.matchers.shouldBe
|
|
import prog8.code.core.escape
|
|
import prog8.code.core.toHex
|
|
import prog8.code.core.unescape
|
|
|
|
/**
|
|
* Unit tests for conversion functions in codeCore.
|
|
* Focus on toHex boundaries and escape/unescape roundtrips.
|
|
*/
|
|
class TestConversions: FunSpec({
|
|
|
|
// ============================================================================
|
|
// toHex() Tests
|
|
// ============================================================================
|
|
|
|
test("toHex for 0-15 (decimal output)") {
|
|
0.toHex() shouldBe "0"
|
|
10.toHex() shouldBe "10"
|
|
15.toHex() shouldBe "15"
|
|
}
|
|
|
|
test("toHex for 16-255 (hex with $)") {
|
|
16.toHex() shouldBe $$"$10"
|
|
255.toHex() shouldBe $$"$ff"
|
|
}
|
|
|
|
test("toHex for 256-65535 (4 digit hex)") {
|
|
256.toHex() shouldBe $$"$0100"
|
|
65535.toHex() shouldBe $$"$ffff"
|
|
}
|
|
|
|
test("toHex for larger numbers (8 digit hex)") {
|
|
65536.toHex() shouldBe $$"$00010000"
|
|
0x12345678.toHex() shouldBe $$"$12345678"
|
|
}
|
|
|
|
test("toHex for negative numbers") {
|
|
(-1).toHex() shouldBe "-1"
|
|
(-255).toHex() shouldBe $$"-$ff"
|
|
Int.MIN_VALUE.toHex() shouldBe $$"$80000000"
|
|
}
|
|
|
|
test("UInt.toHex") {
|
|
0u.toHex() shouldBe "0"
|
|
15u.toHex() shouldBe "15"
|
|
255u.toHex() shouldBe $$"$ff"
|
|
65535u.toHex() shouldBe $$"$ffff"
|
|
}
|
|
|
|
// ============================================================================
|
|
// escape() Tests
|
|
// ============================================================================
|
|
|
|
test("escape for plain string") {
|
|
"hello".escape() shouldBe "hello"
|
|
}
|
|
|
|
test("escape for tab and newline") {
|
|
"hello\tworld".escape() shouldBe "hello\\tworld"
|
|
"hello\nworld".escape() shouldBe "hello\\nworld"
|
|
}
|
|
|
|
test("escape for double quote") {
|
|
"hello\"world".escape() shouldBe "hello\\\"world"
|
|
}
|
|
|
|
test("escape for unicode outside passthrough range") {
|
|
"€".escape() shouldBe "\\u20ac"
|
|
}
|
|
|
|
test("escape for passthrough characters (\\u8000-\\u80ff)") {
|
|
"\u8000".escape() shouldBe "\\x00"
|
|
"\u80ff".escape() shouldBe "\\xff"
|
|
}
|
|
|
|
// ============================================================================
|
|
// unescape() Tests
|
|
// ============================================================================
|
|
|
|
test("unescape for plain string") {
|
|
"hello".unescape() shouldBe "hello"
|
|
}
|
|
|
|
test("unescape for tab and newline") {
|
|
"hello\\tworld".unescape() shouldBe "hello\tworld"
|
|
"hello\\nworld".unescape() shouldBe "hello\nworld"
|
|
}
|
|
|
|
test("unescape for double quote") {
|
|
"hello\\\"world".unescape() shouldBe "hello\"world"
|
|
}
|
|
|
|
test("unescape for unicode") {
|
|
"\\u0041".unescape() shouldBe "A"
|
|
"\\u20ac".unescape() shouldBe "€"
|
|
}
|
|
|
|
// ============================================================================
|
|
// Roundtrip Tests
|
|
// ============================================================================
|
|
|
|
test("escape then unescape roundtrip") {
|
|
val original = "hello\t\nworld\"test"
|
|
original.escape().unescape() shouldBe original
|
|
}
|
|
})
|