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
16use Test;
17BEGIN { plan tests => 40 };
18
19use strict;
20use warnings;
21use Unicode::Collate;
22
23use vars qw($IsEBCDIC);
24$IsEBCDIC = ord("A") != 0x41;
25
26our $kjeEntry = <<'ENTRIES';
270301  ; [.0000.0032.0002.0301] # COMBINING ACUTE ACCENT
280334  ; [.0000.008B.0002.0334] # COMBINING TILDE OVERLAY
29043A  ; [.0D31.0020.0002.043A] # CYRILLIC SMALL LETTER KA
30041A  ; [.0D31.0020.0008.041A] # CYRILLIC CAPITAL LETTER KA
31045C  ; [.0DA1.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
32043A 0301 ; [.0DA1.0020.0002.045C] # CYRILLIC SMALL LETTER KJE
33040C  ; [.0DA1.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
34041A 0301 ; [.0DA1.0020.0008.040C] # CYRILLIC CAPITAL LETTER KJE
35ENTRIES
36
37our $aaEntry = <<'ENTRIES';
380304  ; [.0000.005A.0002.0304] # COMBINING MACRON (cc = 230)
39030A  ; [.0000.0043.0002.030A] # COMBINING RING ABOVE (cc = 230)
400327  ; [.0000.0055.0002.0327] # COMBINING CEDILLA (cc = 202)
41031A  ; [.0000.006B.0002.031A] # COMBINING LEFT ANGLE ABOVE (cc = 232)
420061  ; [.0A15.0020.0002.0061] # LATIN SMALL LETTER A
430041  ; [.0A15.0020.0008.0041] # LATIN CAPITAL LETTER A
44007A  ; [.0C13.0020.0002.007A] # LATIN SMALL LETTER Z
45005A  ; [.0C13.0020.0008.005A] # LATIN CAPITAL LETTER Z
4600E5  ; [.0C25.0020.0002.00E5] # LATIN SMALL LETTER A WITH RING ABOVE; QQCM
4700C5  ; [.0C25.0020.0008.00C5] # LATIN CAPITAL LETTER A WITH RING ABOVE; QQCM
480061 030A ; [.0C25.0020.0002.0061] # LATIN SMALL LETTER A WITH RING ABOVE
490041 030A ; [.0C25.0020.0008.0041] # LATIN CAPITAL LETTER A WITH RING ABOVE
50ENTRIES
51
52#########################
53
54ok(1);
55
56my $kjeNoN = Unicode::Collate->new(
57    level => 1,
58    table => undef,
59    normalization => undef,
60    entry => $kjeEntry,
61);
62
63ok($kjeNoN->lt("\x{043A}", "\x{043A}\x{0301}"));
64ok($kjeNoN->gt("\x{045C}", "\x{043A}\x{0334}\x{0301}"));
65ok($kjeNoN->eq("\x{043A}", "\x{043A}\x{0334}\x{0301}"));
66ok($kjeNoN->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}"));
67
68our %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
74eval { require Unicode::Normalize };
75if (!$@) {
76    my $kjeNFD = Unicode::Collate->new(
77	level => 1,
78	table => undef,
79	entry => $kjeEntry,
80    );
81ok($kjeNFD->lt("\x{043A}", "\x{043A}\x{0301}"));
82ok($kjeNFD->eq("\x{045C}", "\x{043A}\x{0334}\x{0301}"));
83ok($kjeNFD->lt("\x{043A}", "\x{043A}\x{0334}\x{0301}"));
84ok($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
92ok($aaNFD->lt("Z", "A\x{30A}\x{304}"));
93ok($aaNFD->eq("A", "A\x{304}\x{30A}"));
94ok($aaNFD->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
95ok($aaNFD->eq("A\x{304}", "A\x{304}\x{30A}"));
96ok($aaNFD->lt("Z", "A\x{327}\x{30A}"));
97ok($aaNFD->lt("Z", "A\x{30A}\x{327}"));
98ok($aaNFD->lt("Z", "A\x{31A}\x{30A}"));
99ok($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
108ok($aaPre->lt("Z", "A\x{30A}\x{304}"));
109ok($aaPre->eq("A", "A\x{304}\x{30A}"));
110ok($aaPre->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
111ok($aaPre->eq("A\x{304}", "A\x{304}\x{30A}"));
112ok($aaPre->lt("Z", "A\x{327}\x{30A}"));
113ok($aaPre->lt("Z", "A\x{30A}\x{327}"));
114ok($aaPre->lt("Z", "A\x{31A}\x{30A}"));
115ok($aaPre->lt("Z", "A\x{30A}\x{31A}"));
116}
117else {
118  ok(1) for 1..20;
119}
120
121# again: loading Unicode::Normalize should not affect $kjeNoN.
122ok($kjeNoN->lt("\x{043A}", "\x{043A}\x{0301}"));
123ok($kjeNoN->gt("\x{045C}", "\x{043A}\x{0334}\x{0301}"));
124ok($kjeNoN->eq("\x{043A}", "\x{043A}\x{0334}\x{0301}"));
125ok($kjeNoN->eq("\x{045C}", "\x{043A}\x{0301}\x{0334}"));
126
127ok($sortkeys{'KAac'}, $kjeNoN->viewSortKey("\x{043A}\x{0301}"));
128ok($sortkeys{'KAta'}, $kjeNoN->viewSortKey("\x{043A}\x{0334}\x{0301}"));
129ok($sortkeys{'KAat'}, $kjeNoN->viewSortKey("\x{043A}\x{0301}\x{0334}"));
130
131my $aaNoN = Unicode::Collate->new(
132    level => 1,
133    table => undef,
134    entry => $aaEntry,
135    normalization => undef,
136);
137
138ok($aaNoN->lt("Z", "A\x{30A}\x{304}"));
139ok($aaNoN->eq("A", "A\x{304}\x{30A}"));
140ok($aaNoN->eq(pack('U', 0xE5), "A\x{30A}\x{304}"));
141ok($aaNoN->eq("A\x{304}", "A\x{304}\x{30A}"));
142ok($aaNoN->eq("A", "A\x{327}\x{30A}"));
143ok($aaNoN->lt("Z", "A\x{30A}\x{327}"));
144ok($aaNoN->eq("A", "A\x{31A}\x{30A}"));
145ok($aaNoN->lt("Z", "A\x{30A}\x{31A}"));
146
147