177 lines
5.4 KiB
Scheme
177 lines
5.4 KiB
Scheme
#!r6rs
|
|
|
|
(library (tests r6rs records syntactic)
|
|
(export run-records-syntactic-tests)
|
|
(import (rnrs)
|
|
(tests r6rs test))
|
|
|
|
;; ----------------------------------------
|
|
|
|
(define-record-type (point make-point point?)
|
|
(fields (immutable x point-x)
|
|
(mutable y point-y set-point-y!))
|
|
(nongenerative
|
|
point-4893d957-e00b-11d9-817f-00111175eb9e))
|
|
|
|
(define-record-type (cpoint make-cpoint cpoint?)
|
|
(parent point)
|
|
(protocol
|
|
(lambda (n)
|
|
(lambda (x y c)
|
|
((n x y) (color->rgb c)))))
|
|
(fields
|
|
(mutable rgb cpoint-rgb cpoint-rgb-set!)))
|
|
|
|
(define-record-type (cpoint2 make-cpoint2 cpoint2?)
|
|
(parent-rtd (record-type-descriptor point)
|
|
(record-constructor-descriptor point))
|
|
(fields rgb)
|
|
(opaque #f) (sealed #f))
|
|
|
|
(define (color->rgb c)
|
|
(cons 'rgb c))
|
|
|
|
(define p1 (make-point 1 2))
|
|
(define p2 (make-cpoint 3 4 'red))
|
|
|
|
(define-record-type (ex1 make-ex1 ex1?)
|
|
(protocol (lambda (p) (lambda a (p a))))
|
|
(fields (immutable f ex1-f)))
|
|
|
|
(define ex1-i1 (make-ex1 1 2 3))
|
|
|
|
(define-record-type (ex2 make-ex2 ex2?)
|
|
(protocol
|
|
(lambda (p) (lambda (a . b) (p a b))))
|
|
(fields (immutable a ex2-a)
|
|
(immutable b ex2-b)))
|
|
|
|
(define ex2-i1 (make-ex2 1 2 3))
|
|
|
|
(define-record-type (unit-vector
|
|
make-unit-vector
|
|
unit-vector?)
|
|
(protocol
|
|
(lambda (p)
|
|
(lambda (x y z)
|
|
(let ((length
|
|
(sqrt (+ (* x x)
|
|
(* y y)
|
|
(* z z)))))
|
|
(p (/ x length)
|
|
(/ y length)
|
|
(/ z length))))))
|
|
(fields (immutable x unit-vector-x)
|
|
(immutable y unit-vector-y)
|
|
(immutable z unit-vector-z)))
|
|
|
|
(define *ex3-instance* #f)
|
|
|
|
(define-record-type ex3
|
|
(parent cpoint)
|
|
(protocol
|
|
(lambda (n)
|
|
(lambda (x y t)
|
|
(let ((r ((n x y 'red) t)))
|
|
(set! *ex3-instance* r)
|
|
r))))
|
|
(fields
|
|
(mutable thickness))
|
|
(sealed #t) (opaque #t))
|
|
|
|
(define ex3-i1 (make-ex3 1 2 17))
|
|
|
|
(define-record-type (tag make-tag tag?))
|
|
(define-record-type (otag make-otag otag?) (opaque #t))
|
|
(define-record-type (stag make-stag stag?) (sealed #t))
|
|
(define-record-type (ostag make-ostag ostag?) (opaque #t) (sealed #t))
|
|
|
|
;; ----------------------------------------
|
|
|
|
(define (run-records-syntactic-tests)
|
|
(test (point? p1) #t)
|
|
(test (point? p2) #t)
|
|
(test (point? (vector)) #f)
|
|
(test (point? (cons 'a 'b)) #f)
|
|
(test (cpoint? p1) #f)
|
|
(test (cpoint? p2) #t)
|
|
(test (point-x p1) 1)
|
|
(test (point-y p1) 2)
|
|
(test (point-x p2) 3)
|
|
(test (point-y p2) 4)
|
|
(test (cpoint-rgb p2) '(rgb . red))
|
|
|
|
(test/unspec (set-point-y! p1 17))
|
|
(test (point-y p1) 17)
|
|
|
|
(test (record-rtd p1) (record-type-descriptor point))
|
|
|
|
(test (ex1-f ex1-i1) '(1 2 3))
|
|
|
|
(test (ex2-a ex2-i1) 1)
|
|
(test (ex2-b ex2-i1) '(2 3))
|
|
|
|
(test (ex3? ex3-i1) #t)
|
|
(test (cpoint-rgb ex3-i1) '(rgb . red))
|
|
(test (ex3-thickness ex3-i1) 17)
|
|
(test/unspec (ex3-thickness-set! ex3-i1 18))
|
|
(test (ex3-thickness ex3-i1) 18)
|
|
(test *ex3-instance* ex3-i1)
|
|
|
|
(test (record? p1) #t)
|
|
(test (record? ex3-i1) #f)
|
|
|
|
(test (record-type-name (record-type-descriptor point)) 'point)
|
|
(test (record-type-name (record-type-descriptor cpoint2)) 'cpoint2)
|
|
(test (record-type-name (record-type-descriptor ex1)) 'ex1)
|
|
|
|
(test (record-type-parent (record-type-descriptor point)) #f)
|
|
(test (record-type-parent (record-type-descriptor cpoint2)) (record-type-descriptor point))
|
|
|
|
(test (record-type-uid (record-type-descriptor point)) 'point-4893d957-e00b-11d9-817f-00111175eb9e)
|
|
(test/unspec (record-type-uid (record-type-descriptor cpoint2)))
|
|
(test/unspec (record-type-uid (record-type-descriptor ex1)))
|
|
|
|
(test (record-type-generative? (record-type-descriptor point)) #f)
|
|
(test (record-type-generative? (record-type-descriptor cpoint2)) #t)
|
|
(test (record-type-generative? (record-type-descriptor ex1)) #t)
|
|
|
|
(test (record-type-sealed? (record-type-descriptor point)) #f)
|
|
(test (record-type-sealed? (record-type-descriptor ex3)) #t)
|
|
|
|
(test (record-type-opaque? (record-type-descriptor point)) #f)
|
|
(test (record-type-opaque? (record-type-descriptor ex3)) #t)
|
|
|
|
(test (record-type-field-names (record-type-descriptor point)) '#(x y))
|
|
(test (record-type-field-names (record-type-descriptor cpoint2)) '#(rgb))
|
|
|
|
(test (record-field-mutable? (record-type-descriptor point) 0) #f)
|
|
(test (record-field-mutable? (record-type-descriptor point) 1) #t)
|
|
(test (record-field-mutable? (record-type-descriptor cpoint) 0) #t)
|
|
|
|
;; Tests from Alan Watson:
|
|
(test (eqv? (equal? (make-tag) (make-tag)) (eqv? (make-tag) (make-tag)))
|
|
#t)
|
|
(test (eqv? (equal? (make-otag) (make-otag)) (eqv? (make-otag) (make-otag)))
|
|
#t)
|
|
(test (eqv? (equal? (make-stag) (make-stag)) (eqv? (make-stag) (make-stag)))
|
|
#t)
|
|
(test (eqv? (equal? (make-ostag) (make-ostag)) (eqv? (make-ostag) (make-ostag)))
|
|
#t)
|
|
(test (let ([t (make-tag)])
|
|
(eqv? (equal? t t) (eqv? t t)))
|
|
#t)
|
|
(test (let ([t (make-otag)])
|
|
(eqv? (equal? t t) (eqv? t t)))
|
|
#t)
|
|
(test (let ([t (make-stag)])
|
|
(eqv? (equal? t t) (eqv? t t)))
|
|
#t)
|
|
(test (let ([t (make-ostag)])
|
|
(eqv? (equal? t t) (eqv? t t)))
|
|
#t)
|
|
|
|
;;
|
|
))
|
|
|