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