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