6d33e8ab8daa5b66e10a8be185cf82dd05126737
[p5sagit/p5-mst-13.2.git] / t / op / 64bitint.t
1 #./perl
2
3 use integer;
4
5 BEGIN {
6         eval { my $q = pack "q", 0 };
7         if ($@) {
8                 print "1..0\n# no 64-bit types\n";
9                 exit(0);
10         }
11         chdir 't' if -d 't';
12         unshift @INC, '../lib';
13 }
14
15 # This could use many more tests.
16
17 # so that using > 0xfffffff constants and
18 # 32+ bit integers don't cause noise
19 no warnings qw(overflow portable);
20
21 print "1..52\n";
22
23 my $q = 12345678901;
24 my $r = 23456789012;
25 my $f = 0xffffffff;
26 my $x;
27 my $y;
28
29 $x = unpack "q", pack "q", $q;
30 print "not " unless $x == $q && $x > $f;
31 print "ok 1\n";
32
33
34 $x = sprintf("%lld", 12345678901);
35 print "not " unless $x eq $q && $x > $f;
36 print "ok 2\n";
37
38
39 $x = sprintf("%lld", $q);
40 print "not " unless $x == $q && $x eq $q && $x > $f;
41 print "ok 3\n";
42
43 $x = sprintf("%Ld", $q);
44 print "not " unless $x == $q && $x eq $q && $x > $f;
45 print "ok 4\n";
46
47 $x = sprintf("%qd", $q);
48 print "not " unless $x == $q && $x eq $q && $x > $f;
49 print "ok 5\n";
50
51
52 $x = sprintf("%llx", $q);
53 print "not " unless hex($x) == 0x2dfdc1c35 && hex($x) > $f;
54 print "ok 6\n";
55
56 $x = sprintf("%Lx", $q);
57 print "not " unless hex($x) == 0x2dfdc1c35 && hex($x) > $f;
58 print "ok 7\n";
59
60 $x = sprintf("%qx", $q);
61 print "not " unless hex($x) == 0x2dfdc1c35 && hex($x) > $f;
62 print "ok 8\n";
63
64
65 $x = sprintf("%llo", $q);
66 print "not " unless oct("0$x") == 0133767016065 && oct($x) > $f;
67 print "ok 9\n";
68
69 $x = sprintf("%Lo", $q);
70 print "not " unless oct("0$x") == 0133767016065 && oct($x) > $f;
71 print "ok 10\n";
72
73 $x = sprintf("%qo", $q);
74 print "not " unless oct("0$x") == 0133767016065 && oct($x) > $f;
75 print "ok 11\n";
76
77
78 $x = sprintf("%llb", $q);
79 print "not " unless oct("0b$x") == 0b1011011111110111000001110000110101 &&
80                     oct("0b$x") > $f;
81 print "ok 12\n";
82
83 $x = sprintf("%Lb", $q);
84 print "not " unless oct("0b$x") == 0b1011011111110111000001110000110101 &&
85                                    oct("0b$x") > $f;
86 print "ok 13\n";
87
88 $x = sprintf("%qb", $q);
89 print "not " unless oct("0b$x") == 0b1011011111110111000001110000110101 &&
90                     oct("0b$x") > $f;
91 print "ok 14\n";
92
93
94 $x = sprintf("%llu", $q);
95 print "not " unless $x eq $q && $x > $f;
96 print "ok 15\n";
97
98 $x = sprintf("%Lu", $q);
99 print "not " unless $x == $q && $x eq $q && $x > $f;
100 print "ok 16\n";
101
102 $x = sprintf("%qu", $q);
103 print "not " unless $x == $q && $x eq $q && $x > $f;
104 print "ok 17\n";
105
106
107 $x = sprintf("%D", $q);
108 print "not " unless $x == $q && $x eq $q && $x > $f;
109 print "ok 18\n";
110
111 $x = sprintf("%U", $q);
112 print "not " unless $x == $q && $x eq $q && $x > $f;
113 print "ok 19\n";
114
115 $x = sprintf("%O", $q);
116 print "not " unless oct($x) == $q && oct($x) > $f;
117 print "ok 20\n";
118
119
120 $x = $q + $r;
121 print "not " unless $x == 35802467913 && $x > $f;
122 print "ok 21\n";
123
124 $x = $q - $r;
125 print "not " unless $x == -11111110111 && -$x > $f;
126 print "ok 22\n";
127
128 $x = $q * 1234567;
129 print "not " unless $x == 15241567763770867 && $x > $f;
130 print "ok 23\n";
131
132 $x /= 1234567;
133 print "not " unless $x == $q && $x > $f;
134 print "ok 24\n";
135
136 $x = 98765432109 % 12345678901;
137 print "not " unless $x == 901;
138 print "ok 25\n";
139
140 # The following 12 tests adapted from op/inc.
141
142 $a = 9223372036854775807;
143 $c = $a++;
144 print "not " unless $a == 9223372036854775808;
145 print "ok 26\n";
146
147 $a = 9223372036854775807;
148 $c = ++$a;
149 print "not " unless $a == 9223372036854775808 && $c == $a;
150 print "ok 27\n";
151
152 $a = 9223372036854775807;
153 $c = $a + 1;
154 print "not " unless $a == 9223372036854775807 && $c == 9223372036854775808;
155 print "ok 28\n";
156
157 $a = -9223372036854775808;
158 $c = $a--;
159 print "not " unless $a == -9223372036854775809 && $c == -9223372036854775808;
160 print "ok 29\n";
161
162 $a = -9223372036854775808;
163 $c = --$a;
164 print "not " unless $a == -9223372036854775809 && $c == $a;
165 print "ok 30\n";
166
167 $a = -9223372036854775808;
168 $c = $a - 1;
169 print "not " unless $a == -9223372036854775808 && $c == -9223372036854775809;
170 print "ok 31\n";
171
172 $a = 9223372036854775808;
173 $a = -$a;
174 $c = $a--;
175 print "not " unless $a == -9223372036854775809 && $c == -9223372036854775808;
176 print "ok 32\n";
177
178 $a = 9223372036854775808;
179 $a = -$a;
180 $c = --$a;
181 print "not " unless $a == -9223372036854775809 && $c == $a;
182 print "ok 33\n";
183
184 $a = 9223372036854775808;
185 $a = -$a;
186 $c = $a - 1;
187 print "not " unless $a == -9223372036854775808 && $c == -9223372036854775809;
188 print "ok 34\n";
189
190 $a = 9223372036854775808;
191 $b = -$a;
192 $c = $b--;
193 print "not " unless $b == -$a-1 && $c == -$a;
194 print "ok 35\n";
195
196 $a = 9223372036854775808;
197 $b = -$a;
198 $c = --$b;
199 print "not " unless $b == -$a-1 && $c == $b;
200 print "ok 36\n";
201
202 $a = 9223372036854775808;
203 $b = -$a;
204 $b = $b - 1;
205 print "not " unless $b == -(++$a);
206 print "ok 37\n";
207
208
209 $x = '';
210 print "not " unless (vec($x, 1, 64) = $q) == $q;
211 print "ok 38\n";
212
213 print "not " unless vec($x, 1, 64) == $q && vec($x, 1, 64) > $f;
214 print "ok 39\n";
215
216 print "not " unless vec($x, 0, 64) == 0 && vec($x, 2, 64) == 0;
217 print "ok 40\n";
218
219
220 print "not " unless ~0 == 0xffffffffffffffff;
221 print "ok 41\n";
222
223 print "not " unless (0xffffffff<<32) == 0xffffffff00000000;
224 print "ok 42\n";
225
226 print "not " unless ((0xffffffff)<<32)>>32 == 0xffffffff;
227 print "ok 43\n";
228
229 print "not " unless 1<<63 == 0x8000000000000000;
230 print "ok 44\n";
231
232 print "not " unless (sprintf "%#Vx", 1<<63) eq '0x8000000000000000';
233 print "ok 45\n";
234
235 print "not " unless (0x8000000000000000 | 1) == 0x8000000000000001;
236 print "ok 46\n";
237
238 print "not " unless (0xf000000000000000 & 0x8000000000000000) == 0x8000000000000000;
239 print "ok 47\n";
240
241 print "not " unless (0xf000000000000000 ^ 0xfffffffffffffff0) == 0x0ffffffffffffff0;
242 print "ok 48\n";
243
244
245 print "not " unless (sprintf "%b", ~0)   eq '1111111111111111111111111111111111111111111111111111111111111111';
246 print "ok 49\n";
247
248 print "not " unless (sprintf "%64b", ~0) eq '1111111111111111111111111111111111111111111111111111111111111111';
249 print "ok 50\n";
250
251 print "not " unless (sprintf "%d", ~0>>1) eq '9223372036854775807';
252 print "ok 51\n";
253
254 print "not " unless (sprintf "%u", ~0)    eq '18446744073709551615';
255 print "ok 52\n";
256
257 # eof