Author: yamakenz
Date: Mon Apr 28 14:41:05 2008
New Revision: 5458
Added:
trunk/test2/test-light-record.scm
Modified:
trunk/scm/light-record.scm
trunk/test2/Makefile.am
Log:
* scm/light-record.scm
- (%retrieve-record-accessor):
* Add arg 'key' to fix accessor identification
- (%make-record-getter, %make-record-setter): Fix accessor
unification
- (%define-record-getter, %define-record-setter,
define-record-generic): Fix broken macro expansion
* test2/test-light-record.scm
- New file
- Add tests for light-record.scm. All tests are passed
* test2/Makefile.am
- (uim_tests): Add test-light-record.scm
Modified: trunk/scm/light-record.scm
==============================================================================
--- trunk/scm/light-record.scm (original)
+++ trunk/scm/light-record.scm Mon Apr 28 14:41:05 2008
@@ -1,6 +1,6 @@
;;; light-record.scm: Lightweight record types
;;;
-;;; Copyright (c) 2007 uim Project http://code.google.com/p/uim/
+;;; Copyright (c) 2007-2008 uim Project http://code.google.com/p/uim/
;;;
;;; All rights reserved.
;;;
@@ -151,8 +151,8 @@
(set-car! (cdr l) v)))
((2 . ,%list-set!) . ,(lambda (l v)
(set-car! (cddr l) v))))))
- (lambda (index accessor)
- (let ((pool-key (cons index accessor)))
+ (lambda (index key accessor)
+ (let ((pool-key (cons index key)))
(cond
((assoc pool-key pool) => cdr)
(else
@@ -163,25 +163,23 @@
(lambda (index record-ref)
(let ((getter (lambda (rec)
(record-ref rec index))))
- (%retrieve-record-accessor index getter))))
+ (%retrieve-record-accessor index record-ref getter))))
(define %make-record-setter
(lambda (index record-set!)
(let ((setter (lambda (rec val)
(record-set! rec index val))))
- (%retrieve-record-accessor index setter))))
+ (%retrieve-record-accessor index record-set! setter))))
(define-macro %define-record-getter
(lambda (rec-name fld-name index record-ref)
- (let ((getter-name (make-record-getter-name rec-name fld-name))
- (getter (%make-record-getter index record-ref)))
- `(define ,getter-name ,getter))))
+ (let ((getter-name (make-record-getter-name rec-name fld-name)))
+ `(define ,getter-name (%make-record-getter ,index ,record-ref)))))
(define-macro %define-record-setter
(lambda (rec-name fld-name index record-set!)
- (let ((setter-name (make-record-setter-name rec-name fld-name))
- (setter (%make-record-setter index record-set!)))
- `(define ,setter-name ,setter))))
+ (let ((setter-name (make-record-setter-name rec-name fld-name)))
+ `(define ,setter-name (%make-record-setter ,index ,record-set!)))))
;;(define-macro %define-record-accessors
;; (lambda (rec-name fld-specs record-ref record-set!)
@@ -206,8 +204,8 @@
;; define record object duplicator
(define ,(make-record-duplicator-name rec-name) ,record-copy)
;; define record field accessors
- (cons 'begin
- ,(map (lambda (fld-name index)
+ ,(cons 'begin
+ (map (lambda (fld-name index)
`(begin
(%define-record-getter ,rec-name ,fld-name ,index
,record-ref)
Modified: trunk/test2/Makefile.am
==============================================================================
--- trunk/test2/Makefile.am (original)
+++ trunk/test2/Makefile.am Mon Apr 28 14:41:05 2008
@@ -1,5 +1,8 @@
+# Type 'make check' to run all tests.
+
uim_tests = \
test-fail.scm \
+ test-light-record.scm \
test-template.scm
uim_optional_tests =
uim_xfail_tests = test-fail.scm
Added: trunk/test2/test-light-record.scm
==============================================================================
--- (empty file)
+++ trunk/test2/test-light-record.scm Mon Apr 28 14:41:05 2008
@@ -0,0 +1,595 @@
+;; test-template.scm: Unit tests for light-record.scm
+;;
+;;; Copyright (c) 2008 uim Project http://code.google.com/p/uim/
+;;
+;; All rights reserved.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following conditions
+;; are met:
+;;
+;; 1. Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; 2. Redistributions in binary form must reproduce the above copyright
+;; notice, this list of conditions and the following disclaimer in the
+;; documentation and/or other materials provided with the distribution.
+;; 3. Neither the name of authors nor the names of its contributors
+;; may be used to endorse or promote products derived from this software
+;; without specific prior written permission.
+;;
+;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
CONTRIBUTORS ``AS
+;; IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO,
+;; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+;; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+;; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+;; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+;; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF
+;; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+(require-extension (unittest))
+(set! *test-track-progress* #t)
+
+(require "light-record.scm")
+
+(define dummy (lambda () (+ 1 2) #f))
+
+(test-begin "record-field-spec-name")
+(test-eq 'fld0
+ (record-field-spec-name 'fld0))
+(test-eq 'fld0
+ (record-field-spec-name '(fld0)))
+(test-eq 'fld0
+ (record-field-spec-name '(fld0 "val")))
+(test-end)
+
+(test-begin "record-field-spec-default-value")
+(test-eq #f
+ (record-field-spec-default-value 'fld0))
+(test-eq #f
+ (record-field-spec-default-value '(fld0)))
+(test-equal "val"
+ (record-field-spec-default-value '(fld0 "val")))
+(test-end)
+
+;; These tests must be processed before consequent
+;; %retrieve-record-accessor tests to pool the accessor procedures
+;; correctly.
+(test-begin "%make-record-getter list")
+(test-eq car
+ (%make-record-getter 0 list-ref))
+(test-eq cadr
+ (%make-record-getter 1 list-ref))
+(test-eq caddr
+ (%make-record-getter 2 list-ref))
+(test-eq (%make-record-getter 3 list-ref)
+ (%make-record-getter 3 list-ref))
+(test-eqv 3
+ ((%make-record-getter 3 list-ref) '(0 1 2 3 4 5)))
+(test-eq (%make-record-getter 4 list-ref)
+ (%make-record-getter 4 list-ref))
+(test-eqv 4
+ ((%make-record-getter 4 list-ref) '(0 1 2 3 4 5)))
+(test-eq (%make-record-getter 5 list-ref)
+ (%make-record-getter 5 list-ref))
+(test-eqv 5
+ ((%make-record-getter 5 list-ref) '(0 1 2 3 4 5)))
+(test-end)
+
+;; These tests must be processed before consequent
+;; %retrieve-record-accessor tests to pool the accessor procedures
+;; correctly.
+(test-begin "%make-record-getter vector")
+(test-eq (%make-record-getter 0 vector-ref)
+ (%make-record-getter 0 vector-ref))
+(test-eqv 0
+ ((%make-record-getter 0 vector-ref) '#(0 1 2 3 4 5)))
+(test-eq (%make-record-getter 1 vector-ref)
+ (%make-record-getter 1 vector-ref))
+(test-eqv 1
+ ((%make-record-getter 1 vector-ref) '#(0 1 2 3 4 5)))
+(test-eq (%make-record-getter 2 vector-ref)
+ (%make-record-getter 2 vector-ref))
+(test-eqv 2
+ ((%make-record-getter 2 vector-ref) '#(0 1 2 3 4 5)))
+(test-eq (%make-record-getter 3 vector-ref)
+ (%make-record-getter 3 vector-ref))
+(test-eqv 3
+ ((%make-record-getter 3 vector-ref) '#(0 1 2 3 4 5)))
+(test-eq (%make-record-getter 4 vector-ref)
+ (%make-record-getter 4 vector-ref))
+(test-eqv 4
+ ((%make-record-getter 4 vector-ref) '#(0 1 2 3 4 5)))
+(test-eq (%make-record-getter 5 vector-ref)
+ (%make-record-getter 5 vector-ref))
+(test-eqv 5
+ ((%make-record-getter 5 vector-ref) '#(0 1 2 3 4 5)))
+(test-end)
+
+;; These tests must be processed before consequent
+;; %retrieve-record-accessor tests to pool the accessor procedures
+;; correctly.
+(test-begin "%make-record-setter list")
+(test-eq set-car!
+ (%make-record-setter 0 %list-set!))
+(test-equal '(zero 1 2 3 4 5)
+ (let ((lst (list 0 1 2 3 4 5)))
+ ((%make-record-setter 0 %list-set!) lst 'zero)
+ lst))
+(test-equal '(0 one 2 3 4 5)
+ (let ((lst (list 0 1 2 3 4 5)))
+ ((%make-record-setter 1 %list-set!) lst 'one)
+ lst))
+(test-equal '(0 1 two 3 4 5)
+ (let ((lst (list 0 1 2 3 4 5)))
+ ((%make-record-setter 2 %list-set!) lst 'two)
+ lst))
+(test-equal '(0 1 2 three 4 5)
+ (let ((lst (list 0 1 2 3 4 5)))
+ ((%make-record-setter 3 %list-set!) lst 'three)
+ lst))
+(test-equal '(0 1 2 3 four 5)
+ (let ((lst (list 0 1 2 3 4 5)))
+ ((%make-record-setter 4 %list-set!) lst 'four)
+ lst))
+(test-equal '(0 1 2 3 4 five)
+ (let ((lst (list 0 1 2 3 4 5)))
+ ((%make-record-setter 5 %list-set!) lst 'five)
+ lst))
+(test-end)
+
+;; These tests must be processed before consequent
+;; %retrieve-record-accessor tests to pool the accessor procedures
+;; correctly.
+(test-begin "%make-record-setter vector")
+(test-equal '#(zero 1 2 3 4 5)
+ (let ((vec (vector 0 1 2 3 4 5)))
+ ((%make-record-setter 0 vector-set!) vec 'zero)
+ vec))
+(test-equal '#(0 one 2 3 4 5)
+ (let ((vec (vector 0 1 2 3 4 5)))
+ ((%make-record-setter 1 vector-set!) vec 'one)
+ vec))
+(test-equal '#(0 1 two 3 4 5)
+ (let ((vec (vector 0 1 2 3 4 5)))
+ ((%make-record-setter 2 vector-set!) vec 'two)
+ vec))
+(test-equal '#(0 1 2 three 4 5)
+ (let ((vec (vector 0 1 2 3 4 5)))
+ ((%make-record-setter 3 vector-set!) vec 'three)
+ vec))
+(test-equal '#(0 1 2 3 four 5)
+ (let ((vec (vector 0 1 2 3 4 5)))
+ ((%make-record-setter 4 vector-set!) vec 'four)
+ vec))
+(test-equal '#(0 1 2 3 4 five)
+ (let ((vec (vector 0 1 2 3 4 5)))
+ ((%make-record-setter 5 vector-set!) vec 'five)
+ vec))
+(test-end)
+
+(test-begin "%retrieve-record-accessor")
+(test-eq car
+ (%retrieve-record-accessor 0 list-ref dummy))
+(test-eq cadr
+ (%retrieve-record-accessor 1 list-ref dummy))
+(test-eq caddr
+ (%retrieve-record-accessor 2 list-ref dummy))
+(test-true (procedure?
+ (%retrieve-record-accessor 3 list-ref dummy)))
+(test-true (procedure?
+ (%retrieve-record-accessor 4 list-ref dummy)))
+(test-true (procedure?
+ (%retrieve-record-accessor 5 list-ref dummy)))
+(test-eq set-car!
+ (%retrieve-record-accessor 0 %list-set! dummy))
+(test-true (procedure?
+ (%retrieve-record-accessor 1 %list-set! dummy)))
+(test-true (procedure?
+ (%retrieve-record-accessor 2 %list-set! dummy)))
+(test-true (procedure?
+ (%retrieve-record-accessor 3 %list-set! dummy)))
+(test-true (procedure?
+ (%retrieve-record-accessor 4 %list-set! dummy)))
+(test-true (procedure?
+ (%retrieve-record-accessor 5 %list-set! dummy)))
+(test-eq 'zero
+ (let ((lst (list 0 1 2 3 4 5)))
+ ((%retrieve-record-accessor 0 %list-set! dummy) lst 'zero)
+ ((%retrieve-record-accessor 0 list-ref dummy) lst)))
+(test-eq 'one
+ (let ((lst (list 0 1 2 3 4 5)))
+ ((%retrieve-record-accessor 1 %list-set! dummy) lst 'one)
+ ((%retrieve-record-accessor 1 list-ref dummy) lst)))
+(test-eq 'two
+ (let ((lst (list 0 1 2 3 4 5)))
+ ((%retrieve-record-accessor 2 %list-set! dummy) lst 'two)
+ ((%retrieve-record-accessor 2 list-ref dummy) lst)))
+(test-eq 'three
+ (let ((lst (list 0 1 2 3 4 5)))
+ ((%retrieve-record-accessor 3 %list-set! dummy) lst 'three)
+ ((%retrieve-record-accessor 3 list-ref dummy) lst)))
+(test-eq 'four
+ (let ((lst (list 0 1 2 3 4 5)))
+ ((%retrieve-record-accessor 4 %list-set! dummy) lst 'four)
+ ((%retrieve-record-accessor 4 list-ref dummy) lst)))
+(test-eq 'five
+ (let ((lst (list 0 1 2 3 4 5)))
+ ((%retrieve-record-accessor 5 %list-set! dummy) lst 'five)
+ ((%retrieve-record-accessor 5 list-ref dummy) lst)))
+(test-end)
+
+(test-begin "%retrieve-record-accessor accessor identity")
+(for-each (lambda (i)
+ (test-eq (%retrieve-record-accessor i list-ref dummy)
+ (%retrieve-record-accessor i list-ref dummy)))
+ (iota 6))
+(for-each (lambda (i)
+ (test-eq (%retrieve-record-accessor i %list-set! dummy)
+ (%retrieve-record-accessor i %list-set! dummy)))
+ (iota 6))
+(for-each (lambda (i)
+ (test-eq (%retrieve-record-accessor i vector-ref dummy)
+ (%retrieve-record-accessor i vector-ref dummy)))
+ (iota 6))
+(for-each (lambda (i)
+ (test-eq (%retrieve-record-accessor i vector-set! dummy)
+ (%retrieve-record-accessor i vector-set! dummy)))
+ (iota 6))
+(test-end)
+
+(test-begin "%define-record-getter")
+;; index 0
+(test-eq car
+ (%make-record-getter 0 list-ref))
+(test-false (symbol-bound? 'recgt-fld0))
+(%define-record-getter recgt fld0 0 list-ref)
+(test-true (procedure? recgt-fld0))
+(test-eq car recgt-fld0)
+(test-eqv 0
+ (recgt-fld0 '(0 1 2 3 4 5)))
+;; index 1
+(test-eq cadr
+ (%make-record-getter 1 list-ref))
+(test-false (symbol-bound? 'recgt-fld1))
+(%define-record-getter recgt fld1 1 list-ref)
+(test-true (procedure? recgt-fld1))
+(test-eq cadr recgt-fld1)
+(test-eqv 1
+ (recgt-fld1 '(0 1 2 3 4 5)))
+;; index 2
+(test-eq caddr
+ (%make-record-getter 2 list-ref))
+(test-false (symbol-bound? 'recgt-fld2))
+(%define-record-getter recgt fld2 2 list-ref)
+(test-true (procedure? recgt-fld2))
+(test-eq caddr recgt-fld2)
+(test-eqv 2
+ (recgt-fld2 '(0 1 2 3 4 5)))
+;; index 3
+(test-false (symbol-bound? 'recgt-fld3))
+(%define-record-getter recgt fld3 3 list-ref)
+(test-true (procedure? recgt-fld3))
+(test-eqv 3
+ (recgt-fld3 '(0 1 2 3 4 5)))
+;; index 4
+(test-false (symbol-bound? 'recgt-fld4))
+(%define-record-getter recgt fld4 4 list-ref)
+(test-true (procedure? recgt-fld4))
+(test-eqv 4
+ (recgt-fld4 '(0 1 2 3 4 5)))
+;; index 5
+(test-false (symbol-bound? 'recgt-fld5))
+(%define-record-getter recgt fld5 5 list-ref)
+(test-true (procedure? recgt-fld5))
+(test-eqv 5
+ (recgt-fld5 '(0 1 2 3 4 5)))
+(test-end)
+
+(test-begin "%define-record-setter")
+;; index 0
+(test-eq set-car!
+ (%make-record-setter 0 %list-set!))
+(test-false (symbol-bound? 'recst-set-fld0!))
+(%define-record-setter recst fld0 0 %list-set!)
+(test-true (procedure? recst-set-fld0!))
+(test-eq set-car! recst-set-fld0!)
+(test-equal '(zero 1 2 3 4 5)
+ (let ((lst (list 0 1 2 3 4 5)))
+ (recst-set-fld0! lst 'zero)
+ lst))
+;; index 1
+(test-false (symbol-bound? 'recst-set-fld1!))
+(%define-record-setter recst fld1 1 %list-set!)
+(test-true (procedure? recst-set-fld1!))
+(test-equal '(0 one 2 3 4 5)
+ (let ((lst (list 0 1 2 3 4 5)))
+ (recst-set-fld1! lst 'one)
+ lst))
+;; index 2
+(test-false (symbol-bound? 'recst-set-fld2!))
+(%define-record-setter recst fld2 2 %list-set!)
+(test-true (procedure? recst-set-fld2!))
+(test-equal '(0 1 two 3 4 5)
+ (let ((lst (list 0 1 2 3 4 5)))
+ (recst-set-fld2! lst 'two)
+ lst))
+;; index 3
+(test-false (symbol-bound? 'recst-set-fld3!))
+(%define-record-setter recst fld3 3 %list-set!)
+(test-true (procedure? recst-set-fld3!))
+(test-equal '(0 1 2 three 4 5)
+ (let ((lst (list 0 1 2 3 4 5)))
+ (recst-set-fld3! lst 'three)
+ lst))
+;; index 4
+(test-false (symbol-bound? 'recst-set-fld4!))
+(%define-record-setter recst fld4 4 %list-set!)
+(test-true (procedure? recst-set-fld4!))
+(test-equal '(0 1 2 3 four 5)
+ (let ((lst (list 0 1 2 3 4 5)))
+ (recst-set-fld4! lst 'four)
+ lst))
+;; index 5
+(test-false (symbol-bound? 'recst-set-fld5!))
+(%define-record-setter recst fld5 5 %list-set!)
+(test-true (procedure? recst-set-fld5!))
+(test-equal '(0 1 2 3 4 five)
+ (let ((lst (list 0 1 2 3 4 5)))
+ (recst-set-fld5! lst 'five)
+ lst))
+(test-end)
+
+(test-begin "define-record-generic")
+(test-false (symbol-bound? 'record-spec-recgn))
+(test-false (symbol-bound? 'make-recgn))
+(test-false (symbol-bound? 'recgn-copy))
+(test-false (symbol-bound? 'recgn-fld0))
+(test-false (symbol-bound? 'recgn-fld1))
+(test-false (symbol-bound? 'recgn-fld2))
+(test-false (symbol-bound? 'recgn-set-fld0!))
+(test-false (symbol-bound? 'recgn-set-fld1!))
+(test-false (symbol-bound? 'recgn-set-fld2!))
+(define-record-generic recgn
+ '(fld0 fld1)
+ list-copy list-copy list-ref %list-set!)
+;; record-spec
+(test-equal '(fld0 fld1)
+ record-spec-recgn)
+;; make-record
+(procedure? make-recgn)
+(test-equal '(#f #f)
+ (make-recgn))
+(test-equal '(0 #f)
+ (make-recgn 0))
+(test-equal '(0 1)
+ (make-recgn 0 1))
+(test-error (make-recgn 0 1 2))
+(test-equal '((+ 1 2) 3)
+ (make-recgn '(+ 1 2) (+ 1 2)))
+;; record-copy
+(let ((rec (make-recgn 'first 'second)))
+ (test-false (eq? rec
+ (recgn-copy rec)))
+ (test-false (eq? (cdr rec)
+ (cdr (recgn-copy rec))))
+ (test-true (equal? rec
+ (recgn-copy rec)))
+ (test-true (equal? (cdr rec)
+ (cdr (recgn-copy rec)))))
+;; record-get index 0
+(test-eq #f
+ (recgn-fld0 (make-recgn)))
+(test-eqv 0
+ (recgn-fld0 (make-recgn 0 1)))
+;; record-get index 1
+(test-eq #f
+ (recgn-fld1 (make-recgn)))
+(test-eqv 1
+ (recgn-fld1 (make-recgn 0 1)))
+;; record-get index 2
+(test-false (symbol-bound? 'recgn-fld2))
+;; record-set! index 0
+(test-equal '(zero #f)
+ (let ((rec (make-recgn)))
+ (recgn-set-fld0! rec 'zero)
+ rec))
+(test-equal '(zero 1)
+ (let ((rec (make-recgn 0 1)))
+ (recgn-set-fld0! rec 'zero)
+ rec))
+;; record-set! index 1
+(test-equal '(#f one)
+ (let ((rec (make-recgn)))
+ (recgn-set-fld1! rec 'one)
+ rec))
+(test-equal '(0 one)
+ (let ((rec (make-recgn 0 1)))
+ (recgn-set-fld1! rec 'one)
+ rec))
+;; record-set! index 2
+(test-false (symbol-bound? 'recgn-set-fld2!))
+(test-end)
+
+(test-begin "define-record-generic with some default values")
+(define-record-generic recgna
+ (append record-spec-recgn `((fld2 two) fld3 (fld4 ,(string-append "fo"
"ur"))))
+ list-copy list-copy list-ref %list-set!)
+(test-equal '(fld0 fld1 (fld2 two) fld3 (fld4 "four"))
+ record-spec-recgna)
+(test-equal '(#f #f two #f "four")
+ (make-recgna))
+(test-equal '(0 1 2 #f "four")
+ (make-recgna 0 1 2))
+(test-end)
+
+(test-begin "null list-record")
+(test-false (symbol-bound? 'record-spec-rec0))
+(test-false (symbol-bound? 'make-rec0))
+(test-false (symbol-bound? 'rec0-copy))
+(define-list-record rec0
+ '())
+;; record-spec
+(test-equal '()
+ record-spec-rec0)
+;; make-record
+(test-true (procedure? make-rec0))
+(test-equal '()
+ (make-rec0))
+(test-error (make-rec0 0))
+;; record-copy
+(test-true (procedure? rec0-copy))
+(test-equal '()
+ (rec0-copy (make-rec0)))
+(test-end)
+
+(test-begin "1-member list-record")
+(test-false (symbol-bound? 'record-spec-rec1))
+(test-false (symbol-bound? 'make-rec1))
+(test-false (symbol-bound? 'rec1-copy))
+(define-list-record rec1
+ '(fld0))
+;; record-spec
+(test-equal '(fld0)
+ record-spec-rec1)
+;; make-record
+(test-true (procedure? make-rec1))
+(test-equal '(#f)
+ (make-rec1))
+(test-equal '(0)
+ (make-rec1 0))
+(test-error (make-rec1 0 1))
+;; record-copy
+(test-true (procedure? rec1-copy))
+(test-equal '(#f)
+ (rec1-copy (make-rec1)))
+(test-equal '(0)
+ (rec1-copy (make-rec1 0)))
+;; record-get index 0
+(test-eq #f
+ (rec1-fld0 (make-rec1)))
+(test-eqv 0
+ (rec1-fld0 (make-rec1 0)))
+;; record-set! index 0
+(test-equal '(zero)
+ (let ((rec (make-rec1)))
+ (rec1-set-fld0! rec 'zero)
+ rec))
+(test-equal '(zero)
+ (let ((rec (make-rec1 0)))
+ (rec1-set-fld0! rec 'zero)
+ rec))
+(test-end)
+
+(test-begin "1-member list-record with default value")
+(define-list-record rec1a
+ `((fld0 ,(string-append "fir" "st"))))
+(test-equal '((fld0 "first"))
+ record-spec-rec1a)
+;; make-record
+(test-true (procedure? make-rec1a))
+(test-equal '("first")
+ (make-rec1a))
+(test-equal '(0)
+ (make-rec1a 0))
+(test-error (make-rec1a 0 1))
+;; record-copy
+(test-true (procedure? rec1a-copy))
+(test-equal '("first")
+ (rec1a-copy (make-rec1a)))
+(test-equal '(0)
+ (rec1a-copy (make-rec1a 0)))
+;; record-get index 0
+(test-equal "first"
+ (rec1a-fld0 (make-rec1a)))
+(test-eqv 0
+ (rec1a-fld0 (make-rec1a 0)))
+(test-end)
+
+(test-begin "null vector-record")
+(test-false (symbol-bound? 'record-spec-vrec0))
+(test-false (symbol-bound? 'make-vrec0))
+(test-false (symbol-bound? 'vrec0-copy))
+(define-vector-record vrec0
+ '())
+;; record-spec
+(test-equal '()
+ record-spec-vrec0)
+;; make-record
+(test-true (procedure? make-vrec0))
+(test-equal '#()
+ (make-vrec0))
+(test-error (make-vrec0 0))
+;; record-copy
+(test-true (procedure? vrec0-copy))
+(test-equal '#()
+ (vrec0-copy (make-vrec0)))
+(test-end)
+
+(test-begin "1-member vector-record")
+(test-false (symbol-bound? 'record-spec-vrec1))
+(test-false (symbol-bound? 'make-vrec1))
+(test-false (symbol-bound? 'vrec1-copy))
+(define-vector-record vrec1
+ '(fld0))
+;; record-spec
+(test-equal '(fld0)
+ record-spec-vrec1)
+;; make-record
+(test-true (procedure? make-vrec1))
+(test-equal '#(#f)
+ (make-vrec1))
+(test-equal '#(0)
+ (make-vrec1 0))
+(test-error (make-vrec1 0 1))
+;; record-copy
+(test-true (procedure? vrec1-copy))
+(test-equal '#(#f)
+ (vrec1-copy (make-vrec1)))
+(test-equal '#(0)
+ (vrec1-copy (make-vrec1 0)))
+;; record-get index 0
+(%define-record-getter vrec1 fld0 0 vector-ref)
+(test-eq #f
+ (vrec1-fld0 (make-vrec1)))
+(test-eqv 0
+ (vrec1-fld0 (make-vrec1 0)))
+;; record-set! index 0
+(test-equal '#(zero)
+ (let ((rec (make-vrec1)))
+ (vrec1-set-fld0! rec 'zero)
+ rec))
+(test-equal '#(zero)
+ (let ((rec (make-vrec1 0)))
+ (vrec1-set-fld0! rec 'zero)
+ rec))
+(test-end)
+
+(test-begin "1-member vector-record with default value")
+(define-vector-record vrec1a
+ `((fld0 ,(string-append "fir" "st"))))
+(test-equal '((fld0 "first"))
+ record-spec-vrec1a)
+;; make-record
+(test-true (procedure? make-vrec1a))
+(test-equal '#("first")
+ (make-vrec1a))
+(test-equal '#(0)
+ (make-vrec1a 0))
+(test-error (make-vrec1a 0 1))
+;; record-copy
+(test-true (procedure? vrec1a-copy))
+(test-equal '#("first")
+ (vrec1a-copy (make-vrec1a)))
+(test-equal '#(0)
+ (vrec1a-copy (make-vrec1a 0)))
+;; record-get index 0
+(test-equal "first"
+ (vrec1a-fld0 (make-vrec1a)))
+(test-eqv 0
+ (vrec1a-fld0 (make-vrec1a 0)))
+(test-end)
+
+(test-report-result)