107 lines
2.8 KiB
Scheme
107 lines
2.8 KiB
Scheme
; test integer->char function
|
||
|
||
; Is R5RS, but ScriptFu supports unicode
|
||
|
||
; Also test the inverse operation: char->integer
|
||
|
||
; TinyScheme does not implement some char functions in MIT Scheme.
|
||
; For example char->name char->digit
|
||
|
||
; TODO test char=? char-upcase
|
||
|
||
; General test strategy:
|
||
; Generate char atom using integer->char.
|
||
; Convert each such char atom to string.
|
||
; In all cases where it was possible to create such a string, test length is 1.
|
||
|
||
; See also number->string which is similar to (atom->string (integer->char <foo>) <base>)
|
||
|
||
|
||
; integer->char takes only unsigned (positive or zero) codepoints
|
||
; -1 in twos complement is out of range of UTF-8
|
||
(assert-error `(integer->char -1)
|
||
"integer->char: argument 1 must be: non-negative integer")
|
||
|
||
|
||
|
||
; ASCII NUL character.
|
||
|
||
; 0 is a valid codepoint.
|
||
; But ASCII null terminates the string early, so to speak.
|
||
|
||
; Since null byte terminates string early
|
||
; the repr in the REPL of codepoint 0 is #\
|
||
|
||
; re-test
|
||
; (integer->char 0)
|
||
; #\
|
||
|
||
(assert (= (char->integer (integer->char 0))
|
||
0))
|
||
|
||
; codepoint zero equals its sharp char hex repr
|
||
(assert (equal? (integer->char 0)
|
||
#\x0))
|
||
|
||
; Converting the atom to string yields an empty string
|
||
(assert `(string=? (atom->string (integer->char 0))
|
||
""))
|
||
|
||
; You can also represent as escaped hex "x\00"
|
||
(assert `(string=? "\x00"
|
||
""))
|
||
|
||
; Escaped hex must have more than one hex digit.
|
||
; Testing framework can't test: (assert-error `(string? "\x0") "Error reading string ")
|
||
|
||
; re-test REPL
|
||
; (null? "\x0")
|
||
; Error: Error reading string
|
||
|
||
|
||
; the first non-ASCII character (often the euro sign)
|
||
|
||
(assert (integer->char 128))
|
||
|
||
; converted string is equivalent to a string literal that displays
|
||
(assert `(string=? (atom->string (integer->char 128))
|
||
""))
|
||
|
||
; first Unicode character outside the 8-bit range
|
||
|
||
; evaluates without complaint
|
||
(assert (integer->char 256))
|
||
|
||
(assert (= (char->integer (integer->char 256))
|
||
256))
|
||
|
||
; length of converted string is 1
|
||
; The length is count of characters, not the count of bytes.
|
||
(assert `(= (string-length (atom->string (integer->char 256)))
|
||
1))
|
||
|
||
; converted string is equivalent to a string literal that displays
|
||
(assert `(string=? (atom->string (integer->char 256))
|
||
"Ā"))
|
||
|
||
|
||
; first Unicode character outside the Basic Multilingual Plane
|
||
(assert (integer->char 65536))
|
||
|
||
(assert (= (char->integer (integer->char 65536))
|
||
65536))
|
||
|
||
(assert `(= (string-length (atom->string (integer->char 65536)))
|
||
1))
|
||
|
||
; The usual glyph in some editors is a wide box with these digits inside:
|
||
; 010
|
||
; 000
|
||
; Other editors may display a small empty box.
|
||
(assert `(string=? (atom->string (integer->char 65536))
|
||
"𐀀"))
|
||
|
||
; re-test REPL yields a sharp char expr
|
||
; (integer->char 65536)
|
||
; #\𐀀
|