xref: /openbsd-src/gnu/usr.bin/perl/cpan/Unicode-Collate/t/default.t (revision 50b7afb2c2c0993b0894d4e34bf857cb13ed9c80)
1
2BEGIN {
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
14use strict;
15use warnings;
16BEGIN { $| = 1; print "1..70\n"; }
17my $count = 0;
18sub ok ($;$) {
19    my $p = my $r = shift;
20    if (@_) {
21	my $x = shift;
22	$p = !defined $x ? !defined $r : !defined $r ? 0 : $r eq $x;
23    }
24    print $p ? "ok" : "not ok", ' ', ++$count, "\n";
25}
26
27use Unicode::Collate;
28
29ok(1);
30
31#########################
32
33sub _pack_U   { Unicode::Collate::pack_U(@_) }
34sub _unpack_U { Unicode::Collate::unpack_U(@_) }
35
36my $A_acute = _pack_U(0xC1);
37my $a_acute = _pack_U(0xE1);
38my $acute   = _pack_U(0x0301);
39
40my $hiragana = "\x{3042}\x{3044}";
41my $katakana = "\x{30A2}\x{30A4}";
42
43my $Collator = Unicode::Collate->new(
44  normalization => undef,
45);
46
47ok(ref $Collator, "Unicode::Collate");
48
49ok($Collator->version,   Unicode::Collate::Base_Unicode_Version);
50ok($Collator->version(), Unicode::Collate->Base_Unicode_Version);
51ok($Collator->version,          $Collator->Base_Unicode_Version);
52ok($Collator->version(),        $Collator->Base_Unicode_Version());
53
54# 6
55
56ok($Collator->cmp("", ""), 0);
57ok($Collator->eq("", ""));
58ok($Collator->cmp("", "perl"), -1);
59
60ok(
61  join(':', $Collator->sort( qw/ acha aca ada acia acka / ) ),
62  join(':',                  qw/ aca acha acia acka ada / ),
63);
64
65ok(
66  join(':', $Collator->sort( qw/ ACHA ACA ADA ACIA ACKA / ) ),
67  join(':',                  qw/ ACA ACHA ACIA ACKA ADA / ),
68);
69
70# 11
71
72ok($Collator->cmp("A$acute", $A_acute), 0); # @version 3.1.1 (prev: -1)
73ok($Collator->cmp($a_acute, $A_acute), -1);
74ok($Collator->eq("A\cA$acute", $A_acute)); # UCA v9. \cA is invariant.
75
76my %old_level = $Collator->change(level => 1);
77ok($Collator->eq("A$acute", $A_acute));
78ok($Collator->eq("A", $A_acute));
79
80ok($Collator->change(level => 2)->eq($a_acute, $A_acute));
81ok($Collator->lt("A", $A_acute));
82
83ok($Collator->change(%old_level)->lt("A", $A_acute));
84ok($Collator->lt("A", $A_acute));
85ok($Collator->lt("A", $a_acute));
86ok($Collator->lt($a_acute, $A_acute));
87
88# 22
89
90$Collator->change(level => 2);
91
92ok($Collator->{level}, 2);
93
94ok( $Collator->cmp("ABC","abc"), 0);
95ok( $Collator->eq("ABC","abc") );
96ok( $Collator->le("ABC","abc") );
97ok( $Collator->cmp($hiragana, $katakana), 0);
98ok( $Collator->eq($hiragana, $katakana) );
99ok( $Collator->ge($hiragana, $katakana) );
100
101# 29
102
103# hangul
104ok( $Collator->eq("a\x{AC00}b", "a\x{1100}\x{1161}b") );
105ok( $Collator->eq("a\x{AE00}b", "a\x{1100}\x{1173}\x{11AF}b") );
106ok( $Collator->gt("a\x{AE00}b", "a\x{1100}\x{1173}b\x{11AF}") );
107ok( $Collator->lt("a\x{AC00}b", "a\x{AE00}b") );
108ok( $Collator->gt("a\x{D7A3}b", "a\x{C544}b") );
109ok( $Collator->lt("a\x{C544}b", "a\x{30A2}b") ); # hangul < hiragana
110
111# 35
112
113$Collator->change(%old_level, katakana_before_hiragana => 1);
114
115ok($Collator->{level}, 4);
116
117ok( $Collator->cmp("abc", "ABC"), -1);
118ok( $Collator->ne("abc", "ABC") );
119ok( $Collator->lt("abc", "ABC") );
120ok( $Collator->le("abc", "ABC") );
121ok( $Collator->cmp($hiragana, $katakana), 1);
122ok( $Collator->ne($hiragana, $katakana) );
123ok( $Collator->gt($hiragana, $katakana) );
124ok( $Collator->ge($hiragana, $katakana) );
125
126# 44
127
128$Collator->change(upper_before_lower => 1);
129
130ok( $Collator->cmp("abc", "ABC"), 1);
131ok( $Collator->ge("abc", "ABC"), 1);
132ok( $Collator->gt("abc", "ABC"), 1);
133ok( $Collator->cmp($hiragana, $katakana), 1);
134ok( $Collator->ge($hiragana, $katakana), 1);
135ok( $Collator->gt($hiragana, $katakana), 1);
136
137# 50
138
139$Collator->change(katakana_before_hiragana => 0);
140
141ok( $Collator->cmp("abc", "ABC"), 1);
142ok( $Collator->cmp($hiragana, $katakana), -1);
143
144# 52
145
146$Collator->change(upper_before_lower => 0);
147
148ok( $Collator->cmp("abc", "ABC"), -1);
149ok( $Collator->le("abc", "ABC") );
150ok( $Collator->cmp($hiragana, $katakana), -1);
151ok( $Collator->lt($hiragana, $katakana) );
152
153# 56
154
155$Collator->change(level => 1);
156
157my $Tailored = Unicode::Collate->new(
158  normalization => undef,
159  suppress => [0x400..0x4FF],
160  level => 1,
161  entry => '0000 ; [.FFFE.0020.0005.0000]',
162);
163
164# Ka vs Kje
165ok($Collator->gt("\x{45C}", "\x{43A}"));
166ok($Collator->gt("\x{40C}", "\x{41A}"));
167ok($Tailored->gt("\x{45C}", "\x{43A}"));
168ok($Tailored->gt("\x{40C}", "\x{41A}"));
169
170# 60
171
172ok($Collator->eq("abc\0", "abc"));
173ok($Tailored->gt("abc\0", "abc\x{4E00}"));
174ok($Tailored->gt("abc\0", "abc\x{FFFD}"));
175ok($Tailored->gt("abc\0", "abc\x{FFFD}"));
176
177# 64
178
179$Tailored->change(UCA_Version => 9);
180
181ok($Tailored->gt("abc\0", "abc\x{4E00}"));
182ok($Tailored->gt("abc\0", "abc\x{FFFD}"));
183ok($Tailored->gt("abc\0", "abc\x{FFFD}"));
184
185# 67
186
187$Tailored->change(UCA_Version => 8);
188
189ok($Tailored->gt("abc\0", "abc\x{4E00}"));
190ok($Tailored->gt("abc\0", "abc\x{FFFD}"));
191ok($Tailored->gt("abc\0", "abc\x{FFFD}"));
192
193# 70
194