423 lines
18 KiB
Scheme
423 lines
18 KiB
Scheme
#!r6rs
|
|
|
|
(library (tests r6rs bytevectors)
|
|
(export run-bytevectors-tests)
|
|
(import (rnrs)
|
|
(tests r6rs test))
|
|
|
|
(define (run-bytevectors-tests)
|
|
|
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; Tests originally from R6RS, plus added
|
|
|
|
(test (endianness little) 'little)
|
|
(test (endianness big) 'big)
|
|
(test (symbol? (native-endianness)) #t)
|
|
|
|
(test (bytevector? #vu8(1 2 3)) #t)
|
|
(test (bytevector? "123") #f)
|
|
|
|
(test (bytevector-length #vu8(1 2 3)) 3)
|
|
(test (bytevector-length (make-bytevector 10)) 10)
|
|
(test (bytevector-length (make-bytevector 10 3)) 10)
|
|
(test (bytevector-u8-ref (make-bytevector 10 3) 0) 3)
|
|
(test (bytevector-u8-ref (make-bytevector 10 3) 5) 3)
|
|
(test (bytevector-u8-ref (make-bytevector 10 3) 9) 3)
|
|
(test (bytevector-u8-ref (make-bytevector 10 255) 9) 255)
|
|
(test (bytevector-u8-ref (make-bytevector 10 -1) 9) 255)
|
|
(test (bytevector-u8-ref (make-bytevector 10 -128) 9) 128)
|
|
|
|
(let ([v (make-bytevector 5 2)])
|
|
(test/unspec (bytevector-fill! v -1))
|
|
(test v #vu8(255 255 255 255 255))
|
|
(test/unspec (bytevector-fill! v 17))
|
|
(test v #vu8(17 17 17 17 17))
|
|
(test/unspec (bytevector-fill! v 255))
|
|
(test v #vu8(255 255 255 255 255)))
|
|
|
|
(test (let ((b (u8-list->bytevector '(1 2 3 4 5 6 7 8))))
|
|
(bytevector-copy! b 0 b 3 4)
|
|
(bytevector->u8-list b))
|
|
'(1 2 3 1 2 3 4 8))
|
|
|
|
(test (bytevector-copy #vu8(1 2 3)) #vu8(1 2 3))
|
|
|
|
(test (let ((b1 (make-bytevector 16 -127))
|
|
(b2 (make-bytevector 16 255)))
|
|
(list
|
|
(bytevector-s8-ref b1 0)
|
|
(bytevector-u8-ref b1 0)
|
|
(bytevector-s8-ref b2 0)
|
|
(bytevector-u8-ref b2 0)))
|
|
'(-127 129 -1 255))
|
|
|
|
(test (let ((b (make-bytevector 16 -127)))
|
|
|
|
(bytevector-s8-set! b 0 -126)
|
|
(bytevector-u8-set! b 1 246)
|
|
|
|
(list
|
|
(bytevector-s8-ref b 0)
|
|
(bytevector-u8-ref b 0)
|
|
(bytevector-s8-ref b 1)
|
|
(bytevector-u8-ref b 1)))
|
|
'(-126 130 -10 246))
|
|
|
|
(test (bytevector->u8-list #vu8(1 2 3)) '(1 2 3))
|
|
(test (bytevector->u8-list #vu8(255 255 255)) '(255 255 255))
|
|
(test (u8-list->bytevector '(1 2 3)) #vu8(1 2 3))
|
|
(test (u8-list->bytevector '()) #vu8())
|
|
|
|
(let ([b (make-bytevector 16 -127)])
|
|
(test/unspec
|
|
(bytevector-uint-set! b 0 (- (expt 2 128) 3)
|
|
(endianness little) 16))
|
|
|
|
(test (bytevector-uint-ref b 0 (endianness little) 16)
|
|
#xfffffffffffffffffffffffffffffffd)
|
|
|
|
(test (bytevector-sint-ref b 0 (endianness little) 16)
|
|
-3)
|
|
|
|
(test (bytevector->u8-list b)
|
|
'(253 255 255 255 255 255 255 255
|
|
255 255 255 255 255 255 255 255))
|
|
|
|
(test/unspec (bytevector-uint-set! b 0 (- (expt 2 128) 3)
|
|
(endianness big) 16))
|
|
(test (bytevector-uint-ref b 0 (endianness big) 16)
|
|
#xfffffffffffffffffffffffffffffffd)
|
|
|
|
(test (bytevector-sint-ref b 0 (endianness big) 16) -3)
|
|
|
|
(test (bytevector->u8-list b)
|
|
'(255 255 255 255 255 255 255 255
|
|
255 255 255 255 255 255 255 253))
|
|
|
|
(test
|
|
(let ((b (u8-list->bytevector '(1 2 3 255 1 2 1 2))))
|
|
(bytevector->sint-list b (endianness little) 2))
|
|
'(513 -253 513 513))
|
|
|
|
(test (let ((b (u8-list->bytevector '(1 2 3 255 1 2 1 2))))
|
|
(bytevector->uint-list b (endianness little) 2))
|
|
'(513 65283 513 513)))
|
|
|
|
(let ([b (u8-list->bytevector
|
|
'(255 255 255 255 255 255 255 255
|
|
255 255 255 255 255 255 255 253))])
|
|
|
|
(test (bytevector-u16-ref b 14 (endianness little)) 65023)
|
|
(test (bytevector-s16-ref b 14 (endianness little)) -513)
|
|
(test (bytevector-u16-ref b 14 (endianness big)) 65533)
|
|
(test (bytevector-s16-ref b 14 (endianness big)) -3)
|
|
|
|
(test/unspec (bytevector-u16-set! b 0 12345 (endianness little)))
|
|
(test (bytevector-u16-ref b 0 (endianness little)) 12345)
|
|
|
|
(test/unspec (bytevector-u16-native-set! b 0 12345))
|
|
(test (bytevector-u16-native-ref b 0) 12345)
|
|
|
|
(test/unspec (bytevector-u16-ref b 0 (endianness little))))
|
|
|
|
(let ([b (u8-list->bytevector
|
|
'(255 255 255 255 255 255 255 255
|
|
255 255 255 255 255 255 255 253))])
|
|
|
|
(test (bytevector-u32-ref b 12 (endianness little)) 4261412863)
|
|
(test (bytevector-s32-ref b 12 (endianness little)) -33554433)
|
|
(test (bytevector-u32-ref b 12 (endianness big)) 4294967293)
|
|
(test (bytevector-s32-ref b 12 (endianness big)) -3))
|
|
|
|
(let ([b (u8-list->bytevector
|
|
'(255 255 255 255 255 255 255 255
|
|
255 255 255 255 255 255 255 253))])
|
|
(test (bytevector-u64-ref b 8 (endianness little)) 18302628885633695743)
|
|
(test (bytevector-s64-ref b 8 (endianness little)) -144115188075855873)
|
|
(test (bytevector-u64-ref b 8 (endianness big)) 18446744073709551613)
|
|
(test (bytevector-s64-ref b 8 (endianness big)) -3))
|
|
|
|
(for-each
|
|
(lambda (k)
|
|
(for-each
|
|
(lambda (n)
|
|
(if (zero? (fxand k 3))
|
|
(let ([b (make-bytevector 12)])
|
|
(test/unspec (bytevector-ieee-single-native-set! b k n))
|
|
(test/approx (bytevector-ieee-single-native-ref b k) n))
|
|
(let ([b (make-bytevector 12)])
|
|
(test/exn (bytevector-ieee-single-native-set! b k n) &assertion)
|
|
(test/exn (bytevector-ieee-single-native-ref b k) &assertion)))
|
|
(let ([b (make-bytevector 12)])
|
|
(test/unspec (bytevector-ieee-single-set! b k n 'big))
|
|
(test/approx (bytevector-ieee-single-ref b k 'big) n))
|
|
(let ([b (make-bytevector 12)])
|
|
(test/unspec (bytevector-ieee-single-set! b k n 'little))
|
|
(test/approx (bytevector-ieee-single-ref b k 'little) n))
|
|
(if (zero? (fxand k 7))
|
|
(let ([b (make-bytevector 12)])
|
|
(test/unspec (bytevector-ieee-double-native-set! b k n))
|
|
(test/approx (bytevector-ieee-double-native-ref b k) n))
|
|
(let ([b (make-bytevector 12)])
|
|
(test/exn (bytevector-ieee-double-native-set! b k n) &assertion)
|
|
(test/exn (bytevector-ieee-double-native-ref b k) &assertion)))
|
|
(let ([b (make-bytevector 12)])
|
|
(test/unspec (bytevector-ieee-double-set! b k n 'big))
|
|
(test/approx (bytevector-ieee-double-ref b k 'big) n))
|
|
(let ([b (make-bytevector 12)])
|
|
(test/unspec (bytevector-ieee-double-set! b k n 'little))
|
|
(test/approx (bytevector-ieee-double-ref b k 'little) n)))
|
|
'(1.0 25.78 +inf.0 -inf.0 +nan.0)))
|
|
'(0 1 2 3 4))
|
|
|
|
(test (string->utf8 "apple") #vu8(97 112 112 108 101))
|
|
(test (string->utf8 "app\x3BB;e") #vu8(97 112 112 206 187 101))
|
|
(test (string->utf16 "app\x3BB;e" 'little) #vu8(97 0 112 0 112 0 #xBB #x3 101 0))
|
|
(test (string->utf16 "app\x3BB;e" 'big) #vu8(0 97 0 112 0 112 #x3 #xBB 0 101))
|
|
(test (string->utf16 "app\x3BB;e") #vu8(0 97 0 112 0 112 #x3 #xBB 0 101))
|
|
(test (string->utf32 "app\x3BB;e" 'little) #vu8(97 0 0 0 112 0 0 0 112 0 0 0 #xBB #x3 0 0 101 0 0 0))
|
|
(test (string->utf32 "app\x3BB;e" 'big) #vu8(0 0 0 97 0 0 0 112 0 0 0 112 0 0 #x3 #xBB 0 0 0 101))
|
|
(test (string->utf32 "app\x3BB;e") #vu8(0 0 0 97 0 0 0 112 0 0 0 112 0 0 #x3 #xBB 0 0 0 101))
|
|
|
|
(let ([bv-append
|
|
(lambda (bv1 bv2)
|
|
(let ([bv (make-bytevector (+ (bytevector-length bv1)
|
|
(bytevector-length bv2)))])
|
|
(bytevector-copy! bv1 0 bv 0 (bytevector-length bv1))
|
|
(bytevector-copy! bv2 0 bv (bytevector-length bv1) (bytevector-length bv2))
|
|
bv))])
|
|
(for-each
|
|
(lambda (str)
|
|
(test (utf8->string (string->utf8 str)) str)
|
|
(test (utf16->string (string->utf16 str 'big) 'big) str)
|
|
(test (utf16->string (string->utf16 str 'little) 'little) str)
|
|
(test (utf16->string (bv-append #vu8(#xFF #xFE) (string->utf16 str 'little)) 'big) str)
|
|
(test (utf16->string (bv-append #vu8(#xFE #xFF) (string->utf16 str 'big)) 'little) str)
|
|
(test (utf16->string (bv-append #vu8(#xFF #xFE) (string->utf16 str 'little)) 'little #t)
|
|
(string-append "\xFEFF;" str))
|
|
(test (utf16->string (bv-append #vu8(#xFE #xFF) (string->utf16 str 'little)) 'little #t)
|
|
(string-append "\xFFFE;" str))
|
|
(test (utf16->string (bv-append #vu8(#xFE #xFF) (string->utf16 str 'big)) 'big #t)
|
|
(string-append "\xFEFF;" str))
|
|
(test (utf16->string (bv-append #vu8(#xFF #xFE) (string->utf16 str 'big)) 'big #t)
|
|
(string-append "\xFFFE;" str))
|
|
(test (utf32->string (string->utf32 str 'big) 'big) str)
|
|
(test (utf32->string (string->utf32 str 'little) 'little) str)
|
|
(test (utf32->string (bv-append #vu8(#xFF #xFE 0 0) (string->utf32 str 'little)) 'big) str)
|
|
(test (utf32->string (bv-append #vu8(0 0 #xFE #xFF) (string->utf32 str 'big)) 'little) str)
|
|
(test (utf32->string (bv-append #vu8(#xFF #xFE 0 0) (string->utf32 str 'little)) 'little #t)
|
|
(string-append "\xFEFF;" str))
|
|
(test (utf32->string (bv-append #vu8(#xFE #xFF 0 0) (string->utf32 str 'little)) 'little #t)
|
|
(string-append "\xFFFE;" str))
|
|
(test (utf32->string (bv-append #vu8(0 0 #xFE #xFF) (string->utf32 str 'big)) 'big #t)
|
|
(string-append "\xFEFF;" str))
|
|
(test (utf32->string (bv-append #vu8(0 0 #xFF #xFE) (string->utf32 str 'big)) 'big #t)
|
|
(string-append "\xFFFE;" str)))
|
|
(list "apple"
|
|
"app\x3BB;e"
|
|
"\x0;\x1;\x80;\xFF;\xD7FF;\xE000;\x10FFFF;")))
|
|
|
|
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; Tests originally from Ikarus
|
|
|
|
(test (bytevector? (make-bytevector 1)) #t)
|
|
(test (bytevector? (make-bytevector 1 17)) #t)
|
|
(test (bytevector? (make-bytevector 10 -17)) #t)
|
|
(test (bytevector? 'foo) #f)
|
|
(test (bytevector? "hey") #f)
|
|
(test (bytevector? '#(2837 2398 239)) #f)
|
|
(test (bytevector-length (make-bytevector 0)) 0)
|
|
(test (bytevector-length (make-bytevector 100 -30)) 100)
|
|
(test (let ((b (u8-list->bytevector '(1 2 3 4 5 6 7 8))))
|
|
(bytevector-copy! b 0 b 3 4)
|
|
(bytevector->u8-list b))
|
|
'(1 2 3 1 2 3 4 8))
|
|
(test (bytevector-uint-ref
|
|
(u8-list->bytevector '(17))
|
|
0 'little 1)
|
|
17)
|
|
(test (bytevector-uint-ref
|
|
(u8-list->bytevector '(17))
|
|
0 'big 1)
|
|
17)
|
|
(test (bytevector-uint-ref
|
|
(u8-list->bytevector '(17 54))
|
|
0 'little 2)
|
|
(+ 17 (* 54 256)))
|
|
(test (bytevector-uint-ref
|
|
(u8-list->bytevector (reverse '(17 54)))
|
|
0 'big 2)
|
|
(+ 17 (* 54 256)))
|
|
(test (bytevector-uint-ref
|
|
(u8-list->bytevector '(17 54 98))
|
|
0 'little 3)
|
|
(+ 17 (* 54 256) (* 98 256 256)))
|
|
(test (bytevector-uint-ref
|
|
(u8-list->bytevector (reverse '(17 54 98)))
|
|
0 'big 3)
|
|
(+ 17 (* 54 256) (* 98 256 256)))
|
|
(test (bytevector-uint-ref
|
|
(u8-list->bytevector '(17 54 98 120))
|
|
0 'little 4)
|
|
(+ 17 (* 54 256) (* 98 256 256) (* 120 256 256 256)))
|
|
|
|
(test (bytevector-uint-ref
|
|
(u8-list->bytevector
|
|
'(#x89 #x04 #x39 #x82 #x49 #x20 #x93 #x48 #x17
|
|
#x83 #x79 #x94 #x38 #x87 #x34 #x97 #x38 #x12))
|
|
0 'little 18)
|
|
#x123897348738947983174893204982390489)
|
|
(test (bytevector-uint-ref
|
|
(u8-list->bytevector
|
|
(reverse
|
|
'(#x89 #x04 #x39 #x82 #x49 #x20 #x93 #x48 #x17
|
|
#x83 #x79 #x94 #x38 #x87 #x34 #x97 #x38 #x12)))
|
|
0 'big 18)
|
|
#x123897348738947983174893204982390489)
|
|
(test (let ((b (u8-list->bytevector '(1 2 3 255 1 2 1 2))))
|
|
(bytevector->uint-list b 'little 2))
|
|
'(513 65283 513 513))
|
|
(test (bytevector->u8-list
|
|
(uint-list->bytevector '(513 65283 513 513) 'little 2))
|
|
'(1 2 3 255 1 2 1 2))
|
|
(test (bytevector->u8-list
|
|
(uint-list->bytevector '(513 65283 513 513) 'big 2))
|
|
'(2 1 255 3 2 1 2 1))
|
|
(test (let ((b (u8-list->bytevector '(1 2 3 255 1 2 1 2))))
|
|
(bytevector->sint-list b 'little 2))
|
|
'(513 -253 513 513))
|
|
(test (let ((b (u8-list->bytevector '(2 1 255 3 2 1 2 1))))
|
|
(bytevector->sint-list b 'big 2))
|
|
'(513 -253 513 513))
|
|
(test (bytevector->u8-list
|
|
(sint-list->bytevector '(513 -253 513 513) 'little 2))
|
|
'(1 2 3 255 1 2 1 2))
|
|
(test (let ((b (u8-list->bytevector '(1 2 3 255 1 2 1 2))))
|
|
(bytevector->sint-list b 'little 2))
|
|
'(513 -253 513 513))
|
|
(test (let ((b (make-bytevector 16 -127)))
|
|
(bytevector-uint-set! b 0 (- (expt 2 128) 3) 'little 16)
|
|
(list
|
|
(bytevector-uint-ref b 0 'little 16)
|
|
(bytevector-sint-ref b 0 'little 16)
|
|
(bytevector->u8-list b)))
|
|
'(#xfffffffffffffffffffffffffffffffd
|
|
-3
|
|
(253 255 255 255 255 255 255 255
|
|
255 255 255 255 255 255 255 255)))
|
|
(test (let ((b (make-bytevector 16 -127)))
|
|
(bytevector-uint-set! b 0 (- (expt 2 128) 3) 'big 16)
|
|
(list
|
|
(bytevector-uint-ref b 0 'big 16)
|
|
(bytevector-sint-ref b 0 'big 16)
|
|
(bytevector->u8-list b)))
|
|
'(#xfffffffffffffffffffffffffffffffd
|
|
-3
|
|
(255 255 255 255 255 255 255 255
|
|
255 255 255 255 255 255 255 253)))
|
|
(test (bytevector->u8-list '#vu8(1 2 3 4))
|
|
'(1 2 3 4))
|
|
(test (let ((b (make-bytevector 4 0)))
|
|
(bytevector-sint-set! b 0 -1 'little 4)
|
|
(bytevector-uint-ref b 0 'little 4))
|
|
#xFFFFFFFF)
|
|
(test (let ((b (make-bytevector 4 0)))
|
|
(bytevector-sint-set! b 0 -256 'little 4)
|
|
(bytevector-uint-ref b 0 'little 4))
|
|
#xFFFFFF00)
|
|
(test (let ((b (make-bytevector 4 0)))
|
|
(bytevector-sint-set! b 0 (- (expt 256 2)) 'little 4)
|
|
(bytevector-uint-ref b 0 'little 4))
|
|
#xFFFF0000)
|
|
(test (let ((b (make-bytevector 8 0)))
|
|
(bytevector-sint-set! b 0 (- (expt 256 2)) 'little 8)
|
|
(bytevector-uint-ref b 0 'little 8))
|
|
#xFFFFFFFFFFFF0000)
|
|
(test (let ((b (make-bytevector 8 0)))
|
|
(bytevector-sint-set! b 0 (- (expt 256 4)) 'little 8)
|
|
(bytevector-uint-ref b 0 'little 8))
|
|
#xFFFFFFFF00000000)
|
|
(test (let ((b (make-bytevector 8 0)))
|
|
(bytevector-sint-set! b 0 (- (expt 256 7)) 'little 8)
|
|
(bytevector-uint-ref b 0 'little 8))
|
|
#xFF00000000000000)
|
|
(test (let ((b (make-bytevector 8 0)))
|
|
(bytevector-sint-set! b 0 (- 1 (expt 2 63)) 'little 8)
|
|
(bytevector-sint-ref b 0 'little 8))
|
|
(- 1 (expt 2 63)))
|
|
(test (let ((b (make-bytevector 4 38)))
|
|
(bytevector-sint-set! b 0 (- (expt 2 31) 1) 'little 4)
|
|
(bytevector-sint-ref b 0 'little 4))
|
|
#x7FFFFFFF)
|
|
(test (let ((b (make-bytevector 4 38)))
|
|
(bytevector-sint-set! b 0 (- (expt 2 31)) 'little 4)
|
|
(bytevector-sint-ref b 0 'little 4))
|
|
#x-80000000)
|
|
(test (let ((b (make-bytevector 5 38)))
|
|
(bytevector-sint-set! b 0 (- (expt 2 32)) 'little 5)
|
|
(bytevector-sint-ref b 0 'little 5))
|
|
#x-100000000)
|
|
(test (let ((b (make-bytevector 4 0)))
|
|
(bytevector-sint-set! b 0 -1 'big 4)
|
|
(bytevector-uint-ref b 0 'big 4))
|
|
#xFFFFFFFF)
|
|
(test (let ((b (make-bytevector 4 0)))
|
|
(bytevector-sint-set! b 0 -256 'big 4)
|
|
(bytevector-uint-ref b 0 'big 4))
|
|
#xFFFFFF00)
|
|
(test (let ((b (make-bytevector 4 0)))
|
|
(bytevector-sint-set! b 0 (- (expt 256 2)) 'big 4)
|
|
(bytevector-uint-ref b 0 'big 4))
|
|
#xFFFF0000)
|
|
(test (let ((b (make-bytevector 8 0)))
|
|
(bytevector-sint-set! b 0 (- (expt 256 2)) 'big 8)
|
|
(bytevector-uint-ref b 0 'big 8))
|
|
#xFFFFFFFFFFFF0000)
|
|
(test (let ((b (make-bytevector 8 0)))
|
|
(bytevector-sint-set! b 0 (- (expt 256 4)) 'big 8)
|
|
(bytevector-uint-ref b 0 'big 8))
|
|
#xFFFFFFFF00000000)
|
|
(test (let ((b (make-bytevector 8 0)))
|
|
(bytevector-sint-set! b 0 (- (expt 256 7)) 'big 8)
|
|
(bytevector-uint-ref b 0 'big 8))
|
|
#xFF00000000000000)
|
|
(test (let ((b (make-bytevector 8 0)))
|
|
(bytevector-sint-set! b 0 (- 1 (expt 2 63)) 'big 8)
|
|
(bytevector-sint-ref b 0 'big 8))
|
|
(- 1 (expt 2 63)))
|
|
(test (let ((b (make-bytevector 4 38)))
|
|
(bytevector-sint-set! b 0 (- (expt 2 31) 1) 'big 4)
|
|
(bytevector-sint-ref b 0 'big 4))
|
|
#x7FFFFFFF)
|
|
(test (let ((b (make-bytevector 4 38)))
|
|
(bytevector-sint-set! b 0 (- (expt 2 31)) 'big 4)
|
|
(bytevector-sint-ref b 0 'big 4))
|
|
#x-80000000)
|
|
(test (let ((b (make-bytevector 5 38)))
|
|
(bytevector-sint-set! b 0 (- (expt 2 32)) 'big 5)
|
|
(bytevector-sint-ref b 0 'big 5))
|
|
#x-100000000)
|
|
(test (bytevector-u16-ref '#vu8(255 253) 0 'little)
|
|
65023)
|
|
(test (bytevector-u16-ref '#vu8(255 253) 0 'big)
|
|
65533)
|
|
(test (bytevector-s16-ref '#vu8(255 253) 0 'little)
|
|
-513)
|
|
(test (bytevector-s16-ref '#vu8(255 253) 0 'big)
|
|
-3)
|
|
(test (let ((v (make-bytevector 2)))
|
|
(bytevector-u16-native-set! v 0 12345)
|
|
(bytevector-u16-native-ref v 0))
|
|
12345)
|
|
(test (let ((v (make-bytevector 2)))
|
|
(bytevector-u16-set! v 0 12345 'little)
|
|
(bytevector-u16-ref v 0 'little))
|
|
12345)
|
|
(test (let ((v (make-bytevector 2)))
|
|
(bytevector-u16-set! v 0 12345 'big)
|
|
(bytevector-u16-ref v 0 'big))
|
|
12345)
|
|
|
|
;;
|
|
))
|