Author: yamakenz
Date: Thu May 24 09:20:19 2007
New Revision: 4562

Modified:
   sigscheme-trunk/NEWS
   sigscheme-trunk/QALog
   sigscheme-trunk/src/vector.c
   sigscheme-trunk/test/test-vector.scm

Log:
[QA] vector.c

* src/vector.c
  - (scm_p_make_vector): Fix the error message
  - (scm_p_vector_fillx): Return SCM_UNDEF
* test/test-vector.scm
  - Remove obsolete and incomplete tests
  - Add various tests
* NEWS
* QALog
  - Update


Modified: sigscheme-trunk/NEWS
==============================================================================
--- sigscheme-trunk/NEWS        (original)
+++ sigscheme-trunk/NEWS        Thu May 24 09:20:19 2007
@@ -20,7 +20,8 @@
   - Replace implicit filler value ' ' for make-string with '?' to avoid wrong
     assumption by user
 
-  - make-string and string-fill! now returns SCM_UNDEF instead of the str
+  - make-string, string-fill! and vector-fill! now returns SCM_UNDEF instead of
+    the modified object
 
 * Fixes
 

Modified: sigscheme-trunk/QALog
==============================================================================
--- sigscheme-trunk/QALog       (original)
+++ sigscheme-trunk/QALog       Thu May 24 09:20:19 2007
@@ -261,7 +261,7 @@
 yyyy yy  r5rs char.c
 yyyy yyy r5rs string.c
 yyyy yy  r5rs string-procedure.c
-         r5rs vector.c
+yyyy yyy r5rs vector.c
 yyyy yyy r5rs qquote.c
          r5rs macro.c
          r5rs promise.c
@@ -871,14 +871,14 @@
 
 file:              vector.c
 category:          r5rs
-spec by eyes:      
-spec by tests:     
-general review:    
-64-bit by eyes:    
-64-bit by tests:   
-coding style:      
-normal case tests: 
-corner case tests: 
+spec by eyes:      [EMAIL PROTECTED]
+spec by tests:     [EMAIL PROTECTED]
+general review:    [EMAIL PROTECTED]
+64-bit by eyes:    [EMAIL PROTECTED]
+64-bit by tests:   
+coding style:      [EMAIL PROTECTED]
+normal case tests: [EMAIL PROTECTED]
+corner case tests: [EMAIL PROTECTED]
 
 file:              qquote.c
 category:          r5rs
@@ -1081,6 +1081,10 @@
 
 Log
 ---
+2007-05-25  YamaKen <yamaken AT bp.iij4u.or.jp>
+        * vector.c
+          - QA done @r4562 with test-vector.scm
+
 2007-05-20  YamaKen <yamaken AT bp.iij4u.or.jp>
         * string-procedure.c
           - QA done @r4552 with test-string-{proc,cmp}.scm

Modified: sigscheme-trunk/src/vector.c
==============================================================================
--- sigscheme-trunk/src/vector.c        (original)
+++ sigscheme-trunk/src/vector.c        Thu May 24 09:20:19 2007
@@ -81,7 +81,7 @@
 
     len = SCM_INT_VALUE(scm_len);
     if (len < 0)
