1BEGIN {
2    unless ("A" eq pack('U', 0x41)) {
3	print "1..0 # Unicode::Collate " .
4	    "cannot stringify a Unicode code point\n";
5	exit 0;
6    }
7}
8
9BEGIN {
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 Test;
25BEGIN { plan tests => 100 };
26
27use strict;
28use warnings;
29use Unicode::Collate;
30
31our $Aring = pack('U', 0xC5);
32our $aring = pack('U', 0xE5);
33
34our $entry = <<'ENTRIES';
35030A; [.0000.030A.0002] # COMBINING RING ABOVE
36212B; [.002B.0020.0008] # ANGSTROM SIGN
370061; [.0A41.0020.0002] # LATIN SMALL LETTER A
380041; [.0A41.0020.0008] # LATIN CAPITAL LETTER A
39007A; [.0A5A.0020.0002] # LATIN SMALL LETTER Z
40005A; [.0A5A.0020.0008] # LATIN CAPITAL LETTER Z
41FF41; [.0A87.0020.0002] # LATIN SMALL LETTER A
42FF21; [.0A87.0020.0008] # LATIN CAPITAL LETTER A
4300E5; [.0AC5.0020.0002] # LATIN SMALL LETTER A WITH RING ABOVE
4400C5; [.0AC5.0020.0008] # LATIN CAPITAL LETTER A WITH RING ABOVE
45ENTRIES
46
47# Aong < A+ring < Z < fullA+ring < A-ring
48
49#########################
50
51our $noN = Unicode::Collate->new(
52    level => 1,
53    table => undef,
54    normalization => undef,
55    entry => $entry,
56);
57
58our $nfc = Unicode::Collate->new(
59  level => 1,
60  table => undef,
61  normalization => 'NFC',
62  entry => $entry,
63);
64
65our $nfd = Unicode::Collate->new(
66  level => 1,
67  table => undef,
68  normalization => 'NFD',
69  entry => $entry,
70);
71
72our $nfkc = Unicode::Collate->new(
73  level => 1,
74  table => undef,
75  normalization => 'NFKC',
76  entry => $entry,
77);
78
79our $nfkd = Unicode::Collate->new(
80  level => 1,
81  table => undef,
82  normalization => 'NFKD',
83  entry => $entry,
84);
85
86ok($noN->lt("\x{212B}", "A"));
87ok($noN->lt("\x{212B}", $Aring));
88ok($noN->lt("A\x{30A}", $Aring));
89ok($noN->lt("A",       "\x{FF21}"));
90ok($noN->lt("Z",       "\x{FF21}"));
91ok($noN->lt("Z",        $Aring));
92ok($noN->lt("\x{212B}", $aring));
93ok($noN->lt("A\x{30A}", $aring));
94ok($noN->lt("Z",        $aring));
95ok($noN->lt("a\x{30A}", "Z"));
96
97ok($nfd->eq("\x{212B}", "A"));
98ok($nfd->eq("\x{212B}", $Aring));
99ok($nfd->eq("A\x{30A}", $Aring));
100ok($nfd->lt("A",       "\x{FF21}"));
101ok($nfd->lt("Z",       "\x{FF21}"));
102ok($nfd->gt("Z",        $Aring));
103ok($nfd->eq("\x{212B}", $aring));
104ok($nfd->eq("A\x{30A}", $aring));
105ok($nfd->gt("Z",        $aring));
106ok($nfd->lt("a\x{30A}", "Z"));
107
108ok($nfc->gt("\x{212B}", "A"));
109ok($nfc->eq("\x{212B}", $Aring));
110ok($nfc->eq("A\x{30A}", $Aring));
111ok($nfc->lt("A",       "\x{FF21}"));
112ok($nfc->lt("Z",       "\x{FF21}"));
113ok($nfc->lt("Z",        $Aring));
114ok($nfc->eq("\x{212B}", $aring));
115ok($nfc->eq("A\x{30A}", $aring));
116ok($nfc->lt("Z",        $aring));
117ok($nfc->gt("a\x{30A}", "Z"));
118
119ok($nfkd->eq("\x{212B}", "A"));
120ok($nfkd->eq("\x{212B}", $Aring));
121ok($nfkd->eq("A\x{30A}", $Aring));
122ok($nfkd->eq("A",       "\x{FF21}"));
123ok($nfkd->gt("Z",       "\x{FF21}"));
124ok($nfkd->gt("Z",        $Aring));
125ok($nfkd->eq("\x{212B}", $aring));
126ok($nfkd->eq("A\x{30A}", $aring));
127ok($nfkd->gt("Z",        $aring));
128ok($nfkd->lt("a\x{30A}", "Z"));
129
130ok($nfkc->gt("\x{212B}", "A"));
131ok($nfkc->eq("\x{212B}", $Aring));
132ok($nfkc->eq("A\x{30A}", $Aring));
133ok($nfkc->eq("A",       "\x{FF21}"));
134ok($nfkc->gt("Z",       "\x{FF21}"));
135ok($nfkc->lt("Z",        $Aring));
136ok($nfkc->eq("\x{212B}", $aring));
137ok($nfkc->eq("A\x{30A}", $aring));
138ok($nfkc->lt("Z",        $aring));
139ok($nfkc->gt("a\x{30A}", "Z"));
140
141$nfd->change(normalization => undef);
142
143ok($nfd->lt("\x{212B}", "A"));
144ok($nfd->lt("\x{212B}", $Aring));
145ok($nfd->lt("A\x{30A}", $Aring));
146ok($nfd->lt("A",       "\x{FF21}"));
147ok($nfd->lt("Z",       "\x{FF21}"));
148ok($nfd->lt("Z",        $Aring));
149ok($nfd->lt("\x{212B}", $aring));
150ok($nfd->lt("A\x{30A}", $aring));
151ok($nfd->lt("Z",        $aring));
152ok($nfd->lt("a\x{30A}", "Z"));
153
154$nfd->change(normalization => 'C');
155
156ok($nfd->gt("\x{212B}", "A"));
157ok($nfd->eq("\x{212B}", $Aring));
158ok($nfd->eq("A\x{30A}", $Aring));
159ok($nfd->lt("A",       "\x{FF21}"));
160ok($nfd->lt("Z",       "\x{FF21}"));
161ok($nfd->lt("Z",        $Aring));
162ok($nfd->eq("\x{212B}", $aring));
163ok($nfd->eq("A\x{30A}", $aring));
164ok($nfd->lt("Z",        $aring));
165ok($nfd->gt("a\x{30A}", "Z"));
166
167$nfd->change(normalization => 'D');
168
169ok($nfd->eq("\x{212B}", "A"));
170ok($nfd->eq("\x{212B}", $Aring));
171ok($nfd->eq("A\x{30A}", $Aring));
172ok($nfd->lt("A",       "\x{FF21}"));
173ok($nfd->lt("Z",       "\x{FF21}"));
174ok($nfd->gt("Z",        $Aring));
175ok($nfd->eq("\x{212B}", $aring));
176ok($nfd->eq("A\x{30A}", $aring));
177ok($nfd->gt("Z",        $aring));
178ok($nfd->lt("a\x{30A}", "Z"));
179
180$nfd->change(normalization => 'KD');
181
182ok($nfd->eq("\x{212B}", "A"));
183ok($nfd->eq("\x{212B}", $Aring));
184ok($nfd->eq("A\x{30A}", $Aring));
185ok($nfd->eq("A",       "\x{FF21}"));
186ok($nfd->gt("Z",       "\x{FF21}"));
187ok($nfd->gt("Z",        $Aring));
188ok($nfd->eq("\x{212B}", $aring));
189ok($nfd->eq("A\x{30A}", $aring));
190ok($nfd->gt("Z",        $aring));
191ok($nfd->lt("a\x{30A}", "Z"));
192
193$nfd->change(normalization => 'KC');
194
195ok($nfd->gt("\x{212B}", "A"));
196ok($nfd->eq("\x{212B}", $Aring));
197ok($nfd->eq("A\x{30A}", $Aring));
198ok($nfd->eq("A",       "\x{FF21}"));
199ok($nfd->gt("Z",       "\x{FF21}"));
200ok($nfd->lt("Z",        $Aring));
201ok($nfd->eq("\x{212B}", $aring));
202ok($nfd->eq("A\x{30A}", $aring));
203ok($nfd->lt("Z",        $aring));
204ok($nfd->gt("a\x{30A}", "Z"));
205
206