srfi-43.test 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376
  1. ;;;; srfi-43.test --- test suite for SRFI-43 Vector library -*- scheme -*-
  2. ;;;;
  3. ;;;; Copyright (C) 2014 Free Software Foundation, Inc.
  4. ;;;;
  5. ;;;; This library is free software; you can redistribute it and/or
  6. ;;;; modify it under the terms of the GNU Lesser General Public
  7. ;;;; License as published by the Free Software Foundation; either
  8. ;;;; version 3 of the License, or (at your option) any later version.
  9. ;;;;
  10. ;;;; This library is distributed in the hope that it will be useful,
  11. ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. ;;;; Lesser General Public License for more details.
  14. ;;;;
  15. ;;;; You should have received a copy of the GNU Lesser General Public
  16. ;;;; License along with this library; if not, write to the Free Software
  17. ;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  18. ;;;
  19. ;;; Originally written by Shiro Kawai and placed in the public domain
  20. ;;; 10/5/2005.
  21. ;;;
  22. ;;; Many tests added, and adapted for Guile's (test-suite lib)
  23. ;;; by Mark H Weaver <mhw@netris.org>, Jan 2014.
  24. ;;;
  25. (define-module (test-suite test-srfi-43)
  26. #:use-module (srfi srfi-43)
  27. #:use-module (test-suite lib))
  28. (define-syntax-rule (pass-if-error name body0 body ...)
  29. (pass-if name
  30. (catch #t
  31. (lambda () body0 body ... #f)
  32. (lambda (key . args) #t))))
  33. ;;;
  34. ;;; Constructors
  35. ;;;
  36. ;;
  37. ;; make-vector
  38. ;;
  39. (with-test-prefix "make-vector"
  40. (pass-if-equal "simple, no init"
  41. 5
  42. (vector-length (make-vector 5)))
  43. (pass-if-equal "empty"
  44. '#()
  45. (make-vector 0))
  46. (pass-if-error "negative length"
  47. (make-vector -4))
  48. (pass-if-equal "simple with init"
  49. '#(3 3 3 3 3)
  50. (make-vector 5 3))
  51. (pass-if-equal "empty with init"
  52. '#()
  53. (make-vector 0 3))
  54. (pass-if-error "negative length"
  55. (make-vector -1 3)))
  56. ;;
  57. ;; vector
  58. ;;
  59. (with-test-prefix "vector"
  60. (pass-if-equal "no args"
  61. '#()
  62. (vector))
  63. (pass-if-equal "simple"
  64. '#(1 2 3 4 5)
  65. (vector 1 2 3 4 5)))
  66. ;;
  67. ;; vector-unfold
  68. ;;
  69. (with-test-prefix "vector-unfold"
  70. (pass-if-equal "no seeds"
  71. '#(0 1 2 3 4 5 6 7 8 9)
  72. (vector-unfold values 10))
  73. (pass-if-equal "no seeds, zero len"
  74. '#()
  75. (vector-unfold values 0))
  76. (pass-if-error "no seeds, negative len"
  77. (vector-unfold values -1))
  78. (pass-if-equal "1 seed"
  79. '#(0 -1 -2 -3 -4 -5 -6 -7 -8 -9)
  80. (vector-unfold (lambda (i x) (values x (- x 1)))
  81. 10 0))
  82. (pass-if-equal "1 seed, zero len"
  83. '#()
  84. (vector-unfold values 0 1))
  85. (pass-if-error "1 seed, negative len"
  86. (vector-unfold values -2 1))
  87. (pass-if-equal "2 seeds"
  88. '#((0 20) (-1 21) (-2 22) (-3 23) (-4 24)
  89. (-5 25) (-6 26) (-7 27) (-8 28) (-9 29))
  90. (vector-unfold (lambda (i x y) (values (list x y) (- x 1) (+ y 1)))
  91. 10 0 20))
  92. (pass-if-equal "2 seeds, zero len"
  93. '#()
  94. (vector-unfold values 0 1 2))
  95. (pass-if-error "2 seeds, negative len"
  96. (vector-unfold values -2 1 2))
  97. (pass-if-equal "3 seeds"
  98. '#((0 20 30) (-1 21 32) (-2 22 34) (-3 23 36) (-4 24 38)
  99. (-5 25 40) (-6 26 42) (-7 27 44) (-8 28 46) (-9 29 48))
  100. (vector-unfold (lambda (i x y z)
  101. (values (list x y z) (- x 1) (+ y 1) (+ z 2)))
  102. 10 0 20 30))
  103. (pass-if-equal "3 seeds, zero len"
  104. '#()
  105. (vector-unfold values 0 1 2 3))
  106. (pass-if-error "3 seeds, negative len"
  107. (vector-unfold values -2 1 2 3)))
  108. ;;
  109. ;; vector-unfold-right
  110. ;;
  111. (with-test-prefix "vector-unfold-right"
  112. (pass-if-equal "no seeds, zero len"
  113. '#()
  114. (vector-unfold-right values 0))
  115. (pass-if-error "no seeds, negative len"
  116. (vector-unfold-right values -1))
  117. (pass-if-equal "1 seed"
  118. '#(9 8 7 6 5 4 3 2 1 0)
  119. (vector-unfold-right (lambda (i x) (values x (+ x 1))) 10 0))
  120. (pass-if-equal "1 seed, zero len"
  121. '#()
  122. (vector-unfold-right values 0 1))
  123. (pass-if-error "1 seed, negative len"
  124. (vector-unfold-right values -1 1))
  125. (pass-if-equal "1 seed, reverse vector"
  126. '#(e d c b a)
  127. (let ((vector '#(a b c d e)))
  128. (vector-unfold-right
  129. (lambda (i x) (values (vector-ref vector x) (+ x 1)))
  130. (vector-length vector)
  131. 0)))
  132. (pass-if-equal "2 seeds"
  133. '#((0 20) (-1 21) (-2 22) (-3 23) (-4 24)
  134. (-5 25) (-6 26) (-7 27) (-8 28) (-9 29))
  135. (vector-unfold-right (lambda (i x y) (values (list x y) (+ x 1) (- y 1)))
  136. 10 -9 29))
  137. (pass-if-equal "2 seeds, zero len"
  138. '#()
  139. (vector-unfold-right values 0 1 2))
  140. (pass-if-error "2 seeds, negative len"
  141. (vector-unfold-right values -1 1 2))
  142. (pass-if-equal "3 seeds"
  143. '#((0 20 30) (-1 21 32) (-2 22 34) (-3 23 36) (-4 24 38)
  144. (-5 25 40) (-6 26 42) (-7 27 44) (-8 28 46) (-9 29 48))
  145. (vector-unfold-right (lambda (i x y z)
  146. (values (list x y z) (+ x 1) (- y 1) (- z 2)))
  147. 10 -9 29 48))
  148. (pass-if-equal "3 seeds, zero len"
  149. '#()
  150. (vector-unfold-right values 0 1 2 3))
  151. (pass-if-error "3 seeds, negative len"
  152. (vector-unfold-right values -1 1 2 3)))
  153. ;;
  154. ;; vector-copy
  155. ;;
  156. (with-test-prefix "vector-copy"
  157. (pass-if-equal "1 arg"
  158. '#(a b c d e f g h i)
  159. (vector-copy '#(a b c d e f g h i)))
  160. (pass-if-equal "2 args"
  161. '#(g h i)
  162. (vector-copy '#(a b c d e f g h i) 6))
  163. (pass-if-equal "3 args"
  164. '#(d e f)
  165. (vector-copy '#(a b c d e f g h i) 3 6))
  166. (pass-if-equal "4 args"
  167. '#(g h i x x x)
  168. (vector-copy '#(a b c d e f g h i) 6 12 'x))
  169. (pass-if-equal "3 args, empty range"
  170. '#()
  171. (vector-copy '#(a b c d e f g h i) 6 6))
  172. (pass-if-error "3 args, invalid range"
  173. (vector-copy '#(a b c d e f g h i) 4 2)))
  174. ;;
  175. ;; vector-reverse-copy
  176. ;;
  177. (with-test-prefix "vector-reverse-copy"
  178. (pass-if-equal "1 arg"
  179. '#(e d c b a)
  180. (vector-reverse-copy '#(a b c d e)))
  181. (pass-if-equal "2 args"
  182. '#(e d c)
  183. (vector-reverse-copy '#(a b c d e) 2))
  184. (pass-if-equal "3 args"
  185. '#(d c b)
  186. (vector-reverse-copy '#(a b c d e) 1 4))
  187. (pass-if-equal "3 args, empty result"
  188. '#()
  189. (vector-reverse-copy '#(a b c d e) 1 1))
  190. (pass-if-error "2 args, invalid range"
  191. (vector-reverse-copy '#(a b c d e) 2 1)))
  192. ;;
  193. ;; vector-append
  194. ;;
  195. (with-test-prefix "vector-append"
  196. (pass-if-equal "no args"
  197. '#()
  198. (vector-append))
  199. (pass-if-equal "1 arg"
  200. '(#(1 2) #f)
  201. (let* ((v (vector 1 2))
  202. (v-copy (vector-append v)))
  203. (list v-copy (eq? v v-copy))))
  204. (pass-if-equal "2 args"
  205. '#(x y)
  206. (vector-append '#(x) '#(y)))
  207. (pass-if-equal "3 args"
  208. '#(x y x y x y)
  209. (let ((v '#(x y)))
  210. (vector-append v v v)))
  211. (pass-if-equal "3 args with empty vector"
  212. '#(x y)
  213. (vector-append '#(x) '#() '#(y)))
  214. (pass-if-error "3 args with non-vectors"
  215. (vector-append '#() 'b 'c)))
  216. ;;
  217. ;; vector-concatenate
  218. ;;
  219. (with-test-prefix "vector-concatenate"
  220. (pass-if-equal "2 vectors"
  221. '#(a b c d)
  222. (vector-concatenate '(#(a b) #(c d))))
  223. (pass-if-equal "no vectors"
  224. '#()
  225. (vector-concatenate '()))
  226. (pass-if-error "non-vector in list"
  227. (vector-concatenate '(#(a b) c))))
  228. ;;;
  229. ;;; Predicates
  230. ;;;
  231. ;;
  232. ;; vector?
  233. ;;
  234. (with-test-prefix "vector?"
  235. (pass-if "empty vector" (vector? '#()))
  236. (pass-if "simple" (vector? '#(a b)))
  237. (pass-if "list" (not (vector? '(a b))))
  238. (pass-if "symbol" (not (vector? 'a))))
  239. ;;
  240. ;; vector-empty?
  241. ;;
  242. (with-test-prefix "vector-empty?"
  243. (pass-if "empty vector" (vector-empty? '#()))
  244. (pass-if "singleton vector" (not (vector-empty? '#(a))))
  245. (pass-if-error "non-vector" (vector-empty 'a)))
  246. ;;
  247. ;; vector=
  248. ;;
  249. (with-test-prefix "vector="
  250. (pass-if "2 equal vectors"
  251. (vector= eq? '#(a b c d) '#(a b c d)))
  252. (pass-if "3 equal vectors"
  253. (vector= eq? '#(a b c d) '#(a b c d) '#(a b c d)))
  254. (pass-if "2 empty vectors"
  255. (vector= eq? '#() '#()))
  256. (pass-if "no vectors"
  257. (vector= eq?))
  258. (pass-if "1 vector"
  259. (vector= eq? '#(a)))
  260. (pass-if "2 unequal vectors of equal length"
  261. (not (vector= eq? '#(a b c d) '#(a b d c))))
  262. (pass-if "3 unequal vectors of equal length"
  263. (not (vector= eq? '#(a b c d) '#(a b c d) '#(a b d c))))
  264. (pass-if "2 vectors of unequal length"
  265. (not (vector= eq? '#(a b c) '#(a b c d))))
  266. (pass-if "3 vectors of unequal length"
  267. (not (vector= eq? '#(a b c d) '#(a b c d) '#(a b c))))
  268. (pass-if "2 vectors: empty, non-empty"
  269. (not (vector= eq? '#() '#(a b d c))))
  270. (pass-if "2 vectors: non-empty, empty"
  271. (not (vector= eq? '#(a b d c) '#())))
  272. (pass-if "2 equal vectors, elt= is equal?"
  273. (vector= equal? '#("a" "b" "c") '#("a" "b" "c")))
  274. (pass-if "2 equal vectors, elt= is ="
  275. (vector= = '#(1/2 1/3 1/4 1/5) '#(1/2 1/3 1/4 1/5)))
  276. (pass-if-error "vector and list"
  277. (vector= equal? '#("a" "b" "c") '("a" "b" "c")))
  278. (pass-if-error "non-procedure"
  279. (vector= 1 '#("a" "b" "c") '("a" "b" "c"))))
  280. ;;;
  281. ;;; Selectors
  282. ;;;
  283. ;;
  284. ;; vector-ref
  285. ;;
  286. (with-test-prefix "vector-ref"
  287. (pass-if-equal "simple 0" 'a (vector-ref '#(a b c) 0))
  288. (pass-if-equal "simple 1" 'b (vector-ref '#(a b c) 1))
  289. (pass-if-equal "simple 2" 'c (vector-ref '#(a b c) 2))
  290. (pass-if-error "negative index" (vector-ref '#(a b c) -1))
  291. (pass-if-error "index beyond end" (vector-ref '#(a b c) 3))
  292. (pass-if-error "empty vector" (vector-ref '#() 0))
  293. (pass-if-error "non-vector" (vector-ref '(a b c) 0))
  294. (pass-if-error "inexact index" (vector-ref '#(a b c) 1.0)))
  295. ;;
  296. ;; vector-length
  297. ;;
  298. (with-test-prefix "vector-length"
  299. (pass-if-equal "empty vector" 0 (vector-length '#()))
  300. (pass-if-equal "simple" 3 (vector-length '#(a b c)))
  301. (pass-if-error "non-vector" (vector-length '(a b c))))
  302. ;;;
  303. ;;; Iteration
  304. ;;;
  305. ;;
  306. ;; vector-fold
  307. ;;
  308. (with-test-prefix "vector-fold"
  309. (pass-if-equal "1 vector"
  310. 10
  311. (vector-fold (lambda (i seed val) (+ seed val))
  312. 0
  313. '#(0 1 2 3 4)))
  314. (pass-if-equal "1 empty vector"
  315. 'a
  316. (vector-fold (lambda (i seed val) (+ seed val))
  317. 'a
  318. '#()))
  319. (pass-if-equal "1 vector, use index"
  320. 30
  321. (vector-fold (lambda (i seed val) (+ seed (* i val)))
  322. 0
  323. '#(0 1 2 3 4)))
  324. (pass-if-equal "2 vectors, unequal lengths"
  325. '(1 -7 1 -1)
  326. (vector-fold (lambda (i seed x y) (cons (- x y) seed))
  327. '()
  328. '#(6 1 2 3 4) '#(7 0 9 2)))
  329. (pass-if-equal "3 vectors, unequal lengths"
  330. '(51 33 31 19)
  331. (vector-fold (lambda (i seed x y z) (cons (- x y z) seed))
  332. '()
  333. '#(6 1 2 3 4) '#(7 0 9 2) '#(-20 -30 -40 -50 -60 -70)))
  334. (pass-if-error "5 args, non-vector"
  335. (vector-fold (lambda (i seed x y z) (cons (- x y z) seed))
  336. '()
  337. '#(6 1 2 3 4) '#(7 0 9 2) '(-20 -30 -40 -50 -60 -70)))
  338. (pass-if-error "non-procedure"
  339. (vector-fold 1 '() '#(6 1 2 3 4) '#(7 0 9 2))))
  340. ;;
  341. ;; vector-fold-right
  342. ;;
  343. (with-test-prefix "vector-fold-right"
  344. (pass-if-equal "1 vector"
  345. '((0 . a) (1 . b) (2 . c) (3 . d) (4 . e))
  346. (vector-fold-right (lambda (i seed val) (cons (cons i val) seed))
  347. '()
  348. '#(a b c d e)))
  349. (pass-if-equal "2 vectors, unequal lengths"
  350. '(-1 1 -7 1)
  351. (vector-fold-right (lambda (i seed x y) (cons (- x y) seed))
  352. '()
  353. '#(6 1 2 3 7) '#(7 0 9 2)))
  354. (pass-if-equal "3 vectors, unequal lengths"
  355. '(19 31 33 51)
  356. (vector-fold-right (lambda (i seed x y z) (cons (- x y z) seed))
  357. '()
  358. '#(6 1 2 3 4) '#(7 0 9 2) '#(-20 -30 -40 -50 -60 -70)))
  359. (pass-if-error "5 args, non-vector"
  360. (vector-fold-right (lambda (i seed x y z) (cons (- x y z) seed))
  361. '()
  362. '#(6 1 2 3 4) '#(7 0 9 2) '(-20 -30 -40 -50 -60 -70)))
  363. (pass-if-error "non-procedure"
  364. (vector-fold-right 1 '() '#(6 1 2 3 4) '#(7 0 9 2))))
  365. ;;
  366. ;; vector-map
  367. ;;
  368. (with-test-prefix "vector-map"
  369. (pass-if-equal "1 vector"
  370. '#((0 . a) (1 . b) (2 . c) (3 . d) (4 . e))
  371. (vector-map cons '#(a b c d e)))
  372. (pass-if-equal "1 empty vector"
  373. '#()
  374. (vector-map cons '#()))
  375. (pass-if-equal "2 vectors, unequal lengths"
  376. '#(5 8 11 14)
  377. (vector-map + '#(0 1 2 3 4) '#(5 6 7 8)))
  378. (pass-if-equal "3 vectors, unequal lengths"
  379. '#(15 28 41 54)
  380. (vector-map + '#(0 1 2 3 4) '#(5 6 7 8) '#(10 20 30 40 50 60)))
  381. (pass-if-error "4 args, non-vector"
  382. (vector-map + '#(0 1 2 3 4) '(5 6 7 8) '#(10 20 30 40 50 60)))
  383. (pass-if-error "3 args, non-vector"
  384. (vector-map + '#(0 1 2 3 4) '(5 6 7 8)))
  385. (pass-if-error "non-procedure"
  386. (vector-map #f '#(0 1 2 3 4) '#(5 6 7 8) '#(10 20 30 40 50 60))))
  387. ;;
  388. ;; vector-map!
  389. ;;
  390. (with-test-prefix "vector-map!"
  391. (pass-if-equal "1 vector"
  392. '#(0 1 4 9 16)
  393. (let ((v (vector 0 1 2 3 4)))
  394. (vector-map! * v)
  395. v))
  396. (pass-if-equal "1 empty vector"
  397. '#()
  398. (let ((v (vector)))
  399. (vector-map! * v)
  400. v))
  401. (pass-if-equal "2 vectors, unequal lengths"
  402. '#(5 8 11 14 4)
  403. (let ((v (vector 0 1 2 3 4)))
  404. (vector-map! + v '#(5 6 7 8))
  405. v))
  406. (pass-if-equal "3 vectors, unequal lengths"
  407. '#(15 28 41 54 4)
  408. (let ((v (vector 0 1 2 3 4)))
  409. (vector-map! + v '#(5 6 7 8) '#(10 20 30 40 50 60))
  410. v))
  411. (pass-if-error "non-vector"
  412. (let ((v (vector 0 1 2 3 4)))
  413. (vector-map! + v '#(5 6 7 8) '(10 20 30 40 50 60))
  414. v))
  415. (pass-if-error "non-procedure"
  416. (let ((v (vector 0 1 2 3 4)))
  417. (vector-map! '(1 . 2) v '#(5 6 7 8) '#(10 20 30 40 50 60))
  418. v)))
  419. ;;
  420. ;; vector-for-each
  421. ;;
  422. (with-test-prefix "vector-for-each"
  423. (pass-if-equal "1 vector"
  424. '(4 6 6 4 0)
  425. (let ((lst '()))
  426. (vector-for-each (lambda (i x)
  427. (set! lst (cons (* i x) lst)))
  428. '#(5 4 3 2 1))
  429. lst))
  430. (pass-if-equal "1 empty vector"
  431. '()
  432. (let ((lst '()))
  433. (vector-for-each (lambda (i x)
  434. (set! lst (cons (* i x) lst)))
  435. '#())
  436. lst))
  437. (pass-if-equal "2 vectors, unequal lengths"
  438. '(13 11 7 2)
  439. (let ((lst '()))
  440. (vector-for-each (lambda (i x y)
  441. (set! lst (cons (+ (* i x) y) lst)))
  442. '#(5 4 3 2 1)
  443. '#(2 3 5 7))
  444. lst))
  445. (pass-if-equal "3 vectors, unequal lengths"
  446. '(-6 -6 -6 -9)
  447. (let ((lst '()))
  448. (vector-for-each (lambda (i x y z)
  449. (set! lst (cons (+ (* i x) (- y z)) lst)))
  450. '#(5 4 3 2 1)
  451. '#(2 3 5 7)
  452. '#(11 13 17 19 23 29))
  453. lst))
  454. (pass-if-error "non-vector"
  455. (let ((lst '()))
  456. (vector-for-each (lambda (i x y z)
  457. (set! lst (cons (+ (* i x) (- y z)) lst)))
  458. '#(5 4 3 2 1)
  459. '(2 3 5 7)
  460. '#(11 13 17 19 23 29))
  461. lst))
  462. (pass-if-error "non-procedure"
  463. (let ((lst '()))
  464. (vector-for-each '#(not a procedure)
  465. '#(5 4 3 2 1)
  466. '#(2 3 5 7)
  467. '#(11 13 17 19 23 29))
  468. lst)))
  469. ;;
  470. ;; vector-count
  471. ;;
  472. (with-test-prefix "vector-count"
  473. (pass-if-equal "1 vector"
  474. 3
  475. (vector-count (lambda (i x) (even? (+ i x))) '#(2 3 5 7 11)))
  476. (pass-if-equal "1 empty vector"
  477. 0
  478. (vector-count values '#()))
  479. (pass-if-equal "2 vectors, unequal lengths"
  480. 3
  481. (vector-count (lambda (i x y) (< x (* i y)))
  482. '#(8 2 7 8 9 1 0)
  483. '#(7 6 4 3 1)))
  484. (pass-if-equal "3 vectors, unequal lengths"
  485. 2
  486. (vector-count (lambda (i x y z) (<= x (- y i) z))
  487. '#(3 6 3 0 2 4 1)
  488. '#(8 7 4 4 9)
  489. '#(7 6 8 3 1 7 9)))
  490. (pass-if-error "non-vector"
  491. (vector-count (lambda (i x y z) (<= x (- y i) z))
  492. '#(3 6 3 0 2 4 1)
  493. '#(8 7 4 4 9)
  494. '(7 6 8 3 1 7 9)))
  495. (pass-if-error "non-procedure"
  496. (vector-count '(1 2)
  497. '#(3 6 3 0 2 4 1)
  498. '#(8 7 4 4 9)
  499. '#(7 6 8 3 1 7 9))))
  500. ;;;
  501. ;;; Searching
  502. ;;;
  503. ;;
  504. ;; vector-index
  505. ;;
  506. (with-test-prefix "vector-index"
  507. (pass-if-equal "1 vector"
  508. 2
  509. (vector-index even? '#(3 1 4 1 6 9)))
  510. (pass-if-equal "2 vectors, unequal lengths, success"
  511. 1
  512. (vector-index < '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
  513. (pass-if-equal "2 vectors, unequal lengths, failure"
  514. #f
  515. (vector-index = '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
  516. (pass-if-error "non-procedure"
  517. (vector-index 1 '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
  518. (pass-if-error "3 args, non-vector"
  519. (vector-index = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)))
  520. (pass-if-error "4 args, non-vector"
  521. (vector-index = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2) '#(1 2 3)))
  522. (pass-if-equal "3 vectors, unequal lengths, success"
  523. 1
  524. (vector-index <
  525. '#(3 1 4 1 5 9 2 5 6)
  526. '#(2 6 1 7 2)
  527. '#(2 7 1 8)))
  528. (pass-if-equal "3 vectors, unequal lengths, failure"
  529. #f
  530. (vector-index <
  531. '#(3 1 4 1 5 9 2 5 6)
  532. '#(2 7 1 7 2)
  533. '#(2 7 1 7)))
  534. (pass-if-equal "empty vector"
  535. #f
  536. (vector-index < '#() '#(2 7 1 8 2))))
  537. ;;
  538. ;; vector-index-right
  539. ;;
  540. (with-test-prefix "vector-index-right"
  541. (pass-if-equal "1 vector"
  542. 4
  543. (vector-index-right even? '#(3 1 4 1 6 9)))
  544. (pass-if-equal "2 vectors, unequal lengths, success"
  545. 3
  546. (vector-index-right < '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
  547. (pass-if-equal "2 vectors, unequal lengths, failure"
  548. #f
  549. (vector-index-right = '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
  550. (pass-if-error "non-procedure"
  551. (vector-index-right 1 '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
  552. (pass-if-error "3 args, non-vector"
  553. (vector-index-right = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)))
  554. (pass-if-error "4 args, non-vector"
  555. (vector-index-right = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2) '#(1 2 3)))
  556. (pass-if-equal "3 vectors, unequal lengths, success"
  557. 3
  558. (vector-index-right <
  559. '#(3 1 4 1 5 9 2 5 6)
  560. '#(2 6 1 7 2)
  561. '#(2 7 1 8)))
  562. (pass-if-equal "3 vectors, unequal lengths, failure"
  563. #f
  564. (vector-index-right <
  565. '#(3 1 4 1 5 9 2 5 6)
  566. '#(2 7 1 7 2)
  567. '#(2 7 1 7)))
  568. (pass-if-equal "empty vector"
  569. #f
  570. (vector-index-right < '#() '#(2 7 1 8 2))))
  571. ;;
  572. ;; vector-skip
  573. ;;
  574. (with-test-prefix "vector-skip"
  575. (pass-if-equal "1 vector"
  576. 2
  577. (vector-skip odd? '#(3 1 4 1 6 9)))
  578. (pass-if-equal "2 vectors, unequal lengths, success"
  579. 1
  580. (vector-skip >= '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
  581. (pass-if-equal "2 vectors, unequal lengths, failure"
  582. #f
  583. (vector-skip (negate =) '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
  584. (pass-if-error "non-procedure"
  585. (vector-skip 1 '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
  586. (pass-if-error "3 args, non-vector"
  587. (vector-skip = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)))
  588. (pass-if-error "4 args, non-vector"
  589. (vector-skip = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2) '#(1 2 3)))
  590. (pass-if-equal "3 vectors, unequal lengths, success"
  591. 1
  592. (vector-skip (negate <)
  593. '#(3 1 4 1 5 9 2 5 6)
  594. '#(2 6 1 7 2)
  595. '#(2 7 1 8)))
  596. (pass-if-equal "3 vectors, unequal lengths, failure"
  597. #f
  598. (vector-skip (negate <)
  599. '#(3 1 4 1 5 9 2 5 6)
  600. '#(2 7 1 7 2)
  601. '#(2 7 1 7)))
  602. (pass-if-equal "empty vector"
  603. #f
  604. (vector-skip (negate <) '#() '#(2 7 1 8 2))))
  605. ;;
  606. ;; vector-skip-right
  607. ;;
  608. (with-test-prefix "vector-skip-right"
  609. (pass-if-equal "1 vector"
  610. 4
  611. (vector-skip-right odd? '#(3 1 4 1 6 9)))
  612. (pass-if-equal "2 vectors, unequal lengths, success"
  613. 3
  614. (vector-skip-right >= '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
  615. (pass-if-equal "2 vectors, unequal lengths, failure"
  616. #f
  617. (vector-skip-right (negate =) '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
  618. (pass-if-error "non-procedure"
  619. (vector-skip-right 1 '#(3 1 4 1 5 9 2 5 6) '#(2 7 1 8 2)))
  620. (pass-if-error "3 args, non-vector"
  621. (vector-skip-right = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2)))
  622. (pass-if-error "4 args, non-vector"
  623. (vector-skip-right = '#(3 1 4 1 5 9 2 5 6) '(2 7 1 8 2) '#(1 2 3)))
  624. (pass-if-equal "3 vectors, unequal lengths, success"
  625. 3
  626. (vector-skip-right (negate <)
  627. '#(3 1 4 1 5 9 2 5 6)
  628. '#(2 6 1 7 2)
  629. '#(2 7 1 8)))
  630. (pass-if-equal "3 vectors, unequal lengths, failure"
  631. #f
  632. (vector-skip-right (negate <)
  633. '#(3 1 4 1 5 9 2 5 6)
  634. '#(2 7 1 7 2)
  635. '#(2 7 1 7)))
  636. (pass-if-equal "empty vector"
  637. #f
  638. (vector-skip-right (negate <) '#() '#(2 7 1 8 2))))
  639. ;;
  640. ;; vector-binary-search
  641. ;;
  642. (with-test-prefix "vector-binary-search"
  643. (define (char-cmp c1 c2)
  644. (cond ((char<? c1 c2) -1)
  645. ((char=? c1 c2) 0)
  646. (else 1)))
  647. (pass-if-equal "success"
  648. 6
  649. (vector-binary-search '#(#\a #\b #\c #\d #\e #\f #\g #\h)
  650. #\g
  651. char-cmp))
  652. (pass-if-equal "failure"
  653. #f
  654. (vector-binary-search '#(#\a #\b #\c #\d #\e #\f #\g)
  655. #\q
  656. char-cmp))
  657. (pass-if-equal "singleton vector, success"
  658. 0
  659. (vector-binary-search '#(#\a)
  660. #\a
  661. char-cmp))
  662. (pass-if-equal "empty vector"
  663. #f
  664. (vector-binary-search '#()
  665. #\a
  666. char-cmp))
  667. (pass-if-error "first element"
  668. (vector-binary-search '(#\a #\b #\c)
  669. #\a
  670. char-cmp))
  671. (pass-if-equal "specify range, success"
  672. 3
  673. (vector-binary-search '#(#\a #\b #\c #\d #\e #\f #\g #\h)
  674. #\d
  675. char-cmp
  676. 2 6))
  677. (pass-if-equal "specify range, failure"
  678. #f
  679. (vector-binary-search '#(#\a #\b #\c #\d #\e #\f #\g #\h)
  680. #\g
  681. char-cmp
  682. 2 6)))
  683. ;;
  684. ;; vector-any
  685. ;;
  686. (with-test-prefix "vector-any"
  687. (pass-if-equal "1 vector, success"
  688. #t
  689. (vector-any even? '#(3 1 4 1 5 9 2)))
  690. (pass-if-equal "1 vector, failure"
  691. #f
  692. (vector-any even? '#(3 1 5 1 5 9 1)))
  693. (pass-if-equal "1 vector, left-to-right"
  694. #t
  695. (vector-any even? '#(3 1 4 1 5 #f 2)))
  696. (pass-if-equal "1 vector, left-to-right"
  697. 4
  698. (vector-any (lambda (x) (and (even? x) x))
  699. '#(3 1 4 1 5 #f 2)))
  700. (pass-if-equal "1 empty vector"
  701. #f
  702. (vector-any even? '#()))
  703. (pass-if-equal "2 vectors, unequal lengths, success"
  704. '(1 2)
  705. (vector-any (lambda (x y) (and (< x y) (list x y)))
  706. '#(3 1 4 1 5 #f)
  707. '#(1 0 1 2 3)))
  708. (pass-if-equal "2 vectors, unequal lengths, failure"
  709. #f
  710. (vector-any < '#(3 1 4 1 5 #f) '#(1 0 1 0 3)))
  711. (pass-if-equal "3 vectors, unequal lengths, success"
  712. '(1 2 3)
  713. (vector-any (lambda (x y z) (and (< x y z) (list x y z)))
  714. '#(3 1 4 1 3 #f)
  715. '#(1 0 1 2 4)
  716. '#(2 1 6 3 5)))
  717. (pass-if-equal "3 vectors, unequal lengths, failure"
  718. #f
  719. (vector-any <
  720. '#(3 1 4 1 5 #f)
  721. '#(1 0 3 2)
  722. '#(2 1 6 2 3))))
  723. ;;
  724. ;; vector-every
  725. ;;
  726. (with-test-prefix "vector-every"
  727. (pass-if-equal "1 vector, failure"
  728. #f
  729. (vector-every odd? '#(3 1 4 1 5 9 2)))
  730. (pass-if-equal "1 vector, success"
  731. 11
  732. (vector-every (lambda (x) (and (odd? x) x))
  733. '#(3 5 7 1 5 9 11)))
  734. (pass-if-equal "1 vector, left-to-right, failure"
  735. #f
  736. (vector-every odd? '#(3 1 4 1 5 #f 2)))
  737. (pass-if-equal "1 empty vector"
  738. #t
  739. (vector-every even? '#()))
  740. (pass-if-equal "2 vectors, unequal lengths, left-to-right, failure"
  741. #f
  742. (vector-every >= '#(3 1 4 1 5) '#(1 0 1 2 3 #f)))
  743. (pass-if-equal "2 vectors, unequal lengths, left-to-right, success"
  744. '(5 3)
  745. (vector-every (lambda (x y) (and (>= x y) (list x y)))
  746. '#(3 1 4 1 5)
  747. '#(1 0 1 0 3 #f)))
  748. (pass-if-equal "3 vectors, unequal lengths, left-to-right, failure"
  749. #f
  750. (vector-every >=
  751. '#(3 1 4 1 5)
  752. '#(1 0 1 2 3 #f)
  753. '#(0 0 1 2)))
  754. (pass-if-equal "3 vectors, unequal lengths, left-to-right, success"
  755. '(8 5 4)
  756. (vector-every (lambda (x y z) (and (>= x y z) (list x y z)))
  757. '#(3 5 4 8 5)
  758. '#(2 3 4 5 3 #f)
  759. '#(1 2 3 4))))
  760. ;;;
  761. ;;; Mutators
  762. ;;;
  763. ;;
  764. ;; vector-set!
  765. ;;
  766. (with-test-prefix "vector-set!"
  767. (pass-if-equal "simple"
  768. '#(0 a 2)
  769. (let ((v (vector 0 1 2)))
  770. (vector-set! v 1 'a)
  771. v))
  772. (pass-if-error "index beyond end" (vector-set! (vector 0 1 2) 3 'a))
  773. (pass-if-error "negative index" (vector-set! (vector 0 1 2) -1 'a))
  774. (pass-if-error "empty vector" (vector-set! (vector) 0 'a)))
  775. ;;
  776. ;; vector-swap!
  777. ;;
  778. (with-test-prefix "vector-swap!"
  779. (pass-if-equal "simple"
  780. '#(b a c)
  781. (let ((v (vector 'a 'b 'c)))
  782. (vector-swap! v 0 1)
  783. v))
  784. (pass-if-equal "same index"
  785. '#(a b c)
  786. (let ((v (vector 'a 'b 'c)))
  787. (vector-swap! v 1 1)
  788. v))
  789. (pass-if-error "index beyond end" (vector-swap! (vector 'a 'b 'c) 0 3))
  790. (pass-if-error "negative index" (vector-swap! (vector 'a 'b 'c) -1 1))
  791. (pass-if-error "empty vector" (vector-swap! (vector) 0 0)))
  792. ;;
  793. ;; vector-fill!
  794. ;;
  795. (with-test-prefix "vector-fill!"
  796. (pass-if-equal "2 args"
  797. '#(z z z z z)
  798. (let ((v (vector 'a 'b 'c 'd 'e)))
  799. (vector-fill! v 'z)
  800. v))
  801. (pass-if-equal "3 args"
  802. '#(a b z z z)
  803. (let ((v (vector 'a 'b 'c 'd 'e)))
  804. (vector-fill! v 'z 2)
  805. v))
  806. (pass-if-equal "4 args"
  807. '#(a z z d e)
  808. (let ((v (vector 'a 'b 'c 'd 'e)))
  809. (vector-fill! v 'z 1 3)
  810. v))
  811. (pass-if-equal "4 args, entire vector"
  812. '#(z z z z z)
  813. (let ((v (vector 'a 'b 'c 'd 'e)))
  814. (vector-fill! v 'z 0 5)
  815. v))
  816. (pass-if-equal "4 args, empty range"
  817. '#(a b c d e)
  818. (let ((v (vector 'a 'b 'c 'd 'e)))
  819. (vector-fill! v 'z 2 2)
  820. v))
  821. (pass-if-error "index beyond end" (vector-fill! (vector 'a 'b 'c) 'z 0 4))
  822. (pass-if-error "invalid range" (vector-fill! (vector 'a 'b 'c) 'z 2 1))
  823. (pass-if-error "negative index" (vector-fill! (vector 'a 'b 'c) 'z -1 1))
  824. ;; This is intentionally allowed in Guile, as an extension:
  825. ;;(pass-if-error "vector-fill! e3" (vector-fill! (vector) 'z 0 0))
  826. )
  827. ;;
  828. ;; vector-reverse!
  829. ;;
  830. (with-test-prefix "vector-reverse!"
  831. (pass-if-equal "1 arg"
  832. '#(e d c b a)
  833. (let ((v (vector 'a 'b 'c 'd 'e)))
  834. (vector-reverse! v)
  835. v))
  836. (pass-if-equal "2 args"
  837. '#(a b f e d c)
  838. (let ((v (vector 'a 'b 'c 'd 'e 'f)))
  839. (vector-reverse! v 2)
  840. v))
  841. (pass-if-equal "3 args"
  842. '#(a d c b e f)
  843. (let ((v (vector 'a 'b 'c 'd 'e 'f)))
  844. (vector-reverse! v 1 4)
  845. v))
  846. (pass-if-equal "3 args, empty range"
  847. '#(a b c d e f)
  848. (let ((v (vector 'a 'b 'c 'd 'e 'f)))
  849. (vector-reverse! v 3 3)
  850. v))
  851. (pass-if-equal "3 args, singleton range"
  852. '#(a b c d e f)
  853. (let ((v (vector 'a 'b 'c 'd 'e 'f)))
  854. (vector-reverse! v 3 4)
  855. v))
  856. (pass-if-equal "empty vector"
  857. '#()
  858. (let ((v (vector)))
  859. (vector-reverse! v)
  860. v))
  861. (pass-if-error "index beyond end" (vector-reverse! (vector 'a 'b) 0 3))
  862. (pass-if-error "invalid range" (vector-reverse! (vector 'a 'b) 2 1))
  863. (pass-if-error "negative index" (vector-reverse! (vector 'a 'b) -1 1))
  864. ;; This is intentionally allowed in Guile, as an extension:
  865. ;;(pass-if-error "vector-reverse! e3" (vector-reverse! (vector) 0 0))
  866. )
  867. ;;
  868. ;; vector-copy!
  869. ;;
  870. (with-test-prefix "vector-copy!"
  871. (pass-if-equal "3 args, 0 tstart"
  872. '#(1 2 3 d e)
  873. (let ((v (vector 'a 'b 'c 'd 'e)))
  874. (vector-copy! v 0 '#(1 2 3))
  875. v))
  876. (pass-if-equal "3 args, 2 tstart"
  877. '#(a b 1 2 3)
  878. (let ((v (vector 'a 'b 'c 'd 'e)))
  879. (vector-copy! v 2 '#(1 2 3))
  880. v))
  881. (pass-if-equal "4 args"
  882. '#(a b 2 3 e)
  883. (let ((v (vector 'a 'b 'c 'd 'e)))
  884. (vector-copy! v 2 '#(1 2 3) 1)
  885. v))
  886. (pass-if-equal "5 args"
  887. '#(a b 3 4 5)
  888. (let ((v (vector 'a 'b 'c 'd 'e)))
  889. (vector-copy! v 2 '#(1 2 3 4 5) 2 5)
  890. v))
  891. (pass-if-equal "5 args, empty range"
  892. '#(a b c d e)
  893. (let ((v (vector 'a 'b 'c 'd 'e)))
  894. (vector-copy! v 2 '#(1 2 3) 1 1)
  895. v))
  896. (pass-if-equal "overlapping source/target, moving right"
  897. '#(b c c d e)
  898. (let ((v (vector 'a 'b 'c 'd 'e)))
  899. (vector-copy! v 0 v 1 3)
  900. v))
  901. (pass-if-equal "overlapping source/target, moving left"
  902. '#(a b b c d)
  903. (let ((v (vector 'a 'b 'c 'd 'e)))
  904. (vector-copy! v 2 v 1 4)
  905. v))
  906. (pass-if-equal "overlapping source/target, not moving"
  907. '#(a b c d e)
  908. (let ((v (vector 'a 'b 'c 'd 'e)))
  909. (vector-copy! v 0 v 0)
  910. v))
  911. (pass-if-error "tstart beyond end"
  912. (vector-copy! (vector 1 2) 3 '#(1 2 3)))
  913. (pass-if-error "would overwrite target end"
  914. (vector-copy! (vector 1 2) 0 '#(1 2 3)))
  915. (pass-if-error "would overwrite target end"
  916. (vector-copy! (vector 1 2) 1 '#(1 2 3) 1)))
  917. ;;
  918. ;; vector-reverse-copy!
  919. ;;
  920. (with-test-prefix "vector-reverse-copy!"
  921. (pass-if-equal "3 args, 0 tstart"
  922. '#(3 2 1 d e)
  923. (let ((v (vector 'a 'b 'c 'd 'e)))
  924. (vector-reverse-copy! v 0 '#(1 2 3))
  925. v))
  926. (pass-if-equal "3 args, 2 tstart"
  927. '#(a b 3 2 1)
  928. (let ((v (vector 'a 'b 'c 'd 'e)))
  929. (vector-reverse-copy! v 2 '#(1 2 3))
  930. v))
  931. (pass-if-equal "4 args"
  932. '#(a b 3 2 e)
  933. (let ((v (vector 'a 'b 'c 'd 'e)))
  934. (vector-reverse-copy! v 2 '#(1 2 3) 1)
  935. v))
  936. (pass-if-equal "5 args"
  937. '#(a b 4 3 2)
  938. (let ((v (vector 'a 'b 'c 'd 'e)))
  939. (vector-reverse-copy! v 2 '#(1 2 3 4 5) 1 4)
  940. v))
  941. (pass-if-equal "5 args, empty range"
  942. '#(a b c d e)
  943. (let ((v (vector 'a 'b 'c 'd 'e)))
  944. (vector-reverse-copy! v 2 '#(1 2 3 4 5) 2 2)
  945. v))
  946. (pass-if-equal "3 args, overlapping source/target"
  947. '#(e d c b a)
  948. (let ((v (vector 'a 'b 'c 'd 'e)))
  949. (vector-reverse-copy! v 0 v)
  950. v))
  951. (pass-if-equal "5 args, overlapping source/target"
  952. '#(b a c d e)
  953. (let ((v (vector 'a 'b 'c 'd 'e)))
  954. (vector-reverse-copy! v 0 v 0 2)
  955. v))
  956. (pass-if-error "3 args, would overwrite target end"
  957. (vector-reverse-copy! (vector 'a 'b) 2 '#(a b)))
  958. (pass-if-error "3 args, negative tstart"
  959. (vector-reverse-copy! (vector 'a 'b) -1 '#(a b)))
  960. (pass-if-error "3 args, would overwrite target end"
  961. (vector-reverse-copy! (vector 'a 'b) 0 '#(a b c)))
  962. (pass-if-error "5 args, send beyond end"
  963. (vector-reverse-copy! (vector 'a 'b) 0 '#(a b c) 1 4))
  964. (pass-if-error "5 args, negative sstart"
  965. (vector-reverse-copy! (vector 'a 'b) 0 '#(a b c) -1 2))
  966. (pass-if-error "5 args, invalid source range"
  967. (vector-reverse-copy! (vector 'a 'b) 0 '#(a b c) 2 1)))
  968. ;;;
  969. ;;; Conversion
  970. ;;;
  971. ;;
  972. ;; vector->list
  973. ;;
  974. (with-test-prefix "vector->list"
  975. (pass-if-equal "1 arg"
  976. '(a b c)
  977. (vector->list '#(a b c)))
  978. (pass-if-equal "2 args"
  979. '(b c)
  980. (vector->list '#(a b c) 1))
  981. (pass-if-equal "3 args"
  982. '(b c d)
  983. (vector->list '#(a b c d e) 1 4))
  984. (pass-if-equal "3 args, empty range"
  985. '()
  986. (vector->list '#(a b c d e) 1 1))
  987. (pass-if-equal "1 arg, empty vector"
  988. '()
  989. (vector->list '#()))
  990. (pass-if-error "index beyond end" (vector->list '#(a b c) 1 6))
  991. (pass-if-error "negative index" (vector->list '#(a b c) -1 1))
  992. (pass-if-error "invalid range" (vector->list '#(a b c) 2 1)))
  993. ;;
  994. ;; reverse-vector->list
  995. ;;
  996. (with-test-prefix "reverse-vector->list"
  997. (pass-if-equal "1 arg"
  998. '(c b a)
  999. (reverse-vector->list '#(a b c)))
  1000. (pass-if-equal "2 args"
  1001. '(c b)
  1002. (reverse-vector->list '#(a b c) 1))
  1003. (pass-if-equal "3 args"
  1004. '(d c b)
  1005. (reverse-vector->list '#(a b c d e) 1 4))
  1006. (pass-if-equal "3 args, empty range"
  1007. '()
  1008. (reverse-vector->list '#(a b c d e) 1 1))
  1009. (pass-if-equal "1 arg, empty vector"
  1010. '()
  1011. (reverse-vector->list '#()))
  1012. (pass-if-error "index beyond end" (reverse-vector->list '#(a b c) 1 6))
  1013. (pass-if-error "negative index" (reverse-vector->list '#(a b c) -1 1))
  1014. (pass-if-error "invalid range" (reverse-vector->list '#(a b c) 2 1)))
  1015. ;;
  1016. ;; list->vector
  1017. ;;
  1018. (with-test-prefix "list->vector"
  1019. (pass-if-equal "1 arg"
  1020. '#(a b c)
  1021. (list->vector '(a b c)))
  1022. (pass-if-equal "1 empty list"
  1023. '#()
  1024. (list->vector '()))
  1025. (pass-if-equal "2 args"
  1026. '#(2 3)
  1027. (list->vector '(0 1 2 3) 2))
  1028. (pass-if-equal "3 args"
  1029. '#(0 1)
  1030. (list->vector '(0 1 2 3) 0 2))
  1031. (pass-if-equal "3 args, empty range"
  1032. '#()
  1033. (list->vector '(0 1 2 3) 2 2))
  1034. (pass-if-error "index beyond end" (list->vector '(0 1 2 3) 0 5))
  1035. (pass-if-error "negative index" (list->vector '(0 1 2 3) -1 1))
  1036. (pass-if-error "invalid range" (list->vector '(0 1 2 3) 2 1)))
  1037. ;;
  1038. ;; reverse-list->vector
  1039. ;;
  1040. (with-test-prefix "reverse-list->vector"
  1041. (pass-if-equal "1 arg"
  1042. '#(c b a)
  1043. (reverse-list->vector '(a b c)))
  1044. (pass-if-equal "1 empty list"
  1045. '#()
  1046. (reverse-list->vector '()))
  1047. (pass-if-equal "2 args"
  1048. '#(3 2)
  1049. (reverse-list->vector '(0 1 2 3) 2))
  1050. (pass-if-equal "3 args"
  1051. '#(1 0)
  1052. (reverse-list->vector '(0 1 2 3) 0 2))
  1053. (pass-if-equal "3 args, empty range"
  1054. '#()
  1055. (reverse-list->vector '(0 1 2 3) 2 2))
  1056. (pass-if-error "index beyond end"
  1057. (reverse-list->vector '(0 1 2 3) 0 5))
  1058. (pass-if-error "negative index"
  1059. (reverse-list->vector '(0 1 2 3) -1 1))
  1060. (pass-if-error "invalid range"
  1061. (reverse-list->vector '(0 1 2 3) 2 1)))
  1062. ;;; Local Variables:
  1063. ;;; eval: (put 'pass-if-error 'scheme-indent-function 1)
  1064. ;;; End: