bytecomp-testsuite.el 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. ;;; bytecomp-testsuite.el
  2. ;; Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
  3. ;; Author: Shigeru Fukaya <shigeru.fukaya@gmail.com>
  4. ;; Created: November 2008
  5. ;; Keywords: internal
  6. ;; Human-Keywords: internal
  7. ;; This file is part of GNU Emacs.
  8. ;; GNU Emacs is free software: you can redistribute it and/or modify
  9. ;; it under the terms of the GNU General Public License as published by
  10. ;; the Free Software Foundation, either version 3 of the License, or
  11. ;; (at your option) any later version.
  12. ;; GNU Emacs is distributed in the hope that it will be useful,
  13. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. ;; GNU General Public License for more details.
  16. ;; You should have received a copy of the GNU General Public License
  17. ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
  18. ;;; Commentary:
  19. ;;; Code:
  20. (defconst byte-opt-testsuite-arith-data
  21. '(
  22. ;; some functional tests
  23. (let ((a most-positive-fixnum) (b 1) (c 1.0)) (+ a b c))
  24. (let ((a most-positive-fixnum) (b -2) (c 1.0)) (- a b c))
  25. (let ((a most-positive-fixnum) (b 2) (c 1.0)) (* a b c))
  26. (let ((a 3) (b 2) (c 1.0)) (/ a b c))
  27. (let ((a (+ 1 (expt 2 -64))) (b (expt 2 -65))) (+ a -1 b))
  28. (let ((a (+ 1 (expt 2 -64))) (b (expt 2 -65))) (- a 1 (- b)))
  29. (let ((a (expt 2 -1074)) (b 0.125)) (* a 8 b))
  30. (let ((a 1.0)) (* a 0))
  31. (let ((a 1.0)) (* a 2.0 0))
  32. (let ((a 1.0)) (/ 0 a))
  33. (let ((a 1.0)) (/ 3 a 2))
  34. (let ((a most-positive-fixnum) (b 2.0)) (* a 2 b))
  35. (let ((a 3) (b 2)) (/ a b 1.0))
  36. (/ 3 -1)
  37. (+ 4 3 2 1)
  38. (+ 4 3 2.0 1)
  39. (- 4 3 2 1) ; not new, for reference
  40. (- 4 3 2.0 1) ; not new, for reference
  41. (* 4 3 2 1)
  42. (* 4 3 2.0 1)
  43. (/ 4 3 2 1)
  44. (/ 4 3 2.0 1)
  45. (let ((a 3) (b 2)) (+ a b 1))
  46. (let ((a 3) (b 2)) (+ a b -1))
  47. (let ((a 3) (b 2)) (- a b 1))
  48. (let ((a 3) (b 2)) (- a b -1))
  49. (let ((a 3) (b 2)) (+ a b a 1))
  50. (let ((a 3) (b 2)) (+ a b a -1))
  51. (let ((a 3) (b 2)) (- a b a 1))
  52. (let ((a 3) (b 2)) (- a b a -1))
  53. (let ((a 3) (b 2)) (* a b -1))
  54. (let ((a 3) (b 2)) (* a -1))
  55. (let ((a 3) (b 2)) (/ a b 1))
  56. (let ((a 3) (b 2)) (/ (+ a b) 1))
  57. ;; coverage test
  58. (let ((a 3) (b 2) (c 1.0)) (+))
  59. (let ((a 3) (b 2) (c 1.0)) (+ 2))
  60. (let ((a 3) (b 2) (c 1.0)) (+ 2 0))
  61. (let ((a 3) (b 2) (c 1.0)) (+ 2 0.0))
  62. (let ((a 3) (b 2) (c 1.0)) (+ 2.0))
  63. (let ((a 3) (b 2) (c 1.0)) (+ 2.0 0))
  64. (let ((a 3) (b 2) (c 1.0)) (+ 2.0 0.0))
  65. (let ((a 3) (b 2) (c 1.0)) (+ 0 2))
  66. (let ((a 3) (b 2) (c 1.0)) (+ 0 2.0))
  67. (let ((a 3) (b 2) (c 1.0)) (+ 0.0 2))
  68. (let ((a 3) (b 2) (c 1.0)) (+ 0.0 2.0))
  69. (let ((a 3) (b 2) (c 1.0)) (+ a))
  70. (let ((a 3) (b 2) (c 1.0)) (+ a 0))
  71. (let ((a 3) (b 2) (c 1.0)) (+ a 0.0))
  72. (let ((a 3) (b 2) (c 1.0)) (+ 0 a))
  73. (let ((a 3) (b 2) (c 1.0)) (+ 0.0 a))
  74. (let ((a 3) (b 2) (c 1.0)) (+ c 0))
  75. (let ((a 3) (b 2) (c 1.0)) (+ c 0.0))
  76. (let ((a 3) (b 2) (c 1.0)) (+ 0 c))
  77. (let ((a 3) (b 2) (c 1.0)) (+ 0.0 c))
  78. (let ((a 3) (b 2) (c 1.0)) (+ a b 0 c 0))
  79. (let ((a 3) (b 2) (c 1.0)) (+ 0 a))
  80. (let ((a 3) (b 2) (c 1.0)) (+ 0 a b))
  81. (let ((a 3) (b 2) (c 1.0)) (+ 0 a b c))
  82. (let ((a 3) (b 2) (c 1.0)) (+ 1 2 3))
  83. (let ((a 3) (b 2) (c 1.0)) (+ 3.0 2.0 1))
  84. (let ((a 3) (b 2) (c 1.0)) (+ 3.0 2.0 1 4))
  85. (let ((a 3) (b 2) (c 1.0)) (+ a 1))
  86. (let ((a 3) (b 2) (c 1.0)) (+ a -1))
  87. (let ((a 3) (b 2) (c 1.0)) (+ 1 a))
  88. (let ((a 3) (b 2) (c 1.0)) (+ -1 a))
  89. (let ((a 3) (b 2) (c 1.0)) (+ c 1))
  90. (let ((a 3) (b 2) (c 1.0)) (+ c -1))
  91. (let ((a 3) (b 2) (c 1.0)) (+ 1 c))
  92. (let ((a 3) (b 2) (c 1.0)) (+ -1 c))
  93. (let ((a 3) (b 2) (c 1.0)) (+ a b 0))
  94. (let ((a 3) (b 2) (c 1.0)) (+ a b 1))
  95. (let ((a 3) (b 2) (c 1.0)) (+ a b -1))
  96. (let ((a 3) (b 2) (c 1.0)) (+ a b 2))
  97. (let ((a 3) (b 2) (c 1.0)) (+ 1 a b c))
  98. (let ((a 3) (b 2) (c 1.0)) (+ a b c 0))
  99. (let ((a 3) (b 2) (c 1.0)) (+ a b c 1))
  100. (let ((a 3) (b 2) (c 1.0)) (+ a b c -1))
  101. (let ((a 3) (b 2) (c 1.0)) (-))
  102. (let ((a 3) (b 2) (c 1.0)) (- 2))
  103. (let ((a 3) (b 2) (c 1.0)) (- 2 0))
  104. (let ((a 3) (b 2) (c 1.0)) (- 2 0.0))
  105. (let ((a 3) (b 2) (c 1.0)) (- 2.0))
  106. (let ((a 3) (b 2) (c 1.0)) (- 2.0 0))
  107. (let ((a 3) (b 2) (c 1.0)) (- 2.0 0.0))
  108. (let ((a 3) (b 2) (c 1.0)) (- 0 2))
  109. (let ((a 3) (b 2) (c 1.0)) (- 0 2.0))
  110. (let ((a 3) (b 2) (c 1.0)) (- 0.0 2))
  111. (let ((a 3) (b 2) (c 1.0)) (- 0.0 2.0))
  112. (let ((a 3) (b 2) (c 1.0)) (- a))
  113. (let ((a 3) (b 2) (c 1.0)) (- a 0))
  114. (let ((a 3) (b 2) (c 1.0)) (- a 0.0))
  115. (let ((a 3) (b 2) (c 1.0)) (- 0 a))
  116. (let ((a 3) (b 2) (c 1.0)) (- 0.0 a))
  117. (let ((a 3) (b 2) (c 1.0)) (- c 0))
  118. (let ((a 3) (b 2) (c 1.0)) (- c 0.0))
  119. (let ((a 3) (b 2) (c 1.0)) (- 0 c))
  120. (let ((a 3) (b 2) (c 1.0)) (- 0.0 c))
  121. (let ((a 3) (b 2) (c 1.0)) (- a b 0 c 0))
  122. (let ((a 3) (b 2) (c 1.0)) (- 0 a))
  123. (let ((a 3) (b 2) (c 1.0)) (- 0 a b))
  124. (let ((a 3) (b 2) (c 1.0)) (- 0 a b c))
  125. (let ((a 3) (b 2) (c 1.0)) (- 1 2 3))
  126. (let ((a 3) (b 2) (c 1.0)) (- 3.0 2.0 1))
  127. (let ((a 3) (b 2) (c 1.0)) (- 3.0 2.0 1 4))
  128. (let ((a 3) (b 2) (c 1.0)) (- a 1))
  129. (let ((a 3) (b 2) (c 1.0)) (- a -1))
  130. (let ((a 3) (b 2) (c 1.0)) (- 1 a))
  131. (let ((a 3) (b 2) (c 1.0)) (- -1 a))
  132. (let ((a 3) (b 2) (c 1.0)) (- c 1))
  133. (let ((a 3) (b 2) (c 1.0)) (- c -1))
  134. (let ((a 3) (b 2) (c 1.0)) (- 1 c))
  135. (let ((a 3) (b 2) (c 1.0)) (- -1 c))
  136. (let ((a 3) (b 2) (c 1.0)) (- a b 0))
  137. (let ((a 3) (b 2) (c 1.0)) (- a b 1))
  138. (let ((a 3) (b 2) (c 1.0)) (- a b -1))
  139. (let ((a 3) (b 2) (c 1.0)) (- a b 2))
  140. (let ((a 3) (b 2) (c 1.0)) (- 1 a b c))
  141. (let ((a 3) (b 2) (c 1.0)) (- a b c 0))
  142. (let ((a 3) (b 2) (c 1.0)) (- a b c 1))
  143. (let ((a 3) (b 2) (c 1.0)) (- a b c -1))
  144. (let ((a 3) (b 2) (c 1.0)) (*))
  145. (let ((a 3) (b 2) (c 1.0)) (* 2))
  146. (let ((a 3) (b 2) (c 1.0)) (* 2 0))
  147. (let ((a 3) (b 2) (c 1.0)) (* 2 0.0))
  148. (let ((a 3) (b 2) (c 1.0)) (* 2.0))
  149. (let ((a 3) (b 2) (c 1.0)) (* 2.0 0))
  150. (let ((a 3) (b 2) (c 1.0)) (* 2.0 0.0))
  151. (let ((a 3) (b 2) (c 1.0)) (* 0 2))
  152. (let ((a 3) (b 2) (c 1.0)) (* 0 2.0))
  153. (let ((a 3) (b 2) (c 1.0)) (* 0.0 2))
  154. (let ((a 3) (b 2) (c 1.0)) (* 0.0 2.0))
  155. (let ((a 3) (b 2) (c 1.0)) (* a))
  156. (let ((a 3) (b 2) (c 1.0)) (* a 0))
  157. (let ((a 3) (b 2) (c 1.0)) (* a 0.0))
  158. (let ((a 3) (b 2) (c 1.0)) (* 0 a))
  159. (let ((a 3) (b 2) (c 1.0)) (* 0.0 a))
  160. (let ((a 3) (b 2) (c 1.0)) (* c 0))
  161. (let ((a 3) (b 2) (c 1.0)) (* c 0.0))
  162. (let ((a 3) (b 2) (c 1.0)) (* 0 c))
  163. (let ((a 3) (b 2) (c 1.0)) (* 0.0 c))
  164. (let ((a 3) (b 2) (c 1.0)) (* a b 0 c 0))
  165. (let ((a 3) (b 2) (c 1.0)) (* 0 a))
  166. (let ((a 3) (b 2) (c 1.0)) (* 0 a b))
  167. (let ((a 3) (b 2) (c 1.0)) (* 0 a b c))
  168. (let ((a 3) (b 2) (c 1.0)) (* 1 2 3))
  169. (let ((a 3) (b 2) (c 1.0)) (* 3.0 2.0 1))
  170. (let ((a 3) (b 2) (c 1.0)) (* 3.0 2.0 1 4))
  171. (let ((a 3) (b 2) (c 1.0)) (* a 1))
  172. (let ((a 3) (b 2) (c 1.0)) (* a -1))
  173. (let ((a 3) (b 2) (c 1.0)) (* 1 a))
  174. (let ((a 3) (b 2) (c 1.0)) (* -1 a))
  175. (let ((a 3) (b 2) (c 1.0)) (* c 1))
  176. (let ((a 3) (b 2) (c 1.0)) (* c -1))
  177. (let ((a 3) (b 2) (c 1.0)) (* 1 c))
  178. (let ((a 3) (b 2) (c 1.0)) (* -1 c))
  179. (let ((a 3) (b 2) (c 1.0)) (* a b 0))
  180. (let ((a 3) (b 2) (c 1.0)) (* a b 1))
  181. (let ((a 3) (b 2) (c 1.0)) (* a b -1))
  182. (let ((a 3) (b 2) (c 1.0)) (* a b 2))
  183. (let ((a 3) (b 2) (c 1.0)) (* 1 a b c))
  184. (let ((a 3) (b 2) (c 1.0)) (* a b c 0))
  185. (let ((a 3) (b 2) (c 1.0)) (* a b c 1))
  186. (let ((a 3) (b 2) (c 1.0)) (* a b c -1))
  187. (let ((a 3) (b 2) (c 1.0)) (/))
  188. (let ((a 3) (b 2) (c 1.0)) (/ 2))
  189. (let ((a 3) (b 2) (c 1.0)) (/ 2 0))
  190. (let ((a 3) (b 2) (c 1.0)) (/ 2 0.0))
  191. (let ((a 3) (b 2) (c 1.0)) (/ 2.0))
  192. (let ((a 3) (b 2) (c 1.0)) (/ 2.0 0))
  193. (let ((a 3) (b 2) (c 1.0)) (/ 2.0 0.0))
  194. (let ((a 3) (b 2) (c 1.0)) (/ 0 2))
  195. (let ((a 3) (b 2) (c 1.0)) (/ 0 2.0))
  196. (let ((a 3) (b 2) (c 1.0)) (/ 0.0 2))
  197. (let ((a 3) (b 2) (c 1.0)) (/ 0.0 2.0))
  198. (let ((a 3) (b 2) (c 1.0)) (/ a))
  199. (let ((a 3) (b 2) (c 1.0)) (/ a 0))
  200. (let ((a 3) (b 2) (c 1.0)) (/ a 0.0))
  201. (let ((a 3) (b 2) (c 1.0)) (/ 0 a))
  202. (let ((a 3) (b 2) (c 1.0)) (/ 0.0 a))
  203. (let ((a 3) (b 2) (c 1.0)) (/ c 0))
  204. (let ((a 3) (b 2) (c 1.0)) (/ c 0.0))
  205. (let ((a 3) (b 2) (c 1.0)) (/ 0 c))
  206. (let ((a 3) (b 2) (c 1.0)) (/ 0.0 c))
  207. (let ((a 3) (b 2) (c 1.0)) (/ a b 0 c 0))
  208. (let ((a 3) (b 2) (c 1.0)) (/ 0 a))
  209. (let ((a 3) (b 2) (c 1.0)) (/ 0 a b))
  210. (let ((a 3) (b 2) (c 1.0)) (/ 0 a b c))
  211. (let ((a 3) (b 2) (c 1.0)) (/ 1 2 3))
  212. (let ((a 3) (b 2) (c 1.0)) (/ 3.0 2.0 1))
  213. (let ((a 3) (b 2) (c 1.0)) (/ 3.0 2.0 1 4))
  214. (let ((a 3) (b 2) (c 1.0)) (/ a 1))
  215. (let ((a 3) (b 2) (c 1.0)) (/ a -1))
  216. (let ((a 3) (b 2) (c 1.0)) (/ 1 a))
  217. (let ((a 3) (b 2) (c 1.0)) (/ -1 a))
  218. (let ((a 3) (b 2) (c 1.0)) (/ c 1))
  219. (let ((a 3) (b 2) (c 1.0)) (/ c -1))
  220. (let ((a 3) (b 2) (c 1.0)) (/ 1 c))
  221. (let ((a 3) (b 2) (c 1.0)) (/ -1 c))
  222. (let ((a 3) (b 2) (c 1.0)) (/ a b 0))
  223. (let ((a 3) (b 2) (c 1.0)) (/ a b 1))
  224. (let ((a 3) (b 2) (c 1.0)) (/ a b -1))
  225. (let ((a 3) (b 2) (c 1.0)) (/ a b 2))
  226. (let ((a 3) (b 2) (c 1.0)) (/ 1 a b c))
  227. (let ((a 3) (b 2) (c 1.0)) (/ a b c 0))
  228. (let ((a 3) (b 2) (c 1.0)) (/ a b c 1))
  229. (let ((a 3) (b 2) (c 1.0)) (/ a b c -1)))
  230. "List of expression for test.
  231. Each element will be executed by interpreter and with
  232. bytecompiled code, and their results are compared.")
  233. (defun bytecomp-testsuite-run ()
  234. "Run bytecomp test suite."
  235. (interactive)
  236. (with-output-to-temp-buffer "*bytecomp test*"
  237. (byte-opt-testsuite--run-arith)
  238. (message "All byte-opt tests finished successfully.")))
  239. (defun byte-opt-testsuite--run-arith (&optional arg)
  240. "Unit test for byte-opt arithmetic operations.
  241. Subtests signal errors if something goes wrong."
  242. (interactive "P")
  243. (let ((print-escape-nonascii t)
  244. (print-escape-newlines t)
  245. (print-quoted t)
  246. v0 v1
  247. indent-tabs-mode
  248. (patterns byte-opt-testsuite-arith-data))
  249. (mapc
  250. (lambda (pat)
  251. (condition-case nil
  252. (setq v0 (eval pat))
  253. (error (setq v0 nil)))
  254. (condition-case nil
  255. (setq v1 (funcall (byte-compile (list 'lambda nil pat))))
  256. (error (setq v1 nil)))
  257. (princ (format "%s" pat))
  258. (if (equal v0 v1)
  259. (princ (format " --> %s, OK\n" v1))
  260. (princ (format " --> %s, NG\n" v0))
  261. (princ (format " --> %s\n" v1))
  262. (error "Arithmetic test failed!")))
  263. patterns)))
  264. (provide 'byte-opt-testsuite)
  265. ;; arch-tag: 01cb2664-5e7f-4213-ace0-91447d70b7dc