237 lines
6.9 KiB
Plaintext
237 lines
6.9 KiB
Plaintext
;; ==========================================================================
|
|
;; test-bytevectors.sx — Tests for bytevector primitives
|
|
;; ==========================================================================
|
|
|
|
;; --------------------------------------------------------------------------
|
|
;; make-bytevector / bytevector?
|
|
;; --------------------------------------------------------------------------
|
|
|
|
(defsuite
|
|
"bv:create"
|
|
(deftest
|
|
"make-bytevector returns bytevector"
|
|
(assert (bytevector? (make-bytevector 4))))
|
|
(deftest
|
|
"make-bytevector zeroes by default"
|
|
(let
|
|
((bv (make-bytevector 3)))
|
|
(assert
|
|
(and
|
|
(= (bytevector-u8-ref bv 0) 0)
|
|
(= (bytevector-u8-ref bv 1) 0)
|
|
(= (bytevector-u8-ref bv 2) 0)))))
|
|
(deftest
|
|
"make-bytevector with fill"
|
|
(let
|
|
((bv (make-bytevector 3 42)))
|
|
(assert
|
|
(and
|
|
(= (bytevector-u8-ref bv 0) 42)
|
|
(= (bytevector-u8-ref bv 1) 42)
|
|
(= (bytevector-u8-ref bv 2) 42)))))
|
|
(deftest
|
|
"make-bytevector length 0"
|
|
(assert= (bytevector-length (make-bytevector 0)) 0))
|
|
(deftest
|
|
"bytevector? true for bytevector"
|
|
(assert (bytevector? (make-bytevector 2))))
|
|
(deftest
|
|
"bytevector? false for string"
|
|
(assert (not (bytevector? "hello"))))
|
|
(deftest "bytevector? false for nil" (assert (not (bytevector? nil))))
|
|
(deftest
|
|
"bytevector? false for list"
|
|
(assert (not (bytevector? (list 1 2 3))))))
|
|
|
|
;; --------------------------------------------------------------------------
|
|
;; bytevector-length / u8-ref / u8-set!
|
|
;; --------------------------------------------------------------------------
|
|
|
|
(defsuite
|
|
"bv:access"
|
|
(deftest
|
|
"bytevector-length"
|
|
(assert= (bytevector-length (make-bytevector 5)) 5))
|
|
(deftest
|
|
"u8-ref reads fill byte"
|
|
(assert=
|
|
(bytevector-u8-ref (make-bytevector 4 99) 2)
|
|
99))
|
|
(deftest
|
|
"u8-set! mutates"
|
|
(let
|
|
((bv (make-bytevector 3 0)))
|
|
(bytevector-u8-set! bv 1 200)
|
|
(assert= (bytevector-u8-ref bv 1) 200)))
|
|
(deftest
|
|
"u8-set! boundary byte 255"
|
|
(let
|
|
((bv (make-bytevector 1 0)))
|
|
(bytevector-u8-set! bv 0 255)
|
|
(assert= (bytevector-u8-ref bv 0) 255)))
|
|
(deftest
|
|
"u8-set! byte 0"
|
|
(let
|
|
((bv (make-bytevector 1 255)))
|
|
(bytevector-u8-set! bv 0 0)
|
|
(assert= (bytevector-u8-ref bv 0) 0))))
|
|
|
|
;; --------------------------------------------------------------------------
|
|
;; bytevector-copy
|
|
;; --------------------------------------------------------------------------
|
|
|
|
(defsuite
|
|
"bv:copy"
|
|
(deftest
|
|
"copy produces equal content"
|
|
(let
|
|
((bv (make-bytevector 3 7)))
|
|
(let
|
|
((bv2 (bytevector-copy bv)))
|
|
(assert
|
|
(and
|
|
(= (bytevector-u8-ref bv2 0) 7)
|
|
(= (bytevector-u8-ref bv2 1) 7)
|
|
(= (bytevector-u8-ref bv2 2) 7))))))
|
|
(deftest
|
|
"copy is independent"
|
|
(let
|
|
((bv (make-bytevector 2 0)))
|
|
(let
|
|
((bv2 (bytevector-copy bv)))
|
|
(bytevector-u8-set! bv2 0 99)
|
|
(assert= (bytevector-u8-ref bv 0) 0))))
|
|
(deftest
|
|
"copy with start"
|
|
(let
|
|
((bv (list->bytevector (list 10 20 30 40))))
|
|
(let
|
|
((bv2 (bytevector-copy bv 2)))
|
|
(assert
|
|
(and
|
|
(= (bytevector-length bv2) 2)
|
|
(= (bytevector-u8-ref bv2 0) 30))))))
|
|
(deftest
|
|
"copy with start and end"
|
|
(let
|
|
((bv (list->bytevector (list 10 20 30 40))))
|
|
(let
|
|
((bv2 (bytevector-copy bv 1 3)))
|
|
(assert
|
|
(and
|
|
(= (bytevector-length bv2) 2)
|
|
(= (bytevector-u8-ref bv2 0) 20)
|
|
(= (bytevector-u8-ref bv2 1) 30)))))))
|
|
|
|
;; --------------------------------------------------------------------------
|
|
;; bytevector-copy!
|
|
;; --------------------------------------------------------------------------
|
|
|
|
(defsuite
|
|
"bv:copy-bang"
|
|
(deftest
|
|
"copy! overwrites dst region"
|
|
(let
|
|
((dst (make-bytevector 4 0)))
|
|
(let
|
|
((src (list->bytevector (list 1 2 3))))
|
|
(bytevector-copy! dst 1 src)
|
|
(assert
|
|
(and
|
|
(= (bytevector-u8-ref dst 0) 0)
|
|
(= (bytevector-u8-ref dst 1) 1)
|
|
(= (bytevector-u8-ref dst 2) 2)
|
|
(= (bytevector-u8-ref dst 3) 3))))))
|
|
(deftest
|
|
"copy! with src bounds"
|
|
(let
|
|
((dst (make-bytevector 2 0)))
|
|
(let
|
|
((src (list->bytevector (list 10 20 30 40))))
|
|
(bytevector-copy! dst 0 src 1 3)
|
|
(assert
|
|
(and
|
|
(= (bytevector-u8-ref dst 0) 20)
|
|
(= (bytevector-u8-ref dst 1) 30)))))))
|
|
|
|
;; --------------------------------------------------------------------------
|
|
;; bytevector-append
|
|
;; --------------------------------------------------------------------------
|
|
|
|
(defsuite
|
|
"bv:append"
|
|
(deftest
|
|
"append two bytevectors"
|
|
(let
|
|
((bv (bytevector-append (list->bytevector (list 1 2)) (list->bytevector (list 3 4)))))
|
|
(assert
|
|
(and
|
|
(= (bytevector-length bv) 4)
|
|
(= (bytevector-u8-ref bv 0) 1)
|
|
(= (bytevector-u8-ref bv 3) 4)))))
|
|
(deftest
|
|
"append three bytevectors"
|
|
(let
|
|
((bv (bytevector-append (list->bytevector (list 1)) (list->bytevector (list 2)) (list->bytevector (list 3)))))
|
|
(assert= (bytevector-length bv) 3)))
|
|
(deftest
|
|
"append empty"
|
|
(assert=
|
|
(bytevector-length
|
|
(bytevector-append
|
|
(make-bytevector 0)
|
|
(make-bytevector 0)))
|
|
0)))
|
|
|
|
;; --------------------------------------------------------------------------
|
|
;; list->bytevector / bytevector->list
|
|
;; --------------------------------------------------------------------------
|
|
|
|
(defsuite
|
|
"bv:conversion"
|
|
(deftest
|
|
"list->bytevector roundtrip"
|
|
(let
|
|
((lst (list 10 20 30)))
|
|
(assert= (bytevector->list (list->bytevector lst)) lst)))
|
|
(deftest
|
|
"list->bytevector empty"
|
|
(assert= (bytevector-length (list->bytevector nil)) 0))
|
|
(deftest
|
|
"bytevector->list from make-bytevector"
|
|
(let
|
|
((lst (bytevector->list (make-bytevector 3 5))))
|
|
(assert= lst (list 5 5 5)))))
|
|
|
|
;; --------------------------------------------------------------------------
|
|
;; utf8 roundtrip
|
|
;; --------------------------------------------------------------------------
|
|
|
|
(defsuite
|
|
"bv:utf8"
|
|
(deftest
|
|
"string->utf8 returns bytevector"
|
|
(assert (bytevector? (string->utf8 "hello"))))
|
|
(deftest
|
|
"string->utf8 length"
|
|
(assert= (bytevector-length (string->utf8 "abc")) 3))
|
|
(deftest
|
|
"utf8->string roundtrip"
|
|
(assert= (utf8->string (string->utf8 "hello")) "hello"))
|
|
(deftest
|
|
"utf8->string with slice"
|
|
(let
|
|
((bv (string->utf8 "hello")))
|
|
(assert= (utf8->string bv 1 4) "ell")))
|
|
(deftest
|
|
"string->utf8 with start"
|
|
(assert= (utf8->string (string->utf8 "hello" 2)) "llo"))
|
|
(deftest
|
|
"string->utf8 with start and end"
|
|
(assert=
|
|
(utf8->string (string->utf8 "hello" 1 4))
|
|
"ell"))
|
|
(deftest
|
|
"empty string round-trips"
|
|
(assert= (utf8->string (string->utf8 "")) "")))
|