~ chicken-core (master) /tests/unicode-tests.scm
Trap1;;; unicode tests, taken from Chibi23(import (chicken port) (chicken sort))4(import (chicken string) (chicken io))5(import (chicken bytevector))6(import (only (scheme base) write-string))78(include "test.scm")910(test-begin "scheme")1112(test-equal #\Р (string-ref "Русский" 0))13(test-equal #\и (string-ref "Русский" 5))14(test-equal #\й (string-ref "Русский" 6))1516(test-equal 7 (string-length "Русский"))1718(test-equal #\日 (string-ref "日本語" 0))19(test-equal #\本 (string-ref "日本語" 1))20(test-equal #\語 (string-ref "日本語" 2))2122(test-equal 3 (string-length "日本語"))2324(test-equal '(#\日 #\本 #\語) (string->list "日本語"))25(test-equal "日本語" (list->string '(#\日 #\本 #\語)))2627(test-equal "日本" (substring "日本語" 0 2))28(test-equal "本語" (substring "日本語" 1 3))2930(test-equal "日-語"31 (let ((s (substring "日本語" 0 3)))32 (string-set! s 1 #\-)33 s))3435(test-equal "日本人"36 (let ((s (substring "日本語" 0 3)))37 (string-set! s 2 #\人)38 s))3940(test-equal "字字字" (make-string 3 #\字))4142(test-equal "字字字"43 (let ((s (make-string 3)))44 (string-fill! s #\字)45 s))4647; tests from the utf8 egg:4849(test-equal 2 (string-length "漢字"))5051(test-equal 28450 (char->integer (string-ref "漢字" 0)))5253(define str (string-copy "漢字"))5455(test-equal "赤字" (begin (string-set! str 0 (string-ref "赤" 0)) str))5657(test-equal "赤外" (begin (string-set! str 1 (string-ref "外" 0)) str))5859(test-equal "赤x" (begin (string-set! str 1 #\x) str))6061(test-equal "赤々" (begin (string-set! str 1 (string-ref "々" 0)) str))6263(test-equal "文字列" (substring "文字列" 0))64(test-equal "字列" (substring "文字列" 1))65(test-equal "列" (substring "文字列" 2))66(test-equal "文" (substring "文字列" 0 1))67(test-equal "字" (substring "文字列" 1 2))68(test-equal "文字" (substring "文字列" 0 2))6970(define *string* "文字列")71(define *list* '("文" "字" "列"))72(define *chars* '(25991 23383 21015))7374(test-equal *chars* (map char->integer (string->list "文字列")))7576(test-equal *list* (map string (map integer->char *chars*)))7778(test-equal *string* (list->string (map integer->char '(25991 23383 21015))))7980(test-equal "列列列" (make-string 3 (string-ref "列" 0)))8182(test-equal "文文文" (let ((s (string-copy "abc"))) (string-fill! s (string-ref "文" 0)) s))8384(test-equal (string-ref "ハ" 0) (with-input-from-string "全角ハンカク"85 (lambda () (read-char) (read-char) (read-char))))8687(test-equal "個々" (with-output-to-string88 (lambda ()89 (write-char (string-ref "個" 0))90 (write-char (string-ref "々" 0)))))9192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93;; library9495(test-equal "出力改行\n" (with-output-to-string96 (lambda () (print "出" (string-ref "力" 0) "改行"))))9798(test-equal "出力" (with-output-to-string99 (lambda () (print* "出" (string-ref "力" 0) ""))))100101(test-equal "逆リスト→文字列" (reverse-list->string102 (map (cut string-ref <> 0)103 '("列" "字" "文" "→" "ト" "ス" "リ" "逆"))))104105(test-error (utf8->string #u8(255 1 2)))106(test-equal "BC" (utf8->string #u8(65 66 67) 1 3))107(test-assert (bytes->string #u8(255 1 2)))108(test-equal (string-length (bytes->string #u8(255 1 2))) 3)109110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111;; extras112113(test-equal "这是" (with-input-from-string "这是中文" (cut read-string 2)))114115(define s "abcdef")116(call-with-input-string "这是中文" (cut read-string! 2 s <> 2))117(test-equal "ab这是ef" s)118119(define s "这是中文")120(call-with-input-string "abcd" (cut read-string! 1 s <> 2))121(test-equal "这是a文" s)122123(test-equal "这是" (with-output-to-string (cut write-string "这是中文" (current-output-port) 0 2)))124125(test-equal "我爱她" (conc (with-input-from-string "我爱你"126 (cut read-token (lambda (c)127 (memv c (map (cut string-ref <> 0)128 '("爱" "您" "我"))))))129 "她"))130131(test-equal '("第一" "第二" "第三") (string-chop "第一第二第三" 2))132133(test-equal '("第一" "第二" "第三" "…") (string-chop "第一第二第三…" 2))134135(test-equal '("a" "bc" "第" "f几") (string-split "a,bc、第,f几" ",、"))136137(test-equal "THE QUICK BROWN FOX JUMPED OVER THE LAZY SLEEPING DOG"138 (string-translate "the quick brown fox jumped over the lazy sleeping dog"139 "abcdefghijklmnopqrstuvwxyz"140 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))141(test-equal ":foo:bar:baz" (string-translate "/foo/bar/baz" "/" ":"))142(test-equal "你爱我" (string-translate "我爱你" "我你" "你我"))143(test-equal "你爱我" (string-translate "我爱你" '(#\我 #\你) '(#\你 #\我)))144(test-equal "我你" (string-translate "我爱你" "爱"))145(test-equal "我你" (string-translate "我爱你" #\爱))146147(test-assert (substring=? "日本語" "日本語"))148(test-assert (substring=? "日本語" "日本"))149(test-assert (substring=? "日本" "日本語"))150(test-assert (substring=? "日本語" "本語" 1))151(test-assert (substring=? "日本語" "本" 1 0 1))152(test-assert (substring=? "听说上海的东西很贵" "上海的东西很便宜" 2 0 5))153154(test-equal 2 (substring-index "上海" "听说上海的东西很贵"))155156;; case folding157158(test-assert (string-ci=? "abc" "ABC"))159(test-assert (string-ci=? "Xῌηιx" "xηιῌX"))160(test-assert (string-ci=? "αβξ" "αβξ"))161(test-assert (string-ci=? "αβξ" "ΑΒΞ"))162163;; Contributed by Anton Idukov:164165(import (scheme char))166167(test-equal "ru_RU(съешь ещё этих мягких французских булок, да выпей чаю.)"168 (utf8->string169 (string->utf8 "ru_RU(съешь ещё этих мягких французских булок, да выпей чаю.)")))170171172(test-equal "Привет, МИР!"173 (list->string (map integer->char (map char->integer (string->list "Привет, МИР!")))))174175176(test-equal "ПРИВЕТ, МИР!"177 (symbol->string178 (string->symbol179 (list->string180 (map char-upcase (string->list "Привет, МИР!"))))))181182183(test-equal "DZIŚ JEST BARDZO GORĄCY DZIEŃ"184 (list->string185 (map char-upcase186 (string->list187 (list->string188 (map char-downcase189 (string->list "DZIŚ JEST BARDZO GORĄCY DZIEŃ")))))))190191192(test-equal 7193 (apply + (map digit-value194 '(#\3 #\x0664 #\x0AE6))))195196197(test-equal "ru_RU(съешь ещё этих мягких французских булок, да выпей чаю.)"198 (list->string199 (reverse200 (string->list201 (list->string202 (reverse203 (string->list "ru_RU(съешь ещё этих мягких французских булок, да выпей чаю.)")))))))204205(test-equal #t (string<? "ABCD" "ABCd" "ABcd"))206(test-equal #f (string-ci<? "ABCD" "ABCd" "ABcd"))207208(test-equal #t (string<? "АБВГ" "АБВг" "АБвг"))209(test-equal #f (string-ci<? "АБВГ" "АБВг" "АБвг"))210211(test-equal #t (string>? "АБвг" "АБВг" "АБВГ"))212(test-equal #f (string-ci>? "АБвг" "АБВг" "АБВГ"))213214(test-equal #t (string<=? "ПРИВЕТ" "ПРИВЕТ" "ПРИвет"))215(test-equal #t (string-ci<=? "ПРИВЕТ" "ПРИВЕТ" "ПРИвет"))216217(test-equal #t (string>=? "АБвг" "АБвг" "АБВг"))218(test-equal #t (string-ci>=? "АБвг" "АБвг" "АБВг"))219220(test-equal '("ЭЭЭЭЭЭЭЭ" 8)221 (let ((s (make-string 8 #\newline)))222 (string-fill! s #\Э)223 (list s (string-length s))))224225226(test-error (string-fill "Hello" 4 #\x))227228229;; Confirm that compressed ranges in UnicodeData.txt are expanded correctly.230231(define (count-if pred lo hi)232 (let loop ((i lo) (n 0))233 (if (> i hi)234 n235 (loop (add1 i)236 (if (pred (integer->char i))237 (add1 n)238 n)))))239240(test-equal 20992 (count-if char-alphabetic? #x4E00 #x9FFF)) ; CJK241(test-equal 11172 (count-if char-alphabetic? #xAC00 #xD7A3)) ; Hangul242(test-assert (> (count-if char-alphabetic? 0 #x10FFFF) 100000))243244245;; Confirm that consecutive decimal digit runs are not folded together.246247(test-equal 0 (digit-value (integer->char #x1D7CE))) ; bold zero248(test-equal 0 (digit-value (integer->char #x1D7D8))) ; double-struck zero249(test-equal 0 (digit-value (integer->char #x1D7E2))) ; sans-serif zero250(test-equal 0 (digit-value (integer->char #x1D7EC))) ; sans-serif bold zero251(test-equal 0 (digit-value (integer->char #x1D7F6))) ; monospace zero252(test-equal 9 (digit-value (integer->char #x1D7FF))) ; monospace nine253254;; Confirm that decimal digits are all in 0 to 9 range.255256(test-assert (let loop ((i 0))257 (cond ((> i #x10FFFF) #t)258 ((let ((v (digit-value (integer->char i))))259 (or (not v) (and (>= v 0) (<= v 9))))260 (loop (+ i 1)))261 (else #f))))262263264;; Confirm predicate compliance to R7RS.265266(test-assert (char-upper-case? (integer->char #x2160))) ; ROMAN NUMERAL ONE267(test-assert (char-upper-case? (integer->char #x24B6))) ; CIRCLED CAPITAL A268(test-assert (char-lower-case? (integer->char #x2170))) ; SMALL ROMAN NUMERAL ONE269(test-assert (char-lower-case? (integer->char #x24D0))) ; CIRCLED SMALL A270(test-assert (char-lower-case? (integer->char #x02B0))) ; MODIFIER SMALL H271(test-assert (char-alphabetic? (integer->char #x0345))) ; COMBINING YPOGEGRAMMENI272(test-assert (char-alphabetic? (integer->char #x093E))) ; DEVANAGARI VOWEL SIGN AA273(test-assert (char-alphabetic? (integer->char #x2160))) ; Nl is Alphabetic274275(test-assert (char-whitespace? (integer->char #x0085))) ; NEL276(test-assert (char-whitespace? (integer->char #x2029))) ; PARAGRAPH SEPARATOR277(test-assert (char-whitespace? (integer->char #x202F))) ; NARROW NO-BREAK SPACE278(test-assert (not (char-whitespace? (integer->char #x001C))))279(test-assert (not (char-whitespace? (integer->char #x001F))))280(test-assert (not (char-whitespace? (integer->char #x180E))))281282;; Confirm title case folding.283284(test-equal #\x01C4 (char-upcase (integer->char #x01C5))) ; LATIN CAPITAL DZ285(test-equal #\x01C6 (char-downcase (integer->char #x01C5))) ; latin small dz286287;; As per R7RS 7.1.1288;;289;; <intraline whitespace> -> <space or tab>290;; <line ending> -> <newline> | <return> <newline> | <return>.291;; <whitespace> -> <intraline whitespace> | <line ending>292293(test-equal (list (string->symbol "1\x1c;2"))294 (with-input-from-string "(1\x1c;2)" read))295(test-equal '(1 2) (with-input-from-string "(1 2)" read))296(test-equal '(1 2) (with-input-from-string "(1\n2)" read))297298(test-end)299300(test-exit)