This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update Unicode-Collate to CPAN version 0.67
[perl5.git] / cpan / Unicode-Collate / t / contract.t
1
2 BEGIN {
3     unless ("A" eq pack('U', 0x41)) {
4         print "1..0 # Unicode::Collate " .
5             "cannot stringify a Unicode code point\n";
6         exit 0;
7     }
8     if ($ENV{PERL_CORE}) {
9         chdir('t') if -d 't';
10         @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
11     }
12 }
13
14 use Test;
15 BEGIN { plan tests => 74 };
16
17 use strict;
18 use warnings;
19 use Unicode::Collate;
20
21 our $kjeEntry = <<'ENTRIES';
22 0301  ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
23 0334  ; [.0000.008B.0002.0334] # COMBINING TILDE OVERLAY
24 043A  ; [.0D31.0020.0002.043A] # CYRILLIC SMALL LETTER KA
25 041A  ; [.0D31.0020.0008.041A] # CYRILLIC CAPITAL LETTER KA
26 045C  ; [.0DA1.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
27 043A 0301 ; [.0DA1.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
28 040C  ; [.0DA1.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
29 041A 0301 ; [.0DA1.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
30 ENTRIES
31
32 our $aaEntry = <<'ENTRIES';
33 0304  ; [.0000.005A.0002.0304] # COMBINING MACRON (cc = 230)
34 030A  ; [.0000.0043.0002.030A] # COMBINING RING ABOVE (cc = 230)
35 0327  ; [.0000.0055.0002.0327] # COMBINING CEDILLA (cc = 202)
36 031A  ; [.0000.006B.0002.031A] # COMBINING LEFT ANGLE ABOVE (cc = 232)
37 0061  ; [.0A15.0020.0002.0061] # LATIN SMALL LETTER A
38 0041  ; [.0A15.0020.0008.0041] # LATIN CAPITAL LETTER A
39 007A  ; [.0C13.0020.0002.007A] # LATIN SMALL LETTER Z
40 005A  ; [.0C13.0020.0008.005A] # LATIN CAPITAL LETTER Z
41 00E5  ; [.0C25.0020.0002.00E5] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM
42 00C5  ; [.0C25.0020.0008.00C5] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM
43 0061 030A ; [.0C25.0020.0002.0061] # LATIN SMALL LETTER A WITH RING ABOVE
44 0041 030A ; [.0C25.0020.0008.0041] # LATIN CAPITAL LETTER A WITH RING ABOVE
45 ENTRIES
46
47 #########################
48
49 ok(1);
50
51 my $kjeNoN = Unicode::Collate->new(
52     level => 1,
53     table => undef,
54     normalization => undef,
55     entry => $kjeEntry,
56 );
57
58 ok($kjeNoN->lt("\x{43A}", "\x{43A}\x{301}"));
59 ok($kjeNoN->gt("\x{45C}", "\x{43A}\x{334}\x{301}"));
60 ok($kjeNoN->eq("\x{43A}", "\x{43A}\x{334}\x{301}"));
61 ok($kjeNoN->eq("\x{45C}", "\x{43A}\x{301}\x{334}"));
62
63 # 5
64
65 our %sortkeys;
66
67 $sortkeys{'KAac'} = $kjeNoN->viewSortKey("\x{43A}\x{301}");
68 $sortkeys{'KAta'} = $kjeNoN->viewSortKey("\x{43A}\x{334}\x{301}");
69 $sortkeys{'KAat'} = $kjeNoN->viewSortKey("\x{43A}\x{301}\x{334}");
70
71 eval { require Unicode::Normalize };
72 if (!$@) {
73     my $kjeNFD = Unicode::Collate->new(
74         level => 1,
75         table => undef,
76         entry => $kjeEntry,
77     );
78
79 ok($kjeNFD->lt("\x{43A}", "\x{43A}\x{301}"));
80 ok($kjeNFD->eq("\x{45C}", "\x{43A}\x{334}\x{301}"));
81 ok($kjeNFD->lt("\x{43A}", "\x{43A}\x{334}\x{301}"));
82 ok($kjeNFD->eq("\x{45C}", "\x{43A}\x{301}\x{334}"));
83 # 9
84
85     my $aaNFD = Unicode::Collate->new(
86         level => 1,
87         table => undef,
88         entry => $aaEntry,
89     );
90
91 ok($aaNFD->lt("Z", "A\x{30A}\x{304}"));
92 ok($aaNFD->eq("A", "A\x{304}\x{30A}"));
93 ok($aaNFD->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
94 ok($aaNFD->eq("A\x{304}", "A\x{304}\x{30A}"));
95 ok($aaNFD->lt("Z", "A\x{327}\x{30A}"));
96 ok($aaNFD->lt("Z", "A\x{30A}\x{327}"));
97 ok($aaNFD->lt("Z", "A\x{31A}\x{30A}"));
98 ok($aaNFD->lt("Z", "A\x{30A}\x{31A}"));
99 # 17
100
101     my $aaPre = Unicode::Collate->new(
102         level => 1,
103         normalization => "prenormalized",
104         table => undef,
105         entry => $aaEntry,
106     );
107
108 ok($aaPre->lt("Z", "A\x{30A}\x{304}"));
109 ok($aaPre->eq("A", "A\x{304}\x{30A}"));
110 ok($aaPre->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
111 ok($aaPre->eq("A\x{304}", "A\x{304}\x{30A}"));
112 ok($aaPre->lt("Z", "A\x{327}\x{30A}"));
113 ok($aaPre->lt("Z", "A\x{30A}\x{327}"));
114 ok($aaPre->lt("Z", "A\x{31A}\x{30A}"));
115 ok($aaPre->lt("Z", "A\x{30A}\x{31A}"));
116 # 25
117 } else {
118     ok(1) for 1..20;
119 }
120
121 # again: loading Unicode::Normalize should not affect $kjeNoN.
122 ok($kjeNoN->lt("\x{43A}", "\x{43A}\x{301}"));
123 ok($kjeNoN->gt("\x{45C}", "\x{43A}\x{334}\x{301}"));
124 ok($kjeNoN->eq("\x{43A}", "\x{43A}\x{334}\x{301}"));
125 ok($kjeNoN->eq("\x{45C}", "\x{43A}\x{301}\x{334}"));
126
127 ok($sortkeys{'KAac'}, $kjeNoN->viewSortKey("\x{43A}\x{301}"));
128 ok($sortkeys{'KAta'}, $kjeNoN->viewSortKey("\x{43A}\x{334}\x{301}"));
129 ok($sortkeys{'KAat'}, $kjeNoN->viewSortKey("\x{43A}\x{301}\x{334}"));
130
131 # 32
132
133 my $aaNoN = Unicode::Collate->new(
134     level => 1,
135     table => undef,
136     entry => $aaEntry,
137     normalization => undef,
138 );
139
140 ok($aaNoN->lt("Z", "A\x{30A}\x{304}"));
141 ok($aaNoN->eq("A", "A\x{304}\x{30A}"));
142 ok($aaNoN->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
143 ok($aaNoN->eq("A\x{304}", "A\x{304}\x{30A}"));
144 ok($aaNoN->eq("A", "A\x{327}\x{30A}"));
145 ok($aaNoN->lt("Z", "A\x{30A}\x{327}"));
146 ok($aaNoN->eq("A", "A\x{31A}\x{30A}"));
147 ok($aaNoN->lt("Z", "A\x{30A}\x{31A}"));
148
149 # 40
150
151 # suppress contractions
152
153 my $kjeSup = Unicode::Collate->new(
154     level => 1,
155     table => undef,
156     normalization => undef,
157     entry => $kjeEntry,
158     suppress => [0x400..0x45F],
159 );
160
161 ok($kjeSup->eq("\x{43A}", "\x{43A}\x{301}"));
162 ok($kjeSup->gt("\x{45C}", "\x{43A}\x{301}"));
163 ok($kjeSup->eq("\x{41A}", "\x{41A}\x{301}"));
164 ok($kjeSup->gt("\x{40C}", "\x{41A}\x{301}"));
165
166 # 44
167
168 our $tibetanEntry = <<'ENTRIES';
169 0000  ; [.0000.0000.0000.0000] # [0000] NULL (in 6429)
170 0F71           ; [.206D.0020.0002.0F71] # TIBETAN VOWEL SIGN AA
171 0F72           ; [.206E.0020.0002.0F72] # TIBETAN VOWEL SIGN I
172 0F73           ; [.206F.0020.0002.0F73] # TIBETAN VOWEL SIGN II
173 0F71 0F72      ; [.206F.0020.0002.0F73] # TIBETAN VOWEL SIGN II
174 0F80           ; [.2070.0020.0002.0F80] # TIBETAN VOWEL SIGN REVERSED I
175 0F81           ; [.2071.0020.0002.0F81] # TIBETAN VOWEL SIGN REVERSED II
176 0F71 0F80      ; [.2071.0020.0002.0F81] # TIBETAN VOWEL SIGN REVERSED II
177 0F74           ; [.2072.0020.0002.0F74] # TIBETAN VOWEL SIGN U
178 0F75           ; [.2073.0020.0002.0F75] # TIBETAN VOWEL SIGN UU
179 0F71 0F74      ; [.2073.0020.0002.0F75] # TIBETAN VOWEL SIGN UU
180 0F76           ; [.2074.0020.0002.0F76] # TIBETAN VOWEL SIGN VOCALIC R
181 0FB2 0F80      ; [.2074.0020.0002.0F76] # TIBETAN VOWEL SIGN VOCALIC R
182 0F77           ; [.2075.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
183 0FB2 0F81      ; [.2075.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
184 0FB2 0F71 0F80 ; [.2075.0020.0002.0F77] # TIBETAN VOWEL SIGN VOCALIC RR
185 0F78           ; [.2076.0020.0002.0F78] # TIBETAN VOWEL SIGN VOCALIC L
186 0FB3 0F80      ; [.2076.0020.0002.0F78] # TIBETAN VOWEL SIGN VOCALIC L
187 0F79           ; [.2077.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
188 0FB3 0F81      ; [.2077.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
189 0FB3 0F71 0F80 ; [.2077.0020.0002.0F79] # TIBETAN VOWEL SIGN VOCALIC LL
190 ENTRIES
191
192 # ccc(0F71) = 129
193 # ccc(0F80) = 130
194 # 0F76 = 0FB2 0F80
195 # 0F78 = 0FB3 0F80
196 # 0F81 = 0F71 0F80
197 # 0F77 = <compat> 0FB2 0F81 = 0FB2 0F71 0F80 = 0F76 0F71
198 # 0F79 = <compat> 0FB3 0F81 = 0FB3 0F71 0F80 = 0F78 0F71
199
200 eval { require Unicode::Normalize };
201 if (!$@) {
202     my $tibNFD = Unicode::Collate->new(
203         table => undef,
204         entry => $tibetanEntry,
205     );
206
207     # VOCALIC RR
208     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{FB2}\x{334}\x{F81}"));
209     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{FB2}\x{F81}\x{334}"));
210     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{FB2}\x{F81}\0\x{334}"));
211     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{F76}\x{334}\x{F71}"));
212     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{F76}\x{F71}\x{334}"));
213     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{F76}\x{F71}\0\x{334}"));
214     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{FB2}\x{334}\x{F71}\x{F80}"));
215     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{FB2}\x{F71}\x{334}\x{F80}"));
216     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{FB2}\x{F71}\x{F80}\x{334}"));
217     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{FB2}\x{F71}\x{F80}\0\x{334}"));
218     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{FB2}\x{334}\x{F80}\x{F71}"));
219     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{FB2}\x{F80}\x{334}\x{F71}"));
220     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{FB2}\x{F80}\x{F71}\x{334}"));
221     ok($tibNFD->eq("\x{F77}\0\x{334}", "\x{FB2}\x{F80}\x{F71}\0\x{334}"));
222 # 58
223
224     # VOCALIC LL
225     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{FB3}\x{334}\x{F81}"));
226     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{FB3}\x{F81}\x{334}"));
227     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{FB3}\x{F81}\0\x{334}"));
228     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{F78}\x{334}\x{F71}"));
229     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{F78}\x{F71}\x{334}"));
230     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{F78}\x{F71}\0\x{334}"));
231     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{FB3}\x{334}\x{F71}\x{F80}"));
232     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{FB3}\x{F71}\x{334}\x{F80}"));
233     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{FB3}\x{F71}\x{F80}\x{334}"));
234     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{FB3}\x{F71}\x{F80}\0\x{334}"));
235     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{FB3}\x{334}\x{F80}\x{F71}"));
236     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{FB3}\x{F80}\x{334}\x{F71}"));
237     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{FB3}\x{F80}\x{F71}\x{334}"));
238     ok($tibNFD->eq("\x{F79}\0\x{334}", "\x{FB3}\x{F80}\x{F71}\0\x{334}"));
239 # 72
240
241     my $discontNFD = Unicode::Collate->new(
242         table => undef,
243         entry => <<'ENTRIES',
244 0000  ; [.0000.0000.0000.0000] # [0000] NULL (in 6429)
245 0301  ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
246 0300  ; [.0000.0035.0002.0300] # COMBINING GRAVE ACCENT
247 0327  ; [.0000.0055.0002.0327] # COMBINING CEDILLA
248 0334  ; [.0000.008B.0002.0334] # COMBINING TILDE OVERLAY
249 0041  ; [.0101.0020.0008.0041] # LATIN CAPITAL LETTER A
250 0041 0327 0301 ; [.0102.0020.0008.0041]
251 0041 0300 ; [.0103.0020.0008.0041]
252 ENTRIES
253     );
254
255     ok($discontNFD->eq("A\x{327}\x{301}\0\x{334}", "A\x{334}\x{327}\x{301}"));
256     ok($discontNFD->eq("A\x{300}\0\x{327}",        "A\x{327}\x{300}"));
257 } else {
258     ok(1) for 1..30;
259 }
260 # 74