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..93\n"; } # 53 + 4 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(""), "[| | |]"); 43 44ok($Collator->viewSortKey("A"), "[0A15 | 0020 | 0008 | 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 56$Collator->change(level => 3); 57ok($Collator->viewSortKey("A"), "[0A15 | 0020 | 0008 |]"); 58 59$Collator->change(level => 2); 60ok($Collator->viewSortKey("A"), "[0A15 | 0020 | |]"); 61 62$Collator->change(level => 1); 63ok($Collator->viewSortKey("A"), "[0A15 | | |]"); 64 65##### 10 66 67$Collator->change(level => 4, UCA_Version => 8); 68 69ok($Collator->viewSortKey(""), "[|||]"); 70 71ok($Collator->viewSortKey("A"), "[0A15|0020|0008|FFFF]"); 72 73ok($Collator->viewSortKey("ABC"), 74 "[0A15 0A29 0A3D|0020 0020 0020|0008 0008 0008|FFFF FFFF FFFF]"); 75 76ok($Collator->viewSortKey("(12)"), 77 "[0A0C 0A0D|0020 0020|0002 0002|027A FFFF FFFF 027B]"); 78 79ok($Collator->viewSortKey("!\x{300}"), "[|0035|0002|024B FFFF]"); 80 81ok($Collator->viewSortKey("\x{300}"), "[|0035|0002|FFFF]"); 82 83$Collator->change(level => 3); 84ok($Collator->viewSortKey("A"), "[0A15|0020|0008|]"); 85 86$Collator->change(level => 2); 87ok($Collator->viewSortKey("A"), "[0A15|0020||]"); 88 89$Collator->change(level => 1); 90ok($Collator->viewSortKey("A"), "[0A15|||]"); 91 92##### 19 93 94$Collator->change(level => 3, UCA_Version => 9); 95ok($Collator->viewSortKey("A\x{300}z\x{301}"), 96 "[0A15 0C13 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]"); 97 98$Collator->change(backwards => 1); 99ok($Collator->viewSortKey("A\x{300}z\x{301}"), 100 "[0C13 0A15 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]"); 101 102$Collator->change(backwards => 2); 103ok($Collator->viewSortKey("A\x{300}z\x{301}"), 104 "[0A15 0C13 | 0032 0020 0035 0020 | 0008 0002 0002 0002 |]"); 105 106$Collator->change(backwards => [1,3]); 107ok($Collator->viewSortKey("A\x{300}z\x{301}"), 108 "[0C13 0A15 | 0020 0035 0020 0032 | 0002 0002 0002 0008 |]"); 109 110$Collator->change(backwards => [2]); 111ok($Collator->viewSortKey("\x{300}\x{301}\x{302}\x{303}"), 112 "[| 004E 003C 0032 0035 | 0002 0002 0002 0002 |]"); 113 114$Collator->change(backwards => []); 115ok($Collator->viewSortKey("A\x{300}z\x{301}"), 116 "[0A15 0C13 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]"); 117 118$Collator->change(level => 4); 119 120# Variable 121 122our %origVar = $Collator->change(variable => 'Blanked'); 123ok($Collator->viewSortKey("1+2"), 124 '[0A0C 0A0D | 0020 0020 | 0002 0002 | 0031 002B 0032]'); 125 126ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."), 127 '[| | | 003F 0021 002E]'); 128 129ok($Collator->viewSortKey("?!."), '[| | | 003F 0021 002E]'); 130 131$Collator->change(variable => 'Non-ignorable'); 132ok($Collator->viewSortKey("1+2"), 133 '[0A0C 039F 0A0D | 0020 0020 0020 | 0002 0002 0002 | 0031 002B 0032]'); 134 135ok($Collator->viewSortKey("?\x{300}!"), 136 '[024E 024B | 0020 0035 0020 | 0002 0002 0002 | 003F 0300 0021]'); 137 138ok($Collator->viewSortKey("?!."), 139 '[024E 024B 0255 | 0020 0020 0020 | 0002 0002 0002 | 003F 0021 002E]'); 140 141$Collator->change(variable => 'Shifted'); 142ok($Collator->viewSortKey("1+2"), 143 '[0A0C 0A0D | 0020 0020 | 0002 0002 | FFFF 039F FFFF]'); 144 145ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."), 146 '[| | | 024E 024B 0255]'); 147 148ok($Collator->viewSortKey("?!."), '[| | | 024E 024B 0255]'); 149 150$Collator->change(variable => 'Shift-Trimmed'); 151ok($Collator->viewSortKey("1+2"), 152 '[0A0C 0A0D | 0020 0020 | 0002 0002 | 039F]'); 153 154ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."), 155 '[| | | 024E 024B 0255]'); 156 157ok($Collator->viewSortKey("?!."), '[| | | 024E 024B 0255]'); 158 159$Collator->change(%origVar); 160 161##### 37 162 163# Level 3 weight 164 165ok($Collator->viewSortKey("a\x{3042}"), 166 '[0A15 1921 | 0020 0020 | 0002 000E | FFFF FFFF]'); 167 168ok($Collator->viewSortKey("A\x{30A2}"), 169 '[0A15 1921 | 0020 0020 | 0008 0011 | FFFF FFFF]'); 170 171$Collator->change(upper_before_lower => 1); 172 173ok($Collator->viewSortKey("a\x{3042}"), 174 '[0A15 1921 | 0020 0020 | 0008 000E | FFFF FFFF]'); 175 176ok($Collator->viewSortKey("A\x{30A2}"), 177 '[0A15 1921 | 0020 0020 | 0002 0011 | FFFF FFFF]'); 178 179$Collator->change(katakana_before_hiragana => 1); 180 181ok($Collator->viewSortKey("a\x{3042}"), 182 '[0A15 1921 | 0020 0020 | 0008 0013 | FFFF FFFF]'); 183ok($Collator->viewSortKey("A\x{30A2}"), 184 '[0A15 1921 | 0020 0020 | 0002 000F | FFFF FFFF]'); 185 186$Collator->change(upper_before_lower => 0); 187 188ok($Collator->viewSortKey("a\x{3042}"), 189 '[0A15 1921 | 0020 0020 | 0002 0013 | FFFF FFFF]'); 190 191ok($Collator->viewSortKey("A\x{30A2}"), 192 '[0A15 1921 | 0020 0020 | 0008 000F | FFFF FFFF]'); 193 194$Collator->change(katakana_before_hiragana => 0); 195 196ok($Collator->viewSortKey("a\x{3042}"), 197 '[0A15 1921 | 0020 0020 | 0002 000E | FFFF FFFF]'); 198 199ok($Collator->viewSortKey("A\x{30A2}"), 200 '[0A15 1921 | 0020 0020 | 0008 0011 | FFFF FFFF]'); 201 202##### 47 203 204our $el = Unicode::Collate->new( 205 entry => <<'ENTRY', 206006C ; [.0B03.0020.0002.006C] # LATIN SMALL LETTER L 207FF4C ; [.0B03.0020.0003.FF4C] # FULLWIDTH LATIN SMALL LETTER L; QQK 208217C ; [.0B03.0020.0004.217C] # SMALL ROMAN NUMERAL FIFTY; QQK 2092113 ; [.0B03.0020.0005.2113] # SCRIPT SMALL L; QQK 21024DB ; [.0B03.0020.0006.24DB] # CIRCLED LATIN SMALL LETTER L; QQK 211004C ; [.0B03.0020.0008.004C] # LATIN CAPITAL LETTER L 212FF2C ; [.0B03.0020.0009.FF2C] # FULLWIDTH LATIN CAPITAL LETTER L; QQK 213216C ; [.0B03.0020.000A.216C] # ROMAN NUMERAL FIFTY; QQK 2142112 ; [.0B03.0020.000B.2112] # SCRIPT CAPITAL L; QQK 21524C1 ; [.0B03.0020.000C.24C1] # CIRCLED LATIN CAPITAL LETTER L; QQK 216ENTRY 217 table => undef, 218 normalization => undef, 219 UCA_Version => 24, 220); 221 222our $el12 = '0B03 0B03 0B03 0B03 0B03 | 0020 0020 0020 0020 0020'; 223 224ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"), 225 "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]"); 226 227ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"), 228 "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]"); 229 230$el->change(upper_before_lower => 1); 231 232ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"), 233 "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]"); 234 235ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"), 236 "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]"); 237 238$el->change(upper_before_lower => 0); 239 240ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"), 241 "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]"); 242 243ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"), 244 "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]"); 245 246##### 53 247 248my @Versions = (9, 11, 14, 16, 18, 20, 22, 24, 26, 28); 249 250for my $v (@Versions) { 251 $Collator->change(UCA_Version => $v); 252 my $app = $v >= 26 ? ' |]' : ']'; 253 254 $Collator->change(variable => 'Shifted', level => 4); 255 ok($Collator->viewSortKey("1+2"), 256 '[0A0C 0A0D | 0020 0020 | 0002 0002 | FFFF 039F FFFF'.$app); 257 258 $Collator->change(variable => 'Shift-Trimmed'); 259 ok($Collator->viewSortKey("1+2"), 260 '[0A0C 0A0D | 0020 0020 | 0002 0002 | 039F'.$app); 261 262 $Collator->change(variable => 'Non-ignorable', level => 3); 263 ok($Collator->viewSortKey("1+2"), 264 '[0A0C 039F 0A0D | 0020 0020 0020 | 0002 0002 0002 |]'); 265 266 $Collator->change(variable => 'Blanked'); 267 ok($Collator->viewSortKey("1+2"), 268 '[0A0C 0A0D | 0020 0020 | 0002 0002 |]'); 269} 270 271