Merge commit '01a301d1b606b84d986b735049e7155d2f4cd6aa'
[bpt/guile.git] / test-suite / tests / srfi-60.test
CommitLineData
17e69f21
KR
1;;;; srfi-60.test --- Test suite for Guile's SRFI-60 functions. -*- scheme -*-
2;;;;
6e7d5622 3;;;; Copyright 2005, 2006 Free Software Foundation, Inc.
17e69f21 4;;;;
53befeb7
NJ
5;;;; This library is free software; you can redistribute it and/or
6;;;; modify it under the terms of the GNU Lesser General Public
7;;;; License as published by the Free Software Foundation; either
8;;;; version 3 of the License, or (at your option) any later version.
9;;;;
10;;;; This library is distributed in the hope that it will be useful,
17e69f21 11;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
53befeb7
NJ
12;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13;;;; Lesser General Public License for more details.
14;;;;
15;;;; You should have received a copy of the GNU Lesser General Public
16;;;; License along with this library; if not, write to the Free Software
17;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17e69f21
KR
18
19(define-module (test-srfi-60)
23f2b9a3 20 #:duplicates (last) ;; avoid warning about srfi-60 replacing `bit-count'
17e69f21
KR
21 #:use-module (test-suite lib)
22 #:use-module (srfi srfi-60))
23
24
25(pass-if "cond-expand srfi-60"
26 (cond-expand (srfi-60 #t)
27 (else #f)))
28
29;;
30;; logand
31;;
32
33(with-test-prefix "logand"
34 (pass-if (eqv? 6 (logand 14 6))))
35
36;;
37;; bitwise-and
38;;
39
40(with-test-prefix "bitwise-and"
41 (pass-if (eqv? 6 (bitwise-and 14 6))))
42
43;;
44;; logior
45;;
46
47(with-test-prefix "logior"
48 (pass-if (eqv? 14 (logior 10 12))))
49
50;;
51;; bitwise-ior
52;;
53
54(with-test-prefix "bitwise-ior"
55 (pass-if (eqv? 14 (bitwise-ior 10 12))))
56
57;;
58;; logxor
59;;
60
61(with-test-prefix "logxor"
62 (pass-if (eqv? 6 (logxor 10 12))))
63
64;;
65;; bitwise-xor
66;;
67
68(with-test-prefix "bitwise-xor"
69 (pass-if (eqv? 6 (bitwise-xor 10 12))))
70
71;;
72;; lognot
73;;
74
75(with-test-prefix "lognot"
76 (pass-if (eqv? -1 (lognot 0)))
77 (pass-if (eqv? 0 (lognot -1))))
78
79;;
80;; bitwise-not
81;;
82
83(with-test-prefix "bitwise-not"
84 (pass-if (eqv? -1 (bitwise-not 0)))
85 (pass-if (eqv? 0 (bitwise-not -1))))
86
87;;
88;; bitwise-if
89;;
90
91(with-test-prefix "bitwise-if"
92 (pass-if (eqv? 9 (bitwise-if 3 1 8)))
93 (pass-if (eqv? 0 (bitwise-if 3 8 1))))
94
95;;
96;; bitwise-merge
97;;
98
99(with-test-prefix "bitwise-merge"
100 (pass-if (eqv? 9 (bitwise-merge 3 1 8)))
101 (pass-if (eqv? 0 (bitwise-merge 3 8 1))))
102
103;;
104;; logtest
105;;
106
107(with-test-prefix "logtest"
108 (pass-if (eq? #t (logtest 3 6)))
109 (pass-if (eq? #f (logtest 3 12))))
110
111;;
112;; any-bits-set?
113;;
114
115(with-test-prefix "any-bits-set?"
116 (pass-if (eq? #t (any-bits-set? 3 6)))
117 (pass-if (eq? #f (any-bits-set? 3 12))))
118
119;;
120;; logcount
121;;
122
123(with-test-prefix "logcount"
124 (pass-if (eqv? 2 (logcount 12))))
125
126;;
127;; bit-count
128;;
129
130(with-test-prefix "bit-count"
131 (pass-if (eqv? 2 (bit-count 12))))
132
133;;
134;; integer-length
135;;
136
137(with-test-prefix "integer-length"
138 (pass-if (eqv? 0 (integer-length 0)))
139 (pass-if (eqv? 8 (integer-length 128)))
140 (pass-if (eqv? 8 (integer-length 255)))
141 (pass-if (eqv? 9 (integer-length 256))))
142
143;;
144;; log2-binary-factors
145;;
146
147(with-test-prefix "log2-binary-factors"
148 (pass-if (eqv? -1 (log2-binary-factors 0)))
149 (pass-if (eqv? 0 (log2-binary-factors 1)))
150 (pass-if (eqv? 0 (log2-binary-factors 3)))
151 (pass-if (eqv? 2 (log2-binary-factors 4)))
152 (pass-if (eqv? 1 (log2-binary-factors 6)))
153 (pass-if (eqv? 0 (log2-binary-factors -1)))
154 (pass-if (eqv? 1 (log2-binary-factors -2)))
155 (pass-if (eqv? 0 (log2-binary-factors -3)))
156 (pass-if (eqv? 2 (log2-binary-factors -4)))
157 (pass-if (eqv? 128 (log2-binary-factors #x100000000000000000000000000000000))))
158
159;;
160;; first-set-bit
161;;
162
163(with-test-prefix "first-set-bit"
164 (pass-if (eqv? -1 (first-set-bit 0)))
165 (pass-if (eqv? 0 (first-set-bit 1)))
166 (pass-if (eqv? 0 (first-set-bit 3)))
167 (pass-if (eqv? 2 (first-set-bit 4)))
168 (pass-if (eqv? 1 (first-set-bit 6)))
169 (pass-if (eqv? 0 (first-set-bit -1)))
170 (pass-if (eqv? 1 (first-set-bit -2)))
171 (pass-if (eqv? 0 (first-set-bit -3)))
172 (pass-if (eqv? 2 (first-set-bit -4))))
173
174;;
175;; logbit?
176;;
177
178(with-test-prefix "logbit?"
179 (pass-if (eq? #t (logbit? 0 1)))
180 (pass-if (eq? #f (logbit? 1 1)))
181 (pass-if (eq? #f (logbit? 1 8)))
182 (pass-if (eq? #t (logbit? 1000 -1))))
183
184;;
185;; bit-set?
186;;
187
188(with-test-prefix "bit-set?"
189 (pass-if (eq? #t (bit-set? 0 1)))
190 (pass-if (eq? #f (bit-set? 1 1)))
191 (pass-if (eq? #f (bit-set? 1 8)))
192 (pass-if (eq? #t (bit-set? 1000 -1))))
193
194;;
195;; copy-bit
196;;
197
198(with-test-prefix "copy-bit"
199 (pass-if (eqv? 0 (copy-bit 0 0 #f)))
200 (pass-if (eqv? 0 (copy-bit 30 0 #f)))
201 (pass-if (eqv? 0 (copy-bit 31 0 #f)))
202 (pass-if (eqv? 0 (copy-bit 62 0 #f)))
203 (pass-if (eqv? 0 (copy-bit 63 0 #f)))
204 (pass-if (eqv? 0 (copy-bit 128 0 #f)))
205
206 (pass-if (eqv? -1 (copy-bit 0 -1 #t)))
207 (pass-if (eqv? -1 (copy-bit 30 -1 #t)))
208 (pass-if (eqv? -1 (copy-bit 31 -1 #t)))
209 (pass-if (eqv? -1 (copy-bit 62 -1 #t)))
210 (pass-if (eqv? -1 (copy-bit 63 -1 #t)))
211 (pass-if (eqv? -1 (copy-bit 128 -1 #t)))
212
213 (pass-if (eqv? 1 (copy-bit 0 0 #t)))
214 (pass-if (eqv? #x106 (copy-bit 8 6 #t)))
215 (pass-if (eqv? 6 (copy-bit 8 6 #f)))
216 (pass-if (eqv? -2 (copy-bit 0 -1 #f)))
217
218 (pass-if "bignum becomes inum"
219 (eqv? 0 (copy-bit 128 #x100000000000000000000000000000000 #f)))
220
221 ;; bignums unchanged
222 (pass-if (eqv? #x100000000000000000000000000000000
223 (copy-bit 128 #x100000000000000000000000000000000 #t)))
224 (pass-if (eqv? #x100000000000000000000000000000000
225 (copy-bit 64 #x100000000000000000000000000000000 #f)))
226 (pass-if (eqv? #x-100000000000000000000000000000000
227 (copy-bit 64 #x-100000000000000000000000000000000 #f)))
228 (pass-if (eqv? #x-100000000000000000000000000000000
229 (copy-bit 256 #x-100000000000000000000000000000000 #t))))
230
231;;
232;; bit-field
233;;
234
235(with-test-prefix "bit-field"
236 (pass-if (eqv? 0 (bit-field 6 0 1)))
237 (pass-if (eqv? 3 (bit-field 6 1 3)))
238 (pass-if (eqv? 1 (bit-field 6 2 999)))
239 (pass-if (eqv? 1 (bit-field #x100000000000000000000000000000000 128 129))))
240
241;;
242;; copy-bit-field
243;;
244
245(with-test-prefix "copy-bit-field"
246 (pass-if (eqv? #b111 (copy-bit-field #b110 1 0 1)))
247 (pass-if (eqv? #b110 (copy-bit-field #b110 1 1 2)))
248 (pass-if (eqv? #b010 (copy-bit-field #b110 1 1 3))))
249
250;;
251;; ash
252;;
253
254(with-test-prefix "ash"
255 (pass-if (eqv? 2 (ash 1 1)))
256 (pass-if (eqv? 0 (ash 1 -1))))
257
258;;
259;; arithmetic-shift
260;;
261
262(with-test-prefix "arithmetic-shift"
263 (pass-if (eqv? 2 (arithmetic-shift 1 1)))
264 (pass-if (eqv? 0 (arithmetic-shift 1 -1))))
265
266;;
267;; rotate-bit-field
268;;
269
270(with-test-prefix "rotate-bit-field"
7f8ad91b
MW
271 (define-syntax-rule (check expected x count start end)
272 (begin
273 (pass-if-equal expected (rotate-bit-field x count start end))
274 (pass-if-equal (lognot expected)
275 (rotate-bit-field (lognot x) count start end))))
276
277 (check #b110 #b110 1 1 2)
278 (check #b1010 #b110 1 2 4)
279 (check #b1011 #b0111 -1 1 4)
280
281 (check #b0 #b0 128 0 256)
282 (check #b1 #b1 128 1 256)
283 (check #x100000000000000000000000000000000
284 #x100000000000000000000000000000000 128 0 64)
285 (check #x100000000000000000000000000000008
286 #x100000000000000000000000000000001 3 0 64)
287 (check #x100000000000000002000000000000000
288 #x100000000000000000000000000000001 -3 0 64)
289
290 (check #b110 #b110 0 0 10)
291 (check #b110 #b110 0 0 256)
292
293 (check #b110 #b110 1 1 1)
294
295 (check #b10111010001100111101110010101
296 #b11010001100111101110001110101 -26 5 28)
297 (check #b11000110011110111000111011001
298 #b11010001100111101110001110101 28 2 28)
299
300 (check #b01111010001100111101110010101
301 #b11010001100111101110001110101 -3 5 29)
302 (check #b10100011001111011100011101101
303 #b11010001100111101110001110101 28 2 29)
304
305 (check #b110110100011001111011100010101
306 #b011010001100111101110001110101 48 5 30)
307 (check #b110100011001111011100011101001
308 #b011010001100111101110001110101 85 2 30)
309 (check #b011010001100111101110001110101
310 #b110100011001111011100011101001 83 2 30)
311
312 (check
313 #b1101100110101001110000111110011010000111011101011101110111011
314 #b1100110101001110000111110011010000111011101011101110110111011 -3 5 60)
315 (check
316 #b1011010100111000011111001101000011101110101110111011011101110
317 #b1100110101001110000111110011010000111011101011101110110111011 62 0 60)
318
319 (check
320 #b1011100110101001110000111110011010000111011101011101110111011
321 #b1100110101001110000111110011010000111011101011101110110111011 53 5 61)
322 (check
323 #b1001101010011100001111100110100001110111010111011101101110111
324 #b1100110101001110000111110011010000111011101011101110110111011 62 0 61)
325
326 (check
327 #b11011001101010011100001111100110100001110111010111011100111011
328 #b01100110101001110000111110011010000111011101011101110110111011 53 7 62)
329 (check
330 #b11011001101010011100001111100110100001110111010111011100111011
331 #b01100110101001110000111110011010000111011101011101110110111011 -2 7 62)
332 (check
333 #b01100110101001110000111110011010000111011101011101110110111011
334 #b11011001101010011100001111100110100001110111010111011100111011 2 7 62)
335
336 (pass-if-equal "bignum becomes inum"
337 1
338 (rotate-bit-field #x100000000000000000000000000000000 1 0 129)))
17e69f21
KR
339
340;;
341;; reverse-bit-field
342;;
343
344(with-test-prefix "reverse-bit-field"
345 (pass-if (eqv? 6 (reverse-bit-field 6 1 3)))
346 (pass-if (eqv? 12 (reverse-bit-field 6 1 4)))
347
348 (pass-if (eqv? #x80000000 (reverse-bit-field 1 0 32)))
349 (pass-if (eqv? #x40000000 (reverse-bit-field 1 0 31)))
350 (pass-if (eqv? #x20000000 (reverse-bit-field 1 0 30)))
351
352 (pass-if (eqv? (logior (ash -1 32) #xFBFFFFFF)
353 (reverse-bit-field -2 0 27)))
354 (pass-if (eqv? (logior (ash -1 32) #xF7FFFFFF)
355 (reverse-bit-field -2 0 28)))
356 (pass-if (eqv? (logior (ash -1 32) #xEFFFFFFF)
357 (reverse-bit-field -2 0 29)))
358 (pass-if (eqv? (logior (ash -1 32) #xDFFFFFFF)
359 (reverse-bit-field -2 0 30)))
360 (pass-if (eqv? (logior (ash -1 32) #xBFFFFFFF)
361 (reverse-bit-field -2 0 31)))
362 (pass-if (eqv? (logior (ash -1 32) #x7FFFFFFF)
363 (reverse-bit-field -2 0 32)))
364
365 (pass-if "bignum becomes inum"
366 (eqv? 5 (reverse-bit-field #x140000000000000000000000000000000 0 129))))
367
368;;
369;; integer->list
370;;
371
372(with-test-prefix "integer->list"
373 (pass-if (equal? '(#t #t #f) (integer->list 6)))
374 (pass-if (equal? '(#f #t #t #f) (integer->list 6 4)))
375 (pass-if (equal? '(#t #f) (integer->list 6 2)))
376
377 (pass-if "zeros above top of positive inum"
378 (equal? '(#f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
379 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
380 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
381 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
382 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
383 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
384 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
385 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #t)
386 (integer->list 1 128)))
387
388 (pass-if "ones above top of negative inum"
389 (equal? '(#t #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t
390 #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t
391 #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t
392 #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t
393 #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t
394 #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t
395 #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t
396 #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t #t)
397 (integer->list -1 128)))
398
399 (pass-if (equal? '(#t
400 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
401 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
402 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
403 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
404 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
405 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
406 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
407 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f)
408 (integer->list #x100000000000000000000000000000000))))
409
410;;
411;; list->integer
412;;
413
414(with-test-prefix "list->integer"
415 (pass-if (eqv? 6 (list->integer '(#t #t #f))))
416 (pass-if (eqv? 6 (list->integer '(#f #t #t #f))))
417 (pass-if (eqv? 2 (list->integer '(#t #f))))
418
419 (pass-if "leading #f's"
420 (eqv? 1 (list->integer
421 '(#f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
422 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
423 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
424 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
425 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
426 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
427 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
428 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #t))))
429
430 (pass-if (eqv? #x100000000000000000000000000000000
431 (list->integer
432 '(#t
433 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
434 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
435 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
436 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
437 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
438 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
439 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f
440 #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f #f))))
441
442 (pass-if (eqv? #x03FFFFFF (list->integer '(#t #t
443 #t #t #t #t #t #t #t #t
444 #t #t #t #t #t #t #t #t
445 #t #t #t #t #t #t #t #t))))
446 (pass-if (eqv? #x07FFFFFF (list->integer '(#t #t #t
447 #t #t #t #t #t #t #t #t
448 #t #t #t #t #t #t #t #t
449 #t #t #t #t #t #t #t #t))))
450 (pass-if (eqv? #x0FFFFFFF (list->integer '(#t #t #t #t
451 #t #t #t #t #t #t #t #t
452 #t #t #t #t #t #t #t #t
453 #t #t #t #t #t #t #t #t))))
454 (pass-if (eqv? #x1FFFFFFF (list->integer '(#t #t #t #t #t
455 #t #t #t #t #t #t #t #t
456 #t #t #t #t #t #t #t #t
457 #t #t #t #t #t #t #t #t))))
458 (pass-if (eqv? #x3FFFFFFF (list->integer '(#t #t #t #t #t #t
459 #t #t #t #t #t #t #t #t
460 #t #t #t #t #t #t #t #t
461 #t #t #t #t #t #t #t #t))))
462 (pass-if (eqv? #x7FFFFFFF (list->integer '(#t #t #t #t #t #t #t
463 #t #t #t #t #t #t #t #t
464 #t #t #t #t #t #t #t #t
465 #t #t #t #t #t #t #t #t))))
466 (pass-if (eqv? #xFFFFFFFF (list->integer '(#t #t #t #t #t #t #t #t
467 #t #t #t #t #t #t #t #t
468 #t #t #t #t #t #t #t #t
469 #t #t #t #t #t #t #t #t))))
470 (pass-if (eqv? #x1FFFFFFFF (list->integer '(#t
471 #t #t #t #t #t #t #t #t
472 #t #t #t #t #t #t #t #t
473 #t #t #t #t #t #t #t #t
474 #t #t #t #t #t #t #t #t)))))
475
476;;
477;; list->integer
478;;
479
480(with-test-prefix "list->integer"
481 (pass-if (eqv? 0 (booleans->integer)))
482 (pass-if (eqv? 6 (booleans->integer #t #t #f))))