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