12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376 |
- ;;;; srfi-43.test --- test suite for SRFI-43 Vector library -*- scheme -*-
- ;;;;
- ;;;; Copyright (C) 2014 Free Software Foundation, Inc.
- ;;;;
- ;;;; This library is free software; you can redistribute it and/or
- ;;;; modify it under the terms of the GNU Lesser General Public
- ;;;; License as published by the Free Software Foundation; either
- ;;;; version 3 of the License, or (at your option) any later version.
- ;;;;
- ;;;; This library is distributed in the hope that it will be useful,
- ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- ;;;; Lesser General Public License for more details.
- ;;;;
- ;;;; You should have received a copy of the GNU Lesser General Public
- ;;;; License along with this library; if not, write to the Free Software
- ;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- ;;;
- ;;; Originally written by Shiro Kawai and placed in the public domain
- ;;; 10/5/2005.
- ;;;
- ;;; Many tests added, and adapted for Guile's (test-suite lib)
- ;;; by Mark H Weaver <mhw@netris.org>, Jan 2014.
- ;;;
- (define-module (test-suite test-srfi-43)
- #:use-module (srfi srfi-43)
- #:use-module (test-suite lib))
- (define-syntax-rule (pass-if-error name body0 body ...)
- (pass-if name
- (catch #t
- (lambda () body0 body ... #f)
- (lambda (key . args) #t))))
- ;;;
- ;;; Constructors
- ;;;
- ;;
- ;; make-vector
- ;;
- (with-test-prefix "make-vector"
- (pass-if-equal "simple, no init"
- 5
- (vector-length (make-vector 5)))
- (pass-if-equal "empty"
- '#()
- (make-vector 0))
- (pass-if-error "negative length"
- (make-vector -4))
- (pass-if-equal "simple with init"
- '#(3 3 3 3 3)
- (make-vector 5 3))
- (pass-if-equal "empty with init"
- '#()
- (make-vector 0 3))
- (pass-if-error "negative length"
- (make-vector -1 3)))
- ;;
- ;; vector
- ;;
- (with-test-prefix "vector"
- (pass-if-equal "no args"
- '#()
- (vector))
- (pass-if-equal "simple"
- '#(1 2 3 4 5)
- (vector 1 2 3 4 5)))
- ;;
- ;; vector-unfold
- ;;
- (with-test-prefix "vector-unfold"
- (pass-if-equal "no seeds"
- '#(0 1 2 3 4 5 6 7 8 9)
- (vector-unfold values 10))
- (pass-if-equal "no seeds, zero len"
- '#()
- (vector-unfold values 0))
- (pass-if-error "no seeds, negative len"
- (vector-unfold values -1))
- (pass-if-equal "1 seed"
- '#(0 -1 -2 -3 -4 -5 -6 -7 -8 -9)
- (vector-unfold (lambda (i x) (values x (- x 1)))
- 10 0))
- (pass-if-equal "1 seed, zero len"
- '#()
- (vector-unfold values 0 1))
- (pass-if-error "1 seed, negative len"
- (vector-unfold values -2 1))
- (pass-if-equal "2 seeds"
- '#((0 20) (-1 21) (-2 22) (-3 23) (-4 24)
- (-5 25) (-6 26) (-7 27) (-8 28) (-9 29))
- (vector-unfold (lambda (i x y) (values (list x y) (- x 1) (+ y 1)))
- 10 0 20))
- (pass-if-equal "2 seeds, zero len"
- '#()
- (vector-unfold values 0 1 2))
- (pass-if-error "2 seeds, negative len"
- (vector-unfold values -2 1 2))
- (pass-if-equal "3 seeds"
- '#((0 20 30) (-1 21 32) (-2 22 34) (-3 23 36) (-4 24 38)
- (-5 25 40) (-6 26 42) (-7 27 44) (-8 28 46) (-9 29 48))
- (vector-unfold (lambda (i x y z)
- (values (list x y z) (- x 1) (+ y 1) (+ z 2)))
- 10 0 20 30))
- (pass-if-equal "3 seeds, zero len"
- '#()
- (vector-unfold values 0 1 2 3))
- (pass-if-error "3 seeds, negative len"
- (vector-unfold values -2 1 2 3)))
- ;;
- ;; vector-unfold-right
- ;;
- (with-test-prefix "vector-unfold-right"
- (pass-if-equal "no seeds, zero len"
- '#()
- (vector-unfold-right values 0))
- (pass-if-error "no seeds, negative len"
- (vector-unfold-right values -1))
- (pass-if-equal "1 seed"
- '#(9 8 7 6 5 4 3 2 1 0)
- (vector-unfold-right (lambda (i x) (values x (+ x 1))) 10 0))
- (pass-if-equal "1 seed, zero len"
- '#()
- (vector-unfold-right values 0 1))
- (pass-if-error "1 seed, negative len"
- (vector-unfold-right values -1 1))
- (pass-if-equal "1 seed, reverse vector"
- '#(e d c b a)
- (let ((vector '#(a b c d e)))
- (vector-unfold-right
- (lambda (i x) (values (vector-ref vector x) (+ x 1)))
- (vector-length vector)
- 0)))
- (pass-if-equal "2 seeds"
- '#((0 20) (-1 21) (-2 22) (-3 23) (-4 24)
- (-5 25) (-6 26) (-7 27) (-8 28) (-9 29))
- (vector-unfold-right (lambda (i x y) (values (list x y) (+ x 1) (- y 1)))
- 10 -9 29))
- (pass-if-equal "2 seeds, zero len"
- '#()
- (vector-unfold-right values 0 1 2))
- (pass-if-error "2 seeds, negative len"
- (vector-unfold-right values -1 1 2))
- (pass-if-equal "3 seeds"
- '#((0 20 30) (-1 21 32) (-2 22 34) (-3 23 36) (-4 24 38)
- (-5 25 40) (-6 26 42) (-7 27 44) (-8 28 46) (-9 29 48))
- (vector-unfold-right (lambda (i x y z)
- (values (list x y z) (+ x 1) (- y 1) (- z 2)))
- 10 -9 29 48))
- (pass-if-equal "3 seeds, zero len"
- '#()
- (vector-unfold-right values 0 1 2 3))
- (pass-if-error "3 seeds, negative len"
- (vector-unfold-right values -1 1 2 3)))
- ;;
- ;; vector-copy
- ;;
- (with-test-prefix "vector-copy"
- (pass-if-equal "1 arg"
- '#(a b c d e f g h i)
- (vector-copy '#(a b c d e f g h i)))
- (pass-if-equal "2 args"
- '#(g h i)
- (vector-copy '#(a b c d e f g h i) 6))
- (pass-if-equal "3 args"
- '#(d e f)
- (vector-copy '#(a b c d e f g h i) 3 6))
- (pass-if-equal "4 args"
- '#(g h i x x x)
- (vector-copy '#(a b c d e f g h i) 6 12 'x))
- (pass-if-equal "3 args, empty range"
- '#()
- (vector-copy '#(a b c d e f g h i) 6 6))
- (pass-if-error "3 args, invalid range"
- (vector-copy '#(a b c d e f g h i) 4 2)))
- ;;
- ;; vector-reverse-copy
- ;;
- (with-test-prefix "vector-reverse-copy"
- (pass-if-equal "1 arg"
- '#(e d c b a)
- (vector-reverse-copy '#(a b c d e)))
- (pass-if-equal "2 args"
- '#(e d c)
- (vector-reverse-copy '#(a b c d e) 2))
- (pass-if-equal "3 args"
- '#(d c b)
- (vector-reverse-copy '#(a b c d e) 1 4))
- (pass-if-equal "3 args, empty result"
- '#()
- (vector-reverse-copy '#(a b c d e) 1 1))
- (pass-if-error "2 args, invalid range"
- (vector-reverse-copy '#(a b c d e) 2 1)))
- ;;
- ;; vector-append
- ;;
- (with-test-prefix "vector-append"
- (pass-if-equal "no args"
- '#()
- (vector-append))
- (pass-if-equal "1 arg"
- '(#(1 2) #f)
- (let* ((v (vector 1 2))
- (v-copy (vector-append v)))
- (list v-copy (eq? v v-copy))))
- (pass-if-equal "2 args"
- '#(x y)
- (vector-append '#(x) '#(y)))
- (pass-if-equal "3 args"
- '#(x y x y x y)
- (let ((v '#(x y)))
- (vector-append v v v)))
- (pass-if-equal "3 args with empty vector"
- '#(x y)
- (vector-append '#(x) '#() '#(y)))
- (pass-if-error "3 args with non-vectors"
- (vector-append '#() 'b 'c)))
- ;;
- ;; vector-concatenate
- ;;
- (with-test-prefix "vector-concatenate"
- (pass-if-equal "2 vectors"
- '#(a b c d)
- (vector-concatenate '(#(a b) #(c d))))
- (pass-if-equal "no vectors"
- '#()
- (vector-concatenate '()))
- (pass-if-error "non-vector in list"
- (vector-concatenate '(#(a b) c))))
- ;;;
- ;;; Predicates
- ;;;
- ;;
- ;; vector?
- ;;
- (with-test-prefix "vector?"
- (pass-if "empty vector" (vector? '#()))
- (pass-if "simple" (vector? '#(a b)))
- (pass-if "list" (not (vector? '(a b))))
- (pass-if "symbol" (not (vector? 'a))))
- ;;
- ;; vector-empty?
- ;;
- (with-test-prefix "vector-empty?"
- (pass-if "empty vector" (vector-empty? '#()))
- (pass-if "singleton vector" (not (vector-empty? '#(a))))
- (pass-if-error "non-vector" (vector-empty 'a)))
- ;;
- ;; vector=
- ;;
- (with-test-prefix "vector="
- (pass-if "2 equal vectors"
- (vector= eq? '#(a b c d) '#(a b c d)))
- (pass-if "3 equal vectors"
- (vector= eq? '#(a b c d) '#(a b c d) '#(a b c d)))
- (pass-if "2 empty vectors"
- (vector= eq? '#() '#()))
- (pass-if "no vectors"
- (vector= eq?))
- (pass-if "1 vector"
- (vector= eq? '#(a)))
- (pass-if "2 unequal vectors of equal length"
- (not (vector= eq? '#(a b c d) '#(a b d c))))
- (pass-if "3 unequal vectors of equal length"
- (not (vector= eq? '#(a b c d) '#(a b c d) '#(a b d c))))
- (pass-if "2 vectors of unequal length"
- (not (vector= eq? '#(a b c) '#(a b c d))))
- (pass-if "3 vectors of unequal length"
- (not (vector= eq? '#(a b c d) '#(a b c d) '#(a b c))))
- (pass-if "2 vectors: empty, non-empty"
- (not (vector= eq? '#() '#(a b d c))))
- (pass-if "2 vectors: non-empty, empty"
- (not (vector= eq? '#(a b d c) '#())))
- (pass-if "2 equal vectors, elt= is equal?"
- (vector= equal? '#("a" "b" "c") '#("a" "b" "c")))
- (pass-if "2 equal vectors, elt= is ="
- (vector= = '#(1/2 1/3 1/4 1/5) '#(1/2 1/3 1/4 1/5)))
- (pass-if-error "vector and list"
- (vector= equal? '#("a" "b" "c") '("a" "b" "c")))
- (pass-if-error "non-procedure"
- (vector= 1 '#("a" "b" "c") '("a" "b" "c"))))
- ;;;
- ;;; Selectors
- ;;;
- ;;
- ;; vector-ref
- ;;
- (with-test-prefix "vector-ref"
- (pass-if-equal "simple 0" 'a (vector-ref '#(a b c) 0))
- (pass-if-equal "simple 1" 'b (vector-ref '#(a b c) 1))
- (pass-if-equal "simple 2" 'c (vector-ref '#(a b c) 2))
- (pass-if-error "negative index" (vector-ref '#(a b c) -1))
- (pass-if-error "index beyond end" (vector-ref '#(a b c) 3))
- (pass-if-error "empty vector" (vector-ref '#() 0))
- (pass-if-error "non-vector" (vector-ref '(a b c) 0))
- (pass-if-error "inexact index" (vector-ref '#(a b c) 1.0)))
- ;;
- ;; vector-length
- ;;
- (with-test-prefix "vector-length"
- (pass-if-equal "empty vector" 0 (vector-length '#()))
- (pass-if-equal "simple" 3 (vector-length '#(a b c)))
- (pass-if-error "non-vector" (vector-length '(a b c))))
- ;;;
- ;;; Iteration
- ;;;
- ;;
- ;; vector-fold
- ;;
- (with-test-prefix "vector-fold"
- (pass-if-equal "1 vector"
- 10
- (vector-fold (lambda (i seed val) (+ seed val))
- 0
- '#(0 1 2 3 4)))
- (pass-if-equal "1 empty vector"
- 'a
- (vector-fold (lambda (i seed val) (+ seed val))
- 'a
- '#()))
- (pass-if-equal "1 vector, use index"
- 30
- (vector-fold (lambda (i seed val) (+ seed (* i val)))
- 0
- '#(0 1 2 3 4)))
- (pass-if-equal "2 vectors, unequal lengths"
- '(1 -7 1 -1)
- (vector-fold (lambda (i seed x y) (cons (- x y) seed))
- '()
- '#(6 1 2 3 4) '#(7 0 9 2)))
- (pass-if-equal "3 vectors, unequal lengths"
- '(51 33 31 19)
- (vector-fold (lambda (i seed x y z) (cons (- x y z) seed))
- '()
- '#(6 1 2 3 4) '#(7 0 9 2) '#(-20 -30 -40 -50 -60 -70)))
- (pass-if-error "5 args, non-vector"
- (vector-fold (lambda (i seed x y z) (cons (- x y z) seed))
- '()
- '#(6 1 2 3 4) '#(7 0 9 2) '(-20 -30 -40 -50 -60 -70)))
- (pass-if-error "non-procedure"
- (vector-fold 1 '() '#(6 1 2 3 4) '#(7 0 9 2))))
- ;;
- ;; vector-fold-right
- ;;
- (with-test-prefix "vector-fold-right"
- (pass-if-equal "1 vector"
- '((0 . a) (1 . b) (2 . c) (3 . d) (4 . e))
- (vector-fold-right (lambda (i seed val) (cons (cons i val) seed))
- '()
- '#(a b c d e)))
- (pass-if-equal "2 vectors, unequal lengths"
- '(-1 1 -7 1)
- (vector-fold-right (lambda (i seed x y) (cons (- x y) seed))
- '()
- '#(6 1 2 3 7) '#(7 0 9 2)))
- (pass-if-equal "3 vectors, unequal lengths"
- '(19 31 33 51)
- (vector-fold-right (lambda (i seed x y z) (cons (- x y z) seed))
- '()
- '#(6 1 2 3 4) '#(7 0 9 2) '#(-20 -30 -40 -50 -60 -70)))
- (pass-if-error "5 args, non-vector"
- (vector-fold-right (lambda (i seed x y z) (cons (- x y z) seed))
- '()
- '#(6 1 2 3 4) '#(7 0 9 2) '(-20 -30 -40 -50 -60 -70)))
- (pass-if-error "non-procedure"
- (vector-fold-right 1 '() '#(6 1 2 3 4) '#(7 0 9 2))))
- ;;
- ;; vector-map
- ;;
- (with-test-prefix "vector-map"
- (pass-if-equal "1 vector"
- '#((0 . a) (1 . b) (2 . c) (3 . d) (4 . e))
- (vector-map cons '#(a b c d e)))
- (pass-if-equal "1 empty vector"
- '#()
- (vector-map cons '#()))
- (pass-if-equal "2 vectors, unequal lengths"
- '#(5 8 11 14)
- (vector-map + '#(0 1 2 3 4) '#(5 6 7 8)))
- (pass-if-equal "3 vectors, unequal lengths"
- '#(15 28 41 54)
- (vector-map + '#(0 1 2 3 4) '#(5 6 7 8) '#(10 20 30 40 50 60)))
- (pass-if-error "4 args, non-vector"
- (vector-map + '#(0 1 2 3 4) '(5 6 7 8) '#(10 20 30 40 50 60)))
- (pass-if-error "3 args, non-vector"
- (vector-map + '#(0 1 2 3 4) '(5 6 7 8)))
- (pass-if-error "non-procedure"
- (vector-map #f '#(0 1 2 3 4) '#(5 6 7 8) '#(10 20 30 40 50 60))))
- ;;
- ;; vector-map!
- ;;
- (with-test-prefix "vector-map!"
- (pass-if-equal "1 vector"
- '#(0 1 4 9 16)
- (let ((v (vector 0 1 2 3 4)))
- (vector-map! * v)
- v))
- (pass-if-equal "1 empty vector"
- '#()
- (let ((v (vector)))
- (vector-map! * v)
- v))
- (pass-if-equal "2 vectors, unequal lengths"
- '#(5 8 11 14 4)
- (let ((v (vector 0 1 2 3 4)))
- (vector-map! + v '#(5 6 7 8))
- v))
- (pass-if-equal "3 vectors, unequal lengths"
- '#(15 28 41 54 4)
- (let ((v (vector 0 1 2 3 4)))
- (vector-map! + v '#(5 6 7 8) '#(10 20 30 40 50 60))
- v))
- (pass-if-error "non-vector"
- (let ((v (vector 0 1 2 3 4)))
- (vector-map! + v '#(5 6 7 8) '(10 20 30 40 50 60))
- v))
- (pass-if-error "non-procedure"
- (let ((v (vector 0 1 2 3 4)))
- (vector-map! '(1 . 2) v '#(5 6 7 8) '#(10 20 30 40 50 60))
- v)))
- ;;
- ;; vector-for-each
- ;;
- (with-test-prefix "vector-for-each"
- (pass-if-equal "1 vector"
- '(4 6 6 4 0)
- (let ((lst '()))
- (vector-for-each (lambda (i x)
- (set! lst (cons (* i x) lst)))
- '#(5 4 3 2 1))
- lst))
- (pass-if-equal "1 empty vector"
- '()
- (let ((lst '()))
- (vector-for-each (lambda (i x)
- (set! lst (cons (* i x) lst)))
- '#())
- lst))
- (pass-if-equal "2 vectors, unequal lengths"
- '(13 11 7 2)
- (let ((lst '()))
- (vector-for-each (lambda (i x y)
- (set! lst (cons (+ (* i x) y) lst)))
- '#(5 4 3 2 1)
- '#(2 3 5 7))
- lst))
- (pass-if-equal "3 vectors, unequal lengths"
- '(-6 -6 -6 -9)
- (let ((lst '()))
- (vector-for-each (lambda (i x y z)
- (set! lst (cons (+ (* i x) (- y z)) lst)))
- '#(5 4 3 2 1)
- '#(2 3 5 7)
- '#(11 13 17 19 23 29))
- lst))
- (pass-if-error "non-vector"
- (let ((lst '()))
- (vector-for-each (lambda (i x y z)
- (set! lst (cons (+ (* i x) (- y z)) lst)))
- '#(5 4 3 2 1)
- '(2 3 5 7)
- '#(11 13 17 19 23 29))
- lst))
- (pass-if-error "non-procedure"
- (let ((lst '()))
- (vector-for-each '#(not a procedure)
- '#(5 4 3 2 1)
- '#(2 3 5 7)
- '#(11 13 17 19 23 29))
- lst)))
- ;;
- ;; vector-count
- ;;
- (with-test-prefix "vector-count"
- (pass-if-equal "1 vector"
- 3
- (vector-count (lambda (i x) (even? (+ i x))) '#(2 3 5 7 11)))
- (pass-if-equal "1 empty vector"
- 0
- (vector-count values '#()))
- (pass-if-equal "2 vectors, unequal lengths"
- 3
- (vector-count (lambda (i x y) (< x (* i y)))
- '#(8 2 7 8 9 1 0)
- '#(7 6 4 3 1)))
- (pass-if-equal "3 vectors, unequal lengths"
- 2
- (vector-count (lambda (i x y z) (<= x (- y i) z))
- '#(3 6 3 0 2 4 1)
- '#(8 7 4 4 9)
- '#(7 6 8 3 1 7 9)))
- (pass-if-error "non-vector"
- (vector-count (lambda (i x y z) (<= x (- y i) z))
- '#(3 6 3 0 2 4 1)
- '#(8 7 4 4 9)
- '(7 6 8 3 1 7 9)))
- (pass-if-error "non-procedure"
- (vector-count '(1 2)
- '#(3 6 3 0 2 4 1)
- '#(8 7 4 4 9)
- '#(7 6 8 3 1 7 9))))
- ;;;
- ;;; Searching
- ;;;
- ;;
- ;; vector-index
- ;;
- (with-test-prefix "vector-index"
- (pass-if-equal "1 vector"
- 2
- (vector-index even? '#(3 1 4 1 6 9)))
- (pass-if-equal "2 vectors, unequal lengths, success"
- 1
- (vector-index < '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
- (pass-if-equal "2 vectors, unequal lengths, failure"
- #f
- (vector-index = '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
- (pass-if-error "non-procedure"
- (vector-index 1 '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
- (pass-if-error "3 args, non-vector"
- (vector-index = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)))
- (pass-if-error "4 args, non-vector"
- (vector-index = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2) '#(1 2 3)))
- (pass-if-equal "3 vectors, unequal lengths, success"
- 1
- (vector-index <
- '#(3 1 4 1 5 9 2 5 6)
- '#(2 6 1 7 2)
- '#(2 7 1 8)))
- (pass-if-equal "3 vectors, unequal lengths, failure"
- #f
- (vector-index <
- '#(3 1 4 1 5 9 2 5 6)
- '#(2 7 1 7 2)
- '#(2 7 1 7)))
- (pass-if-equal "empty vector"
- #f
- (vector-index < '#() '#(2 7 1 8 2))))
- ;;
- ;; vector-index-right
- ;;
- (with-test-prefix "vector-index-right"
- (pass-if-equal "1 vector"
- 4
- (vector-index-right even? '#(3 1 4 1 6 9)))
- (pass-if-equal "2 vectors, unequal lengths, success"
- 3
- (vector-index-right < '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
- (pass-if-equal "2 vectors, unequal lengths, failure"
- #f
- (vector-index-right = '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
- (pass-if-error "non-procedure"
- (vector-index-right 1 '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
- (pass-if-error "3 args, non-vector"
- (vector-index-right = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)))
- (pass-if-error "4 args, non-vector"
- (vector-index-right = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2) '#(1 2 3)))
- (pass-if-equal "3 vectors, unequal lengths, success"
- 3
- (vector-index-right <
- '#(3 1 4 1 5 9 2 5 6)
- '#(2 6 1 7 2)
- '#(2 7 1 8)))
- (pass-if-equal "3 vectors, unequal lengths, failure"
- #f
- (vector-index-right <
- '#(3 1 4 1 5 9 2 5 6)
- '#(2 7 1 7 2)
- '#(2 7 1 7)))
- (pass-if-equal "empty vector"
- #f
- (vector-index-right < '#() '#(2 7 1 8 2))))
- ;;
- ;; vector-skip
- ;;
- (with-test-prefix "vector-skip"
- (pass-if-equal "1 vector"
- 2
- (vector-skip odd? '#(3 1 4 1 6 9)))
- (pass-if-equal "2 vectors, unequal lengths, success"
- 1
- (vector-skip >= '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
- (pass-if-equal "2 vectors, unequal lengths, failure"
- #f
- (vector-skip (negate =) '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
- (pass-if-error "non-procedure"
- (vector-skip 1 '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
- (pass-if-error "3 args, non-vector"
- (vector-skip = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)))
- (pass-if-error "4 args, non-vector"
- (vector-skip = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2) '#(1 2 3)))
- (pass-if-equal "3 vectors, unequal lengths, success"
- 1
- (vector-skip (negate <)
- '#(3 1 4 1 5 9 2 5 6)
- '#(2 6 1 7 2)
- '#(2 7 1 8)))
- (pass-if-equal "3 vectors, unequal lengths, failure"
- #f
- (vector-skip (negate <)
- '#(3 1 4 1 5 9 2 5 6)
- '#(2 7 1 7 2)
- '#(2 7 1 7)))
- (pass-if-equal "empty vector"
- #f
- (vector-skip (negate <) '#() '#(2 7 1 8 2))))
- ;;
- ;; vector-skip-right
- ;;
- (with-test-prefix "vector-skip-right"
- (pass-if-equal "1 vector"
- 4
- (vector-skip-right odd? '#(3 1 4 1 6 9)))
- (pass-if-equal "2 vectors, unequal lengths, success"
- 3
- (vector-skip-right >= '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
- (pass-if-equal "2 vectors, unequal lengths, failure"
- #f
- (vector-skip-right (negate =) '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
- (pass-if-error "non-procedure"
- (vector-skip-right 1 '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
- (pass-if-error "3 args, non-vector"
- (vector-skip-right = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)))
- (pass-if-error "4 args, non-vector"
- (vector-skip-right = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2) '#(1 2 3)))
- (pass-if-equal "3 vectors, unequal lengths, success"
- 3
- (vector-skip-right (negate <)
- '#(3 1 4 1 5 9 2 5 6)
- '#(2 6 1 7 2)
- '#(2 7 1 8)))
- (pass-if-equal "3 vectors, unequal lengths, failure"
- #f
- (vector-skip-right (negate <)
- '#(3 1 4 1 5 9 2 5 6)
- '#(2 7 1 7 2)
- '#(2 7 1 7)))
- (pass-if-equal "empty vector"
- #f
- (vector-skip-right (negate <) '#() '#(2 7 1 8 2))))
- ;;
- ;; vector-binary-search
- ;;
- (with-test-prefix "vector-binary-search"
- (define (char-cmp c1 c2)
- (cond ((char<? c1 c2) -1)
- ((char=? c1 c2) 0)
- (else 1)))
- (pass-if-equal "success"
- 6
- (vector-binary-search '#(#\a #\b #\c #\d #\e #\f #\g #\h)
- #\g
- char-cmp))
- (pass-if-equal "failure"
- #f
- (vector-binary-search '#(#\a #\b #\c #\d #\e #\f #\g)
- #\q
- char-cmp))
- (pass-if-equal "singleton vector, success"
- 0
- (vector-binary-search '#(#\a)
- #\a
- char-cmp))
- (pass-if-equal "empty vector"
- #f
- (vector-binary-search '#()
- #\a
- char-cmp))
- (pass-if-error "first element"
- (vector-binary-search '(#\a #\b #\c)
- #\a
- char-cmp))
- (pass-if-equal "specify range, success"
- 3
- (vector-binary-search '#(#\a #\b #\c #\d #\e #\f #\g #\h)
- #\d
- char-cmp
- 2 6))
- (pass-if-equal "specify range, failure"
- #f
- (vector-binary-search '#(#\a #\b #\c #\d #\e #\f #\g #\h)
- #\g
- char-cmp
- 2 6)))
- ;;
- ;; vector-any
- ;;
- (with-test-prefix "vector-any"
- (pass-if-equal "1 vector, success"
- #t
- (vector-any even? '#(3 1 4 1 5 9 2)))
- (pass-if-equal "1 vector, failure"
- #f
- (vector-any even? '#(3 1 5 1 5 9 1)))
- (pass-if-equal "1 vector, left-to-right"
- #t
- (vector-any even? '#(3 1 4 1 5 #f 2)))
- (pass-if-equal "1 vector, left-to-right"
- 4
- (vector-any (lambda (x) (and (even? x) x))
- '#(3 1 4 1 5 #f 2)))
- (pass-if-equal "1 empty vector"
- #f
- (vector-any even? '#()))
- (pass-if-equal "2 vectors, unequal lengths, success"
- '(1 2)
- (vector-any (lambda (x y) (and (< x y) (list x y)))
- '#(3 1 4 1 5 #f)
- '#(1 0 1 2 3)))
- (pass-if-equal "2 vectors, unequal lengths, failure"
- #f
- (vector-any < '#(3 1 4 1 5 #f) '#(1 0 1 0 3)))
- (pass-if-equal "3 vectors, unequal lengths, success"
- '(1 2 3)
- (vector-any (lambda (x y z) (and (< x y z) (list x y z)))
- '#(3 1 4 1 3 #f)
- '#(1 0 1 2 4)
- '#(2 1 6 3 5)))
- (pass-if-equal "3 vectors, unequal lengths, failure"
- #f
- (vector-any <
- '#(3 1 4 1 5 #f)
- '#(1 0 3 2)
- '#(2 1 6 2 3))))
- ;;
- ;; vector-every
- ;;
- (with-test-prefix "vector-every"
- (pass-if-equal "1 vector, failure"
- #f
- (vector-every odd? '#(3 1 4 1 5 9 2)))
- (pass-if-equal "1 vector, success"
- 11
- (vector-every (lambda (x) (and (odd? x) x))
- '#(3 5 7 1 5 9 11)))
- (pass-if-equal "1 vector, left-to-right, failure"
- #f
- (vector-every odd? '#(3 1 4 1 5 #f 2)))
- (pass-if-equal "1 empty vector"
- #t
- (vector-every even? '#()))
- (pass-if-equal "2 vectors, unequal lengths, left-to-right, failure"
- #f
- (vector-every >= '#(3 1 4 1 5) '#(1 0 1 2 3 #f)))
- (pass-if-equal "2 vectors, unequal lengths, left-to-right, success"
- '(5 3)
- (vector-every (lambda (x y) (and (>= x y) (list x y)))
- '#(3 1 4 1 5)
- '#(1 0 1 0 3 #f)))
- (pass-if-equal "3 vectors, unequal lengths, left-to-right, failure"
- #f
- (vector-every >=
- '#(3 1 4 1 5)
- '#(1 0 1 2 3 #f)
- '#(0 0 1 2)))
- (pass-if-equal "3 vectors, unequal lengths, left-to-right, success"
- '(8 5 4)
- (vector-every (lambda (x y z) (and (>= x y z) (list x y z)))
- '#(3 5 4 8 5)
- '#(2 3 4 5 3 #f)
- '#(1 2 3 4))))
- ;;;
- ;;; Mutators
- ;;;
- ;;
- ;; vector-set!
- ;;
- (with-test-prefix "vector-set!"
- (pass-if-equal "simple"
- '#(0 a 2)
- (let ((v (vector 0 1 2)))
- (vector-set! v 1 'a)
- v))
- (pass-if-error "index beyond end" (vector-set! (vector 0 1 2) 3 'a))
- (pass-if-error "negative index" (vector-set! (vector 0 1 2) -1 'a))
- (pass-if-error "empty vector" (vector-set! (vector) 0 'a)))
- ;;
- ;; vector-swap!
- ;;
- (with-test-prefix "vector-swap!"
- (pass-if-equal "simple"
- '#(b a c)
- (let ((v (vector 'a 'b 'c)))
- (vector-swap! v 0 1)
- v))
- (pass-if-equal "same index"
- '#(a b c)
- (let ((v (vector 'a 'b 'c)))
- (vector-swap! v 1 1)
- v))
- (pass-if-error "index beyond end" (vector-swap! (vector 'a 'b 'c) 0 3))
- (pass-if-error "negative index" (vector-swap! (vector 'a 'b 'c) -1 1))
- (pass-if-error "empty vector" (vector-swap! (vector) 0 0)))
- ;;
- ;; vector-fill!
- ;;
- (with-test-prefix "vector-fill!"
- (pass-if-equal "2 args"
- '#(z z z z z)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-fill! v 'z)
- v))
- (pass-if-equal "3 args"
- '#(a b z z z)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-fill! v 'z 2)
- v))
- (pass-if-equal "4 args"
- '#(a z z d e)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-fill! v 'z 1 3)
- v))
- (pass-if-equal "4 args, entire vector"
- '#(z z z z z)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-fill! v 'z 0 5)
- v))
- (pass-if-equal "4 args, empty range"
- '#(a b c d e)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-fill! v 'z 2 2)
- v))
- (pass-if-error "index beyond end" (vector-fill! (vector 'a 'b 'c) 'z 0 4))
- (pass-if-error "invalid range" (vector-fill! (vector 'a 'b 'c) 'z 2 1))
- (pass-if-error "negative index" (vector-fill! (vector 'a 'b 'c) 'z -1 1))
- ;; This is intentionally allowed in Guile, as an extension:
- ;;(pass-if-error "vector-fill! e3" (vector-fill! (vector) 'z 0 0))
- )
- ;;
- ;; vector-reverse!
- ;;
- (with-test-prefix "vector-reverse!"
- (pass-if-equal "1 arg"
- '#(e d c b a)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-reverse! v)
- v))
- (pass-if-equal "2 args"
- '#(a b f e d c)
- (let ((v (vector 'a 'b 'c 'd 'e 'f)))
- (vector-reverse! v 2)
- v))
- (pass-if-equal "3 args"
- '#(a d c b e f)
- (let ((v (vector 'a 'b 'c 'd 'e 'f)))
- (vector-reverse! v 1 4)
- v))
- (pass-if-equal "3 args, empty range"
- '#(a b c d e f)
- (let ((v (vector 'a 'b 'c 'd 'e 'f)))
- (vector-reverse! v 3 3)
- v))
- (pass-if-equal "3 args, singleton range"
- '#(a b c d e f)
- (let ((v (vector 'a 'b 'c 'd 'e 'f)))
- (vector-reverse! v 3 4)
- v))
- (pass-if-equal "empty vector"
- '#()
- (let ((v (vector)))
- (vector-reverse! v)
- v))
- (pass-if-error "index beyond end" (vector-reverse! (vector 'a 'b) 0 3))
- (pass-if-error "invalid range" (vector-reverse! (vector 'a 'b) 2 1))
- (pass-if-error "negative index" (vector-reverse! (vector 'a 'b) -1 1))
- ;; This is intentionally allowed in Guile, as an extension:
- ;;(pass-if-error "vector-reverse! e3" (vector-reverse! (vector) 0 0))
- )
- ;;
- ;; vector-copy!
- ;;
- (with-test-prefix "vector-copy!"
- (pass-if-equal "3 args, 0 tstart"
- '#(1 2 3 d e)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-copy! v 0 '#(1 2 3))
- v))
- (pass-if-equal "3 args, 2 tstart"
- '#(a b 1 2 3)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-copy! v 2 '#(1 2 3))
- v))
- (pass-if-equal "4 args"
- '#(a b 2 3 e)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-copy! v 2 '#(1 2 3) 1)
- v))
- (pass-if-equal "5 args"
- '#(a b 3 4 5)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-copy! v 2 '#(1 2 3 4 5) 2 5)
- v))
- (pass-if-equal "5 args, empty range"
- '#(a b c d e)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-copy! v 2 '#(1 2 3) 1 1)
- v))
- (pass-if-equal "overlapping source/target, moving right"
- '#(b c c d e)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-copy! v 0 v 1 3)
- v))
- (pass-if-equal "overlapping source/target, moving left"
- '#(a b b c d)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-copy! v 2 v 1 4)
- v))
- (pass-if-equal "overlapping source/target, not moving"
- '#(a b c d e)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-copy! v 0 v 0)
- v))
- (pass-if-error "tstart beyond end"
- (vector-copy! (vector 1 2) 3 '#(1 2 3)))
- (pass-if-error "would overwrite target end"
- (vector-copy! (vector 1 2) 0 '#(1 2 3)))
- (pass-if-error "would overwrite target end"
- (vector-copy! (vector 1 2) 1 '#(1 2 3) 1)))
- ;;
- ;; vector-reverse-copy!
- ;;
- (with-test-prefix "vector-reverse-copy!"
- (pass-if-equal "3 args, 0 tstart"
- '#(3 2 1 d e)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-reverse-copy! v 0 '#(1 2 3))
- v))
- (pass-if-equal "3 args, 2 tstart"
- '#(a b 3 2 1)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-reverse-copy! v 2 '#(1 2 3))
- v))
- (pass-if-equal "4 args"
- '#(a b 3 2 e)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-reverse-copy! v 2 '#(1 2 3) 1)
- v))
- (pass-if-equal "5 args"
- '#(a b 4 3 2)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-reverse-copy! v 2 '#(1 2 3 4 5) 1 4)
- v))
- (pass-if-equal "5 args, empty range"
- '#(a b c d e)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-reverse-copy! v 2 '#(1 2 3 4 5) 2 2)
- v))
- (pass-if-equal "3 args, overlapping source/target"
- '#(e d c b a)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-reverse-copy! v 0 v)
- v))
- (pass-if-equal "5 args, overlapping source/target"
- '#(b a c d e)
- (let ((v (vector 'a 'b 'c 'd 'e)))
- (vector-reverse-copy! v 0 v 0 2)
- v))
- (pass-if-error "3 args, would overwrite target end"
- (vector-reverse-copy! (vector 'a 'b) 2 '#(a b)))
- (pass-if-error "3 args, negative tstart"
- (vector-reverse-copy! (vector 'a 'b) -1 '#(a b)))
- (pass-if-error "3 args, would overwrite target end"
- (vector-reverse-copy! (vector 'a 'b) 0 '#(a b c)))
- (pass-if-error "5 args, send beyond end"
- (vector-reverse-copy! (vector 'a 'b) 0 '#(a b c) 1 4))
- (pass-if-error "5 args, negative sstart"
- (vector-reverse-copy! (vector 'a 'b) 0 '#(a b c) -1 2))
- (pass-if-error "5 args, invalid source range"
- (vector-reverse-copy! (vector 'a 'b) 0 '#(a b c) 2 1)))
- ;;;
- ;;; Conversion
- ;;;
- ;;
- ;; vector->list
- ;;
- (with-test-prefix "vector->list"
- (pass-if-equal "1 arg"
- '(a b c)
- (vector->list '#(a b c)))
- (pass-if-equal "2 args"
- '(b c)
- (vector->list '#(a b c) 1))
- (pass-if-equal "3 args"
- '(b c d)
- (vector->list '#(a b c d e) 1 4))
- (pass-if-equal "3 args, empty range"
- '()
- (vector->list '#(a b c d e) 1 1))
- (pass-if-equal "1 arg, empty vector"
- '()
- (vector->list '#()))
- (pass-if-error "index beyond end" (vector->list '#(a b c) 1 6))
- (pass-if-error "negative index" (vector->list '#(a b c) -1 1))
- (pass-if-error "invalid range" (vector->list '#(a b c) 2 1)))
- ;;
- ;; reverse-vector->list
- ;;
- (with-test-prefix "reverse-vector->list"
- (pass-if-equal "1 arg"
- '(c b a)
- (reverse-vector->list '#(a b c)))
- (pass-if-equal "2 args"
- '(c b)
- (reverse-vector->list '#(a b c) 1))
- (pass-if-equal "3 args"
- '(d c b)
- (reverse-vector->list '#(a b c d e) 1 4))
- (pass-if-equal "3 args, empty range"
- '()
- (reverse-vector->list '#(a b c d e) 1 1))
- (pass-if-equal "1 arg, empty vector"
- '()
- (reverse-vector->list '#()))
- (pass-if-error "index beyond end" (reverse-vector->list '#(a b c) 1 6))
- (pass-if-error "negative index" (reverse-vector->list '#(a b c) -1 1))
- (pass-if-error "invalid range" (reverse-vector->list '#(a b c) 2 1)))
- ;;
- ;; list->vector
- ;;
- (with-test-prefix "list->vector"
- (pass-if-equal "1 arg"
- '#(a b c)
- (list->vector '(a b c)))
- (pass-if-equal "1 empty list"
- '#()
- (list->vector '()))
- (pass-if-equal "2 args"
- '#(2 3)
- (list->vector '(0 1 2 3) 2))
- (pass-if-equal "3 args"
- '#(0 1)
- (list->vector '(0 1 2 3) 0 2))
- (pass-if-equal "3 args, empty range"
- '#()
- (list->vector '(0 1 2 3) 2 2))
- (pass-if-error "index beyond end" (list->vector '(0 1 2 3) 0 5))
- (pass-if-error "negative index" (list->vector '(0 1 2 3) -1 1))
- (pass-if-error "invalid range" (list->vector '(0 1 2 3) 2 1)))
- ;;
- ;; reverse-list->vector
- ;;
- (with-test-prefix "reverse-list->vector"
- (pass-if-equal "1 arg"
- '#(c b a)
- (reverse-list->vector '(a b c)))
- (pass-if-equal "1 empty list"
- '#()
- (reverse-list->vector '()))
- (pass-if-equal "2 args"
- '#(3 2)
- (reverse-list->vector '(0 1 2 3) 2))
- (pass-if-equal "3 args"
- '#(1 0)
- (reverse-list->vector '(0 1 2 3) 0 2))
- (pass-if-equal "3 args, empty range"
- '#()
- (reverse-list->vector '(0 1 2 3) 2 2))
- (pass-if-error "index beyond end"
- (reverse-list->vector '(0 1 2 3) 0 5))
- (pass-if-error "negative index"
- (reverse-list->vector '(0 1 2 3) -1 1))
- (pass-if-error "invalid range"
- (reverse-list->vector '(0 1 2 3) 2 1)))
- ;;; Local Variables:
- ;;; eval: (put 'pass-if-error 'scheme-indent-function 1)
- ;;; End:
|