Commit | Line | Data |
---|---|---|
11883c88 | 1 | #!./perl |
e312add1 | 2 | |
0f4b6630 | 3 | BEGIN { |
11883c88 NC |
4 | chdir 't' if -d 't'; |
5 | @INC = '../lib'; | |
6 | require './test.pl'; | |
7 | eval { my $q = pack "q", 0 }; | |
8 | skip_all('no 64-bit types') if $@; | |
0f4b6630 JH |
9 | } |
10 | ||
686fa4bb | 11 | # This could use many more tests. |
0f4b6630 | 12 | |
d0ba1bd2 | 13 | # so that using > 0xfffffff constants and |
972b05a9 | 14 | # 32+ bit integers don't cause noise |
59d8ce62 | 15 | use warnings; |
4438c4b7 | 16 | no warnings qw(overflow portable); |
ea2b5ef6 | 17 | |
59d8ce62 NC |
18 | # as 6 * 6 = 36, the last digit of 6**n will always be six. Hence the last |
19 | # digit of 16**n will always be six. Hence 16**n - 1 will always end in 5. | |
20 | # Assumption is that UVs will always be a multiple of 4 bits long. | |
21 | ||
22 | my $UV_max = ~0; | |
23 | die "UV_max eq '$UV_max', doesn't end in 5; your UV isn't 4n bits long :-(." | |
24 | unless $UV_max =~ /5$/; | |
25 | my $UV_max_less3 = $UV_max - 3; | |
26 | my $maths_preserves_UVs = $UV_max_less3 =~ /^\d+2$/; # 5 - 3 is 2. | |
27 | if ($maths_preserves_UVs) { | |
28 | print "# This perl's maths preserves all bits of a UV.\n"; | |
29 | } else { | |
30 | print "# This perl's maths does not preserve all bits of a UV.\n"; | |
31 | } | |
32 | ||
0f4b6630 JH |
33 | my $q = 12345678901; |
34 | my $r = 23456789012; | |
20fe1ea2 | 35 | my $f = 0xffffffff; |
0f4b6630 | 36 | my $x; |
2d4389e4 | 37 | my $y; |
0f4b6630 JH |
38 | |
39 | $x = unpack "q", pack "q", $q; | |
11883c88 NC |
40 | cmp_ok($x, '==', $q); |
41 | cmp_ok($x, '>', $f); | |
0f4b6630 JH |
42 | |
43 | ||
22f3ae8c | 44 | $x = sprintf("%lld", 12345678901); |
11883c88 NC |
45 | is($x, $q); |
46 | cmp_ok($x, '>', $f); | |
0f4b6630 | 47 | |
0f4b6630 | 48 | $x = sprintf("%lld", $q); |
11883c88 NC |
49 | cmp_ok($x, '==', $q); |
50 | is($x, $q); | |
51 | cmp_ok($x, '>', $f); | |
0f4b6630 JH |
52 | |
53 | $x = sprintf("%Ld", $q); | |
11883c88 NC |
54 | cmp_ok($x, '==', $q); |
55 | is($x, $q); | |
56 | cmp_ok($x, '>', $f); | |
0f4b6630 JH |
57 | |
58 | $x = sprintf("%qd", $q); | |
11883c88 NC |
59 | cmp_ok($x, '==', $q); |
60 | is($x, $q); | |
61 | cmp_ok($x, '>', $f); | |
0f4b6630 | 62 | |
0f4b6630 JH |
63 | |
64 | $x = sprintf("%llx", $q); | |
11883c88 NC |
65 | cmp_ok(hex $x, '==', 0x2dfdc1c35); |
66 | cmp_ok(hex $x, '>', $f); | |
0f4b6630 JH |
67 | |
68 | $x = sprintf("%Lx", $q); | |
11883c88 NC |
69 | cmp_ok(hex $x, '==', 0x2dfdc1c35); |
70 | cmp_ok(hex $x, '>', $f); | |
0f4b6630 JH |
71 | |
72 | $x = sprintf("%qx", $q); | |
11883c88 NC |
73 | cmp_ok(hex $x, '==', 0x2dfdc1c35); |
74 | cmp_ok(hex $x, '>', $f); | |
0f4b6630 JH |
75 | |
76 | $x = sprintf("%llo", $q); | |
11883c88 NC |
77 | cmp_ok(oct "0$x", '==', 0133767016065); |
78 | cmp_ok(oct $x, '>', $f); | |
0f4b6630 JH |
79 | |
80 | $x = sprintf("%Lo", $q); | |
11883c88 NC |
81 | cmp_ok(oct "0$x", '==', 0133767016065); |
82 | cmp_ok(oct $x, '>', $f); | |
0f4b6630 JH |
83 | |
84 | $x = sprintf("%qo", $q); | |
11883c88 NC |
85 | cmp_ok(oct "0$x", '==', 0133767016065); |
86 | cmp_ok(oct $x, '>', $f); | |
0f4b6630 JH |
87 | |
88 | $x = sprintf("%llb", $q); | |
11883c88 NC |
89 | cmp_ok(oct "0b$x", '==', 0b1011011111110111000001110000110101); |
90 | cmp_ok(oct "0b$x", '>', $f); | |
0f4b6630 JH |
91 | |
92 | $x = sprintf("%Lb", $q); | |
11883c88 NC |
93 | cmp_ok(oct "0b$x", '==', 0b1011011111110111000001110000110101); |
94 | cmp_ok(oct "0b$x", '>', $f); | |
0f4b6630 JH |
95 | |
96 | $x = sprintf("%qb", $q); | |
11883c88 NC |
97 | cmp_ok(oct "0b$x", '==', 0b1011011111110111000001110000110101); |
98 | cmp_ok(oct "0b$x", '>', $f); | |
0f4b6630 JH |
99 | |
100 | ||
22f3ae8c | 101 | $x = sprintf("%llu", $q); |
11883c88 NC |
102 | is($x, $q); |
103 | cmp_ok($x, '>', $f); | |
0f4b6630 | 104 | |
22f3ae8c | 105 | $x = sprintf("%Lu", $q); |
11883c88 NC |
106 | cmp_ok($x, '==', $q); |
107 | is($x, $q); | |
108 | cmp_ok($x, '>', $f); | |
0f4b6630 | 109 | |
22f3ae8c | 110 | $x = sprintf("%qu", $q); |
11883c88 NC |
111 | cmp_ok($x, '==', $q); |
112 | is($x, $q); | |
113 | cmp_ok($x, '>', $f); | |
0f4b6630 JH |
114 | |
115 | ||
29fe7a80 | 116 | $x = sprintf("%D", $q); |
11883c88 NC |
117 | cmp_ok($x, '==', $q); |
118 | is($x, $q); | |
119 | cmp_ok($x, '>', $f); | |
29fe7a80 JH |
120 | |
121 | $x = sprintf("%U", $q); | |
11883c88 NC |
122 | cmp_ok($x, '==', $q); |
123 | is($x, $q); | |
124 | cmp_ok($x, '>', $f); | |
29fe7a80 JH |
125 | |
126 | $x = sprintf("%O", $q); | |
11883c88 NC |
127 | cmp_ok(oct $x, '==', $q); |
128 | cmp_ok(oct $x, '>', $f); | |
29fe7a80 JH |
129 | |
130 | ||
0f4b6630 | 131 | $x = $q + $r; |
11883c88 NC |
132 | cmp_ok($x, '==', 35802467913); |
133 | cmp_ok($x, '>', $f); | |
0f4b6630 JH |
134 | |
135 | $x = $q - $r; | |
11883c88 NC |
136 | cmp_ok($x, '==', -11111110111); |
137 | cmp_ok(-$x, '>', $f); | |
138 | ||
139 | SKIP: { | |
140 | # Unicos has imprecise doubles (14 decimal digits or so), | |
141 | # especially if operating near the UV/IV limits the low-order bits | |
142 | # become mangled even by simple arithmetic operations. | |
143 | skip('too imprecise numbers on unicos') if $^O eq 'unicos'; | |
0f4b6630 | 144 | |
f3ff050f | 145 | $x = $q * 1234567; |
11883c88 NC |
146 | cmp_ok($x, '==', 15241567763770867); |
147 | cmp_ok($x, '>', $f); | |
0f4b6630 | 148 | |
8d489514 | 149 | $x /= 1234567; |
11883c88 NC |
150 | cmp_ok($x, '==', $q); |
151 | cmp_ok($x, '>', $f); | |
2d4389e4 | 152 | |
8d489514 | 153 | $x = 98765432109 % 12345678901; |
11883c88 NC |
154 | cmp_ok($x, '==', 901); |
155 | ||
8d489514 | 156 | # The following 12 tests adapted from op/inc. |
2d4389e4 | 157 | |
f3ff050f JH |
158 | $a = 9223372036854775807; |
159 | $c = $a++; | |
11883c88 | 160 | cmp_ok($a, '==', 9223372036854775808); |
f3ff050f JH |
161 | |
162 | $a = 9223372036854775807; | |
163 | $c = ++$a; | |
11883c88 NC |
164 | cmp_ok($a, '==', 9223372036854775808); |
165 | cmp_ok($c, '==', $a); | |
f3ff050f JH |
166 | |
167 | $a = 9223372036854775807; | |
168 | $c = $a + 1; | |
11883c88 NC |
169 | cmp_ok($a, '==', 9223372036854775807); |
170 | cmp_ok($c, '==', 9223372036854775808); | |
f3ff050f JH |
171 | |
172 | $a = -9223372036854775808; | |
a12a6a4d NC |
173 | { |
174 | no warnings 'imprecision'; | |
175 | $c = $a--; | |
176 | } | |
11883c88 NC |
177 | cmp_ok($a, '==', -9223372036854775809); |
178 | cmp_ok($c, '==', -9223372036854775808); | |
f3ff050f JH |
179 | |
180 | $a = -9223372036854775808; | |
a12a6a4d NC |
181 | { |
182 | no warnings 'imprecision'; | |
183 | $c = --$a; | |
184 | } | |
11883c88 NC |
185 | cmp_ok($a, '==', -9223372036854775809); |
186 | cmp_ok($c, '==', $a); | |
f3ff050f JH |
187 | |
188 | $a = -9223372036854775808; | |
189 | $c = $a - 1; | |
11883c88 NC |
190 | cmp_ok($a, '==', -9223372036854775808); |
191 | cmp_ok($c, '==', -9223372036854775809); | |
192 | ||
f3ff050f JH |
193 | $a = 9223372036854775808; |
194 | $a = -$a; | |
a12a6a4d NC |
195 | { |
196 | no warnings 'imprecision'; | |
197 | $c = $a--; | |
198 | } | |
11883c88 NC |
199 | cmp_ok($a, '==', -9223372036854775809); |
200 | cmp_ok($c, '==', -9223372036854775808); | |
201 | ||
f3ff050f JH |
202 | $a = 9223372036854775808; |
203 | $a = -$a; | |
a12a6a4d NC |
204 | { |
205 | no warnings 'imprecision'; | |
206 | $c = --$a; | |
207 | } | |
11883c88 NC |
208 | cmp_ok($a, '==', -9223372036854775809); |
209 | cmp_ok($c, '==', $a); | |
210 | ||
f3ff050f JH |
211 | $a = 9223372036854775808; |
212 | $a = -$a; | |
213 | $c = $a - 1; | |
11883c88 NC |
214 | cmp_ok($a, '==', -9223372036854775808); |
215 | cmp_ok($c, '==', -9223372036854775809); | |
f3ff050f JH |
216 | |
217 | $a = 9223372036854775808; | |
218 | $b = -$a; | |
a12a6a4d NC |
219 | { |
220 | no warnings 'imprecision'; | |
221 | $c = $b--; | |
222 | } | |
11883c88 NC |
223 | cmp_ok($b, '==', -$a-1); |
224 | cmp_ok($c, '==', -$a); | |
f3ff050f JH |
225 | |
226 | $a = 9223372036854775808; | |
227 | $b = -$a; | |
a12a6a4d NC |
228 | { |
229 | no warnings 'imprecision'; | |
230 | $c = --$b; | |
231 | } | |
11883c88 NC |
232 | cmp_ok($b, '==', -$a-1); |
233 | cmp_ok($c, '==', $b); | |
f3ff050f JH |
234 | |
235 | $a = 9223372036854775808; | |
236 | $b = -$a; | |
237 | $b = $b - 1; | |
11883c88 | 238 | cmp_ok($b, '==', -(++$a)); |
f3ff050f | 239 | } |
e312add1 | 240 | |
2d4389e4 | 241 | |
c5a0f51a | 242 | $x = ''; |
11883c88 | 243 | cmp_ok((vec($x, 1, 64) = $q), '==', $q); |
c5a0f51a | 244 | |
11883c88 NC |
245 | cmp_ok(vec($x, 1, 64), '==', $q); |
246 | cmp_ok(vec($x, 1, 64), '>', $f); | |
972b05a9 | 247 | |
11883c88 NC |
248 | cmp_ok(vec($x, 0, 64), '==', 0); |
249 | cmp_ok(vec($x, 2, 64), '==', 0); | |
972b05a9 | 250 | |
11883c88 | 251 | cmp_ok(~0, '==', 0xffffffffffffffff); |
972b05a9 | 252 | |
11883c88 | 253 | cmp_ok((0xffffffff<<32), '==', 0xffffffff00000000); |
972b05a9 | 254 | |
11883c88 | 255 | cmp_ok(((0xffffffff)<<32)>>32, '==', 0xffffffff); |
972b05a9 | 256 | |
11883c88 | 257 | cmp_ok(1<<63, '==', 0x8000000000000000); |
972b05a9 | 258 | |
11883c88 | 259 | is((sprintf "%#Vx", 1<<63), '0x8000000000000000'); |
972b05a9 | 260 | |
11883c88 | 261 | cmp_ok((0x8000000000000000 | 1), '==', 0x8000000000000001); |
972b05a9 | 262 | |
11883c88 NC |
263 | cmp_ok((0xf000000000000000 & 0x8000000000000000), '==', 0x8000000000000000); |
264 | cmp_ok((0xf000000000000000 ^ 0xfffffffffffffff0), '==', 0x0ffffffffffffff0); | |
972b05a9 | 265 | |
686fa4bb | 266 | |
11883c88 NC |
267 | is((sprintf "%b", ~0), |
268 | '1111111111111111111111111111111111111111111111111111111111111111'); | |
686fa4bb | 269 | |
686fa4bb | 270 | |
11883c88 NC |
271 | is((sprintf "%64b", ~0), |
272 | '1111111111111111111111111111111111111111111111111111111111111111'); | |
686fa4bb | 273 | |
11883c88 NC |
274 | is((sprintf "%d", ~0>>1),'9223372036854775807'); |
275 | is((sprintf "%u", ~0),'18446744073709551615'); | |
686fa4bb | 276 | |
868d6b85 JH |
277 | # If the 53..55 fail you have problems in the parser's string->int conversion, |
278 | # see toke.c:scan_num(). | |
279 | ||
280 | $q = -9223372036854775808; | |
11883c88 | 281 | is("$q","-9223372036854775808"); |
868d6b85 JH |
282 | |
283 | $q = 9223372036854775807; | |
11883c88 | 284 | is("$q","9223372036854775807"); |
868d6b85 JH |
285 | |
286 | $q = 18446744073709551615; | |
11883c88 | 287 | is("$q","18446744073709551615"); |
868d6b85 | 288 | |
85b81d93 NC |
289 | # Test that sv_2nv then sv_2iv is the same as sv_2iv direct |
290 | # fails if whatever Atol is defined as can't actually cope with >32 bits. | |
291 | my $num = 4294967297; | |
292 | my $string = "4294967297"; | |
293 | { | |
294 | use integer; | |
295 | $num += 0; | |
296 | $string += 0; | |
297 | } | |
11883c88 | 298 | is($num, $string); |
85b81d93 NC |
299 | |
300 | # Test that sv_2nv then sv_2uv is the same as sv_2uv direct | |
301 | $num = 4294967297; | |
302 | $string = "4294967297"; | |
303 | $num &= 0; | |
304 | $string &= 0; | |
11883c88 | 305 | is($num, $string); |
85b81d93 | 306 | |
09bb3e27 NC |
307 | $q = "18446744073709551616e0"; |
308 | $q += 0; | |
11883c88 | 309 | isnt($q, "18446744073709551615"); |
09bb3e27 | 310 | |
5479d192 NC |
311 | # 0xFFFFFFFFFFFFFFFF == 1 * 3 * 5 * 17 * 257 * 641 * 65537 * 6700417' |
312 | $q = 0xFFFFFFFFFFFFFFFF / 3; | |
11883c88 NC |
313 | cmp_ok($q, '==', 0x5555555555555555); |
314 | SKIP: { | |
315 | skip("Maths does not preserve UVs", 2) unless $maths_preserves_UVs; | |
316 | cmp_ok($q, '!=', 0x5555555555555556); | |
317 | unlike($q, qr/[e.]/); | |
5479d192 | 318 | } |
09bb3e27 | 319 | |
e2c88acc | 320 | $q = 0xFFFFFFFFFFFFFFFF % 0x5555555555555555; |
11883c88 | 321 | cmp_ok($q, '==', 0); |
e2c88acc NC |
322 | |
323 | $q = 0xFFFFFFFFFFFFFFFF % 0xFFFFFFFFFFFFFFF0; | |
11883c88 | 324 | cmp_ok($q, '==', 0xF); |
e2c88acc NC |
325 | |
326 | $q = 0x8000000000000000 % 9223372036854775807; | |
11883c88 | 327 | cmp_ok($q, '==', 1); |
e2c88acc NC |
328 | |
329 | $q = 0x8000000000000000 % -9223372036854775807; | |
11883c88 | 330 | cmp_ok($q, '==', -9223372036854775806); |
e2c88acc | 331 | |
53305cf1 | 332 | { |
11883c88 NC |
333 | use integer; |
334 | $q = hex "0x123456789abcdef0"; | |
335 | cmp_ok($q, '==', 0x123456789abcdef0); | |
336 | cmp_ok($q, '!=', 0x123456789abcdef1); | |
337 | unlike($q, qr/[e.]/, 'Should not be floating point'); | |
338 | ||
339 | $q = oct "0x123456789abcdef0"; | |
340 | cmp_ok($q, '==', 0x123456789abcdef0); | |
341 | cmp_ok($q, '!=', 0x123456789abcdef1); | |
342 | unlike($q, qr/[e.]/, 'Should not be floating point'); | |
343 | ||
344 | $q = oct "765432176543217654321"; | |
345 | cmp_ok($q, '==', 0765432176543217654321); | |
346 | cmp_ok($q, '!=', 0765432176543217654322); | |
347 | unlike($q, qr/[e.]/, 'Should not be floating point'); | |
348 | ||
349 | $q = oct "0b0101010101010101010101010101010101010101010101010101010101010101"; | |
350 | cmp_ok($q, '==', 0x5555555555555555); | |
351 | cmp_ok($q, '!=', 0x5555555555555556); | |
352 | unlike($q, qr/[e.]/, 'Should not be floating point'); | |
53305cf1 NC |
353 | } |
354 | ||
11883c88 | 355 | done_testing(); |