~ chicken-core (chicken-5) /tests/lolevel-tests.scm
Trap1;;;; Unit lolevel testing23(import chicken.format chicken.locative chicken.platform4 chicken.memory chicken.memory.representation srfi-4)56(define-syntax assert-error7 (syntax-rules ()8 ((_ expr)9 (assert (handle-exceptions _ #t expr #f)))))1011; move-memory!1213(let ((s "..."))14 (assert-error (move-memory! "abc" s 3 -1)))1516; overlapping src and dest, moving "right" (from SRFI-13 tests)17(assert (string=?18 "aabce"19 (let ((str (string-copy "abcde")))20 (move-memory! str str 3 0 1) str)))21;; Specialisation rewrite from types.db22(assert (string=?23 "aabce"24 (let ((str (string-copy "abcde")))25 (move-memory! (make-locative str) (make-locative str) 3 0 1) str)))2627; overlapping src and dest, moving "left" (from SRFI-13 tests)28(assert (string=?29 "bcdde"30 (let ((str (string-copy "abcde")))31 (move-memory! str str 3 1) str)))32;; Specialisation rewrite from types.db33(assert (string=?34 "bcdde"35 (let ((str (string-copy "abcde")))36 (move-memory! (make-locative str) (make-locative str) 3 1) str)))3738; object-copy3940; allocate4142(define some-chunk (allocate 23))4344(assert some-chunk)4546; free4748(free some-chunk)4950(define some-chunk (allocate 23))5152; pointer?5354(assert (pointer? some-chunk))5556; pointer-like?5758(assert (pointer-like? some-chunk))5960(assert (pointer-like? allocate))6162; address->pointer6364; pointer->address6566; object->pointer6768; pointer->object6970; pointer=?7172(assert (pointer=? some-chunk (address->pointer (pointer->address some-chunk))))7374; pointer+7576(assert (pointer=? (address->pointer #x9) (pointer+ (address->pointer #x5) #x4)))7778; align-to-word7980; pointer-u8-set!8182; pointer-s8-set!8384; pointer-u16-set!8586; pointer-s16-set!8788; pointer-u32-set!8990; pointer-s32-set!9192; pointer-u64-set!9394; pointer-s64-set!9596; pointer-f32-set!9798; pointer-f64-set!99100; pointer-u8-ref101102(set! (pointer-u8-ref some-chunk) 255)103104(assert (= 255 (pointer-u8-ref some-chunk)))105106; pointer-s8-ref107108(set! (pointer-s8-ref some-chunk) -1)109110(assert (= -1 (pointer-s8-ref some-chunk)))111112; pointer-u16-ref113114; pointer-s16-ref115116; pointer-u32-ref117118; pointer-s32-ref119120; pointer-u64-ref121122; pointer-s64-ref123124; pointer-f32-ref125126; pointer-f64-ref127128; tag-pointer129130(define some-unique-tag '#(vector foo bar))131132(define some-tagged-pointer (tag-pointer some-chunk some-unique-tag))133134(assert some-tagged-pointer)135136; tagged-pointer?137138(assert (tagged-pointer? some-tagged-pointer))139140(assert (tagged-pointer? some-tagged-pointer some-unique-tag))141142; pointer-tag143144(assert (eq? some-unique-tag (pointer-tag some-tagged-pointer)))145146; make-locative, locative-ref, locative-set!, locative?147148;; Reverse an object vector of the given type by going through149;; locatives.150(define-syntax check-type-locative151 (ir-macro-transformer152 (lambda (e i c)153 (let* ((type (strip-syntax (cadr e)))154 (inits (cddr e))155 (size (length inits))156 (construct type)157 (make (i (symbol-append 'make- type)))158 (ref (i (symbol-append type '-ref))))159 `(let* ((old (,construct ,@inits))160 (new (,make ,size)))161 ;; Copy first162 (do ((i 0 (add1 i)))163 ((= i ,size))164 (let ((loc-src (make-locative old i))165 (loc-dst (make-locative new (- ,size i 1))))166 (assert (locative? loc-src))167 (assert (locative? loc-dst))168 (locative-set! loc-dst (locative-ref loc-src))))169 (printf "\nold: ~S\nnew: ~S\n" old new)170 ;; Now compare (unroll loop for better error reporting)171 ,@(let lp ((i 0) (res '()))172 (if (= i size)173 res174 (lp (add1 i)175 ;; Note: we must use eqv? because extraction176 ;; may cause fresh object allocation.177 (cons `(assert (eqv? (,ref old ,i)178 (,ref new ,(- size i 1))))179 res)))))))))180181(check-type-locative string #\nul #\y #\o #\xff)182(check-type-locative vector 'yo 1 2 #f #t '(1 2 3) #(1 2 3))183(check-type-locative u8vector 0 1 2 #xfe #xff)184(check-type-locative s8vector #x-80 #x-7f -2 -1 0 1 2 #x7e #x7f)185(check-type-locative u16vector 0 1 2 #xfffe #xffff)186(check-type-locative s16vector #x-8000 #x-7fff -2 -1 0 1 2 #x7ffe #x7fff)187(check-type-locative u32vector 0 1 2 #xfffffffe #xffffffff)188(check-type-locative s32vector189 #x-80000000 #x-7fffffff -2 -1190 0 1 2 #x7ffffffe #x7fffffff)191(check-type-locative u64vector192 0 1 2 #xfffffffffffffffe #xffffffffffffffff)193(check-type-locative s64vector194 #x-8000000000000000 #x-7fffffffffffffff -2 -1195 0 1 2 #x7ffffffffffffffe #x7fffffffffffffff)196;; TODO: better/more extreme values?197(check-type-locative f32vector -1e100 -2.0 -1.0 0.0 1.0 2.0 1e100)198(check-type-locative f64vector -1e200 -2.0 -1.0 0.0 1.0 2.0 1e200)199200; make-weak-locative201202; locative->object203204; locative-index205206;; Default index (0)207(assert (= 0 (locative-index (make-locative '(0 . 1)))))208(assert (= 0 (locative-index (make-locative #(a b c d e)))))209(assert (= 0 (locative-index (make-locative "abcde"))))210(assert (= 0 (locative-index (make-locative #${012345}))))211(assert (= 0 (locative-index (make-locative #u8(0 1 2 3 4)))))212(assert (= 0 (locative-index (make-locative #s8(0 1 2 3 4)))))213(assert (= 0 (locative-index (make-locative #u16(0 1 2 3 4)))))214(assert (= 0 (locative-index (make-locative #s16(0 1 2 3 4)))))215(assert (= 0 (locative-index (make-locative #u32(0 1 2 3 4)))))216(assert (= 0 (locative-index (make-locative #s32(0 1 2 3 4)))))217(assert (= 0 (locative-index (make-locative #u64(0 1 2 3 4)))))218(assert (= 0 (locative-index (make-locative #s64(0 1 2 3 4)))))219(assert (= 0 (locative-index (make-locative #f32(0 1 2 3 4)))))220(assert (= 0 (locative-index (make-locative #f64(0 1 2 3 4)))))221222;; Given index argument223(assert (= 1 (locative-index (make-locative '(0 . 1) 1))))224(assert (= 2 (locative-index (make-locative #(a b c d e) 2))))225(assert (= 3 (locative-index (make-locative "abcde" 3))))226(assert (= 2 (locative-index (make-locative #${01234} 2))))227(assert (= 1 (locative-index (make-locative #u8(0 1 2 3 4) 1))))228(assert (= 2 (locative-index (make-locative #s8(0 1 2 3 4) 2))))229(assert (= 3 (locative-index (make-locative #u16(0 1 2 3 4) 3))))230(assert (= 2 (locative-index (make-locative #s16(0 1 2 3 4) 2))))231(assert (= 1 (locative-index (make-locative #u32(0 1 2 3 4) 1))))232(assert (= 2 (locative-index (make-locative #s32(0 1 2 3 4) 2))))233(assert (= 3 (locative-index (make-locative #u64(0 1 2 3 4) 3))))234(assert (= 2 (locative-index (make-locative #s64(0 1 2 3 4) 2))))235(assert (= 1 (locative-index (make-locative #f32(0 1 2 3 4) 1))))236(assert (= 2 (locative-index (make-locative #f64(0 1 2 3 4) 2))))237238; extend-procedure239240(define (foo a b) (list a b))241242(define unique-proc-data-1 '(23 'skidoo))243244(define new-foo (extend-procedure foo unique-proc-data-1))245246(assert (not (eq? foo new-foo)))247248(define foo new-foo)249250; extended-procedure?251252(assert (extended-procedure? foo))253254; procedure-data255256(assert (eq? unique-proc-data-1 (procedure-data foo)))257258; set-procedure-data!259260(define unique-proc-data-2 '(23 'skidoo))261262(set-procedure-data! foo unique-proc-data-2)263264(assert (eq? unique-proc-data-2 (procedure-data foo)))265266; block-set!267268(define some-block (vector 1 2 3 4))269270(block-set! some-block 2 5)271272; block-ref273274(assert (= 5 (block-ref some-block 2)))275276; number-of-slots277278(assert (= 4 (number-of-slots some-block)))279280; number-of-bytes281282(assert (= 4 (number-of-bytes "abcd")))283284(assert (= (if (feature? #:64bit) 8 4) (number-of-bytes '#(1))))285286; make-record-instance287288(define some-record (make-record-instance 'test 'a 1))289290(assert some-record)291292; record-instance?293294(assert (record-instance? some-record))295296(assert (record-instance? some-record 'test))297298; record-instance-type299300(assert (eq? 'test (record-instance-type some-record)))301302; record-instance-length303304(assert (= 2 (record-instance-length some-record)))305306; record-instance-slot-set!307308; record-instance-slot309310(assert (eq? 1 (record-instance-slot some-record 1)))311312(record-instance-slot-set! some-record 1 'b)313314(assert (eq? 'b (record-instance-slot some-record 1)))315316; record->vector317318(assert (equal? '#(test a b) (record->vector some-record)))319320; object-become!321322(define some-foo '#(1 2 3))323324(define some-bar '(1 2 3))325326(object-become! (list (cons some-foo '(1 2 3)) (cons some-bar '#(1 2 3))))327328(assert (pair? some-foo))329330(assert (vector? some-bar))331332; mutate-procedure!333334(assert (equal? '(1 2) (foo 1 2)))335336(define new-foo337 (mutate-procedure! foo (lambda (new) (lambda args (cons 'hello (apply new args))))))338339(assert (not (eq? foo new-foo)))340341(assert (equal? '(hello 1 2) (foo 1 2)))342343; pointer vectors344345(define pv (make-pointer-vector 42 #f))346(assert (= 42 (pointer-vector-length pv)))347(assert (not (pointer-vector-ref pv 0)))348(pointer-vector-set! pv 1 (address->pointer 999))349(set! (pointer-vector-ref pv 40) (address->pointer 777))350(assert (not (pointer-vector-ref pv 0)))351(assert (not (pointer-vector-ref pv 41)))352(assert (= (pointer->address (pointer-vector-ref pv 1)) 999))353(assert (= (pointer->address (pointer-vector-ref pv 40)) 777))354(pointer-vector-fill! pv (address->pointer 1))355(assert (= 1 (pointer->address (pointer-vector-ref pv 0))))356357#+(not csi)358(begin359 (define pv1360 (foreign-lambda* bool ((pointer-vector pv))361 "C_return(pv == NULL);"))362 (define pv2363 (foreign-lambda* c-pointer ((pointer-vector pv) (bool f))364 "static void *xx = (void *)123;"365 "if(f) pv[ 0 ] = xx;"366 "C_return(xx);"))367 (assert (eq? #t (pv1 #f)))368 (define p (pv2 pv #t))369 (assert (pointer=? p (pv2 pv #f))))