1 2BEGIN { 3 unless ('A' eq pack('U', 0x41)) { 4 print "1..0 # Unicode::Normalize cannot pack a Unicode code point\n"; 5 exit 0; 6 } 7 unless (0x41 == unpack('U', 'A')) { 8 print "1..0 # Unicode::Normalize cannot get a Unicode code point\n"; 9 exit 0; 10 } 11} 12 13BEGIN { 14 if ($ENV{PERL_CORE}) { 15 chdir('t') if -d 't'; 16 @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib); 17 } 18} 19 20BEGIN { 21 unless (5.006001 <= $]) { 22 print "1..0 # skipped: Perl 5.6.1 or later". 23 " needed for this test\n"; 24 exit; 25 } 26} 27 28######################### 29 30use strict; 31use warnings; 32BEGIN { $| = 1; print "1..26\n"; } 33my $count = 0; 34sub ok ($;$) { 35 my $p = my $r = shift; 36 if (@_) { 37 my $x = shift; 38 $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x; 39 } 40 print $p ? "ok" : "not ok", ' ', ++$count, "\n"; 41} 42 43use Unicode::Normalize qw(:all); 44 45ok(1); 46 47sub _pack_U { Unicode::Normalize::pack_U(@_) } 48sub _unpack_U { Unicode::Normalize::unpack_U(@_) } 49 50######################### 51 52sub arraynorm { 53 my $form = shift; 54 my @string = @_; 55 my $result = ""; 56 my $unproc = ""; 57 foreach my $str (@string) { 58 $unproc .= $str; 59 $result .= $form eq 'NFC' ? NFC_partial ($unproc) : 60 $form eq 'NFD' ? NFD_partial ($unproc) : 61 $form eq 'NFKC' ? NFKC_partial($unproc) : 62 $form eq 'NFKD' ? NFKD_partial($unproc) : 63 undef; 64 } 65 $result .= $unproc; 66 return $result; 67} 68 69my $strD = "\x{3C9}\x{301}\x{1100}\x{1161}\x{11A8}\x{1100}\x{1161}\x{11AA}"; 70my $strC = "\x{3CE}\x{AC01}\x{AC03}"; 71my @str1 = (substr($strD,0,3), substr($strD,3,4), substr($strD,7)); 72my @str2 = (substr($strD,0,1), substr($strD,1,3), substr($strD,4)); 73ok($strC eq NFC($strD)); 74ok($strD eq join('', @str1)); 75ok($strC eq arraynorm('NFC', @str1)); 76ok($strD eq join('', @str2)); 77ok($strC eq arraynorm('NFC', @str2)); 78 79my @strX = ("\x{300}\x{AC00}", "\x{11A8}"); 80my $strX = "\x{300}\x{AC01}"; 81ok($strX eq NFC(join('', @strX))); 82ok($strX eq arraynorm('NFC', @strX)); 83ok($strX eq NFKC(join('', @strX))); 84ok($strX eq arraynorm('NFKC', @strX)); 85 86my @strY = ("\x{304B}\x{0308}", "\x{0323}\x{3099}"); 87my $strY = ("\x{304C}\x{0323}\x{0308}"); 88ok($strY eq NFC(join('', @strY))); 89ok($strY eq arraynorm('NFC', @strY)); 90ok($strY eq NFKC(join('', @strY))); 91ok($strY eq arraynorm('NFKC', @strY)); 92 93my @strZ = ("\x{304B}\x{0308}", "\x{0323}", "\x{3099}"); 94my $strZ = ("\x{304B}\x{3099}\x{0323}\x{0308}"); 95ok($strZ eq NFD(join('', @strZ))); 96ok($strZ eq arraynorm('NFD', @strZ)); 97ok($strZ eq NFKD(join('', @strZ))); 98ok($strZ eq arraynorm('NFKD', @strZ)); 99 100# 18 101 102# must modify the source 103my $sNFD = "\x{FA19}"; 104ok(NFD_partial($sNFD), ""); 105ok($sNFD, "\x{795E}"); 106 107my $sNFC = "\x{FA1B}"; 108ok(NFC_partial($sNFC), ""); 109ok($sNFC, "\x{798F}"); 110 111my $sNFKD = "\x{FA1E}"; 112ok(NFKD_partial($sNFKD), ""); 113ok($sNFKD, "\x{7FBD}"); 114 115my $sNFKC = "\x{FA26}"; 116ok(NFKC_partial($sNFKC), ""); 117ok($sNFKC, "\x{90FD}"); 118 119# 26 120 121