-        ERR_OBJ("length must be a positive integer", scm_len);
+        ERR_OBJ("length must be a non-negative integer", scm_len);
 
     vec = scm_malloc(sizeof(ScmObj) * len);
     if (NULLP(args)) {
@@ -209,7 +209,7 @@
     for (i = 0; i < len; i++)
         v[i] = fill;
 
-    return vec;
+    return SCM_UNDEF;
 }
 
 /* This procedure should rightfully be written in module-sscm-ext.c, but since

Modified: sigscheme-trunk/test/test-vector.scm
==============================================================================
--- sigscheme-trunk/test/test-vector.scm        (original)
+++ sigscheme-trunk/test/test-vector.scm        Thu May 24 09:20:19 2007
@@ -1,3 +1,5 @@
+#! /usr/bin/env sscm -C UTF-8
+
 ;;  Filename : test-vector.scm
 ;;  About    : unit test for R5RS vector
 ;;
@@ -31,6 +33,8 @@
 ;;  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 ;;  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+(use sscm-ext)
+
 (load "./test/unittest.scm")
 
 (if (not (symbol-bound? 'vector?))
@@ -38,148 +42,468 @@
 
 (define tn test-name)
 
-(tn "vector")
-(assert-equal? (tn) '#()        (vector))
-(assert-equal? (tn) '#(a)       (vector 'a))
-(assert-equal? (tn) '#(a b c d) (vector 'a 'b 'c 'd))
-
+;;
+;; vector?
+;;
 (tn "vector?")
-(assert-true   (tn) (vector? '#()))
-(assert-true   (tn) (vector? '#(a)))
-(assert-true   (tn) (vector? '#(a b c d)))
+(assert-eq? (tn) #f (vector? #f))
+(assert-eq? (tn) #f (vector? #t))
+(assert-eq? (tn) #f (vector? '()))
+(assert-eq? (tn) #f (vector? (eof)))
+(assert-eq? (tn) #f (vector? (undef)))
+(assert-eq? (tn) #f (vector? 0))
+(assert-eq? (tn) #f (vector? 1))
+(assert-eq? (tn) #f (vector? 3))
+(assert-eq? (tn) #f (vector? -1))
+(assert-eq? (tn) #f (vector? -3))
+(assert-eq? (tn) #f (vector? 'symbol))
+(assert-eq? (tn) #f (vector? 'SYMBOL))
+(assert-eq? (tn) #f (vector? #\a))
+(assert-eq? (tn) #f (vector? #\ ))
+(assert-eq? (tn) #f (vector? ""))
+(assert-eq? (tn) #f (vector? " "))
+(assert-eq? (tn) #f (vector? "a"))
+(assert-eq? (tn) #f (vector? "A"))
+(assert-eq? (tn) #f (vector? "aBc12!"))
+(assert-eq? (tn) #f (vector? " "))
+(assert-eq? (tn) #f (vector? " 0  12!"))
+(assert-eq? (tn) #f (vector? +))
+(assert-eq? (tn) #f (vector? (lambda () #t)))
+
+;; syntactic keywords should not be appeared as operand
+(if sigscheme?
+    (begin
+      ;; pure syntactic keyword
+      (assert-error (tn) (lambda () (vector? else)))
+      ;; expression keyword
+      (assert-error (tn) (lambda () (vector? do)))))
+
+(call-with-current-continuation
+ (lambda (k)
+   (assert-eq? (tn) #f (vector? k))))
+(assert-eq? (tn) #f (vector? (current-output-port)))
+(assert-eq? (tn) #f (vector? '(#t . #t)))
+(assert-eq? (tn) #f (vector? (cons #t #t)))
+(assert-eq? (tn) #f (vector? '(0 1 2)))
+(assert-eq? (tn) #f (vector? (list 0 1 2)))
+(assert-eq? (tn) #t (vector? '#()))
+(assert-eq? (tn) #t (vector? (vector)))
+(assert-eq? (tn) #t (vector? '#(0 1 2)))
+(assert-eq? (tn) #t (vector? (vector 0 1 2)))
+
+;;
+;; make-vector
+;;
+(tn "make-vector invalid forms")
+(assert-error  (tn) (lambda ()                       (make-vector #t)))
+(assert-error  (tn) (lambda ()                       (make-vector #t #t)))
+(assert-error  (tn) (lambda ()                       (make-vector 0 #t #t)))
 
 (tn "make-vector")
-(assert-equal? (tn) '#() (make-vector 0 #f))
-(assert-equal? (tn) '#() (make-vector 0 '()))
-(assert-equal? (tn) '#(#f)    (make-vector 1 #f))
-(assert-equal? (tn) '#(#f #f) (make-vector 2 #f))
+(assert-error  (tn) (lambda ()                       (make-vector -1)))
+(assert-equal? (tn) '#()                             (make-vector  0))
+(assert-equal? (tn) (vector (undef))                 (make-vector  1))
+(assert-equal? (tn) (vector (undef) (undef))         (make-vector  2))
+(assert-equal? (tn) (vector (undef) (undef) (undef)) (make-vector  3))
+(assert-equal? (tn) 0                 (vector-length (make-vector  0)))
+(assert-equal? (tn) 1                 (vector-length (make-vector  1)))
+(assert-equal? (tn) 2                 (vector-length (make-vector  2)))
+(assert-equal? (tn) 3                 (vector-length (make-vector  3)))
+(assert-error  (tn) (lambda ()                       (make-vector -1 #t)))
+(assert-equal? (tn) '#()                             (make-vector  0  #t))
+(assert-equal? (tn) '#(#t)                           (make-vector  1  #t))
+(assert-equal? (tn) '#(#t #t)                        (make-vector  2  #t))
+(assert-equal? (tn) '#(#t #t #t)                     (make-vector  3  #t))
+(assert-equal? (tn) 0                 (vector-length (make-vector  0  #t)))
+(assert-equal? (tn) 1                 (vector-length (make-vector  1  #t)))
+(assert-equal? (tn) 2                 (vector-length (make-vector  2  #t)))
+(assert-equal? (tn) 3                 (vector-length (make-vector  3  #t)))
 (assert-equal? (tn) '#(#(a b) #(a b)) (make-vector 2 '#(a b)))
-(assert-error  (tn) (lambda ()
-                      (make-vector -1 #f)))
+
+(tn "make-vector filler identity")
+(define filler '(a b))
+(define v (make-vector 3 filler))
+(assert-eq?    (tn) filler (vector-ref v 0))
+(assert-eq?    (tn) filler (vector-ref v 1))
+(assert-eq?    (tn) filler (vector-ref v 2))
+
+(tn "make-vector mutability")
+(if sigscheme?
+    (begin
+      (assert-true   (tn) (%vector-mutable? (make-vector 0)))
+      (assert-true   (tn) (%vector-mutable? (make-vector 1)))
+      (assert-true   (tn) (%vector-mutable? (make-vector 2)))
+      (assert-true   (tn) (%vector-mutable? (make-vector 3)))
+      (assert-true   (tn) (%vector-mutable? (make-vector 0 #t)))
+      (assert-true   (tn) (%vector-mutable? (make-vector 1 #t)))
+      (assert-true   (tn) (%vector-mutable? (make-vector 2 #t)))
+      (assert-true   (tn) (%vector-mutable? (make-vector 3 #t)))))
+
+;;
+;; vector
+;;
+(tn "vector")
+(assert-equal? (tn) '#()              (vector))
+(assert-equal? (tn) '#(a)             (vector 'a))
+(assert-equal? (tn) '#(a #\b "c" #xd) (vector 'a #\b "c" #xd))
+(assert-error  (tn) (lambda ()        (vector 'a #\b "c" #xd . e)))
+
+(tn "vector element identity")
+(define elm '(a b))
+(define v (vector elm elm elm))
+(assert-eq?    (tn) elm (vector-ref v 0))
+(assert-eq?    (tn) elm (vector-ref v 1))
+(assert-eq?    (tn) elm (vector-ref v 2))
+
+(tn "vector mutability")
+(if sigscheme?
+    (begin
+      (assert-true   (tn) (%vector-mutable? (vector)))
+      (assert-true   (tn) (%vector-mutable? (vector 'a)))
+      (assert-true   (tn) (%vector-mutable? (vector 'a 'b 'c 'd)))))
+
+;;
+;; vector-length
+;;
+(tn "vector-length invalid forms")
+(assert-error  (tn) (lambda () (vector-length #f)))
+(assert-error  (tn) (lambda () (vector-length #t)))
+(assert-error  (tn) (lambda () (vector-length '(a b))))
 
 (tn "vector-length")
 (assert-equal? (tn) 0 (vector-length '#()))
 (assert-equal? (tn) 1 (vector-length '#(a)))
 (assert-equal? (tn) 2 (vector-length '#(a b)))
+(assert-equal? (tn) 3 (vector-length '#(a b c)))
+(assert-equal? (tn) 4 (vector-length '#(a b c d)))
+(assert-equal? (tn) 0 (vector-length (vector)))
+(assert-equal? (tn) 1 (vector-length (vector 'a)))
+(assert-equal? (tn) 2 (vector-length (vector 'a 'b)))
+(assert-equal? (tn) 3 (vector-length (vector 'a 'b 'c)))
+(assert-equal? (tn) 4 (vector-length (vector 'a 'b 'c 'd)))
 
-(tn "vector-ref")
-(assert-equal? (tn) 'a (vector-ref '#(a b c d e) 0))
-(assert-equal? (tn) 'c (vector-ref '#(a b c d e) 2))
-(assert-equal? (tn) 'e (vector-ref '#(a b c d e) 4))
-(assert-error  (tn) (lambda ()
-                      (vector-ref '#() -1)))
-(assert-error  (tn) (lambda ()
-                      (vector-ref '#() 1)))
+;;
+;; vector-ref
+;;
+(tn "vector-ref invalid forms")
+(assert-error  (tn) (lambda () (vector-ref '(a)  0)))
+(assert-error  (tn) (lambda () (vector-ref '#(a) #\0)))
+
+(tn "vector-ref immutable")
+(define immv1 '#(e0))
+(define immv5 '#(e0 e1 e2 e3 e4))
+(if sigscheme?
+    (begin
+      (assert-true   (tn) (not (%vector-mutable? immv1)))
+      (assert-true   (tn) (not (%vector-mutable? immv5)))))
+(assert-error  (tn) (lambda () (vector-ref '#() -1)))
+(assert-error  (tn) (lambda () (vector-ref '#()  0)))
+(assert-error  (tn) (lambda () (vector-ref '#()  1)))
+(assert-error  (tn) (lambda () (vector-ref immv1 -1)))
+(assert-equal? (tn) 'e0        (vector-ref immv1  0))
+(assert-error  (tn) (lambda () (vector-ref immv1  1)))
+(assert-error  (tn) (lambda () (vector-ref immv5 -1)))
+(assert-equal? (tn) 'e0        (vector-ref immv5  0))
+(assert-equal? (tn) 'e1        (vector-ref immv5  1))
+(assert-equal? (tn) 'e2        (vector-ref immv5  2))
+(assert-equal? (tn) 'e3        (vector-ref immv5  3))
+(assert-equal? (tn) 'e4        (vector-ref immv5  4))
+(assert-error  (tn) (lambda () (vector-ref immv5  5)))
+
+(tn "vector-ref mutable")
+(define e0 '(0))
+(define e1 '(1))
+(define e2 '(2))
+(define e3 '(3))
+(define e4 '(4))
+(define mutv1 (vector e0))
+(define mutv5 (vector e0 e1 e2 e3 e4))
+(if sigscheme?
+    (begin
+      (assert-true   (tn) (%vector-mutable? mutv1))
+      (assert-true   (tn) (%vector-mutable? mutv5))))
+(assert-error  (tn) (lambda () (vector-ref (vector) -1)))
+(assert-error  (tn) (lambda () (vector-ref (vector)  0)))
+(assert-error  (tn) (lambda () (vector-ref (vector)  1)))
+(assert-error  (tn) (lambda () (vector-ref mutv1 -1)))
+(assert-eq?    (tn) e0         (vector-ref mutv1  0))
+(assert-error  (tn) (lambda () (vector-ref mutv1  1)))
+(assert-error  (tn) (lambda () (vector-ref mutv5 -1)))
+(assert-eq?    (tn) e0         (vector-ref mutv5  0))
+(assert-eq?    (tn) e1         (vector-ref mutv5  1))
+(assert-eq?    (tn) e2         (vector-ref mutv5  2))
+(assert-eq?    (tn) e3         (vector-ref mutv5  3))
+(assert-eq?    (tn) e4         (vector-ref mutv5  4))
+(assert-error  (tn) (lambda () (vector-ref mutv5  5)))
 
+;;
 ;; vector-set!
-(tn "vector-set!")
-(assert-equal? (tn)
-              '#(#t a "abc" #f ())
-              (begin
-                (define tmpvec (vector 1 'a "abc" #f '()))
-                (vector-set! tmpvec 0 #t)
-                tmpvec))
-(assert-equal? (tn)
-              '#(1 a #t #f ())
-              (begin
-                (define tmpvec (vector 1 'a "abc" #f '()))
-                (vector-set! tmpvec 2 #t)
-                tmpvec))
-(assert-equal? (tn)
-              '#(1 a "abc" #f #t)
-              (begin
-                (define tmpvec (vector 1 'a "abc" #f '()))
-                (vector-set! tmpvec 4 #t)
-                tmpvec))
-(assert-error  (tn)
-              (lambda ()
-                (vector-set! '#() -1 #t)))
-(assert-error  (tn)
-              (lambda ()
-                (vector-set! '#() 1 #t)))
-(tn "vector-set! const vector")
-(if (and (provided? "sigscheme")
-         (provided? "const-vector-literal"))
-    (begin
-      (assert-error  (tn)
-                     (lambda ()
-                       (define tmpvec '#(1 'a "abc" #f '()))
-                       (vector-set! tmpvec 0 #t)))
-      (assert-error  (tn)
-                     (lambda ()
-                       (define tmpvec '#(1 'a "abc" #f '()))
-                       (vector-set! tmpvec 2 #t)))
-      (assert-error  (tn)
-                     (lambda ()
-                       (define tmpvec '#(1 'a "abc" #f '()))
-                       (vector-set! tmpvec 4 #t))))
-    (begin
-      (assert-equal? (tn)
-                     '#(#t a "abc" #f ())
-                     (begin
-                       (define tmpvec '#(1 'a "abc" #f '()))
-                       (vector-set! tmpvec 0 #t)
-                       tmpvec))
-      (assert-equal? (tn)
-                     '#(1 a #t #f ())
-                     (begin
-                       (define tmpvec '#(1 'a "abc" #f '()))
-                       (vector-set! tmpvec 2 #t)
-                       tmpvec))
-      (assert-equal? (tn)
-                     '#(1 a "abc" #f #t)
-                     (begin
-                       (define tmpvec '#(1 'a "abc" #f '()))
-                       (vector-set! tmpvec 4 #t)
-                       tmpvec))))
-
-(tn "vector->list")
-(assert-equal? (tn) '()    (vector->list '#()))
-(assert-equal? (tn) '(a)   (vector->list '#(a)))
-(assert-equal? (tn) '(a b) (vector->list '#(a b)))
-
-(tn "list->vector")
-(assert-equal? (tn) '#()    (list->vector '()))
-(assert-equal? (tn) '#(a)   (list->vector '(a)))
-(assert-equal? (tn) '#(a b) (list->vector '(a b)))
-
-(tn "vector-fill!")
-(assert-equal? (tn)
-              '#()
-              (begin
-                (define tmpvec (vector))
-                (vector-fill! tmpvec #f)
-                tmpvec))
-(assert-equal? (tn)
-              '#(#f #f #f #f)
-              (begin
-                (define tmpvec (vector #t #t #t #t))
-                (vector-fill! tmpvec #f)
-                tmpvec))
-(tn "vector-fill! const vector")
-(if (and (provided? "sigscheme")
-         (provided? "const-vector-literal"))
-    (begin
-      (assert-error  (tn)
-                     (lambda ()
-                       (define tmpvec '#())
-                       (vector-fill! tmpvec #f)))
-      (assert-error  (tn)
-                     (lambda ()
-                       (define tmpvec '#(#t #t #t #t))
-                       (vector-fill! tmpvec #f))))
-    (begin
-      (assert-equal? (tn)
-                     '#()
-                     (begin
-                       (define tmpvec '#())
-                       (vector-fill! tmpvec #f)
-                       tmpvec))
-      (assert-equal? (tn)
-                     '#(#f #f #f #f)
-                     (begin
-                       (define tmpvec '#(#t #t #t #t))
-                       (vector-fill! tmpvec #f)
-                       tmpvec))))
+;;
+(tn "vector-set! invalid forms")
+(assert-error  (tn) (lambda ()  (vector-set! (list 0)   0   'x)))
+(assert-error  (tn) (lambda ()  (vector-set! (vector 0) #\0 'x)))
+
+(tn "vector-set! mutable")
+(define e0 '(0))
+(define e1 '(1))
+(define e2 '(2))
+(define e3 '(3))
+(define e4 '(4))
+(define x  '(#t))
+
+;; The value returned by `vector-set!' is unspecified in R5RS.
+(if sigscheme?
+    (assert-equal? (tn) (undef) (vector-set! (vector 0 1 2) 0 x)))
+
+(if sigscheme?
+    (assert-true   (tn) (let ((v (vector e0)))
+                          (vector-set! v 0 x)
+                          (%vector-mutable? v))))
+
+;; length 0
+(assert-error  (tn) (lambda ()  (vector-set! (vector) -1 x)))
+(assert-error  (tn) (lambda ()  (vector-set! (vector)  0 x)))
+(assert-error  (tn) (lambda ()  (vector-set! (vector)  1 x)))
+;; length 1
+(assert-error  (tn) (lambda ()  (vector-set! (vector e0) -1 x)))
+(assert-eq?    (tn) x           (let ((v (vector e0)))
+                                  (vector-set! v 0 x)
+                                  (vector-ref  v 0)))
+(assert-error  (tn) (lambda ()  (vector-set! (vector e0)  1 x)))
+;; length 3
+;; index -1
+(assert-error  (tn) (lambda ()  (vector-set! (vector e0 e1 e2) -1 x)))
+;; index 0
+(assert-eq?    (tn) x           (let ((v (vector e0 e1 e2)))
+                                  (vector-set! v 0 x)
+                                  (vector-ref  v 0)))
+(assert-eq?    (tn) e1          (let ((v (vector e0 e1 e2)))
+                                  (vector-set! v 0 x)
+                                  (vector-ref  v 1)))
+(assert-eq?    (tn) e2          (let ((v (vector e0 e1 e2)))
+                                  (vector-set! v 0 x)
+                                  (vector-ref  v 2)))
+;; index 1
+(assert-eq?    (tn) e0          (let ((v (vector e0 e1 e2)))
+                                  (vector-set! v 1 x)
+                                  (vector-ref  v 0)))
+(assert-eq?    (tn) x           (let ((v (vector e0 e1 e2)))
+                                  (vector-set! v 1 x)
+                                  (vector-ref  v 1)))
+(assert-eq?    (tn) e2          (let ((v (vector e0 e1 e2)))
+                                  (vector-set! v 1 x)
+                                  (vector-ref  v 2)))
+;; index 2
+(assert-eq?    (tn) e0          (let ((v (vector e0 e1 e2)))
+                                  (vector-set! v 2 x)
+                                  (vector-ref  v 0)))
+(assert-eq?    (tn) e1          (let ((v (vector e0 e1 e2)))
+                                  (vector-set! v 2 x)
+                                  (vector-ref  v 1)))
+(assert-eq?    (tn) x           (let ((v (vector e0 e1 e2)))
+                                  (vector-set! v 2 x)
+                                  (vector-ref  v 2)))
+;; index 3
+(assert-error  (tn) (lambda ()  (vector-set! (vector e0 e1 e2)  3 x)))
+
+(tn "vector-set! immutable")
+(define x  '(#t))
+;; length 0
+(assert-error  (tn) (lambda ()  (vector-set! '#() -1 x)))
+(assert-error  (tn) (lambda ()  (vector-set! '#()  0 x)))
+(assert-error  (tn) (lambda ()  (vector-set! '#()  1 x)))
+;; length 1
+(assert-error  (tn) (lambda ()  (vector-set! '#(0) -1 x)))
+(assert-error  (tn) (lambda ()  (vector-set! '#(0)  0 x)))
+(assert-error  (tn) (lambda ()  (vector-set! '#(0)  1 x)))
+;; length 3
+(assert-error  (tn) (lambda ()  (vector-set! '#(0 1 2) -1 x)))
+(assert-error  (tn) (lambda ()  (vector-set! '#(0 1 2)  0 x)))
+(assert-error  (tn) (lambda ()  (vector-set! '#(0 1 2)  1 x)))
+(assert-error  (tn) (lambda ()  (vector-set! '#(0 1 2)  2 x)))
+(assert-error  (tn) (lambda ()  (vector-set! '#(0 1 2)  3 x)))
+
+;;
+;; vector->list
+;;
+(tn "vector->list invalid forms")
+(assert-error  (tn) (lambda () (vector->list '())))
+(assert-error  (tn) (lambda () (vector->list '(0 1 2))))
+(assert-error  (tn) (lambda () (vector->list #t)))
+
+(tn "vector->list immutable")
+(define e0 '(0))
+(define e1 '(1))
+(define e2 '(2))
+(assert-equal? (tn) '()              (vector->list '#()))
+(assert-equal? (tn) '(a)             (vector->list '#(a)))
+(assert-equal? (tn) '(a b)           (vector->list '#(a b)))
+(assert-equal? (tn) '(a b c)         (vector->list '#(a b c)))
+
+(assert-equal? (tn) 0        (length (vector->list '#())))
+(assert-equal? (tn) 1        (length (vector->list '#(a))))
+(assert-equal? (tn) 2        (length (vector->list '#(a b))))
+(assert-equal? (tn) 3        (length (vector->list '#(a b c))))
+
+(tn "vector->list mutable")
+(define e0 '(0))
+(define e1 '(1))
+(define e2 '(2))
+(assert-equal? (tn) '()              (vector->list (vector)))
+(assert-equal? (tn) '(a)             (vector->list (vector 'a)))
+(assert-equal? (tn) '(a b)           (vector->list (vector 'a 'b)))
+(assert-equal? (tn) '(a b c)         (vector->list (vector 'a 'b 'c)))
+(assert-eq?    (tn) e0     (list-ref (vector->list (vector e0 e1 e2)) 0))
+(assert-eq?    (tn) e1     (list-ref (vector->list (vector e0 e1 e2)) 1))
+(assert-eq?    (tn) e2     (list-ref (vector->list (vector e0 e1 e2)) 2))
+
+(assert-equal? (tn) 0        (length (vector->list (vector))))
+(assert-equal? (tn) 1        (length (vector->list (vector 'a))))
+(assert-equal? (tn) 2        (length (vector->list (vector 'a 'b))))
+(assert-equal? (tn) 3        (length (vector->list (vector e0 e1 e2))))
+
+(tn "vector->list mutability")
+(if sigscheme?
+    (begin
+      (assert-true   (tn) (%pair-mutable? (vector->list '#(a))))
+      (assert-true   (tn) (%pair-mutable? (vector->list '#(a b))))
+      (assert-true   (tn) (%pair-mutable? (vector->list '#(a b c))))
+
+      (assert-true   (tn) (%pair-mutable? (vector->list (vector 'a))))
+      (assert-true   (tn) (%pair-mutable? (vector->list (vector 'a 'b))))
+      (assert-true   (tn) (%pair-mutable? (vector->list (vector 'a 'b 'c))))))
+
+;;
+;; list->vector
+;;
+(tn "list->vector invalid forms")
+(assert-error  (tn) (lambda () (list->vector '#())))
+(assert-error  (tn) (lambda () (list->vector '#(0 1 2))))
+(assert-error  (tn) (lambda () (list->vector #t)))
+
+(tn "list->vector improper list")
+;; circular lists
+(define clst1 (list 1))
+(set-cdr! clst1 clst1)
+(define clst2 (list 1 2))
+(set-cdr! (list-tail clst2 1) clst2)
+(define clst3 (list 1 2 3))
+(set-cdr! (list-tail clst3 2) clst3)
+(define clst4 (list 1 2 3 4))
+(set-cdr! (list-tail clst4 3) clst4)
+(if sigscheme?
+    (begin
+      (assert-error  (tn) (lambda () (list->vector '(0 1 2 . 3))))
+      (assert-error  (tn) (lambda () (list->vector clst1)))
+      (assert-error  (tn) (lambda () (list->vector clst2)))
+      (assert-error  (tn) (lambda () (list->vector clst3)))
+      (assert-error  (tn) (lambda () (list->vector clst4)))))
+
+(tn "list->vector immutable")
+(define e0 '(0))
+(define e1 '(1))
+(define e2 '(2))
+(assert-equal? (tn) '#()              (list->vector '()))
+(assert-equal? (tn) '#(a)             (list->vector '(a)))
+(assert-equal? (tn) '#(a b)           (list->vector '(a b)))
+(assert-equal? (tn) '#(a b c)         (list->vector '(a b c)))
+
+(assert-equal? (tn) 0     (vector-length (list->vector '())))
+(assert-equal? (tn) 1     (vector-length (list->vector '(a))))
+(assert-equal? (tn) 2     (vector-length (list->vector '(a b))))
+(assert-equal? (tn) 3     (vector-length (list->vector '(a b c))))
+
+(tn "list->vector mutable")
+(define e0 '(0))
+(define e1 '(1))
+(define e2 '(2))
+(assert-equal? (tn) '#(a)             (list->vector (list 'a)))
+(assert-equal? (tn) '#(a b)           (list->vector (list 'a 'b)))
+(assert-equal? (tn) '#(a b c)         (list->vector (list 'a 'b 'c)))
+
+(assert-equal? (tn) 1     (vector-length (list->vector (list 'a))))
+(assert-equal? (tn) 2     (vector-length (list->vector (list 'a 'b))))
+(assert-equal? (tn) 3     (vector-length (list->vector (list 'a 'b 'c))))
+
+(tn "list->vector mutability")
+(if sigscheme?
+    (begin
+      (assert-true   (tn) (%vector-mutable? (list->vector '())))
+      (assert-true   (tn) (%vector-mutable? (list->vector '(a))))
+      (assert-true   (tn) (%vector-mutable? (list->vector '(a b))))
+      (assert-true   (tn) (%vector-mutable? (list->vector '(a b c))))
+
+      (assert-true   (tn) (%vector-mutable? (list->vector (list 'a))))
+      (assert-true   (tn) (%vector-mutable? (list->vector (list 'a 'b))))
+      (assert-true   (tn) (%vector-mutable? (list->vector (list 'a 'b 'c))))))
+
+;;
+;; vector-fill!
+;;
+(tn "vector-fill! invalid forms")
+(assert-error  (tn) (lambda () (vector-fill! #f     #t)))
+(assert-error  (tn) (lambda () (vector-fill! #t     #t)))
+(assert-error  (tn) (lambda () (vector-fill! '()    #t)))
+(assert-error  (tn) (lambda () (vector-fill! '(a b) #t)))
+
+(tn "vector-fill! mutable")
+(define e0 '(0))
+(define e1 '(1))
+(define e2 '(2))
+(define e3 '(3))
+(define e4 '(4))
+(define x  '(#t))
+
+;; The value returned by `vector-fill!' is unspecified in R5RS.
+(if sigscheme?
+    (assert-equal? (tn) (undef) (vector-fill! (vector 0 1 2) x)))
+
+;; length 0
+(assert-eq?    (tn) 0           (let ((v (vector)))
+                                  (vector-fill!  v x)
+                                  (vector-length v)))
+;; length 1
+(assert-eq?    (tn) x           (let ((v (vector e0)))
+                                  (vector-fill!  v x)
+                                  (vector-ref    v 0)))
+(assert-eq?    (tn) 1           (let ((v (vector e0)))
+                                  (vector-fill!  v x)
+                                  (vector-length v)))
+;; length 2
+(assert-eq?    (tn) x           (let ((v (vector e0 e1)))
+                                  (vector-fill!  v x)
+                                  (vector-ref    v 0)))
+(assert-eq?    (tn) x           (let ((v (vector e0 e1)))
+                                  (vector-fill!  v x)
+                                  (vector-ref    v 1)))
+(assert-eq?    (tn) 2           (let ((v (vector e0 e1)))
+                                  (vector-fill!  v x)
+                                  (vector-length v)))
+;; length 5
+(assert-eq?    (tn) x           (let ((v (vector e0 e1 e2 e3 e4)))
+                                  (vector-fill!  v x)
+                                  (vector-ref    v 0)))
+(assert-eq?    (tn) x           (let ((v (vector e0 e1 e2 e3 e4)))
+                                  (vector-fill!  v x)
+                                  (vector-ref    v 1)))
+(assert-eq?    (tn) x           (let ((v (vector e0 e1 e2 e3 e4)))
+                                  (vector-fill!  v x)
+                                  (vector-ref    v 2)))
+(assert-eq?    (tn) x           (let ((v (vector e0 e1 e2 e3 e4)))
+                                  (vector-fill!  v x)
+                                  (vector-ref    v 3)))
+(assert-eq?    (tn) x           (let ((v (vector e0 e1 e2 e3 e4)))
+                                  (vector-fill!  v x)
+                                  (vector-ref    v 4)))
+(assert-eq?    (tn) 5           (let ((v (vector e0 e1 e2 e3 e4)))
+                                  (vector-fill!  v x)
+                                  (vector-length v)))
+
+(tn "vector-fill! immutable")
+(assert-error  (tn) (lambda () (vector-fill! '#()      #t)))
+(assert-error  (tn) (lambda () (vector-fill! '#(a)     #t)))
+(assert-error  (tn) (lambda () (vector-fill! '#(a b)   #t)))
+(assert-error  (tn) (lambda () (vector-fill! '#(a b c) #t)))
+
 
 (total-report)

Reply via email to