r6rs-base.test 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. ;;; r6rs-base.test --- Test suite for R6RS (rnrs base)
  2. ;; Copyright (C) 2010, 2011 Free Software Foundation, Inc.
  3. ;;
  4. ;; This library is free software; you can redistribute it and/or
  5. ;; modify it under the terms of the GNU Lesser General Public
  6. ;; License as published by the Free Software Foundation; either
  7. ;; version 3 of the License, or (at your option) any later version.
  8. ;;
  9. ;; This library is distributed in the hope that it will be useful,
  10. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. ;; Lesser General Public License for more details.
  13. ;;
  14. ;; You should have received a copy of the GNU Lesser General Public
  15. ;; License along with this library; if not, write to the Free Software
  16. ;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. (define-module (test-suite test-r6rs-base)
  18. :use-module ((rnrs base) :version (6))
  19. :use-module ((rnrs conditions) :version (6))
  20. :use-module ((rnrs exceptions) :version (6))
  21. :use-module (test-suite lib))
  22. ;; numbers are considered =? if their difference is less than a set
  23. ;; tolerance
  24. (define (=? alpha beta)
  25. (< (abs (- alpha beta)) 1e-10))
  26. (with-test-prefix "log (2nd arg)"
  27. (pass-if "log positive-base" (=? (log 8 2) 3))
  28. (pass-if "log negative-base" (=? (real-part (log 256 -4))
  29. 0.6519359443))
  30. (pass-if "log base-one" (= (log 10 1) +inf.0))
  31. (pass-if "log base-zero"
  32. (catch #t
  33. (lambda () (log 10 0) #f)
  34. (lambda args #t))))
  35. (with-test-prefix "boolean=?"
  36. (pass-if "boolean=? null" (boolean=?))
  37. (pass-if "boolean=? unary" (boolean=? #f))
  38. (pass-if "boolean=? many"
  39. (and (boolean=? #t #t #t)
  40. (boolean=? #f #f #f)
  41. (not (boolean=? #t #f #t))))
  42. (pass-if "boolean=? mixed type" (not (boolean=? #t #t 'foo))))
  43. (with-test-prefix "symbol=?"
  44. (pass-if "symbol=? null" (symbol=?))
  45. (pass-if "symbol=? unary" (symbol=? 'a))
  46. (pass-if "symbol=? many"
  47. (and (symbol=? 'a 'a 'a)
  48. (symbol=? 'foo 'foo 'foo)
  49. (not (symbol=? 'a 'foo 'a))))
  50. (pass-if "symbol=? mixed type" (not (symbol=? 'a 'a 123))))
  51. (with-test-prefix "infinite?"
  52. (pass-if "infinite? true on infinities"
  53. (and (infinite? +inf.0) (infinite? -inf.0)))
  54. (pass-if "infinite? false on non-infities"
  55. (and (not (infinite? 123)) (not (infinite? +nan.0)))))
  56. (with-test-prefix "finite?"
  57. (pass-if "finite? false on infinities"
  58. (and (not (finite? +inf.0)) (not (finite? -inf.0))))
  59. (pass-if "finite? true on non-infinities"
  60. (and (finite? 123) (finite? 123.0))))
  61. (with-test-prefix "exact-integer-sqrt"
  62. (pass-if "exact-integer-sqrt simple"
  63. (let-values (((s e) (exact-integer-sqrt 5)))
  64. (and (eqv? s 2) (eqv? e 1)))))
  65. (with-test-prefix "integer-valued?"
  66. (pass-if "true on integers"
  67. (and (integer-valued? 3) (integer-valued? 3.0) (integer-valued? 3.0+0.0i)))
  68. (pass-if "false on rationals" (not (integer-valued? 3.1)))
  69. (pass-if "false on reals" (not (integer-valued? +nan.0))))
  70. (with-test-prefix "rational-valued?"
  71. (pass-if "true on integers" (rational-valued? 3))
  72. (pass-if "true on rationals"
  73. (and (rational-valued? 3.1) (rational-valued? 3.1+0.0i)))
  74. (pass-if "false on reals"
  75. (or (not (rational-valued? +nan.0))
  76. (throw 'unresolved))))
  77. (with-test-prefix "real-valued?"
  78. (pass-if "true on integers" (real-valued? 3))
  79. (pass-if "true on rationals" (real-valued? 3.1))
  80. (pass-if "true on reals" (real-valued? +nan.0)))
  81. (with-test-prefix "vector-for-each"
  82. (pass-if "vector-for-each simple"
  83. (let ((sum 0))
  84. (vector-for-each (lambda (x) (set! sum (+ sum x))) '#(1 2 3))
  85. (eqv? sum 6))))
  86. (with-test-prefix "vector-map"
  87. (pass-if "vector-map simple"
  88. (equal? '#(3 2 1) (vector-map (lambda (x) (- 4 x)) '#(1 2 3)))))
  89. (with-test-prefix "real-valued?"
  90. (pass-if (real-valued? +nan.0))
  91. (pass-if (real-valued? +nan.0+0i))
  92. (pass-if (real-valued? +nan.0+0.0i))
  93. (pass-if (real-valued? +inf.0))
  94. (pass-if (real-valued? -inf.0))
  95. (pass-if (real-valued? +inf.0+0.0i))
  96. (pass-if (real-valued? -inf.0-0.0i))
  97. (pass-if (real-valued? 3))
  98. (pass-if (real-valued? -2.5))
  99. (pass-if (real-valued? -2.5+0i))
  100. (pass-if (real-valued? -2.5+0.0i))
  101. (pass-if (real-valued? -2.5-0i))
  102. (pass-if (real-valued? #e1e10))
  103. (pass-if (real-valued? 1e200))
  104. (pass-if (real-valued? 1e200+0.0i))
  105. (pass-if (real-valued? 6/10))
  106. (pass-if (real-valued? 6/10+0.0i))
  107. (pass-if (real-valued? 6/10+0i))
  108. (pass-if (real-valued? 6/3))
  109. (pass-if (not (real-valued? 3+i)))
  110. (pass-if (not (real-valued? -2.5+0.01i)))
  111. (pass-if (not (real-valued? +nan.0+0.01i)))
  112. (pass-if (not (real-valued? +nan.0+nan.0i)))
  113. (pass-if (not (real-valued? +inf.0-0.01i)))
  114. (pass-if (not (real-valued? +0.01i)))
  115. (pass-if (not (real-valued? -inf.0i))))
  116. (with-test-prefix "rational-valued?"
  117. (pass-if (not (rational-valued? +nan.0)))
  118. (pass-if (not (rational-valued? +nan.0+0i)))
  119. (pass-if (not (rational-valued? +nan.0+0.0i)))
  120. (pass-if (not (rational-valued? +inf.0)))
  121. (pass-if (not (rational-valued? -inf.0)))
  122. (pass-if (not (rational-valued? +inf.0+0.0i)))
  123. (pass-if (not (rational-valued? -inf.0-0.0i)))
  124. (pass-if (rational-valued? 3))
  125. (pass-if (rational-valued? -2.5))
  126. (pass-if (rational-valued? -2.5+0i))
  127. (pass-if (rational-valued? -2.5+0.0i))
  128. (pass-if (rational-valued? -2.5-0i))
  129. (pass-if (rational-valued? #e1e10))
  130. (pass-if (rational-valued? 1e200))
  131. (pass-if (rational-valued? 1e200+0.0i))
  132. (pass-if (rational-valued? 6/10))
  133. (pass-if (rational-valued? 6/10+0.0i))
  134. (pass-if (rational-valued? 6/10+0i))
  135. (pass-if (rational-valued? 6/3))
  136. (pass-if (not (rational-valued? 3+i)))
  137. (pass-if (not (rational-valued? -2.5+0.01i)))
  138. (pass-if (not (rational-valued? +nan.0+0.01i)))
  139. (pass-if (not (rational-valued? +nan.0+nan.0i)))
  140. (pass-if (not (rational-valued? +inf.0-0.01i)))
  141. (pass-if (not (rational-valued? +0.01i)))
  142. (pass-if (not (rational-valued? -inf.0i))))
  143. (with-test-prefix "integer-valued?"
  144. (pass-if (not (integer-valued? +nan.0)))
  145. (pass-if (not (integer-valued? +nan.0+0i)))
  146. (pass-if (not (integer-valued? +nan.0+0.0i)))
  147. (pass-if (not (integer-valued? +inf.0)))
  148. (pass-if (not (integer-valued? -inf.0)))
  149. (pass-if (not (integer-valued? +inf.0+0.0i)))
  150. (pass-if (not (integer-valued? -inf.0-0.0i)))
  151. (pass-if (integer-valued? 3))
  152. (pass-if (integer-valued? 3.0))
  153. (pass-if (integer-valued? 3+0i))
  154. (pass-if (integer-valued? 3+0.0i))
  155. (pass-if (integer-valued? 8/4))
  156. (pass-if (integer-valued? #e1e10))
  157. (pass-if (integer-valued? 1e200))
  158. (pass-if (integer-valued? 1e200+0.0i))
  159. (pass-if (not (integer-valued? -2.5)))
  160. (pass-if (not (integer-valued? -2.5+0i)))
  161. (pass-if (not (integer-valued? -2.5+0.0i)))
  162. (pass-if (not (integer-valued? -2.5-0i)))
  163. (pass-if (not (integer-valued? 6/10)))
  164. (pass-if (not (integer-valued? 6/10+0.0i)))
  165. (pass-if (not (integer-valued? 6/10+0i)))
  166. (pass-if (not (integer-valued? 3+i)))
  167. (pass-if (not (integer-valued? -2.5+0.01i)))
  168. (pass-if (not (integer-valued? +nan.0+0.01i)))
  169. (pass-if (not (integer-valued? +nan.0+nan.0i)))
  170. (pass-if (not (integer-valued? +inf.0-0.01i)))
  171. (pass-if (not (integer-valued? +0.01i)))
  172. (pass-if (not (integer-valued? -inf.0i))))
  173. (with-test-prefix "assert"
  174. (pass-if "assert returns value" (= 1 (assert 1)))
  175. (pass-if "assertion-violation"
  176. (guard (condition ((assertion-violation? condition) #t))
  177. (assert #f)
  178. #f)))
  179. (with-test-prefix "string-for-each"
  180. (pass-if "reverse string"
  181. (let ((s "reverse me") (l '()))
  182. (string-for-each (lambda (x) (set! l (cons x l))) s)
  183. (equal? "em esrever" (list->string l))))
  184. (pass-if "two strings good"
  185. (let ((s1 "two legs good")
  186. (s2 "four legs bad")
  187. (c '()))
  188. (string-for-each (lambda (c1 c2)
  189. (set! c (cons* c2 c1 c)))
  190. s1 s2)
  191. (equal? (list->string c)
  192. "ddaobo gs gsegle lr uoowft")))
  193. (pass-if "two strings bad"
  194. (let ((s1 "frotz")
  195. (s2 "veeblefetzer"))
  196. (guard (condition ((assertion-violation? condition) #t))
  197. (string-for-each (lambda (s1 s2) #f) s1 s2)
  198. #f)))
  199. (pass-if "many strings good"
  200. (let ((s1 "foo")
  201. (s2 "bar")
  202. (s3 "baz")
  203. (s4 "zot")
  204. (c '()))
  205. (string-for-each (lambda (c1 c2 c3 c4)
  206. (set! c (cons* c4 c3 c2 c1 c)))
  207. s1 s2 s3 s4)
  208. (equal? (list->string c)
  209. "tzrooaaozbbf")))
  210. (pass-if "many strings bad"
  211. (let ((s1 "foo")
  212. (s2 "bar")
  213. (s3 "baz")
  214. (s4 "quux"))
  215. (guard (condition ((assertion-violation? condition) #t))
  216. (string-for-each (lambda _ #f) s1 s2 s3 s4)
  217. #f))))