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 Test; 15BEGIN { plan tests => 53 }; 16 17use strict; 18use warnings; 19use Unicode::Collate; 20 21######################### 22 23ok(1); 24 25my $Collator = Unicode::Collate->new( 26 table => 'keys.txt', 27 normalization => undef, 28); 29 30############## 31 32ok($Collator->viewSortKey(""), "[| | |]"); 33 34ok($Collator->viewSortKey("A"), "[0A15 | 0020 | 0008 | FFFF]"); 35 36ok($Collator->viewSortKey("ABC"), 37 "[0A15 0A29 0A3D | 0020 0020 0020 | 0008 0008 0008 | FFFF FFFF FFFF]"); 38 39ok($Collator->viewSortKey("(12)"), 40 "[0A0C 0A0D | 0020 0020 | 0002 0002 | 027A FFFF FFFF 027B]"); 41 42ok($Collator->viewSortKey("!\x{300}"), "[| | | 024B]"); 43 44ok($Collator->viewSortKey("\x{300}"), "[| 0035 | 0002 | FFFF]"); 45 46$Collator->change(level => 3); 47ok($Collator->viewSortKey("A"), "[0A15 | 0020 | 0008 |]"); 48 49$Collator->change(level => 2); 50ok($Collator->viewSortKey("A"), "[0A15 | 0020 | |]"); 51 52$Collator->change(level => 1); 53ok($Collator->viewSortKey("A"), "[0A15 | | |]"); 54 55### Version 8 56 57$Collator->change(level => 4, UCA_Version => 8); 58 59ok($Collator->viewSortKey(""), "[|||]"); 60 61ok($Collator->viewSortKey("A"), "[0A15|0020|0008|FFFF]"); 62 63ok($Collator->viewSortKey("ABC"), 64 "[0A15 0A29 0A3D|0020 0020 0020|0008 0008 0008|FFFF FFFF FFFF]"); 65 66ok($Collator->viewSortKey("(12)"), 67 "[0A0C 0A0D|0020 0020|0002 0002|027A FFFF FFFF 027B]"); 68 69ok($Collator->viewSortKey("!\x{300}"), "[|0035|0002|024B FFFF]"); 70 71ok($Collator->viewSortKey("\x{300}"), "[|0035|0002|FFFF]"); 72 73$Collator->change(level => 3); 74ok($Collator->viewSortKey("A"), "[0A15|0020|0008|]"); 75 76$Collator->change(level => 2); 77ok($Collator->viewSortKey("A"), "[0A15|0020||]"); 78 79$Collator->change(level => 1); 80ok($Collator->viewSortKey("A"), "[0A15|||]"); 81 82# Version 9 83 84$Collator->change(level => 3, UCA_Version => 9); 85ok($Collator->viewSortKey("A\x{300}z\x{301}"), 86 "[0A15 0C13 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]"); 87 88$Collator->change(backwards => 1); 89ok($Collator->viewSortKey("A\x{300}z\x{301}"), 90 "[0C13 0A15 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]"); 91 92$Collator->change(backwards => 2); 93ok($Collator->viewSortKey("A\x{300}z\x{301}"), 94 "[0A15 0C13 | 0032 0020 0035 0020 | 0008 0002 0002 0002 |]"); 95 96$Collator->change(backwards => [1,3]); 97ok($Collator->viewSortKey("A\x{300}z\x{301}"), 98 "[0C13 0A15 | 0020 0035 0020 0032 | 0002 0002 0002 0008 |]"); 99 100$Collator->change(backwards => [2]); 101ok($Collator->viewSortKey("\x{300}\x{301}\x{302}\x{303}"), 102 "[| 004E 003C 0032 0035 | 0002 0002 0002 0002 |]"); 103 104$Collator->change(backwards => []); 105ok($Collator->viewSortKey("A\x{300}z\x{301}"), 106 "[0A15 0C13 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]"); 107 108$Collator->change(level => 4); 109 110# Variable 111 112our %origVar = $Collator->change(variable => 'Blanked'); 113ok($Collator->viewSortKey("1+2"), 114 '[0A0C 0A0D | 0020 0020 | 0002 0002 | 0031 002B 0032]'); 115 116ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."), 117 '[| | | 003F 0021 002E]'); 118 119ok($Collator->viewSortKey("?!."), '[| | | 003F 0021 002E]'); 120 121$Collator->change(variable => 'Non-ignorable'); 122ok($Collator->viewSortKey("1+2"), 123 '[0A0C 039F 0A0D | 0020 0020 0020 | 0002 0002 0002 | 0031 002B 0032]'); 124 125ok($Collator->viewSortKey("?\x{300}!"), 126 '[024E 024B | 0020 0035 0020 | 0002 0002 0002 | 003F 0300 0021]'); 127 128ok($Collator->viewSortKey("?!."), 129 '[024E 024B 0255 | 0020 0020 0020 | 0002 0002 0002 | 003F 0021 002E]'); 130 131$Collator->change(variable => 'Shifted'); 132ok($Collator->viewSortKey("1+2"), 133 '[0A0C 0A0D | 0020 0020 | 0002 0002 | FFFF 039F FFFF]'); 134 135ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."), 136 '[| | | 024E 024B 0255]'); 137 138ok($Collator->viewSortKey("?!."), '[| | | 024E 024B 0255]'); 139 140$Collator->change(variable => 'Shift-Trimmed'); 141ok($Collator->viewSortKey("1+2"), 142 '[0A0C 0A0D | 0020 0020 | 0002 0002 | 039F]'); 143 144ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."), 145 '[| | | 024E 024B 0255]'); 146 147ok($Collator->viewSortKey("?!."), '[| | | 024E 024B 0255]'); 148 149$Collator->change(%origVar); 150 151##### 152 153# Level 3 weight 154 155ok($Collator->viewSortKey("a\x{3042}"), 156 '[0A15 1921 | 0020 0020 | 0002 000E | FFFF FFFF]'); 157 158ok($Collator->viewSortKey("A\x{30A2}"), 159 '[0A15 1921 | 0020 0020 | 0008 0011 | FFFF FFFF]'); 160 161$Collator->change(upper_before_lower => 1); 162 163ok($Collator->viewSortKey("a\x{3042}"), 164 '[0A15 1921 | 0020 0020 | 0008 000E | FFFF FFFF]'); 165 166ok($Collator->viewSortKey("A\x{30A2}"), 167 '[0A15 1921 | 0020 0020 | 0002 0011 | FFFF FFFF]'); 168 169$Collator->change(katakana_before_hiragana => 1); 170 171ok($Collator->viewSortKey("a\x{3042}"), 172 '[0A15 1921 | 0020 0020 | 0008 0013 | FFFF FFFF]'); 173ok($Collator->viewSortKey("A\x{30A2}"), 174 '[0A15 1921 | 0020 0020 | 0002 000F | FFFF FFFF]'); 175 176$Collator->change(upper_before_lower => 0); 177 178ok($Collator->viewSortKey("a\x{3042}"), 179 '[0A15 1921 | 0020 0020 | 0002 0013 | FFFF FFFF]'); 180 181ok($Collator->viewSortKey("A\x{30A2}"), 182 '[0A15 1921 | 0020 0020 | 0008 000F | FFFF FFFF]'); 183 184$Collator->change(katakana_before_hiragana => 0); 185 186ok($Collator->viewSortKey("a\x{3042}"), 187 '[0A15 1921 | 0020 0020 | 0002 000E | FFFF FFFF]'); 188 189ok($Collator->viewSortKey("A\x{30A2}"), 190 '[0A15 1921 | 0020 0020 | 0008 0011 | FFFF FFFF]'); 191 192##### 193 194our $el = Unicode::Collate->new( 195 entry => <<'ENTRY', 196006C ; [.0B03.0020.0002.006C] # LATIN SMALL LETTER L 197FF4C ; [.0B03.0020.0003.FF4C] # FULLWIDTH LATIN SMALL LETTER L; QQK 198217C ; [.0B03.0020.0004.217C] # SMALL ROMAN NUMERAL FIFTY; QQK 1992113 ; [.0B03.0020.0005.2113] # SCRIPT SMALL L; QQK 20024DB ; [.0B03.0020.0006.24DB] # CIRCLED LATIN SMALL LETTER L; QQK 201004C ; [.0B03.0020.0008.004C] # LATIN CAPITAL LETTER L 202FF2C ; [.0B03.0020.0009.FF2C] # FULLWIDTH LATIN CAPITAL LETTER L; QQK 203216C ; [.0B03.0020.000A.216C] # ROMAN NUMERAL FIFTY; QQK 2042112 ; [.0B03.0020.000B.2112] # SCRIPT CAPITAL L; QQK 20524C1 ; [.0B03.0020.000C.24C1] # CIRCLED LATIN CAPITAL LETTER L; QQK 206ENTRY 207 table => undef, 208 normalization => undef, 209); 210 211our $el12 = '0B03 0B03 0B03 0B03 0B03 | 0020 0020 0020 0020 0020'; 212 213ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"), 214 "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]"); 215 216ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"), 217 "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]"); 218 219$el->change(upper_before_lower => 1); 220 221ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"), 222 "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]"); 223 224ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"), 225 "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]"); 226 227$el->change(upper_before_lower => 0); 228 229ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"), 230 "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]"); 231 232ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"), 233 "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]"); 234 235##### 236 237