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 / illegal.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 use strict;
16 use warnings;
17
18 BEGIN {
19     use Unicode::Collate;
20
21     unless (exists &Unicode::Collate::bootstrap or 5.008 <= $]) {
22         print "1..0 # skipped: XSUB, or Perl 5.8.0 or later".
23                 " needed for this test\n";
24         print $@;
25         exit;
26     }
27 }
28
29 BEGIN { plan tests => 65 };
30
31 ok(1);
32
33 #########################
34
35 no warnings 'utf8';
36
37 # NULL is tailorable but illegal code points are not.
38 # illegal code points should be always ingored
39 # (cf. UCA, 7.1.1 Illegal code points).
40
41 my $entry = <<'ENTRIES';
42 0000  ; [.0020.0000.0000.0000] # [0000] NULL
43 0001  ; [.0021.0000.0000.0001] # [0001] START OF HEADING
44 FFFE  ; [.0022.0000.0000.FFFE] # <noncharacter-FFFE> (invalid)
45 FFFF  ; [.0023.0000.0000.FFFF] # <noncharacter-FFFF> (invalid)
46 D800  ; [.0024.0000.0000.D800] # <surrogate-D800> (invalid)
47 DFFF  ; [.0025.0000.0000.DFFF] # <surrogate-DFFF> (invalid)
48 FDD0  ; [.0026.0000.0000.FDD0] # <noncharacter-FDD0> (invalid)
49 FDEF  ; [.0027.0000.0000.FDEF] # <noncharacter-FDEF> (invalid)
50 0002  ; [.0030.0000.0000.0002] # [0002] START OF TEXT
51 10FFFF; [.0040.0000.0000.10FFFF] # <noncharacter-10FFFF> (invalid)
52 110000; [.0041.0000.0000.110000] # <out-of-range 110000> (invalid)
53 0041  ; [.1000.0020.0008.0041] # latin A
54 0041 0000 ; [.1100.0020.0008.0041] # latin A + NULL
55 0041 FFFF ; [.1200.0020.0008.0041] # latin A + FFFF (invalid)
56 ENTRIES
57
58 ##################
59
60 my $illeg = Unicode::Collate->new(
61   entry => $entry,
62   level => 1,
63   table => undef,
64   normalization => undef,
65   UCA_Version => 20,
66 );
67
68 # 2..12
69 ok($illeg->lt("", "\x00"));
70 ok($illeg->lt("", "\x01"));
71 ok($illeg->eq("", "\x{FFFE}"));
72 ok($illeg->eq("", "\x{FFFF}"));
73 ok($illeg->eq("", "\x{D800}"));
74 ok($illeg->eq("", "\x{DFFF}"));
75 ok($illeg->eq("", "\x{FDD0}"));
76 ok($illeg->eq("", "\x{FDEF}"));
77 ok($illeg->lt("", "\x02"));
78 ok($illeg->eq("", "\x{10FFFF}"));
79 ok($illeg->eq("", "\x{110000}"));
80
81 # 13..22
82 ok($illeg->lt("\x00", "\x01"));
83 ok($illeg->lt("\x01", "\x02"));
84 ok($illeg->ne("\0", "\x{D800}"));
85 ok($illeg->ne("\0", "\x{DFFF}"));
86 ok($illeg->ne("\0", "\x{FDD0}"));
87 ok($illeg->ne("\0", "\x{FDEF}"));
88 ok($illeg->ne("\0", "\x{FFFE}"));
89 ok($illeg->ne("\0", "\x{FFFF}"));
90 ok($illeg->ne("\0", "\x{10FFFF}"));
91 ok($illeg->ne("\0", "\x{110000}"));
92
93 # 23..26
94 ok($illeg->eq("A",   "A\x{FFFF}"));
95 ok($illeg->gt("A\0", "A\x{FFFF}"));
96 ok($illeg->lt("A",  "A\0"));
97 ok($illeg->lt("AA", "A\0"));
98
99 ##################
100
101 my $nonch = Unicode::Collate->new(
102   entry => $entry,
103   level => 1,
104   table => undef,
105   normalization => undef,
106   UCA_Version => 22,
107 );
108
109 # 27..37
110 ok($nonch->lt("", "\x00"));
111 ok($nonch->lt("", "\x01"));
112 ok($nonch->lt("", "\x{FFFE}"));
113 ok($nonch->lt("", "\x{FFFF}"));
114 ok($nonch->lt("", "\x{D800}"));
115 ok($nonch->lt("", "\x{DFFF}"));
116 ok($nonch->lt("", "\x{FDD0}"));
117 ok($nonch->lt("", "\x{FDEF}"));
118 ok($nonch->lt("", "\x02"));
119 ok($nonch->lt("", "\x{10FFFF}"));
120 ok($nonch->eq("", "\x{110000}"));
121
122 # 38..47
123 ok($nonch->lt("\x00",     "\x01"));
124 ok($nonch->lt("\x01",     "\x{FFFE}"));
125 ok($nonch->lt("\x{FFFE}", "\x{FFFF}"));
126 ok($nonch->lt("\x{FFFF}", "\x{D800}"));
127 ok($nonch->lt("\x{D800}", "\x{DFFF}"));
128 ok($nonch->lt("\x{DFFF}", "\x{FDD0}"));
129 ok($nonch->lt("\x{FDD0}", "\x{FDEF}"));
130 ok($nonch->lt("\x{FDEF}", "\x02"));
131 ok($nonch->lt("\x02",     "\x{10FFFF}"));
132 ok($nonch->gt("\x{10FFFF}", "\x{110000}"));
133
134 # 48..51
135 ok($nonch->lt("A",   "A\x{FFFF}"));
136 ok($nonch->lt("A\0", "A\x{FFFF}"));
137 ok($nonch->lt("A",  "A\0"));
138 ok($nonch->lt("AA", "A\0"));
139
140 ##################
141
142 my $Collator = Unicode::Collate->new(
143   table => 'keys.txt',
144   level => 1,
145   normalization => undef,
146   UCA_Version => 8,
147 );
148
149 my @ret = (
150     "Pe\x{300}\x{301}",
151     "Pe\x{300}\0\0\x{301}",
152     "Pe\x{DA00}\x{301}\x{DFFF}",
153     "Pe\x{FFFF}\x{301}",
154     "Pe\x{110000}\x{301}",
155     "Pe\x{300}\x{d801}\x{301}",
156     "Pe\x{300}\x{ffff}\x{301}",
157     "Pe\x{300}\x{110000}\x{301}",
158     "Pe\x{D9ab}\x{DFFF}",
159     "Pe\x{FFFF}",
160     "Pe\x{110000}",
161     "Pe\x{300}\x{D800}\x{DFFF}",
162     "Pe\x{300}\x{FFFF}",
163     "Pe\x{300}\x{110000}",
164 );
165
166 # 52..65
167 for my $ret (@ret) {
168     my $str = $ret."rl";
169     my($match) = $Collator->match($str, "pe");
170     ok($match eq $ret);
171 }
172