3 unless ("A" eq pack('U', 0x41) || "A" eq pack('U', ord("A"))) {
4 print "1..0 # Unicode::Collate " .
5 "cannot stringify a Unicode code point\n";
11 if ($ENV{PERL_CORE}) {
13 @INC = $^O eq 'MacOS' ? qw(::lib) : qw(../lib);
18 BEGIN { plan tests => 65 };
21 our $IsEBCDIC = ord("A") != 0x41;
23 #########################
25 ok(1); # If we made it this far, we're ok.
27 my $Collator = Unicode::Collate->new(
29 normalization => undef,
34 my %old_level = $Collator->change(level => 2);
38 my $orig = "This is a Perl book.";
41 my $ret = "This is a camel book.";
44 if (my($pos,$len) = $Collator->index($str, $sub)) {
45 substr($str, $pos, $len, $rep);
50 $Collator->change(%old_level);
53 if (my($pos,$len) = $Collator->index($str, $sub)) {
54 substr($str, $pos, $len, $rep);
63 $Collator->change(level => 1);
69 if (my($pos, $len) = $Collator->index($str, $sub)) {
70 $match = substr($str, $pos, $len);
74 $str = "P\x{300}e\x{300}\x{301}\x{303}rl";
76 $ret = "P\x{300}e\x{300}\x{301}\x{303}";
78 if (my($pos, $len) = $Collator->index($str, $sub)) {
79 $match = substr($str, $pos, $len);
83 $Collator->change(level => 2);
89 if (my($pos, $len) = $Collator->index($str, $sub)) {
90 $match = substr($str, $pos, $len);
94 $str = "P\x{300}e\x{300}\x{301}\x{303}rl";
98 if (my($pos, $len) = $Collator->index($str, $sub)) {
99 $match = substr($str, $pos, $len);
103 $str = "Pe\x{300}rl";
107 if (my($pos, $len) = $Collator->index($str, $sub)) {
108 $match = substr($str, $pos, $len);
112 $str = "P\x{300}e\x{300}\x{301}\x{303}rl";
113 $sub = "p\x{300}E\x{300}\x{301}\x{303}";
114 $ret = "P\x{300}e\x{300}\x{301}\x{303}";
116 if (my($pos, $len) = $Collator->index($str, $sub)) {
117 $match = substr($str, $pos, $len);
123 $Collator->change(level => 1);
126 ? "Ich mu\x{0059} studieren Perl."
127 : "Ich mu\x{00DF} studieren Perl.";
135 if (my($pos, $len) = $Collator->index($str, $sub)) {
136 $match = substr($str, $pos, $len);
140 $Collator->change(%old_level);
143 if (my($pos, $len) = $Collator->index($str, $sub)) {
144 $match = substr($str, $pos, $len);
149 if (my($pos,$len) = $Collator->index("", "")) {
150 $match = substr("", $pos, $len);
155 if (my($pos,$len) = $Collator->index("", "abc")) {
156 $match = substr("", $pos, $len);
162 $Collator->change(level => 1);
164 $str = "\0\cA\0\cAe\0\x{300}\cA\x{301}\cB\x{302}\0 \0\cA";
166 $ret = "e\0\x{300}\cA\x{301}\cB\x{302}\0";
168 if (my($pos, $len) = $Collator->index($str, $sub)) {
169 $match = substr($str, $pos, $len);
173 $Collator->change(level => 1);
175 $str = "\0\cA\0\cAe\0\cA\x{300}\0\cAe";
177 $ret = "e\0\cA\x{300}\0\cA";
179 if (my($pos, $len) = $Collator->index($str, $sub)) {
180 $match = substr($str, $pos, $len);
185 $Collator->change(%old_level);
191 if (my($pos, $len) = $Collator->index($str, $sub)) {
192 $match = substr($str, $pos, $len);
198 $Collator->change(level => 1);
200 $str = "The Perl is a language, and the perl is an interpreter.";
204 if (my($pos, $len) = $Collator->index($str, $sub, -40)) {
205 $match = substr($str, $pos, $len);
210 if (my($pos, $len) = $Collator->index($str, $sub, 4)) {
211 $match = substr($str, $pos, $len);
216 if (my($pos, $len) = $Collator->index($str, $sub, 5)) {
217 $match = substr($str, $pos, $len);
222 if (my($pos, $len) = $Collator->index($str, $sub, 32)) {
223 $match = substr($str, $pos, $len);
228 if (my($pos, $len) = $Collator->index($str, $sub, 33)) {
229 $match = substr($str, $pos, $len);
234 if (my($pos, $len) = $Collator->index($str, $sub, 100)) {
235 $match = substr($str, $pos, $len);
239 $Collator->change(%old_level);
245 $Collator->change(level => 1);
247 $ret = $Collator->match("P\cBe\x{300}\cBrl and PERL", "pe");
249 ok($$ret eq "P\cBe\x{300}\cB");
251 @ret = $Collator->match("P\cBe\x{300}\cBrl and PERL", "pe");
252 ok($ret[0], "P\cBe\x{300}\cB");
254 $str = $IsEBCDIC ? "mu\x{0059}" : "mu\x{00DF}";
255 $sub = $IsEBCDIC ? "m\x{00DC}ss" : "m\x{00FC}ss";
257 ($ret) = $Collator->match($str, $sub);
260 $str = $IsEBCDIC ? "mu\x{0059}" : "mu\x{00DF}";
261 $sub = $IsEBCDIC ? "m\x{00DC}s" : "m\x{00FC}s";
263 ($ret) = $Collator->match($str, $sub);
266 $ret = join ':', $Collator->gmatch("P\cBe\x{300}\cBrl, perl, and PERL", "pe");
267 ok($ret eq "P\cBe\x{300}\cB:pe:PE");
269 $ret = $Collator->gmatch("P\cBe\x{300}\cBrl, perl, and PERL", "pe");
274 $ret = $Collator->match($str, $sub);
276 ok($ret && $$ret, "CDE");
280 ($ret) = $Collator->match($str, $sub);
285 $Collator->change(level => 3);
287 $ret = $Collator->match("P\cBe\x{300}\cBrl and PERL", "pe");
290 @ret = $Collator->match("P\cBe\x{300}\cBrl and PERL", "pe");
293 $ret = join ':', $Collator->gmatch("P\cBe\x{300}\cBrl and PERL", "pe");
296 $ret = $Collator->gmatch("P\cBe\x{300}\cBrl and PERL", "pe");
299 $ret = join ':', $Collator->gmatch("P\cBe\x{300}\cBrl, perl, and PERL", "pe");
302 $ret = $Collator->gmatch("P\cBe\x{300}\cBrl, perl, and PERL", "pe");
305 $str = $IsEBCDIC ? "mu\x{0059}" : "mu\x{00DF}";
306 $sub = $IsEBCDIC ? "m\x{00DC}ss" : "m\x{00FC}ss";
308 ($ret) = $Collator->match($str, $sub);
311 $Collator->change(%old_level);
315 $Collator->change(level => 1);
317 sub strreverse { scalar reverse shift }
319 $str = "P\cBe\x{300}\cBrl and PERL.";
320 $ret = $Collator->subst($str, "perl", 'Camel');
322 ok($str, "Camel and PERL.");
324 $str = "P\cBe\x{300}\cBrl and PERL.";
325 $ret = $Collator->subst($str, "perl", \&strreverse);
327 ok($str, "lr\cB\x{300}e\cBP and PERL.");
329 $str = "P\cBe\x{300}\cBrl and PERL.";
330 $ret = $Collator->gsubst($str, "perl", 'Camel');
332 ok($str, "Camel and Camel.");
334 $str = "P\cBe\x{300}\cBrl and PERL.";
335 $ret = $Collator->gsubst($str, "perl", \&strreverse);
337 ok($str, "lr\cB\x{300}e\cBP and LREP.");
339 $str = "Camel ass came\x{301}l CAMEL horse cAm\0E\0L...";
340 $Collator->gsubst($str, "camel", sub { "<b>$_[0]</b>" });
342 "<b>Camel</b> ass <b>came\x{301}l</b> <b>CAMEL</b> horse <b>cAm\0E\0L</b>...");
344 $Collator->change(level => 3);
346 $str = "P\cBe\x{300}\cBrl and PERL.";
347 $ret = $Collator->subst($str, "perl", "Camel");
349 ok($str, "P\cBe\x{300}\cBrl and PERL.");
351 $str = "P\cBe\x{300}\cBrl and PERL.";
352 $ret = $Collator->subst($str, "perl", \&strreverse);
354 ok($str, "P\cBe\x{300}\cBrl and PERL.");
356 $str = "P\cBe\x{300}\cBrl and PERL.";
357 $ret = $Collator->gsubst($str, "perl", "Camel");
359 ok($str, "P\cBe\x{300}\cBrl and PERL.");
361 $str = "P\cBe\x{300}\cBrl and PERL.";
362 $ret = $Collator->gsubst($str, "perl", \&strreverse);
364 ok($str, "P\cBe\x{300}\cBrl and PERL.");
366 $Collator->change(%old_level);
370 $str = "Perl and Camel";
371 $ret = $Collator->gsubst($str, "\cA\cA\0", "AB");
373 ok($str, "ABPABeABrABlAB ABaABnABdAB ABCABaABmABeABlAB");
376 $ret = $Collator->subst($str, "", "ABC");
381 $ret = $Collator->gsubst($str, "", "ABC");
386 $ret = $Collator->gsubst($str, 'PP', "ABC");
392 # Shifted; ignorable after variable
394 ($ret) = $Collator->match("A?\x{300}!\x{301}\x{344}B\x{315}", "?!");
395 ok($ret, "?\x{300}!\x{301}\x{344}");
397 $Collator->change(alternate => 'Non-ignorable');
399 ($ret) = $Collator->match("A?\x{300}!\x{301}B\x{315}", "?!");