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..54\n"; }
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
31my $Collator = Unicode::Collate->new(
32    table => 'keys.txt',
33    normalization => undef,
34    UCA_Version => 24,
35);
36
37# [001F] UNIT SEPARATOR
38{
39    ok($Collator->eq("\0",   "\x1F"));
40    ok($Collator->eq("\x1F", "\x{200B}"));
41    ok($Collator->eq("\0",   "\x{200B}"));
42    ok($Collator->eq("\x{313}", "\x{343}"));
43    ok($Collator->eq("\x{2000}", "\x{2001}"));
44    ok($Collator->eq("\x{200B}", "\x{200C}"));
45    ok($Collator->eq("\x{304C}", "\x{304B}\x{3099}"));
46
47    $Collator->change(identical => 1);
48
49    ok($Collator->lt("\0",   "\x1F"));
50    ok($Collator->lt("\x1F", "\x{200B}"));
51    ok($Collator->lt("\0",   "\x{200B}"));
52    ok($Collator->lt("\x{313}", "\x{343}"));
53    ok($Collator->lt("\x{2000}", "\x{2001}"));
54    ok($Collator->lt("\x{200B}", "\x{200C}"));
55    ok($Collator->gt("\x{304C}", "\x{304B}\x{3099}"));
56
57    $Collator->change(identical => 0);
58
59    ok($Collator->eq("\0",   "\x1F"));
60    ok($Collator->eq("\x1F", "\x{200B}"));
61    ok($Collator->eq("\0",   "\x{200B}"));
62    ok($Collator->eq("\x{313}", "\x{343}"));
63    ok($Collator->eq("\x{2000}", "\x{2001}"));
64    ok($Collator->eq("\x{200B}", "\x{200C}"));
65    ok($Collator->eq("\x{304C}", "\x{304B}\x{3099}"));
66}
67
68#### 22
69
70eval { require Unicode::Normalize };
71if (!$@) {
72    $Collator->change(normalization => "NFD");
73
74    $Collator->change(identical => 1);
75
76    ok($Collator->lt("\0", "\x{200B}"));
77    ok($Collator->eq("\x{313}", "\x{343}"));
78    ok($Collator->lt("\x{2000}", "\x{2001}"));
79    ok($Collator->lt("\x{200B}", "\x{200C}"));
80    ok($Collator->eq("\x{304C}", "\x{304B}\x{3099}"));
81
82    $Collator->change(identical => 0);
83
84    ok($Collator->eq("\0", "\x{200B}"));
85    ok($Collator->eq("\x{313}", "\x{343}"));
86    ok($Collator->eq("\x{2000}", "\x{2001}"));
87    ok($Collator->eq("\x{200B}", "\x{200C}"));
88    ok($Collator->eq("\x{304C}", "\x{304B}\x{3099}"));
89} else {
90    ok(1) for 1..10;
91}
92
93$Collator->change(normalization => undef, identical => 1);
94
95##### 32
96
97ok($Collator->viewSortKey("\0"),       '[| | | | 0000 0000]');
98ok($Collator->viewSortKey("\x{200B}"), '[| | | | 0000 200B]');
99
100ok($Collator->viewSortKey('a'),
101    '[0A15 | 0020 | 0002 | FFFF | 0000 0061]');
102
103# 0061 FOR 'a' SHOULD BE A UNICODE CODE POINT, NOT A NATIVE CODE POINT.
104
105ok($Collator->viewSortKey("\x{304C}"),
106    '[1926 | 0020 013D | 000E 0002 | FFFF FFFF | 0000 304C]');
107
108ok($Collator->viewSortKey("\x{4E00}"),
109    '[FB40 CE00 | 0020 | 0002 | FFFF FFFF | 0000 4E00]');
110
111ok($Collator->viewSortKey("\x{100000}"),
112    '[FBE0 8000 | 0020 | 0002 | FFFF FFFF | 0010 0000]');
113
114##### 38
115
116eval { require Unicode::Normalize };
117if (!$@) {
118    $Collator->change(normalization => "NFD");
119
120    ok($Collator->viewSortKey("\x{304C}"),
121    '[1926 | 0020 013D | 000E 0002 | FFFF FFFF | 0000 304B 0000 3099]');
122} else {
123    ok(1);
124}
125
126$Collator->change(normalization => undef);
127
128##### 39
129
130$Collator->change(level => 3);
131
132ok($Collator->viewSortKey("\x{304C}"),
133    '[1926 | 0020 013D | 000E 0002 | | 0000 304C]');
134
135$Collator->change(level => 2);
136
137ok($Collator->viewSortKey("\x{304C}"),
138    '[1926 | 0020 013D | | | 0000 304C]');
139
140$Collator->change(level => 1);
141
142ok($Collator->viewSortKey("\x{304C}"),
143    '[1926 | | | | 0000 304C]');
144
145##### 42
146
147$Collator->change(UCA_Version => 8);
148
149ok($Collator->viewSortKey("\x{304C}"),
150    '[1926||||0000 304C]');
151
152$Collator->change(level => 2);
153
154ok($Collator->viewSortKey("\x{304C}"),
155    '[1926|0020 013D|||0000 304C]');
156
157$Collator->change(level => 3);
158
159ok($Collator->viewSortKey("\x{304C}"),
160    '[1926|0020 013D|000E 0002||0000 304C]');
161
162$Collator->change(level => 4);
163
164ok($Collator->viewSortKey("\x{304C}"),
165    '[1926|0020 013D|000E 0002|FFFF FFFF|0000 304C]');
166
167ok($Collator->viewSortKey("\x{4E00}"),
168    '[4E00|0020|0002|FFFF|0000 4E00]');
169
170ok($Collator->viewSortKey("\x{100000}"),
171    '[FFA0 8000|0002|0001|FFFF FFFF|0010 0000]');
172
173##### 48
174
175$Collator->change(UCA_Version => 36);
176
177ok($Collator->viewSortKey("\0"),       '[| | | | 0000 0000]');
178ok($Collator->viewSortKey("\x{200B}"), '[| | | | 0000 200B]');
179
180ok($Collator->viewSortKey('a'),
181    '[0A15 | 0020 | 0002 | FFFF | 0000 0061]');
182
183# 0061 FOR 'a' SHOULD BE A UNICODE CODE POINT, NOT A NATIVE CODE POINT.
184
185ok($Collator->viewSortKey("\x{304C}"),
186    '[1926 | 0020 013D | 000E 0002 | FFFF FFFF | 0000 304C]');
187
188ok($Collator->viewSortKey("\x{4E00}"),
189    '[FB40 CE00 | 0020 | 0002 | FFFF | 0000 4E00]');
190
191ok($Collator->viewSortKey("\x{100000}"),
192    '[FBE0 8000 | 0020 | 0002 | FFFF | 0010 0000]');
193
194##### 54
195