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