1 2BEGIN { 3 unless ('A' eq pack('U', 0x41)) { 4 print "1..0 # Unicode::Collate cannot pack a Unicode code point\n"; 5 exit 0; 6 } 7 unless (0x41 == unpack('U', 'A')) { 8 print "1..0 # Unicode::Collate cannot get a Unicode code point\n"; 9 exit 0; 10 } 11 if ($ENV{PERL_CORE}) { 12 chdir('t') if -d 't'; 13 @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib); 14 } 15} 16 17use strict; 18use warnings; 19BEGIN { $| = 1; print "1..48\n"; } 20my $count = 0; 21sub ok ($;$) { 22 my $p = my $r = shift; 23 if (@_) { 24 my $x = shift; 25 $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x; 26 } 27 print $p ? "ok" : "not ok", ' ', ++$count, "\n"; 28} 29 30use Unicode::Collate; 31 32ok(1); 33 34######################### 35 36my $Collator = Unicode::Collate->new( 37 table => 'keys.txt', 38 normalization => undef, 39); 40 41# [001F] UNIT SEPARATOR 42{ 43 ok($Collator->eq("\0", "\x1F")); 44 ok($Collator->eq("\x1F", "\x{200B}")); 45 ok($Collator->eq("\0", "\x{200B}")); 46 ok($Collator->eq("\x{313}", "\x{343}")); 47 ok($Collator->eq("\x{2000}", "\x{2001}")); 48 ok($Collator->eq("\x{200B}", "\x{200C}")); 49 ok($Collator->eq("\x{304C}", "\x{304B}\x{3099}")); 50 51 $Collator->change(identical => 1); 52 53 ok($Collator->lt("\0", "\x1F")); 54 ok($Collator->lt("\x1F", "\x{200B}")); 55 ok($Collator->lt("\0", "\x{200B}")); 56 ok($Collator->lt("\x{313}", "\x{343}")); 57 ok($Collator->lt("\x{2000}", "\x{2001}")); 58 ok($Collator->lt("\x{200B}", "\x{200C}")); 59 ok($Collator->gt("\x{304C}", "\x{304B}\x{3099}")); 60 61 $Collator->change(identical => 0); 62 63 ok($Collator->eq("\0", "\x1F")); 64 ok($Collator->eq("\x1F", "\x{200B}")); 65 ok($Collator->eq("\0", "\x{200B}")); 66 ok($Collator->eq("\x{313}", "\x{343}")); 67 ok($Collator->eq("\x{2000}", "\x{2001}")); 68 ok($Collator->eq("\x{200B}", "\x{200C}")); 69 ok($Collator->eq("\x{304C}", "\x{304B}\x{3099}")); 70} 71 72#### 22 73 74eval { require Unicode::Normalize }; 75if (!$@) { 76 $Collator->change(normalization => "NFD"); 77 78 $Collator->change(identical => 1); 79 80 ok($Collator->lt("\0", "\x{200B}")); 81 ok($Collator->eq("\x{313}", "\x{343}")); 82 ok($Collator->lt("\x{2000}", "\x{2001}")); 83 ok($Collator->lt("\x{200B}", "\x{200C}")); 84 ok($Collator->eq("\x{304C}", "\x{304B}\x{3099}")); 85 86 $Collator->change(identical => 0); 87 88 ok($Collator->eq("\0", "\x{200B}")); 89 ok($Collator->eq("\x{313}", "\x{343}")); 90 ok($Collator->eq("\x{2000}", "\x{2001}")); 91 ok($Collator->eq("\x{200B}", "\x{200C}")); 92 ok($Collator->eq("\x{304C}", "\x{304B}\x{3099}")); 93} else { 94 ok(1) for 1..10; 95} 96 97$Collator->change(normalization => undef, identical => 1); 98 99##### 32 100 101ok($Collator->viewSortKey("\0"), '[| | | | 0000 0000]'); 102ok($Collator->viewSortKey("\x{200B}"), '[| | | | 0000 200B]'); 103 104ok($Collator->viewSortKey('a'), 105 '[0A15 | 0020 | 0002 | FFFF | 0000 0061]'); 106 107ok($Collator->viewSortKey("\x{304C}"), 108 '[1926 | 0020 013D | 000E 0002 | FFFF FFFF | 0000 304C]'); 109 110ok($Collator->viewSortKey("\x{4E00}"), 111 '[FB40 CE00 | 0020 | 0002 | FFFF FFFF | 0000 4E00]'); 112 113ok($Collator->viewSortKey("\x{100000}"), 114 '[FBE0 8000 | 0020 | 0002 | FFFF FFFF | 0010 0000]'); 115 116##### 38 117 118eval { require Unicode::Normalize }; 119if (!$@) { 120 $Collator->change(normalization => "NFD"); 121 122 ok($Collator->viewSortKey("\x{304C}"), 123 '[1926 | 0020 013D | 000E 0002 | FFFF FFFF | 0000 304B 0000 3099]'); 124} else { 125 ok(1); 126} 127 128$Collator->change(normalization => undef); 129 130##### 39 131 132$Collator->change(level => 3); 133 134ok($Collator->viewSortKey("\x{304C}"), 135 '[1926 | 0020 013D | 000E 0002 | | 0000 304C]'); 136 137$Collator->change(level => 2); 138 139ok($Collator->viewSortKey("\x{304C}"), 140 '[1926 | 0020 013D | | | 0000 304C]'); 141 142$Collator->change(level => 1); 143 144ok($Collator->viewSortKey("\x{304C}"), 145 '[1926 | | | | 0000 304C]'); 146 147##### 42 148 149$Collator->change(UCA_Version => 8); 150 151ok($Collator->viewSortKey("\x{304C}"), 152 '[1926||||0000 304C]'); 153 154$Collator->change(level => 2); 155 156ok($Collator->viewSortKey("\x{304C}"), 157 '[1926|0020 013D|||0000 304C]'); 158 159$Collator->change(level => 3); 160 161ok($Collator->viewSortKey("\x{304C}"), 162 '[1926|0020 013D|000E 0002||0000 304C]'); 163 164$Collator->change(level => 4); 165 166ok($Collator->viewSortKey("\x{304C}"), 167 '[1926|0020 013D|000E 0002|FFFF FFFF|0000 304C]'); 168 169ok($Collator->viewSortKey("\x{4E00}"), 170 '[4E00|0020|0002|FFFF|0000 4E00]'); 171 172ok($Collator->viewSortKey("\x{100000}"), 173 '[FFA0 8000|0002|0001|FFFF FFFF|0010 0000]'); 174 175##### 48 176