This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to Unicode::Collate 0.28
[perl5.git] / lib / Unicode / Collate / t / contract.t
1 BEGIN {
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
9 BEGIN {
10     if ($ENV{PERL_CORE}) {
11         chdir('t') if -d 't';
12         @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
13     }
14 }
15
16 use Test;
17 BEGIN { plan tests => 40 };
18
19 use strict;
20 use warnings;
21 use Unicode::Collate;
22
23 use vars qw($IsEBCDIC);
24 $IsEBCDIC = ord("A") != 0x41;
25
26 our $kjeEntry = <<'ENTRIES';
27 0301  ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
28 0334  ; [.0000.008B.0002.0334] # COMBINING TILDE OVERLAY
29 043A  ; [.0D31.0020.0002.043A] # CYRILLIC SMALL LETTER KA
30 041A  ; [.0D31.0020.0008.041A] # CYRILLIC CAPITAL LETTER KA
31 045C  ; [.0DA1.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
32 043A 0301 ; [.0DA1.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
33 040C  ; [.0DA1.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
34 041A 0301 ; [.0DA1.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
35 ENTRIES
36
37 our $aaEntry = <<'ENTRIES';
38 0304  ; [.0000.005A.0002.0304] # COMBINING MACRON (cc = 230)
39 030A  ; [.0000.0043.0002.030A] # COMBINING RING ABOVE (cc = 230)
40 0327  ; [.0000.0055.0002.0327] # COMBINING CEDILLA (cc = 202)
41 031A  ; [.0000.006B.0002.031A] # COMBINING LEFT ANGLE ABOVE (cc = 232)
42 0061  ; [.0A15.0020.0002.0061] # LATIN SMALL LETTER A
43 0041  ; [.0A15.0020.0008.0041] # LATIN CAPITAL LETTER A
44 007A  ; [.0C13.0020.0002.007A] # LATIN SMALL LETTER Z
45 005A  ; [.0C13.0020.0008.005A] # LATIN CAPITAL LETTER Z
46 00E5  ; [.0C25.0020.0002.00E5] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM
47 00C5  ; [.0C25.0020.0008.00C5] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM
48 0061 030A ; [.0C25.0020.0002.0061] # LATIN SMALL LETTER A WITH RING ABOVE
49 0041 030A ; [.0C25.0020.0008.0041] # LATIN CAPITAL LETTER A WITH RING ABOVE
50 ENTRIES
51
52 #########################
53
54 ok(1); # If we made it this far, we're ok.
55
56 my $kjeNoN = Unicode::Collate->new(
57     level => 1,
58     table => undef,
59     normalization => undef,
60     entry => $kjeEntry,
61 );
62
63 ok($kjeNoN->lt("\x{043A}", "\x{043A}\x{0301}"));
64 ok($kjeNoN->gt("\x{045C}", "\x{043A}\x{0334}\x{0301}"));
65 ok($kjeNoN->eq("\x{043A}", "\x{043A}\x{0334}\x{0301}"));
66 ok($kjeNoN->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}"));
67
68 our %sortkeys;
69
70 $sortkeys{'KAac'} = $kjeNoN->viewSortKey("\x{043A}\x{0301}");
71 $sortkeys{'KAta'} = $kjeNoN->viewSortKey("\x{043A}\x{0334}\x{0301}");
72 $sortkeys{'KAat'} = $kjeNoN->viewSortKey("\x{043A}\x{0301}\x{0334}");
73
74 eval { require Unicode::Normalize };
75 if (!$@ && !$IsEBCDIC) {
76     my $kjeNFD = Unicode::Collate->new(
77         level => 1,
78         table => undef,
79         entry => $kjeEntry,
80     );
81 ok($kjeNFD->lt("\x{043A}", "\x{043A}\x{0301}"));
82 ok($kjeNFD->eq("\x{045C}", "\x{043A}\x{0334}\x{0301}"));
83 ok($kjeNFD->lt("\x{043A}", "\x{043A}\x{0334}\x{0301}"));
84 ok($kjeNFD->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}"));
85
86     my $aaNFD = Unicode::Collate->new(
87         level => 1,
88         table => undef,
89         entry => $aaEntry,
90     );
91
92 ok($aaNFD->lt("Z", "A\x{30A}\x{304}"));
93 ok($aaNFD->eq("A", "A\x{304}\x{30A}"));
94 ok($aaNFD->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
95 ok($aaNFD->eq("A\x{304}", "A\x{304}\x{30A}"));
96 ok($aaNFD->lt("Z", "A\x{327}\x{30A}"));
97 ok($aaNFD->lt("Z", "A\x{30A}\x{327}"));
98 ok($aaNFD->lt("Z", "A\x{31A}\x{30A}"));
99 ok($aaNFD->lt("Z", "A\x{30A}\x{31A}"));
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 }
117 else {
118   ok(1) for 1..20;
119 }
120
121 # again: loading Unicode::Normalize should not affect $kjeNoN.
122 ok($kjeNoN->lt("\x{043A}", "\x{043A}\x{0301}"));
123 ok($kjeNoN->gt("\x{045C}", "\x{043A}\x{0334}\x{0301}"));
124 ok($kjeNoN->eq("\x{043A}", "\x{043A}\x{0334}\x{0301}"));
125 ok($kjeNoN->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}"));
126
127 ok($sortkeys{'KAac'}, $kjeNoN->viewSortKey("\x{043A}\x{0301}"));
128 ok($sortkeys{'KAta'}, $kjeNoN->viewSortKey("\x{043A}\x{0334}\x{0301}"));
129 ok($sortkeys{'KAat'}, $kjeNoN->viewSortKey("\x{043A}\x{0301}\x{0334}"));
130
131 my $aaNoN = Unicode::Collate->new(
132     level => 1,
133     table => undef,
134     entry => $aaEntry,
135     normalization => undef,
136 );
137
138 ok($aaNoN->lt("Z", "A\x{30A}\x{304}"));
139 ok($aaNoN->eq("A", "A\x{304}\x{30A}"));
140 ok($aaNoN->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
141 ok($aaNoN->eq("A\x{304}", "A\x{304}\x{30A}"));
142 ok($aaNoN->eq("A", "A\x{327}\x{30A}"));
143 ok($aaNoN->lt("Z", "A\x{30A}\x{327}"));
144 ok($aaNoN->eq("A", "A\x{31A}\x{30A}"));
145 ok($aaNoN->lt("Z", "A\x{30A}\x{31A}"));
146