1 2BEGIN { 3 if ($ENV{PERL_CORE}) { 4 chdir('t') if -d 't'; 5 @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib); 6 } 7} 8 9######################### 10 11use strict; 12use warnings; 13BEGIN { $| = 1; print "1..72\n"; } 14my $count = 0; 15sub ok { Unicode::Normalize::ok(\$count, @_) } 16 17use Unicode::Normalize; 18 19ok(1); 20 21sub _pack_U { Unicode::Normalize::dot_t_pack_U(@_) } 22sub _unpack_U { Unicode::Normalize::dot_t_unpack_U(@_) } 23 24######################### 25 26ok(NFD(""), ""); 27ok(NFC(""), ""); 28ok(NFKD(""), ""); 29ok(NFKC(""), ""); 30 31ok(NFD("A"), "A"); 32ok(NFC("A"), "A"); 33ok(NFKD("A"), "A"); 34ok(NFKC("A"), "A"); 35 36# 9 37 38# don't modify the source 39my $sNFD = "\x{FA19}"; 40ok(NFD($sNFD), "\x{795E}"); 41ok($sNFD, "\x{FA19}"); 42 43my $sNFC = "\x{FA1B}"; 44ok(NFC($sNFC), "\x{798F}"); 45ok($sNFC, "\x{FA1B}"); 46 47my $sNFKD = "\x{FA1E}"; 48ok(NFKD($sNFKD), "\x{7FBD}"); 49ok($sNFKD, "\x{FA1E}"); 50 51my $sNFKC = "\x{FA26}"; 52ok(NFKC($sNFKC), "\x{90FD}"); 53ok($sNFKC, "\x{FA26}"); 54 55# 17 56 57sub hexNFC { 58 join " ", map sprintf("%04X", $_), 59 _unpack_U NFC _pack_U map hex, split ' ', shift; 60} 61sub hexNFD { 62 join " ", map sprintf("%04X", $_), 63 _unpack_U NFD _pack_U map hex, split ' ', shift; 64} 65 66ok(hexNFD("1E14 AC01"), "0045 0304 0300 1100 1161 11A8"); 67ok(hexNFD("AC00 AE00"), "1100 1161 1100 1173 11AF"); 68 69ok(hexNFC("0061 0315 0300 05AE 05C4 0062"), "00E0 05AE 05C4 0315 0062"); 70ok(hexNFC("00E0 05AE 05C4 0315 0062"), "00E0 05AE 05C4 0315 0062"); 71ok(hexNFC("0061 05AE 0300 05C4 0315 0062"), "00E0 05AE 05C4 0315 0062"); 72ok(hexNFC("0045 0304 0300 AC00 11A8"), "1E14 AC01"); 73ok(hexNFC("1100 1161 1100 1173 11AF"), "AC00 AE00"); 74ok(hexNFC("1100 0300 1161 1173 11AF"), "1100 0300 1161 1173 11AF"); 75 76ok(hexNFD("0061 0315 0300 05AE 05C4 0062"), "0061 05AE 0300 05C4 0315 0062"); 77ok(hexNFD("00E0 05AE 05C4 0315 0062"), "0061 05AE 0300 05C4 0315 0062"); 78ok(hexNFD("0061 05AE 0300 05C4 0315 0062"), "0061 05AE 0300 05C4 0315 0062"); 79ok(hexNFC("0061 05C4 0315 0300 05AE 0062"), "0061 05AE 05C4 0300 0315 0062"); 80ok(hexNFC("0061 05AE 05C4 0300 0315 0062"), "0061 05AE 05C4 0300 0315 0062"); 81ok(hexNFD("0061 05C4 0315 0300 05AE 0062"), "0061 05AE 05C4 0300 0315 0062"); 82ok(hexNFD("0061 05AE 05C4 0300 0315 0062"), "0061 05AE 05C4 0300 0315 0062"); 83ok(hexNFC("0000 0041 0000 0000"), "0000 0041 0000 0000"); 84ok(hexNFD("0000 0041 0000 0000"), "0000 0041 0000 0000"); 85 86ok(hexNFC("AC00 11A7"), "AC00 11A7"); 87ok(hexNFC("AC00 11A8"), "AC01"); 88ok(hexNFC("AC00 11A9"), "AC02"); 89ok(hexNFC("AC00 11C2"), "AC1B"); 90ok(hexNFC("AC00 11C3"), "AC00 11C3"); 91 92# 39 93 94# Test Cases from Public Review Issue #29: Normalization Issue 95# cf. http://www.unicode.org/review/pr-29.html 96ok(hexNFC("0B47 0300 0B3E"), "0B47 0300 0B3E"); 97ok(hexNFC("1100 0300 1161"), "1100 0300 1161"); 98ok(hexNFC("0B47 0B3E 0300"), "0B4B 0300"); 99ok(hexNFC("1100 1161 0300"), "AC00 0300"); 100ok(hexNFC("0B47 0300 0B3E 0327"), "0B47 0300 0B3E 0327"); 101ok(hexNFC("1100 0300 1161 0327"), "1100 0300 1161 0327"); 102 103ok(hexNFC("0300 0041"), "0300 0041"); 104ok(hexNFC("0300 0301 0041"), "0300 0301 0041"); 105ok(hexNFC("0301 0300 0041"), "0301 0300 0041"); 106ok(hexNFC("0000 0300 0000 0301"), "0000 0300 0000 0301"); 107ok(hexNFC("0000 0301 0000 0300"), "0000 0301 0000 0300"); 108 109ok(hexNFC("0327 0061 0300"), "0327 00E0"); 110ok(hexNFC("0301 0061 0300"), "0301 00E0"); 111ok(hexNFC("0315 0061 0300"), "0315 00E0"); 112ok(hexNFC("0000 0327 0061 0300"), "0000 0327 00E0"); 113ok(hexNFC("0000 0301 0061 0300"), "0000 0301 00E0"); 114ok(hexNFC("0000 0315 0061 0300"), "0000 0315 00E0"); 115 116# 56 117 118# NFC() and NFKC() should be unary. 119my $str11 = _pack_U(0x41, 0x0302, 0x0301, 0x62); 120my $str12 = _pack_U(0x1EA4, 0x62); 121ok(NFC $str11 eq $str12); 122ok(NFKC $str11 eq $str12); 123 124# NFD() and NFKD() should be unary. 125my $str21 = _pack_U(0xE0, 0xAC00); 126my $str22 = _pack_U(0x61, 0x0300, 0x1100, 0x1161); 127ok(NFD $str21 eq $str22); 128ok(NFKD $str21 eq $str22); 129 130# 60 131 132## Bug #53197: NFKC("\x{2000}") produces... 133 134ok(NFKC("\x{2002}") eq ' '); 135ok(NFKD("\x{2002}") eq ' '); 136ok(NFKC("\x{2000}") eq ' '); 137ok(NFKD("\x{2000}") eq ' '); 138 139ok(NFKC("\x{210C}") eq 'H'); 140ok(NFKD("\x{210C}") eq 'H'); 141ok(NFKC("\x{210D}") eq 'H'); 142ok(NFKD("\x{210D}") eq 'H'); 143 144ok(NFC("\x{F907}") eq "\x{9F9C}"); 145ok(NFD("\x{F907}") eq "\x{9F9C}"); 146ok(NFKC("\x{F907}") eq "\x{9F9C}"); 147ok(NFKD("\x{F907}") eq "\x{9F9C}"); 148 149# 72 150 151