2 unless ("A" eq pack('U', 0x41)) {
3 print "1..0 # Unicode::Collate " .
4 "cannot stringify a Unicode code point\n";
9 @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
14 eval { require Unicode::Normalize; };
16 print "1..0 # skipped: Unicode::Normalize needed for this test\n";
22 BEGIN { plan tests => 100 };
28 our $Aring = pack('U', 0xC5);
29 our $aring = pack('U', 0xE5);
31 our $entry = <<'ENTRIES';
32 030A; [.0000.030A.0002] # COMBINING RING ABOVE
33 212B; [.002B.0020.0008] # ANGSTROM SIGN
34 0061; [.0A41.0020.0002] # LATIN SMALL LETTER A
35 0041; [.0A41.0020.0008] # LATIN CAPITAL LETTER A
36 007A; [.0A5A.0020.0002] # LATIN SMALL LETTER Z
37 005A; [.0A5A.0020.0008] # LATIN CAPITAL LETTER Z
38 FF41; [.0A87.0020.0002] # LATIN SMALL LETTER A
39 FF21; [.0A87.0020.0008] # LATIN CAPITAL LETTER A
40 00E5; [.0AC5.0020.0002] # LATIN SMALL LETTER A WITH RING ABOVE
41 00C5; [.0AC5.0020.0008] # LATIN CAPITAL LETTER A WITH RING ABOVE
44 # Aong < A+ring < Z < fullA+ring < A-ring
46 #########################
48 our $noN = Unicode::Collate->new(
51 normalization => undef,
55 our $nfc = Unicode::Collate->new(
58 normalization => 'NFC',
62 our $nfd = Unicode::Collate->new(
65 normalization => 'NFD',
69 our $nfkc = Unicode::Collate->new(
72 normalization => 'NFKC',
76 our $nfkd = Unicode::Collate->new(
79 normalization => 'NFKD',
83 ok($noN->lt("\x{212B}", "A"));
84 ok($noN->lt("\x{212B}", $Aring));
85 ok($noN->lt("A\x{30A}", $Aring));
86 ok($noN->lt("A", "\x{FF21}"));
87 ok($noN->lt("Z", "\x{FF21}"));
88 ok($noN->lt("Z", $Aring));
89 ok($noN->lt("\x{212B}", $aring));
90 ok($noN->lt("A\x{30A}", $aring));
91 ok($noN->lt("Z", $aring));
92 ok($noN->lt("a\x{30A}", "Z"));
94 ok($nfd->eq("\x{212B}", "A"));
95 ok($nfd->eq("\x{212B}", $Aring));
96 ok($nfd->eq("A\x{30A}", $Aring));
97 ok($nfd->lt("A", "\x{FF21}"));
98 ok($nfd->lt("Z", "\x{FF21}"));
99 ok($nfd->gt("Z", $Aring));
100 ok($nfd->eq("\x{212B}", $aring));
101 ok($nfd->eq("A\x{30A}", $aring));
102 ok($nfd->gt("Z", $aring));
103 ok($nfd->lt("a\x{30A}", "Z"));
105 ok($nfc->gt("\x{212B}", "A"));
106 ok($nfc->eq("\x{212B}", $Aring));
107 ok($nfc->eq("A\x{30A}", $Aring));
108 ok($nfc->lt("A", "\x{FF21}"));
109 ok($nfc->lt("Z", "\x{FF21}"));
110 ok($nfc->lt("Z", $Aring));
111 ok($nfc->eq("\x{212B}", $aring));
112 ok($nfc->eq("A\x{30A}", $aring));
113 ok($nfc->lt("Z", $aring));
114 ok($nfc->gt("a\x{30A}", "Z"));
116 ok($nfkd->eq("\x{212B}", "A"));
117 ok($nfkd->eq("\x{212B}", $Aring));
118 ok($nfkd->eq("A\x{30A}", $Aring));
119 ok($nfkd->eq("A", "\x{FF21}"));
120 ok($nfkd->gt("Z", "\x{FF21}"));
121 ok($nfkd->gt("Z", $Aring));
122 ok($nfkd->eq("\x{212B}", $aring));
123 ok($nfkd->eq("A\x{30A}", $aring));
124 ok($nfkd->gt("Z", $aring));
125 ok($nfkd->lt("a\x{30A}", "Z"));
127 ok($nfkc->gt("\x{212B}", "A"));
128 ok($nfkc->eq("\x{212B}", $Aring));
129 ok($nfkc->eq("A\x{30A}", $Aring));
130 ok($nfkc->eq("A", "\x{FF21}"));
131 ok($nfkc->gt("Z", "\x{FF21}"));
132 ok($nfkc->lt("Z", $Aring));
133 ok($nfkc->eq("\x{212B}", $aring));
134 ok($nfkc->eq("A\x{30A}", $aring));
135 ok($nfkc->lt("Z", $aring));
136 ok($nfkc->gt("a\x{30A}", "Z"));
138 $nfd->change(normalization => undef);
140 ok($nfd->lt("\x{212B}", "A"));
141 ok($nfd->lt("\x{212B}", $Aring));
142 ok($nfd->lt("A\x{30A}", $Aring));
143 ok($nfd->lt("A", "\x{FF21}"));
144 ok($nfd->lt("Z", "\x{FF21}"));
145 ok($nfd->lt("Z", $Aring));
146 ok($nfd->lt("\x{212B}", $aring));
147 ok($nfd->lt("A\x{30A}", $aring));
148 ok($nfd->lt("Z", $aring));
149 ok($nfd->lt("a\x{30A}", "Z"));
151 $nfd->change(normalization => 'C');
153 ok($nfd->gt("\x{212B}", "A"));
154 ok($nfd->eq("\x{212B}", $Aring));
155 ok($nfd->eq("A\x{30A}", $Aring));
156 ok($nfd->lt("A", "\x{FF21}"));
157 ok($nfd->lt("Z", "\x{FF21}"));
158 ok($nfd->lt("Z", $Aring));
159 ok($nfd->eq("\x{212B}", $aring));
160 ok($nfd->eq("A\x{30A}", $aring));
161 ok($nfd->lt("Z", $aring));
162 ok($nfd->gt("a\x{30A}", "Z"));
164 $nfd->change(normalization => 'D');
166 ok($nfd->eq("\x{212B}", "A"));
167 ok($nfd->eq("\x{212B}", $Aring));
168 ok($nfd->eq("A\x{30A}", $Aring));
169 ok($nfd->lt("A", "\x{FF21}"));
170 ok($nfd->lt("Z", "\x{FF21}"));
171 ok($nfd->gt("Z", $Aring));
172 ok($nfd->eq("\x{212B}", $aring));
173 ok($nfd->eq("A\x{30A}", $aring));
174 ok($nfd->gt("Z", $aring));
175 ok($nfd->lt("a\x{30A}", "Z"));
177 $nfd->change(normalization => 'KD');
179 ok($nfd->eq("\x{212B}", "A"));
180 ok($nfd->eq("\x{212B}", $Aring));
181 ok($nfd->eq("A\x{30A}", $Aring));
182 ok($nfd->eq("A", "\x{FF21}"));
183 ok($nfd->gt("Z", "\x{FF21}"));
184 ok($nfd->gt("Z", $Aring));
185 ok($nfd->eq("\x{212B}", $aring));
186 ok($nfd->eq("A\x{30A}", $aring));
187 ok($nfd->gt("Z", $aring));
188 ok($nfd->lt("a\x{30A}", "Z"));
190 $nfd->change(normalization => 'KC');
192 ok($nfd->gt("\x{212B}", "A"));
193 ok($nfd->eq("\x{212B}", $Aring));
194 ok($nfd->eq("A\x{30A}", $Aring));
195 ok($nfd->eq("A", "\x{FF21}"));
196 ok($nfd->gt("Z", "\x{FF21}"));
197 ok($nfd->lt("Z", $Aring));
198 ok($nfd->eq("\x{212B}", $aring));
199 ok($nfd->eq("A\x{30A}", $aring));
200 ok($nfd->lt("Z", $aring));
201 ok($nfd->gt("a\x{30A}", "Z"));