~ chicken-core (chicken-5) /tests/srfi-4-tests.scm
Trap1;;;; srfi-4-tests.scm
2
3
4(import (srfi 4) (chicken port))
5(import-for-syntax (chicken base))
6
7(define-syntax test1
8 (er-macro-transformer
9 (lambda (x r c)
10 (let* ((t (strip-syntax (cadr x)))
11 (name (symbol->string (strip-syntax t)))
12 (min (caddr x))
13 (max (cadddr x)))
14 (define (conc op)
15 (string->symbol (string-append name op)))
16 `(let ((x (,(conc "vector") 100 101)))
17 (assert (eqv? 100 (,(conc "vector-ref") x 0)))
18 (assert (,(conc "vector?") x))
19 (assert (number-vector? x))
20 ;; Test direct setter and ref
21 (,(conc "vector-set!") x 1 99)
22 (assert (eqv? 99 (,(conc "vector-ref") x 1)))
23 ;; Test SRFI-17 generalised set! and ref
24 (set! (,(conc "vector-ref") x 0) 127)
25 (assert (eqv? 127 (,(conc "vector-ref") x 0)))
26 ;; Ensure length is okay
27 (assert (= 2 (,(conc "vector-length") x)))
28 (assert
29 (let ((result (,(conc "vector->list") x)))
30 (and (eqv? 127 (car result))
31 (eqv? 99 (cadr result))))))))))
32
33(define-syntax test-subv
34 (er-macro-transformer
35 (lambda (x r c)
36 (let* ((t (strip-syntax (cadr x)))
37 (make (symbol-append 'make- t 'vector))
38 (subv (symbol-append 'sub t 'vector))
39 (len (symbol-append t 'vector-length)))
40 `(let ((x (,make 10)))
41 (assert (eq? (,len (,subv x 0 5)) 5)))))))
42
43(test-subv u8)
44(test-subv s8)
45(test-subv u16)
46(test-subv s16)
47(test-subv u32)
48(test-subv s32)
49(test-subv u64)
50(test-subv s64)
51
52(test1 u8 0 255)
53(test1 u16 0 65535)
54(test1 u32 0 4294967295)
55(test1 u64 0 18446744073709551615)
56(test1 s8 -128 127)
57(test1 s16 -32768 32767)
58(test1 s32 -2147483648 2147483647)
59(test1 s64 -9223372036854775808 9223372036854775807)
60
61(define-syntax test2
62 (er-macro-transformer
63 (lambda (x r c)
64 (let* ((t (strip-syntax (cadr x)))
65 (name (symbol->string (strip-syntax t))))
66 (define (conc op)
67 (string->symbol (string-append name op)))
68 `(let ((x (,(conc "vector") 100 101.0)))
69 (assert (eqv? 100.0 (,(conc "vector-ref") x 0)))
70 (assert (eqv? 101.0 (,(conc "vector-ref") x 1)))
71 (assert (,(conc "vector?") x))
72 (assert (number-vector? x))
73 (,(conc "vector-set!") x 1 99)
74 (assert (eqv? 99.0 (,(conc "vector-ref") x 1)))
75 (assert (= 2 (,(conc "vector-length") x)))
76 (assert
77 (let ((result (,(conc "vector->list") x)))
78 (and (eqv? 100.0 (car result))
79 (eqv? 99.0 (cadr result))))))))))
80
81(test2 f32)
82(test2 f64)
83
84;; Test implicit quoting/self evaluation
85(assert (equal? #u8(1 2 3) '#u8(1 2 3)))
86(assert (equal? #s8(-1 2 3) '#s8(-1 2 3)))
87(assert (equal? #u16(1 2 3) '#u16(1 2 3)))
88(assert (equal? #s16(-1 2 3) '#s16(-1 2 3)))
89(assert (equal? #u32(1 2 3) '#u32(1 2 3)))
90(assert (equal? #u64(1 2 3) '#u64(1 2 3)))
91(assert (equal? #s32(-1 2 3) '#s32(-1 2 3)))
92(assert (equal? #s64(-1 2 3) '#s64(-1 2 3)))
93(assert (equal? #f32(1 2 3) '#f32(1 2 3)))
94(assert (equal? #f64(-1 2 3) '#f64(-1 2 3)))
95
96;; Ticket #1124: read-u8vector! w/o length, dest smaller than source.
97(let ((input (open-input-string "abcdefghijklmnopqrstuvwxyz"))
98 (u8vec (make-u8vector 10)))
99 (assert (= 10 (read-u8vector! #f u8vec input)))
100 (assert (equal? u8vec #u8(97 98 99 100 101 102 103 104 105 106)))
101 (assert (= 5 (read-u8vector! #f u8vec input 5)))
102 (assert (equal? u8vec #u8(97 98 99 100 101 107 108 109 110 111)))
103 (assert (= 5 (read-u8vector! 5 u8vec input)))
104 (assert (equal? u8vec #u8(112 113 114 115 116 107 108 109 110 111)))
105 (assert (= 6 (read-u8vector! 10 u8vec input)))
106 (assert (equal? u8vec #u8(117 118 119 120 121 122 108 109 110 111))))
107
108(let ((input (open-input-string "abcdefghijklmnopqrs")))
109 (assert (equal? (read-u8vector 5 input)
110 #u8(97 98 99 100 101)))
111 (assert (equal? (read-u8vector 5 input) #u8(102 103 104 105 106)))
112 (assert (equal? (read-u8vector #f input)
113 #u8(107 108 109 110 111 112 113 114 115)))
114 (with-input-from-string "abcdefghijklmnopqrs"
115 (lambda ()
116 (assert (equal? (read-u8vector 5)
117 #u8(97 98 99 100 101)))
118 (assert (equal? (read-u8vector 5) #u8(102 103 104 105 106)))
119 (assert (equal? (read-u8vector)
120 #u8(107 108 109 110 111 112 113 114 115))))))
121
122(assert (string=?
123 "abc"
124 (with-output-to-string
125 (lambda ()
126 (write-u8vector #u8(97 98 99))))))
127
128(assert (string=?
129 "bc"
130 (with-output-to-string
131 (lambda ()
132 (write-u8vector #u8(97 98 99) (current-output-port) 1)))))
133
134(assert (string=?
135 "a"
136 (with-output-to-string
137 (lambda ()
138 (write-u8vector #u8(97 98 99) (current-output-port) 0 1)))))
139
140(assert (string=?
141 "b"
142 (with-output-to-string
143 (lambda ()
144 (write-u8vector #u8(97 98 99) (current-output-port) 1 2)))))
145
146(assert (string=?
147 ""
148 (with-output-to-string
149 (lambda ()
150 (write-u8vector #u8())))))
151
152; make sure the N parameter is a fixnum
153(assert
154 (handle-exceptions exn #t
155 (make-f64vector 4.0) #f))
156; catch the overflow
157(assert
158 (handle-exceptions exn #t
159 (make-f64vector most-positive-fixnum) #f))
160
161;; test special read-syntax
162
163(let ((cases '(("#u8(1 2 #\\A)" #u8(1 2 65))
164 ("#u8(\"abc\")" #u8(97 98 99))
165 ("#u8\"abc\"" #u8(97 98 99))
166 ("#u8(\"\")" #u8())
167 ("#u8(\"\" \"a\")" #u8(97))
168 ("#u8(\"a\" \"\")" #u8(97))
169 ("#u8\"\"" #u8())
170 ("#s8\"\"" #s8())
171 ("#u64(\" \" #\\! 1 \"A\")" #u64(32 33 1 65))
172 ("#u64(\" \" #\\! \"A\" 1)" #u64(32 33 65 1)))))
173 (do ((cs cases (cdr cs)))
174 ((null? cs))
175 (let ((x (with-input-from-string (caar cs) read)))
176 (unless (equal? x (cadar cs))
177 (error "failed" x (cadar cs))))))