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..214\n"; } # 62 + 8 x @Versions 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 31##### 1 32 33my $Collator = Unicode::Collate->new( 34 table => 'keys.txt', 35 normalization => undef, 36 UCA_Version => 24, 37); 38 39ok($Collator->viewSortKey(""), '[| | |]'); 40ok($Collator->viewSortKey("\0"), '[| | |]'); 41ok($Collator->viewSortKey("\x{200B}"), '[| | |]'); 42 43ok($Collator->viewSortKey("A"), '[0A15 | 0020 | 0008 | FFFF]'); 44ok($Collator->viewSortKey('a'), '[0A15 | 0020 | 0002 | FFFF]'); 45 46ok($Collator->viewSortKey("ABC"), 47 "[0A15 0A29 0A3D | 0020 0020 0020 | 0008 0008 0008 | FFFF FFFF FFFF]"); 48 49ok($Collator->viewSortKey("(12)"), 50 "[0A0C 0A0D | 0020 0020 | 0002 0002 | 027A FFFF FFFF 027B]"); 51 52ok($Collator->viewSortKey("!\x{300}"), "[| | | 024B]"); 53 54ok($Collator->viewSortKey("\x{300}"), "[| 0035 | 0002 | FFFF]"); 55 56ok($Collator->viewSortKey("\x{304C}"), 57 '[1926 | 0020 013D | 000E 0002 | FFFF FFFF]'); 58 59ok($Collator->viewSortKey("\x{4E00}"), 60 '[FB40 CE00 | 0020 | 0002 | FFFF FFFF]'); 61 62ok($Collator->viewSortKey("\x{100000}"), 63 '[FBE0 8000 | 0020 | 0002 | FFFF FFFF]'); 64 65$Collator->change(level => 3); 66ok($Collator->viewSortKey("A"), "[0A15 | 0020 | 0008 |]"); 67 68$Collator->change(level => 2); 69ok($Collator->viewSortKey("A"), "[0A15 | 0020 | |]"); 70 71$Collator->change(level => 1); 72ok($Collator->viewSortKey("A"), "[0A15 | | |]"); 73 74##### 16 75 76$Collator->change(level => 4, UCA_Version => 8); 77 78ok($Collator->viewSortKey(""), "[|||]"); 79 80ok($Collator->viewSortKey("A"), "[0A15|0020|0008|FFFF]"); 81 82ok($Collator->viewSortKey("ABC"), 83 "[0A15 0A29 0A3D|0020 0020 0020|0008 0008 0008|FFFF FFFF FFFF]"); 84 85ok($Collator->viewSortKey("(12)"), 86 "[0A0C 0A0D|0020 0020|0002 0002|027A FFFF FFFF 027B]"); 87 88ok($Collator->viewSortKey("!\x{300}"), "[|0035|0002|024B FFFF]"); 89 90ok($Collator->viewSortKey("\x{300}"), "[|0035|0002|FFFF]"); 91 92ok($Collator->viewSortKey("\x{304C}"), 93 '[1926|0020 013D|000E 0002|FFFF FFFF]'); 94 95ok($Collator->viewSortKey("\x{4E00}"), 96 '[4E00|0020|0002|FFFF]'); 97 98ok($Collator->viewSortKey("\x{100000}"), 99 '[FFA0 8000|0002|0001|FFFF FFFF]'); 100 101$Collator->change(level => 3); 102ok($Collator->viewSortKey("A"), "[0A15|0020|0008|]"); 103 104$Collator->change(level => 2); 105ok($Collator->viewSortKey("A"), "[0A15|0020||]"); 106 107$Collator->change(level => 1); 108ok($Collator->viewSortKey("A"), "[0A15|||]"); 109 110##### 28 111 112$Collator->change(level => 3, UCA_Version => 9); 113ok($Collator->viewSortKey("A\x{300}z\x{301}"), 114 "[0A15 0C13 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]"); 115 116$Collator->change(backwards => 1); 117ok($Collator->viewSortKey("A\x{300}z\x{301}"), 118 "[0C13 0A15 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]"); 119 120$Collator->change(backwards => 2); 121ok($Collator->viewSortKey("A\x{300}z\x{301}"), 122 "[0A15 0C13 | 0032 0020 0035 0020 | 0008 0002 0002 0002 |]"); 123 124$Collator->change(backwards => [1,3]); 125ok($Collator->viewSortKey("A\x{300}z\x{301}"), 126 "[0C13 0A15 | 0020 0035 0020 0032 | 0002 0002 0002 0008 |]"); 127 128$Collator->change(backwards => [2]); 129ok($Collator->viewSortKey("\x{300}\x{301}\x{302}\x{303}"), 130 "[| 004E 003C 0032 0035 | 0002 0002 0002 0002 |]"); 131 132$Collator->change(backwards => []); 133ok($Collator->viewSortKey("A\x{300}z\x{301}"), 134 "[0A15 0C13 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]"); 135 136##### 34 137 138$Collator->change(level => 4); 139 140# Variable 141 142our %origVar = $Collator->change(variable => 'Blanked'); 143ok($Collator->viewSortKey("1+2"), 144 '[0A0C 0A0D | 0020 0020 | 0002 0002 | 0031 002B 0032]'); 145 146ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."), 147 '[| | | 003F 0021 002E]'); 148 149ok($Collator->viewSortKey("?!."), '[| | | 003F 0021 002E]'); 150 151$Collator->change(variable => 'Non-ignorable'); 152ok($Collator->viewSortKey("1+2"), 153 '[0A0C 039F 0A0D | 0020 0020 0020 | 0002 0002 0002 | 0031 002B 0032]'); 154 155ok($Collator->viewSortKey("?\x{300}!"), 156 '[024E 024B | 0020 0035 0020 | 0002 0002 0002 | 003F 0300 0021]'); 157 158ok($Collator->viewSortKey("?!."), 159 '[024E 024B 0255 | 0020 0020 0020 | 0002 0002 0002 | 003F 0021 002E]'); 160 161$Collator->change(variable => 'Shifted'); 162ok($Collator->viewSortKey("1+2"), 163 '[0A0C 0A0D | 0020 0020 | 0002 0002 | FFFF 039F FFFF]'); 164 165ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."), 166 '[| | | 024E 024B 0255]'); 167 168ok($Collator->viewSortKey("?!."), '[| | | 024E 024B 0255]'); 169 170$Collator->change(variable => 'Shift-Trimmed'); 171ok($Collator->viewSortKey("1+2"), 172 '[0A0C 0A0D | 0020 0020 | 0002 0002 | 039F]'); 173 174ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."), 175 '[| | | 024E 024B 0255]'); 176 177ok($Collator->viewSortKey("?!."), '[| | | 024E 024B 0255]'); 178 179$Collator->change(%origVar); 180 181##### 46 182 183# Level 3 weight 184 185ok($Collator->viewSortKey("a\x{3042}"), 186 '[0A15 1921 | 0020 0020 | 0002 000E | FFFF FFFF]'); 187 188ok($Collator->viewSortKey("A\x{30A2}"), 189 '[0A15 1921 | 0020 0020 | 0008 0011 | FFFF FFFF]'); 190 191$Collator->change(upper_before_lower => 1); 192 193ok($Collator->viewSortKey("a\x{3042}"), 194 '[0A15 1921 | 0020 0020 | 0008 000E | FFFF FFFF]'); 195 196ok($Collator->viewSortKey("A\x{30A2}"), 197 '[0A15 1921 | 0020 0020 | 0002 0011 | FFFF FFFF]'); 198 199$Collator->change(katakana_before_hiragana => 1); 200 201ok($Collator->viewSortKey("a\x{3042}"), 202 '[0A15 1921 | 0020 0020 | 0008 0013 | FFFF FFFF]'); 203ok($Collator->viewSortKey("A\x{30A2}"), 204 '[0A15 1921 | 0020 0020 | 0002 000F | FFFF FFFF]'); 205 206$Collator->change(upper_before_lower => 0); 207 208ok($Collator->viewSortKey("a\x{3042}"), 209 '[0A15 1921 | 0020 0020 | 0002 0013 | FFFF FFFF]'); 210 211ok($Collator->viewSortKey("A\x{30A2}"), 212 '[0A15 1921 | 0020 0020 | 0008 000F | FFFF FFFF]'); 213 214$Collator->change(katakana_before_hiragana => 0); 215 216ok($Collator->viewSortKey("a\x{3042}"), 217 '[0A15 1921 | 0020 0020 | 0002 000E | FFFF FFFF]'); 218 219ok($Collator->viewSortKey("A\x{30A2}"), 220 '[0A15 1921 | 0020 0020 | 0008 0011 | FFFF FFFF]'); 221 222##### 56 223 224our $el = Unicode::Collate->new( 225 entry => <<'ENTRY', 226006C ; [.0B03.0020.0002.006C] # LATIN SMALL LETTER L 227FF4C ; [.0B03.0020.0003.FF4C] # FULLWIDTH LATIN SMALL LETTER L; QQK 228217C ; [.0B03.0020.0004.217C] # SMALL ROMAN NUMERAL FIFTY; QQK 2292113 ; [.0B03.0020.0005.2113] # SCRIPT SMALL L; QQK 23024DB ; [.0B03.0020.0006.24DB] # CIRCLED LATIN SMALL LETTER L; QQK 231004C ; [.0B03.0020.0008.004C] # LATIN CAPITAL LETTER L 232FF2C ; [.0B03.0020.0009.FF2C] # FULLWIDTH LATIN CAPITAL LETTER L; QQK 233216C ; [.0B03.0020.000A.216C] # ROMAN NUMERAL FIFTY; QQK 2342112 ; [.0B03.0020.000B.2112] # SCRIPT CAPITAL L; QQK 23524C1 ; [.0B03.0020.000C.24C1] # CIRCLED LATIN CAPITAL LETTER L; QQK 236ENTRY 237 table => undef, 238 normalization => undef, 239 UCA_Version => 24, 240); 241 242our $el12 = '0B03 0B03 0B03 0B03 0B03 | 0020 0020 0020 0020 0020'; 243 244ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"), 245 "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]"); 246 247ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"), 248 "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]"); 249 250$el->change(upper_before_lower => 1); 251 252ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"), 253 "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]"); 254 255ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"), 256 "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]"); 257 258$el->change(upper_before_lower => 0); 259 260ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"), 261 "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]"); 262 263ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"), 264 "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]"); 265 266##### 62 267 268my @Versions = ( 8, 9, 11, 14, 16, 18, 20, 22, 24, 26, 269 28, 30, 32, 34, 36, 38, 40, 41, 43); 270 271for my $v (@Versions) { 272 $Collator->change(UCA_Version => $v); 273 274 # primary weights 275 my $pri1 = '0A0C 0A0D'; 276 my $pri2 = '0A0C 039F 0A0D'; 277 my $pri3 = $v >= 9 ? 'FB40 CE02' : '4E02'; 278 279 # secondary weights 280 my $sec1 = '0020'; 281 my $sec2 = '0020 0020'; 282 my $sec3 = '0020 0020 0020'; 283 284 # tertiary weights 285 my $ter1 = '0002'; 286 my $ter2 = '0002 0002'; 287 my $ter3 = '0002 0002 0002'; 288 289 # quaternary weights 290 my $eququat = 'FFFF 039F FFFF'; 291 my $hanquat = $v >= 36 || $v == 8 ? 'FFFF' : 'FFFF FFFF'; 292 293 # separators 294 my $sep1 = $v >= 9 ? ' |' : '|'; 295 my $sep2 = $v >= 9 ? ' | ' : '|'; 296 297 my $app = $v >= 26 ? ' |]' : ']'; 298 299 $Collator->change(variable => 'Shifted', level => 4); 300 ok($Collator->viewSortKey("1+2"), 301 "[$pri1$sep2$sec2$sep2$ter2$sep2$eququat$app"); 302 ok($Collator->viewSortKey("\x{4E02}"), 303 "[$pri3$sep2$sec1$sep2$ter1$sep2$hanquat$app"); 304 305 $Collator->change(variable => 'Shift-Trimmed'); 306 ok($Collator->viewSortKey("1+2"), 307 "[$pri1$sep2$sec2$sep2$ter2$sep2"."039F$app"); 308 ok($Collator->viewSortKey("\x{4E02}"), 309 "[$pri3$sep2$sec1$sep2$ter1$sep1$app"); 310 311 $Collator->change(variable => 'Non-ignorable', level => 3); 312 ok($Collator->viewSortKey("1+2"), 313 "[$pri2$sep2$sec3$sep2$ter3$sep1]"); 314 ok($Collator->viewSortKey("\x{4E02}"), 315 "[$pri3$sep2$sec1$sep2$ter1$sep1]"); 316 317 $Collator->change(variable => 'Blanked'); 318 ok($Collator->viewSortKey("1+2"), 319 "[$pri1$sep2$sec2$sep2$ter2$sep1]"); 320 ok($Collator->viewSortKey("\x{4E02}"), 321 "[$pri3$sep2$sec1$sep2$ter1$sep1]"); 322} 323 324