1
2BEGIN {
3    if ($ENV{PERL_CORE}) {
4	chdir('t') if -d 't';
5	@INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
6    }
7}
8
9use strict;
10use warnings;
11BEGIN { $| = 1; print "1..214\n"; } # 62 + 8 x @Versions
12my $count = 0;
13sub ok ($;$) {
14    my $p = my $r = shift;
15    if (@_) {
16	my $x = shift;
17	$p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
18    }
19    print $p ? "ok" : "not ok", ' ', ++$count, "\n";
20}
21
22use Unicode::Collate;
23
24ok(1);
25
26sub _pack_U   { Unicode::Collate::pack_U(@_) }
27sub _unpack_U { Unicode::Collate::unpack_U(@_) }
28
29#########################
30
31##### 1
32
33my $Collator = Unicode::Collate->new(
34  table => 'keys.txt',
35  normalization => undef,
36  UCA_Version => 24,
37);
38
39ok($Collator->viewSortKey(""),		'[| | |]');
40ok($Collator->viewSortKey("\0"),	'[| | |]');
41ok($Collator->viewSortKey("\x{200B}"),	'[| | |]');
42
43ok($Collator->viewSortKey("A"), '[0A15 | 0020 | 0008 | FFFF]');
44ok($Collator->viewSortKey('a'), '[0A15 | 0020 | 0002 | 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
56ok($Collator->viewSortKey("\x{304C}"),
57    '[1926 | 0020 013D | 000E 0002 | FFFF FFFF]');
58
59ok($Collator->viewSortKey("\x{4E00}"),
60    '[FB40 CE00 | 0020 | 0002 | FFFF FFFF]');
61
62ok($Collator->viewSortKey("\x{100000}"),
63    '[FBE0 8000 | 0020 | 0002 | FFFF FFFF]');
64
65$Collator->change(level => 3);
66ok($Collator->viewSortKey("A"), "[0A15 | 0020 | 0008 |]");
67
68$Collator->change(level => 2);
69ok($Collator->viewSortKey("A"), "[0A15 | 0020 | |]");
70
71$Collator->change(level => 1);
72ok($Collator->viewSortKey("A"), "[0A15 | | |]");
73
74##### 16
75
76$Collator->change(level => 4, UCA_Version => 8);
77
78ok($Collator->viewSortKey(""), "[|||]");
79
80ok($Collator->viewSortKey("A"), "[0A15|0020|0008|FFFF]");
81
82ok($Collator->viewSortKey("ABC"),
83    "[0A15 0A29 0A3D|0020 0020 0020|0008 0008 0008|FFFF FFFF FFFF]");
84
85ok($Collator->viewSortKey("(12)"),
86    "[0A0C 0A0D|0020 0020|0002 0002|027A FFFF FFFF 027B]");
87
88ok($Collator->viewSortKey("!\x{300}"), "[|0035|0002|024B FFFF]");
89
90ok($Collator->viewSortKey("\x{300}"), "[|0035|0002|FFFF]");
91
92ok($Collator->viewSortKey("\x{304C}"),
93    '[1926|0020 013D|000E 0002|FFFF FFFF]');
94
95ok($Collator->viewSortKey("\x{4E00}"),
96    '[4E00|0020|0002|FFFF]');
97
98ok($Collator->viewSortKey("\x{100000}"),
99    '[FFA0 8000|0002|0001|FFFF FFFF]');
100
101$Collator->change(level => 3);
102ok($Collator->viewSortKey("A"), "[0A15|0020|0008|]");
103
104$Collator->change(level => 2);
105ok($Collator->viewSortKey("A"), "[0A15|0020||]");
106
107$Collator->change(level => 1);
108ok($Collator->viewSortKey("A"), "[0A15|||]");
109
110##### 28
111
112$Collator->change(level => 3, UCA_Version => 9);
113ok($Collator->viewSortKey("A\x{300}z\x{301}"),
114    "[0A15 0C13 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]");
115
116$Collator->change(backwards => 1);
117ok($Collator->viewSortKey("A\x{300}z\x{301}"),
118    "[0C13 0A15 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]");
119
120$Collator->change(backwards => 2);
121ok($Collator->viewSortKey("A\x{300}z\x{301}"),
122    "[0A15 0C13 | 0032 0020 0035 0020 | 0008 0002 0002 0002 |]");
123
124$Collator->change(backwards => [1,3]);
125ok($Collator->viewSortKey("A\x{300}z\x{301}"),
126    "[0C13 0A15 | 0020 0035 0020 0032 | 0002 0002 0002 0008 |]");
127
128$Collator->change(backwards => [2]);
129ok($Collator->viewSortKey("\x{300}\x{301}\x{302}\x{303}"),
130    "[| 004E 003C 0032 0035 | 0002 0002 0002 0002 |]");
131
132$Collator->change(backwards => []);
133ok($Collator->viewSortKey("A\x{300}z\x{301}"),
134    "[0A15 0C13 | 0020 0035 0020 0032 | 0008 0002 0002 0002 |]");
135
136##### 34
137
138$Collator->change(level => 4);
139
140# Variable
141
142our %origVar = $Collator->change(variable => 'Blanked');
143ok($Collator->viewSortKey("1+2"),
144    '[0A0C 0A0D | 0020 0020 | 0002 0002 | 0031 002B 0032]');
145
146ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."),
147    '[| | | 003F 0021 002E]');
148
149ok($Collator->viewSortKey("?!."), '[| | | 003F 0021 002E]');
150
151$Collator->change(variable => 'Non-ignorable');
152ok($Collator->viewSortKey("1+2"),
153    '[0A0C 039F 0A0D | 0020 0020 0020 | 0002 0002 0002 | 0031 002B 0032]');
154
155ok($Collator->viewSortKey("?\x{300}!"),
156    '[024E 024B | 0020 0035 0020 | 0002 0002 0002 | 003F 0300 0021]');
157
158ok($Collator->viewSortKey("?!."),
159    '[024E 024B 0255 | 0020 0020 0020 | 0002 0002 0002 | 003F 0021 002E]');
160
161$Collator->change(variable => 'Shifted');
162ok($Collator->viewSortKey("1+2"),
163    '[0A0C 0A0D | 0020 0020 | 0002 0002 | FFFF 039F FFFF]');
164
165ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."),
166    '[| | | 024E 024B 0255]');
167
168ok($Collator->viewSortKey("?!."), '[| | | 024E 024B 0255]');
169
170$Collator->change(variable => 'Shift-Trimmed');
171ok($Collator->viewSortKey("1+2"),
172    '[0A0C 0A0D | 0020 0020 | 0002 0002 | 039F]');
173
174ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."),
175    '[| | | 024E 024B 0255]');
176
177ok($Collator->viewSortKey("?!."), '[| | | 024E 024B 0255]');
178
179$Collator->change(%origVar);
180
181##### 46
182
183# Level 3 weight
184
185ok($Collator->viewSortKey("a\x{3042}"),
186    '[0A15 1921 | 0020 0020 | 0002 000E | FFFF FFFF]');
187
188ok($Collator->viewSortKey("A\x{30A2}"),
189    '[0A15 1921 | 0020 0020 | 0008 0011 | FFFF FFFF]');
190
191$Collator->change(upper_before_lower => 1);
192
193ok($Collator->viewSortKey("a\x{3042}"),
194    '[0A15 1921 | 0020 0020 | 0008 000E | FFFF FFFF]');
195
196ok($Collator->viewSortKey("A\x{30A2}"),
197    '[0A15 1921 | 0020 0020 | 0002 0011 | FFFF FFFF]');
198
199$Collator->change(katakana_before_hiragana => 1);
200
201ok($Collator->viewSortKey("a\x{3042}"),
202    '[0A15 1921 | 0020 0020 | 0008 0013 | FFFF FFFF]');
203ok($Collator->viewSortKey("A\x{30A2}"),
204    '[0A15 1921 | 0020 0020 | 0002 000F | FFFF FFFF]');
205
206$Collator->change(upper_before_lower => 0);
207
208ok($Collator->viewSortKey("a\x{3042}"),
209    '[0A15 1921 | 0020 0020 | 0002 0013 | FFFF FFFF]');
210
211ok($Collator->viewSortKey("A\x{30A2}"),
212    '[0A15 1921 | 0020 0020 | 0008 000F | FFFF FFFF]');
213
214$Collator->change(katakana_before_hiragana => 0);
215
216ok($Collator->viewSortKey("a\x{3042}"),
217    '[0A15 1921 | 0020 0020 | 0002 000E | FFFF FFFF]');
218
219ok($Collator->viewSortKey("A\x{30A2}"),
220    '[0A15 1921 | 0020 0020 | 0008 0011 | FFFF FFFF]');
221
222##### 56
223
224our $el = Unicode::Collate->new(
225  entry => <<'ENTRY',
226006C ; [.0B03.0020.0002.006C] # LATIN SMALL LETTER L
227FF4C ; [.0B03.0020.0003.FF4C] # FULLWIDTH LATIN SMALL LETTER L; QQK
228217C ; [.0B03.0020.0004.217C] # SMALL ROMAN NUMERAL FIFTY; QQK
2292113 ; [.0B03.0020.0005.2113] # SCRIPT SMALL L; QQK
23024DB ; [.0B03.0020.0006.24DB] # CIRCLED LATIN SMALL LETTER L; QQK
231004C ; [.0B03.0020.0008.004C] # LATIN CAPITAL LETTER L
232FF2C ; [.0B03.0020.0009.FF2C] # FULLWIDTH LATIN CAPITAL LETTER L; QQK
233216C ; [.0B03.0020.000A.216C] # ROMAN NUMERAL FIFTY; QQK
2342112 ; [.0B03.0020.000B.2112] # SCRIPT CAPITAL L; QQK
23524C1 ; [.0B03.0020.000C.24C1] # CIRCLED LATIN CAPITAL LETTER L; QQK
236ENTRY
237  table => undef,
238  normalization => undef,
239  UCA_Version => 24,
240);
241
242our $el12 = '0B03 0B03 0B03 0B03 0B03 | 0020 0020 0020 0020 0020';
243
244ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"),
245    "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]");
246
247ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"),
248    "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]");
249
250$el->change(upper_before_lower => 1);
251
252ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"),
253    "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]");
254
255ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"),
256    "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]");
257
258$el->change(upper_before_lower => 0);
259
260ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"),
261    "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]");
262
263ok($el->viewSortKey("L\x{FF2C}\x{216C}\x{2112}\x{24C1}"),
264    "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]");
265
266##### 62
267
268my @Versions = ( 8,  9, 11, 14, 16, 18, 20, 22, 24, 26,
269		28, 30, 32, 34, 36, 38, 40, 41, 43);
270
271for my $v (@Versions) {
272    $Collator->change(UCA_Version => $v);
273
274    # primary weights
275    my $pri1 = '0A0C 0A0D';
276    my $pri2 = '0A0C 039F 0A0D';
277    my $pri3 = $v >= 9 ? 'FB40 CE02' : '4E02';
278
279    # secondary weights
280    my $sec1 = '0020';
281    my $sec2 = '0020 0020';
282    my $sec3 = '0020 0020 0020';
283
284    # tertiary weights
285    my $ter1 = '0002';
286    my $ter2 = '0002 0002';
287    my $ter3 = '0002 0002 0002';
288
289    # quaternary weights
290    my $eququat = 'FFFF 039F FFFF';
291    my $hanquat = $v >= 36 || $v == 8 ? 'FFFF' : 'FFFF FFFF';
292
293    # separators
294    my $sep1 = $v >= 9 ? ' |'  : '|';
295    my $sep2 = $v >= 9 ? ' | ' : '|';
296
297    my $app = $v >= 26 ? ' |]' : ']';
298
299    $Collator->change(variable => 'Shifted', level => 4);
300    ok($Collator->viewSortKey("1+2"),
301	"[$pri1$sep2$sec2$sep2$ter2$sep2$eququat$app");
302    ok($Collator->viewSortKey("\x{4E02}"),
303	"[$pri3$sep2$sec1$sep2$ter1$sep2$hanquat$app");
304
305    $Collator->change(variable => 'Shift-Trimmed');
306    ok($Collator->viewSortKey("1+2"),
307	"[$pri1$sep2$sec2$sep2$ter2$sep2"."039F$app");
308    ok($Collator->viewSortKey("\x{4E02}"),
309	"[$pri3$sep2$sec1$sep2$ter1$sep1$app");
310
311    $Collator->change(variable => 'Non-ignorable', level => 3);
312    ok($Collator->viewSortKey("1+2"),
313	"[$pri2$sep2$sec3$sep2$ter3$sep1]");
314    ok($Collator->viewSortKey("\x{4E02}"),
315	"[$pri3$sep2$sec1$sep2$ter1$sep1]");
316
317    $Collator->change(variable => 'Blanked');
318    ok($Collator->viewSortKey("1+2"),
319	"[$pri1$sep2$sec2$sep2$ter2$sep1]");
320    ok($Collator->viewSortKey("\x{4E02}"),
321	"[$pri3$sep2$sec1$sep2$ter1$sep1]");
322}
323
324