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