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
9BEGIN {
10    eval { require Unicode::Normalize; };
11    if ($@) {
12	print "1..0 # skipped: Unicode::Normalize needed for this test\n";
13	print $@;
14	exit;
15    }
16}
17
18use strict;
19use warnings;
20BEGIN { $| = 1; print "1..101\n"; }
21my $count = 0;
22sub ok ($;$) {
23    my $p = my $r = shift;
24    if (@_) {
25	my $x = shift;
26	$p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
27    }
28    print $p ? "ok" : "not ok", ' ', ++$count, "\n";
29}
30
31use Unicode::Collate;
32
33ok(1);
34
35sub _pack_U   { Unicode::Collate::pack_U(@_) }
36sub _unpack_U { Unicode::Collate::unpack_U(@_) }
37
38#########################
39
40our $Aring = _pack_U(0xC5);
41our $aring = _pack_U(0xE5);
42
43our $entry = <<'ENTRIES';
44030A; [.0000.030A.0002] # COMBINING RING ABOVE
45212B; [.002B.0020.0008] # ANGSTROM SIGN
460061; [.0A41.0020.0002] # LATIN SMALL LETTER A
470041; [.0A41.0020.0008] # LATIN CAPITAL LETTER A
48007A; [.0A5A.0020.0002] # LATIN SMALL LETTER Z
49005A; [.0A5A.0020.0008] # LATIN CAPITAL LETTER Z
50FF41; [.0A87.0020.0002] # LATIN SMALL LETTER A
51FF21; [.0A87.0020.0008] # LATIN CAPITAL LETTER A
5200E5; [.0AC5.0020.0002] # LATIN SMALL LETTER A WITH RING ABOVE
5300C5; [.0AC5.0020.0008] # LATIN CAPITAL LETTER A WITH RING ABOVE
54ENTRIES
55
56# Aong < A+ring < Z < fullA+ring < A-ring
57
58#########################
59
60our $noN = Unicode::Collate->new(
61    level => 1,
62    table => undef,
63    normalization => undef,
64    entry => $entry,
65);
66
67our $nfc = Unicode::Collate->new(
68  level => 1,
69  table => undef,
70  normalization => 'NFC',
71  entry => $entry,
72);
73
74our $nfd = Unicode::Collate->new(
75  level => 1,
76  table => undef,
77  normalization => 'NFD',
78  entry => $entry,
79);
80
81our $nfkc = Unicode::Collate->new(
82  level => 1,
83  table => undef,
84  normalization => 'NFKC',
85  entry => $entry,
86);
87
88our $nfkd = Unicode::Collate->new(
89  level => 1,
90  table => undef,
91  normalization => 'NFKD',
92  entry => $entry,
93);
94
95ok($noN->lt("\x{212B}", "A"));
96ok($noN->lt("\x{212B}", $Aring));
97ok($noN->lt("A\x{30A}", $Aring));
98ok($noN->lt("A",       "\x{FF21}"));
99ok($noN->lt("Z",       "\x{FF21}"));
100ok($noN->lt("Z",        $Aring));
101ok($noN->lt("\x{212B}", $aring));
102ok($noN->lt("A\x{30A}", $aring));
103ok($noN->lt("Z",        $aring));
104ok($noN->lt("a\x{30A}", "Z"));
105
106ok($nfd->eq("\x{212B}", "A"));
107ok($nfd->eq("\x{212B}", $Aring));
108ok($nfd->eq("A\x{30A}", $Aring));
109ok($nfd->lt("A",       "\x{FF21}"));
110ok($nfd->lt("Z",       "\x{FF21}"));
111ok($nfd->gt("Z",        $Aring));
112ok($nfd->eq("\x{212B}", $aring));
113ok($nfd->eq("A\x{30A}", $aring));
114ok($nfd->gt("Z",        $aring));
115ok($nfd->lt("a\x{30A}", "Z"));
116
117ok($nfc->gt("\x{212B}", "A"));
118ok($nfc->eq("\x{212B}", $Aring));
119ok($nfc->eq("A\x{30A}", $Aring));
120ok($nfc->lt("A",       "\x{FF21}"));
121ok($nfc->lt("Z",       "\x{FF21}"));
122ok($nfc->lt("Z",        $Aring));
123ok($nfc->eq("\x{212B}", $aring));
124ok($nfc->eq("A\x{30A}", $aring));
125ok($nfc->lt("Z",        $aring));
126ok($nfc->gt("a\x{30A}", "Z"));
127
128ok($nfkd->eq("\x{212B}", "A"));
129ok($nfkd->eq("\x{212B}", $Aring));
130ok($nfkd->eq("A\x{30A}", $Aring));
131ok($nfkd->eq("A",       "\x{FF21}"));
132ok($nfkd->gt("Z",       "\x{FF21}"));
133ok($nfkd->gt("Z",        $Aring));
134ok($nfkd->eq("\x{212B}", $aring));
135ok($nfkd->eq("A\x{30A}", $aring));
136ok($nfkd->gt("Z",        $aring));
137ok($nfkd->lt("a\x{30A}", "Z"));
138
139ok($nfkc->gt("\x{212B}", "A"));
140ok($nfkc->eq("\x{212B}", $Aring));
141ok($nfkc->eq("A\x{30A}", $Aring));
142ok($nfkc->eq("A",       "\x{FF21}"));
143ok($nfkc->gt("Z",       "\x{FF21}"));
144ok($nfkc->lt("Z",        $Aring));
145ok($nfkc->eq("\x{212B}", $aring));
146ok($nfkc->eq("A\x{30A}", $aring));
147ok($nfkc->lt("Z",        $aring));
148ok($nfkc->gt("a\x{30A}", "Z"));
149
150$nfd->change(normalization => undef);
151
152ok($nfd->lt("\x{212B}", "A"));
153ok($nfd->lt("\x{212B}", $Aring));
154ok($nfd->lt("A\x{30A}", $Aring));
155ok($nfd->lt("A",       "\x{FF21}"));
156ok($nfd->lt("Z",       "\x{FF21}"));
157ok($nfd->lt("Z",        $Aring));
158ok($nfd->lt("\x{212B}", $aring));
159ok($nfd->lt("A\x{30A}", $aring));
160ok($nfd->lt("Z",        $aring));
161ok($nfd->lt("a\x{30A}", "Z"));
162
163$nfd->change(normalization => 'C');
164
165ok($nfd->gt("\x{212B}", "A"));
166ok($nfd->eq("\x{212B}", $Aring));
167ok($nfd->eq("A\x{30A}", $Aring));
168ok($nfd->lt("A",       "\x{FF21}"));
169ok($nfd->lt("Z",       "\x{FF21}"));
170ok($nfd->lt("Z",        $Aring));
171ok($nfd->eq("\x{212B}", $aring));
172ok($nfd->eq("A\x{30A}", $aring));
173ok($nfd->lt("Z",        $aring));
174ok($nfd->gt("a\x{30A}", "Z"));
175
176$nfd->change(normalization => 'D');
177
178ok($nfd->eq("\x{212B}", "A"));
179ok($nfd->eq("\x{212B}", $Aring));
180ok($nfd->eq("A\x{30A}", $Aring));
181ok($nfd->lt("A",       "\x{FF21}"));
182ok($nfd->lt("Z",       "\x{FF21}"));
183ok($nfd->gt("Z",        $Aring));
184ok($nfd->eq("\x{212B}", $aring));
185ok($nfd->eq("A\x{30A}", $aring));
186ok($nfd->gt("Z",        $aring));
187ok($nfd->lt("a\x{30A}", "Z"));
188
189$nfd->change(normalization => 'KD');
190
191ok($nfd->eq("\x{212B}", "A"));
192ok($nfd->eq("\x{212B}", $Aring));
193ok($nfd->eq("A\x{30A}", $Aring));
194ok($nfd->eq("A",       "\x{FF21}"));
195ok($nfd->gt("Z",       "\x{FF21}"));
196ok($nfd->gt("Z",        $Aring));
197ok($nfd->eq("\x{212B}", $aring));
198ok($nfd->eq("A\x{30A}", $aring));
199ok($nfd->gt("Z",        $aring));
200ok($nfd->lt("a\x{30A}", "Z"));
201
202$nfd->change(normalization => 'KC');
203
204ok($nfd->gt("\x{212B}", "A"));
205ok($nfd->eq("\x{212B}", $Aring));
206ok($nfd->eq("A\x{30A}", $Aring));
207ok($nfd->eq("A",       "\x{FF21}"));
208ok($nfd->gt("Z",       "\x{FF21}"));
209ok($nfd->lt("Z",        $Aring));
210ok($nfd->eq("\x{212B}", $aring));
211ok($nfd->eq("A\x{30A}", $aring));
212ok($nfd->lt("Z",        $aring));
213ok($nfd->gt("a\x{30A}", "Z"));
214
215