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..174\n"; } # 62 + 8 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(""),		'[| | |]');
43ok($Collator->viewSortKey("\0"),	'[| | |]');
44ok($Collator->viewSortKey("\x{200B}"),	'[| | |]');
45
46ok($Collator->viewSortKey("A"), '[0A15 | 0020 | 0008 | FFFF]');
47ok($Collator->viewSortKey('a'), '[0A15 | 0020 | 0002 | FFFF]');
48
49ok($Collator->viewSortKey("ABC"),
50    "[0A15 0A29 0A3D | 0020 0020 0020 | 0008 0008 0008 | FFFF FFFF FFFF]");
51
52ok($Collator->viewSortKey("(12)"),
53    "[0A0C 0A0D | 0020 0020 | 0002 0002 | 027A FFFF FFFF 027B]");
54
55ok($Collator->viewSortKey("!\x{300}"), "[| | | 024B]");
56
57ok($Collator->viewSortKey("\x{300}"), "[| 0035 | 0002 | FFFF]");
58
59ok($Collator->viewSortKey("\x{304C}"),
60    '[1926 | 0020 013D | 000E 0002 | FFFF FFFF]');
61
62ok($Collator->viewSortKey("\x{4E00}"),
63    '[FB40 CE00 | 0020 | 0002 | FFFF FFFF]');
64
65ok($Collator->viewSortKey("\x{100000}"),
66    '[FBE0 8000 | 0020 | 0002 | FFFF FFFF]');
67
68$Collator->change(level => 3);
69ok($Collator->viewSortKey("A"), "[0A15 | 0020 | 0008 |]");
70
71$Collator->change(level => 2);
72ok($Collator->viewSortKey("A"), "[0A15 | 0020 | |]");
73
74$Collator->change(level => 1);
75ok($Collator->viewSortKey("A"), "[0A15 | | |]");
76
77##### 16
78
79$Collator->change(level => 4, UCA_Version => 8);
80
81ok($Collator->viewSortKey(""), "[|||]");
82
83ok($Collator->viewSortKey("A"), "[0A15|0020|0008|FFFF]");
84
85ok($Collator->viewSortKey("ABC"),
86    "[0A15 0A29 0A3D|0020 0020 0020|0008 0008 0008|FFFF FFFF FFFF]");
87
88ok($Collator->viewSortKey("(12)"),
89    "[0A0C 0A0D|0020 0020|0002 0002|027A FFFF FFFF 027B]");
90
91ok($Collator->viewSortKey("!\x{300}"), "[|0035|0002|024B FFFF]");
92
93ok($Collator->viewSortKey("\x{300}"), "[|0035|0002|FFFF]");
94
95ok($Collator->viewSortKey("\x{304C}"),
96    '[1926|0020 013D|000E 0002|FFFF FFFF]');
97
98ok($Collator->viewSortKey("\x{4E00}"),
99    '[4E00|0020|0002|FFFF]');
100
101ok($Collator->viewSortKey("\x{100000}"),
102    '[FFA0 8000|0002|0001|FFFF FFFF]');
103
104$Collator->change(level => 3);
105ok($Collator->viewSortKey("A"), "[0A15|0020|0008|]");
106
107$Collator->change(level => 2);
108ok($Collator->viewSortKey("A"), "[0A15|0020||]");
109
110$Collator->change(level => 1);
111ok($Collator->viewSortKey("A"), "[0A15|||]");
112
113##### 28
114
115$Collator->change(level => 3, UCA_Version => 9);
116ok($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);
120ok($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);
124ok($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]);
128ok($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]);
132ok($Collator->viewSortKey("\x{300}\x{301}\x{302}\x{303}"),
133    "[| 004E 003C 0032 0035 | 0002 0002 0002 0002 |]");
134
135$Collator->change(backwards => []);
136ok($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
145our %origVar = $Collator->change(variable => 'Blanked');
146ok($Collator->viewSortKey("1+2"),
147    '[0A0C 0A0D | 0020 0020 | 0002 0002 | 0031 002B 0032]');
148
149ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."),
150    '[| | | 003F 0021 002E]');
151
152ok($Collator->viewSortKey("?!."), '[| | | 003F 0021 002E]');
153
154$Collator->change(variable => 'Non-ignorable');
155ok($Collator->viewSortKey("1+2"),
156    '[0A0C 039F 0A0D | 0020 0020 0020 | 0002 0002 0002 | 0031 002B 0032]');
157
158ok($Collator->viewSortKey("?\x{300}!"),
159    '[024E 024B | 0020 0035 0020 | 0002 0002 0002 | 003F 0300 0021]');
160
161ok($Collator->viewSortKey("?!."),
162    '[024E 024B 0255 | 0020 0020 0020 | 0002 0002 0002 | 003F 0021 002E]');
163
164$Collator->change(variable => 'Shifted');
165ok($Collator->viewSortKey("1+2"),
166    '[0A0C 0A0D | 0020 0020 | 0002 0002 | FFFF 039F FFFF]');
167
168ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."),
169    '[| | | 024E 024B 0255]');
170
171ok($Collator->viewSortKey("?!."), '[| | | 024E 024B 0255]');
172
173$Collator->change(variable => 'Shift-Trimmed');
174ok($Collator->viewSortKey("1+2"),
175    '[0A0C 0A0D | 0020 0020 | 0002 0002 | 039F]');
176
177ok($Collator->viewSortKey("?\x{300}!\x{301}\x{315}."),
178    '[| | | 024E 024B 0255]');
179
180ok($Collator->viewSortKey("?!."), '[| | | 024E 024B 0255]');
181
182$Collator->change(%origVar);
183
184##### 46
185
186# Level 3 weight
187
188ok($Collator->viewSortKey("a\x{3042}"),
189    '[0A15 1921 | 0020 0020 | 0002 000E | FFFF FFFF]');
190
191ok($Collator->viewSortKey("A\x{30A2}"),
192    '[0A15 1921 | 0020 0020 | 0008 0011 | FFFF FFFF]');
193
194$Collator->change(upper_before_lower => 1);
195
196ok($Collator->viewSortKey("a\x{3042}"),
197    '[0A15 1921 | 0020 0020 | 0008 000E | FFFF FFFF]');
198
199ok($Collator->viewSortKey("A\x{30A2}"),
200    '[0A15 1921 | 0020 0020 | 0002 0011 | FFFF FFFF]');
201
202$Collator->change(katakana_before_hiragana => 1);
203
204ok($Collator->viewSortKey("a\x{3042}"),
205    '[0A15 1921 | 0020 0020 | 0008 0013 | FFFF FFFF]');
206ok($Collator->viewSortKey("A\x{30A2}"),
207    '[0A15 1921 | 0020 0020 | 0002 000F | FFFF FFFF]');
208
209$Collator->change(upper_before_lower => 0);
210
211ok($Collator->viewSortKey("a\x{3042}"),
212    '[0A15 1921 | 0020 0020 | 0002 0013 | FFFF FFFF]');
213
214ok($Collator->viewSortKey("A\x{30A2}"),
215    '[0A15 1921 | 0020 0020 | 0008 000F | FFFF FFFF]');
216
217$Collator->change(katakana_before_hiragana => 0);
218
219ok($Collator->viewSortKey("a\x{3042}"),
220    '[0A15 1921 | 0020 0020 | 0002 000E | FFFF FFFF]');
221
222ok($Collator->viewSortKey("A\x{30A2}"),
223    '[0A15 1921 | 0020 0020 | 0008 0011 | FFFF FFFF]');
224
225##### 56
226
227our $el = Unicode::Collate->new(
228  entry => <<'ENTRY',
229006C ; [.0B03.0020.0002.006C] # LATIN SMALL LETTER L
230FF4C ; [.0B03.0020.0003.FF4C] # FULLWIDTH LATIN SMALL LETTER L; QQK
231217C ; [.0B03.0020.0004.217C] # SMALL ROMAN NUMERAL FIFTY; QQK
2322113 ; [.0B03.0020.0005.2113] # SCRIPT SMALL L; QQK
23324DB ; [.0B03.0020.0006.24DB] # CIRCLED LATIN SMALL LETTER L; QQK
234004C ; [.0B03.0020.0008.004C] # LATIN CAPITAL LETTER L
235FF2C ; [.0B03.0020.0009.FF2C] # FULLWIDTH LATIN CAPITAL LETTER L; QQK
236216C ; [.0B03.0020.000A.216C] # ROMAN NUMERAL FIFTY; QQK
2372112 ; [.0B03.0020.000B.2112] # SCRIPT CAPITAL L; QQK
23824C1 ; [.0B03.0020.000C.24C1] # CIRCLED LATIN CAPITAL LETTER L; QQK
239ENTRY
240  table => undef,
241  normalization => undef,
242  UCA_Version => 24,
243);
244
245our $el12 = '0B03 0B03 0B03 0B03 0B03 | 0020 0020 0020 0020 0020';
246
247ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"),
248    "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]");
249
250ok($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
255ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"),
256    "[$el12 | 0008 0009 000A 000B 000C | FFFF FFFF FFFF FFFF FFFF]");
257
258ok($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
263ok($el->viewSortKey("l\x{FF4C}\x{217C}\x{2113}\x{24DB}"),
264    "[$el12 | 0002 0003 0004 0005 0006 | FFFF FFFF FFFF FFFF FFFF]");
265
266ok($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
271my @Versions = (9, 11, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36);
272
273for my $v (@Versions) {
274    $Collator->change(UCA_Version => $v);
275    my $app = $v >= 26 ? ' |]' : ']';
276    my $sec = $v >= 36 ? '' : ' FFFF';
277
278    $Collator->change(variable => 'Shifted', level => 4);
279    ok($Collator->viewSortKey("1+2"),
280	'[0A0C 0A0D | 0020 0020 | 0002 0002 | FFFF 039F FFFF'.$app);
281    ok($Collator->viewSortKey("\x{4E02}"),
282	'[FB40 CE02 | 0020 | 0002 | FFFF'.$sec.$app);
283
284    $Collator->change(variable => 'Shift-Trimmed');
285    ok($Collator->viewSortKey("1+2"),
286	'[0A0C 0A0D | 0020 0020 | 0002 0002 | 039F'.$app);
287    ok($Collator->viewSortKey("\x{4E02}"),
288	'[FB40 CE02 | 0020 | 0002 |'.$app);
289
290    $Collator->change(variable => 'Non-ignorable', level => 3);
291    ok($Collator->viewSortKey("1+2"),
292	'[0A0C 039F 0A0D | 0020 0020 0020 | 0002 0002 0002 |]');
293    ok($Collator->viewSortKey("\x{4E02}"),
294	'[FB40 CE02 | 0020 | 0002 |]');
295
296    $Collator->change(variable => 'Blanked');
297    ok($Collator->viewSortKey("1+2"),
298	'[0A0C 0A0D | 0020 0020 | 0002 0002 |]');
299    ok($Collator->viewSortKey("\x{4E02}"),
300	'[FB40 CE02 | 0020 | 0002 |]');
301}
302
303