1 2BEGIN { 3 unless ("A" eq pack('U', 0x41)) { 4 print "1..0 # Unicode::Collate " . 5 "cannot stringify a Unicode code point\n"; 6 exit 0; 7 } 8 if ($ENV{PERL_CORE}) { 9 chdir('t') if -d 't'; 10 @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib); 11 } 12} 13 14use strict; 15use warnings; 16BEGIN { $| = 1; print "1..89\n"; } 17my $count = 0; 18sub ok ($;$) { 19 my $p = my $r = shift; 20 if (@_) { 21 my $x = shift; 22 $p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x; 23 } 24 print $p ? "ok" : "not ok", ' ', ++$count, "\n"; 25} 26 27use Unicode::Collate; 28 29ok(1); 30 31##### 1 32 33my $Collator = Unicode::Collate->new( 34 table => 'keys.txt', 35 normalization => undef, 36 UCA_Version => 24, 37); 38 39ok($Collator->viewSortKey(""), "[| | |]"); 40 41ok($Collator->viewSortKey("A"), "[0A15 | 0020 | 0008 | FFFF]"); 42 43ok($Collator->viewSortKey("ABC"), 44 "[0A15 0A29 0A3D | 0020 0020 0020 | 0008 0008 0008 | FFFF FFFF FFFF]"); 45 46ok($Collator->viewSortKey("(12)"), 47 "[0A0C 0A0D | 0020 0020 | 0002 0002 | 027A FFFF FFFF 027B]"); 48 49ok($Collator->viewSortKey("!\x{300}"), "[| | | 024B]"); 50 51ok($Collator->viewSortKey("\x{300}"), "[| 0035 | 0002 | FFFF]"); 52 53$Collator->change(level => 3); 54ok($Collator->viewSortKey("A"), "[0A15 | 0020 | 0008 |]"); 55 56$Collator->change(level => 2); 57ok($Collator->viewSortKey("A"), "[0A15 | 0020 | |]"); 58 59$Collator->change(level => 1); 60ok($Collator->viewSortKey("A"), "[0A15 | | |]"); 61 62##### 10 63 64$Collator->change(level => 4, UCA_Version => 8); 65 66ok($Collator->viewSortKey(""), "[|||]"); 67 68ok($Collator->viewSortKey("A"), "[0A15|0020|0008|FFFF]"); 69 70ok($Collator->viewSortKey("ABC"), 71 "[0A15 0A29 0A3D|0020 0020 0020|0008 0008 0008|FFFF FFFF FFFF]"); 72 73ok($Collator->viewSortKey("(12)"), 74 "[0A0C 0A0D|0020 0020|0002 0002|027A FFFF FFFF 027B]"); 75 76ok($Collator->viewSortKey("!\x{300}"), "[|0035|0002|024B FFFF]"); 77 78ok($Collator->viewSortKey("\x{300}"), "[|0035|0002|FFFF]"); 79 80$Collator->change(level => 3); 81ok($Collator->viewSortKey("A"), "[0A15|0020|0008|]"); 82 83$Collator->change(level => 2); 84ok($Collator->viewSortKey("A"), "[0A15|0020||]"); 85 86$Collator->change(level => 1); 87ok($Collator->viewSortKey("A"), "[0A15|||]"); 88 89##### 19 90 91$Collator->change(level => 3, UCA_Version => 9); 92ok($Collator->viewSortKey("A\x{300}z\x{301}"), 93 "[0A15 0C13 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]"); 94 95$Collator->change(backwards => 1); 96ok($Collator->viewSortKey("A\x{300}z\x{301}"), 97 "[0C13 0A15 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]"); 98 99$Collator->change(backwards => 2); 100ok($Collator->viewSortKey("A\x{300}z\x{301}"), 101 "[0A15 0C13 | 0032 0020 0035 0020 | 0008 0002 0002 0002 |]"); 102 103$Collator->change(backwards => [1,3]); 104ok($Collator->viewSortKey("A\x{300}z\x{301}"), 105 "[0C13 0A15 | 0020 0035 0020 0032 | 0002 0002 0002 0008 |]"); 106 107$Collator->change(backwards => [2]); 108ok($Collator->viewSortKey("\x{300}\x{301}\x{302}\x{303}"), 109 "[| 004E 003C 0032 0035 | 0002 0002 0002 0002 |]"); 110 111$Collator->change(backwards => []); 112ok($Collator->viewSortKey("A\x{300}z\x{301}"), 113 "[0A15 0C13 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]"); 114 115$Collator->change(level => 4); 116 117# Variable 118 119our %origVar = $Collator->change(variable => 'Blanked'); 120ok($Collator->viewSortKey("1+2"), 121 '[0A0C 0A0D | 0020 0020 | 0002 0002 | 0031 002B 0032]'); 122 123ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."), 124 '[| | | 003F 0021 002E]'); 125 126ok($Collator->viewSortKey("?!."), '[| | | 003F 0021 002E]'); 127 128$Collator->change(variable => 'Non-ignorable'); 129ok($Collator->viewSortKey("1+2"), 130 '[0A0C 039F 0A0D | 0020 0020 0020 | 0002 0002 0002 | 0031 002B 0032]'); 131 132ok($Collator->viewSortKey("?\x{300}!"), 133 '[024E 024B | 0020 0035 0020 | 0002 0002 0002 | 003F 0300 0021]'); 134 135ok($Collator->viewSortKey("?!."), 136 '[024E 024B 0255 | 0020 0020 0020 | 0002 0002 0002 | 003F 0021 002E]'); 137 138$Collator->change(variable => 'Shifted'); 139ok($Collator->viewSortKey("1+2"), 140 '[0A0C 0A0D | 0020 0020 | 0002 0002 | FFFF 039F FFFF]'); 141 142ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."), 143 '[| | | 024E 024B 0255]'); 144 145ok($Collator->viewSortKey("?!."), '[| | | 024E 024B 0255]'); 146 147$Collator->change(variable => 'Shift-Trimmed'); 148ok($Collator->viewSortKey("1+2"), 149 '[0A0C 0A0D | 0020 0020 | 0002 0002 | 039F]'); 150 151ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."), 152 '[| | | 024E 024B 0255]'); 153 154ok($Collator->viewSortKey("?!."), '[| | | 024E 024B 0255]'); 155 156$Collator->change(%origVar); 157 158##### 37 159 160# Level 3 weight 161 162ok($Collator->viewSortKey("a\x{3042}"), 163 '[0A15 1921 | 0020 0020 | 0002 000E | FFFF FFFF]'); 164 165ok($Collator->viewSortKey("A\x{30A2}"), 166 '[0A15 1921 | 0020 0020 | 0008 0011 | FFFF FFFF]'); 167 168$Collator->change(upper_before_lower => 1); 169 170ok($Collator->viewSortKey("a\x{3042}"), 171 '[0A15 1921 | 0020 0020 | 0008 000E | FFFF FFFF]'); 172 173ok($Collator->viewSortKey("A\x{30A2}"), 174 '[0A15 1921 | 0020 0020 | 0002 0011 | FFFF FFFF]'); 175 176$Collator->change(katakana_before_hiragana => 1); 177 178ok($Collator->viewSortKey("a\x{3042}"), 179 '[0A15 1921 | 0020 0020 | 0008 0013 | FFFF FFFF]'); 180ok($Collator->viewSortKey("A\x{30A2}"), 181 '[0A15 1921 | 0020 0020 | 0002 000F | FFFF FFFF]'); 182 183$Collator->change(upper_before_lower => 0); 184 185ok($Collator->viewSortKey("a\x{3042}"), 186 '[0A15 1921 | 0020 0020 | 0002 0013 | FFFF FFFF]'); 187 188ok($Collator->viewSortKey("A\x{30A2}"), 189 '[0A15 1921 | 0020 0020 | 0008 000F | FFFF FFFF]'); 190 191$Collator->change(katakana_before_hiragana => 0); 192 193ok($Collator->viewSortKey("a\x{3042}"), 194 '[0A15 1921 | 0020 0020 | 0002 000E | FFFF FFFF]'); 195 196ok($Collator->viewSortKey("A\x{30A2}"), 197 '[0A15 1921 | 0020 0020 | 0008 0011 | FFFF FFFF]'); 198 199##### 47 200 201our $el = Unicode::Collate->new( 202 entry => <<'ENTRY', 203006C ; [.0B03.0020.0002.006C] # LATIN SMALL LETTER L 204FF4C ; [.0B03.0020.0003.FF4C] # FULLWIDTH LATIN SMALL LETTER L; QQK 205217C ; [.0B03.0020.0004.217C] # SMALL ROMAN NUMERAL FIFTY; QQK 2062113 ; [.0B03.0020.0005.2113] # SCRIPT SMALL L; QQK 20724DB ; [.0B03.0020.0006.24DB] # CIRCLED LATIN SMALL LETTER L; QQK 208004C ; [.0B03.0020.0008.004C] # LATIN CAPITAL LETTER L 209FF2C ; [.0B03.0020.0009.FF2C] # FULLWIDTH LATIN CAPITAL LETTER L; QQK 210216C ; [.0B03.0020.000A.216C] # ROMAN NUMERAL FIFTY; QQK 2112112 ; [.0B03.0020.000B.2112] # SCRIPT CAPITAL L; QQK 21224C1 ; [.0B03.0020.000C.24C1] # CIRCLED LATIN CAPITAL LETTER L; QQK 213ENTRY 214 table => undef, 215 normalization => undef, 216 UCA_Version => 24, 217); 218 219our $el12 = '0B03 0B03 0B03 0B03 0B03 | 0020 0020 0020 0020 0020'; 220 221ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"), 222 "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]"); 223 224ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"), 225 "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]"); 226 227$el->change(upper_before_lower => 1); 228 229ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"), 230 "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]"); 231 232ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"), 233 "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]"); 234 235$el->change(upper_before_lower => 0); 236 237ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"), 238 "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]"); 239 240ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"), 241 "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]"); 242 243##### 53 244 245my @Versions = (9, 11, 14, 16, 18, 20, 22, 24, 26); 246 247for my $v (@Versions) { 248 $Collator->change(UCA_Version => $v); 249 my $app = $v >= 26 ? ' |]' : ']'; 250 251 $Collator->change(variable => 'Shifted', level => 4); 252 ok($Collator->viewSortKey("1+2"), 253 '[0A0C 0A0D | 0020 0020 | 0002 0002 | FFFF 039F FFFF'.$app); 254 255 $Collator->change(variable => 'Shift-Trimmed'); 256 ok($Collator->viewSortKey("1+2"), 257 '[0A0C 0A0D | 0020 0020 | 0002 0002 | 039F'.$app); 258 259 $Collator->change(variable => 'Non-ignorable', level => 3); 260 ok($Collator->viewSortKey("1+2"), 261 '[0A0C 039F 0A0D | 0020 0020 0020 | 0002 0002 0002 |]'); 262 263 $Collator->change(variable => 'Blanked'); 264 ok($Collator->viewSortKey("1+2"), 265 '[0A0C 0A0D | 0020 0020 | 0002 0002 |]'); 266} 267 268##### 89 269 270