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