PageRenderTime 31ms CodeModel.GetById 1ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/doubletest.fth

https://gitlab.com/BGCX261/zmforth-hg-to-git
Forth | 388 lines | 317 code | 71 blank | 0 comment | 3 complexity | 9f734e346fcd5e0dba20d644668a9a68 MD5 | raw file
Possible License(s): GPL-3.0
  1. \ To test the ANS Forth Double-Number word set and double number extensions
  2. \ Copyright (C) Gerry Jackson 2006, 2007, 2009
  3. \ This program is free software; you can redistribute it and/or
  4. \ modify it any way.
  5. \ This program is distributed in the hope that it will be useful,
  6. \ but WITHOUT ANY WARRANTY; without even the implied warranty of
  7. \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  8. \ The tests are not claimed to be comprehensive or correct
  9. \ --------------------------------------------------------------------
  10. \ Version 0.4 6 March 2009 { and } replaced with T{ and }T
  11. \ Tests rewritten to be independent of word size and
  12. \ tests re-ordered
  13. \ 0.3 20 April 2007 ANS Forth words changed to upper case
  14. \ 0.2 30 Oct 2006 Updated following GForth test to include
  15. \ various constants from core.fr
  16. \ 0.1 Oct 2006 First version released
  17. \ --------------------------------------------------------------------
  18. \ The tests are based on John Hayes test program for the core word set
  19. \ and requires tester.fr to have been loaded
  20. \ Words tested in this file are:
  21. \ 2CONSTANT 2LITERAL 2VARIABLE D+ D- D. D.R D0< D0= D2* D2/
  22. \ D< D= D>S DABS DMAX DMIN DNEGATE M*/ M+ 2ROT DU<
  23. \ Also tests the interpreter and compiler reading a double number
  24. \ --------------------------------------------------------------------
  25. \ Assumptions and dependencies:
  26. \ - tester.fr has been included prior to this file
  27. \ - core words and core extension words to have been tested
  28. \ ------------------------------------------------------------------------------
  29. \ Constant definitions
  30. DECIMAL
  31. 0 INVERT CONSTANT 1s
  32. 1s 1 RSHIFT CONSTANT max-int \ 01...1
  33. max-int INVERT CONSTANT min-int \ 10...0
  34. max-int 2/ CONSTANT hi-int \ 001...1
  35. min-int 2/ CONSTANT lo-int \ 110...1
  36. 0 CONSTANT <false>
  37. 1s CONSTANT <true>
  38. \ ------------------------------------------------------------------------------
  39. testing interpreter and compiler reading a double number
  40. T{ 1. -> 1 0 }T
  41. T{ -2. -> -2 -1 }T
  42. T{ : rdl1 3. ; rdl1 -> 3 0 }T
  43. T{ : rdl2 -4. ; rdl2 -> -4 -1 }T
  44. \ ------------------------------------------------------------------------------
  45. testing 2CONSTANT
  46. T{ 1 2 2CONSTANT 2c1 -> }T
  47. T{ 2c1 -> 1 2 }T
  48. T{ : cd1 2c1 ; -> }T
  49. T{ cd1 -> 1 2 }T
  50. T{ : cd2 2CONSTANT ; -> }T
  51. T{ -1 -2 cd2 2c2 -> }T
  52. T{ 2c2 -> -1 -2 }T
  53. \ ------------------------------------------------------------------------------
  54. \ Some 2CONSTANTs for the following tests
  55. 1s max-int 2CONSTANT max-2int \ 01...1
  56. 0 min-int 2CONSTANT min-2int \ 10...0
  57. max-2int 2/ 2CONSTANT hi-2int \ 001...1
  58. min-2int 2/ 2CONSTANT lo-2int \ 110...0
  59. \ ------------------------------------------------------------------------------
  60. testing DNEGATE
  61. T{ 0. DNEGATE -> 0. }T
  62. T{ 1. DNEGATE -> -1. }T
  63. T{ -1. DNEGATE -> 1. }T
  64. T{ max-2int DNEGATE -> min-2int SWAP 1+ SWAP }T
  65. T{ min-2int SWAP 1+ SWAP DNEGATE -> max-2int }T
  66. \ ------------------------------------------------------------------------------
  67. testing D+ with small integers
  68. T{ 0. 5. D+ -> 5. }T
  69. T{ -5. 0. D+ -> -5. }T
  70. T{ 1. 2. D+ -> 3. }T
  71. T{ 1. -2. D+ -> -1. }T
  72. T{ -1. 2. D+ -> 1. }T
  73. T{ -1. -2. D+ -> -3. }T
  74. T{ -1. 1. D+ -> 0. }T
  75. testing D+ with mid range integers
  76. T{ 0 0 0 5 D+ -> 0 5 }T
  77. T{ -1 5 0 0 D+ -> -1 5 }T
  78. T{ 0 0 0 -5 D+ -> 0 -5 }T
  79. T{ 0 -5 -1 0 D+ -> -1 -5 }T
  80. T{ 0 1 0 2 D+ -> 0 3 }T
  81. T{ -1 1 0 -2 D+ -> -1 -1 }T
  82. T{ 0 -1 0 2 D+ -> 0 1 }T
  83. T{ 0 -1 -1 -2 D+ -> -1 -3 }T
  84. T{ -1 -1 0 1 D+ -> -1 0 }T
  85. T{ min-int 0 2DUP D+ -> 0 1 }T
  86. T{ min-int S>D min-int 0 D+ -> 0 0 }T
  87. testing D+ with large double integers
  88. T{ hi-2int 1. D+ -> 0 hi-int 1+ }T
  89. T{ hi-2int 2DUP D+ -> 1s 1- max-int }T
  90. T{ max-2int min-2int D+ -> -1. }T
  91. T{ max-2int lo-2int D+ -> hi-2int }T
  92. T{ hi-2int min-2int D+ 1. D+ -> lo-2int }T
  93. T{ lo-2int 2DUP D+ -> min-2int }T
  94. \ --------------------------------------------------------------------
  95. testing D- with small integers
  96. T{ 0. 5. D- -> -5. }T
  97. T{ 5. 0. D- -> 5. }T
  98. T{ 0. -5. D- -> 5. }T
  99. T{ 1. 2. D- -> -1. }T
  100. T{ 1. -2. D- -> 3. }T
  101. T{ -1. 2. D- -> -3. }T
  102. T{ -1. -2. D- -> 1. }T
  103. T{ -1. -1. D- -> 0. }T
  104. testing D- with mid-range integers
  105. T{ 0 0 0 5 D- -> 0 -5 }T
  106. T{ -1 5 0 0 D- -> -1 5 }T
  107. T{ 0 0 -1 -5 D- -> 1 4 }T
  108. T{ 0 -5 0 0 D- -> 0 -5 }T
  109. T{ -1 1 0 2 D- -> -1 -1 }T
  110. T{ 0 1 -1 -2 D- -> 1 2 }T
  111. T{ 0 -1 0 2 D- -> 0 -3 }T
  112. T{ 0 -1 0 -2 D- -> 0 1 }T
  113. T{ 0 0 0 1 D- -> 0 -1 }T
  114. T{ min-int 0 2DUP D- -> 0. }T
  115. T{ min-int S>D max-int 0 D- -> 1 1s }T
  116. testing D- with large integers
  117. T{ max-2int max-2int D- -> 0. }T
  118. T{ min-2int min-2int D- -> 0. }T
  119. T{ max-2int hi-2int D- -> lo-2int DNEGATE }T
  120. T{ hi-2int lo-2int D- -> max-2int }T
  121. T{ lo-2int hi-2int D- -> min-2int 1. D+ }T
  122. T{ min-2int min-2int D- -> 0. }T
  123. T{ min-2int lo-2int D- -> lo-2int }T
  124. \ --------------------------------------------------------------------
  125. testing D0< D0=
  126. T{ 0. D0< -> <false> }T
  127. T{ 1. D0< -> <false> }T
  128. T{ min-int 0 D0< -> <false> }T
  129. T{ 0 max-int D0< -> <false> }T
  130. T{ max-2int D0< -> <false> }T
  131. T{ -1. D0< -> <true> }T
  132. T{ min-2int D0< -> <true> }T
  133. T{ 1. D0= -> <false> }T
  134. T{ min-int 0 D0= -> <false> }T
  135. T{ max-2int D0= -> <false> }T
  136. T{ -1 max-int D0= -> <false> }T
  137. T{ 0. D0= -> <true> }T
  138. T{ -1. D0= -> <false> }T
  139. T{ 0 min-int D0= -> <false> }T
  140. \ --------------------------------------------------------------------
  141. testing D2* D2/
  142. T{ 0. D2* -> 0. D2* }T
  143. T{ min-int 0 D2* -> 0 1 }T
  144. T{ hi-2int D2* -> max-2int 1. D- }T
  145. T{ lo-2int D2* -> min-2int }T
  146. T{ 0. D2/ -> 0. }T
  147. T{ 1. D2/ -> 0. }T
  148. T{ 0 1 D2/ -> min-int 0 }T
  149. T{ max-2int D2/ -> hi-2int }T
  150. T{ -1. D2/ -> -1. }T
  151. T{ min-2int D2/ -> lo-2int }T
  152. \ --------------------------------------------------------------------
  153. testing D< D=
  154. T{ 0. 1. D< -> <true> }T
  155. T{ 0. 0. D< -> <false> }T
  156. T{ 1. 0. D< -> <false> }T
  157. T{ -1. 1. D< -> <true> }T
  158. T{ -1. 0. D< -> <true> }T
  159. T{ -2. -1. D< -> <true> }T
  160. T{ -1. -2. D< -> <false> }T
  161. T{ -1. max-2int D< -> <true> }T
  162. T{ min-2int max-2int D< -> <true> }T
  163. T{ max-2int -1. D< -> <false> }T
  164. T{ max-2int min-2int D< -> <false> }T
  165. T{ max-2int 2DUP -1. D+ D< -> <false> }T
  166. T{ min-2int 2DUP 1. D+ D< -> <true> }T
  167. T{ -1 1 1 1 D< -> <false> }T
  168. T{ -1 1 1 1 D> -> <true> }T
  169. T{ 1 -1 1 1 D> -> <false> }T
  170. T{ 1 -1 1 1 D< -> <true> }T
  171. T{ -1 -1 1 -1 D> -> <true> }T
  172. T{ -1 -1 1 -1 D< -> <false> }T
  173. T{ -1. -1. D= -> <true> }T
  174. T{ -1. 0. D= -> <false> }T
  175. T{ -1. 1. D= -> <false> }T
  176. T{ 0. -1. D= -> <false> }T
  177. T{ 0. 0. D= -> <true> }T
  178. T{ 0. 1. D= -> <false> }T
  179. T{ 1. -1. D= -> <false> }T
  180. T{ 1. 0. D= -> <false> }T
  181. T{ 1. 1. D= -> <true> }T
  182. T{ 0 -1 0 -1 D= -> <true> }T
  183. T{ 0 -1 0 0 D= -> <false> }T
  184. T{ 0 -1 0 1 D= -> <false> }T
  185. T{ 0 0 0 -1 D= -> <false> }T
  186. T{ 0 0 0 0 D= -> <true> }T
  187. T{ 0 0 0 1 D= -> <false> }T
  188. T{ 0 1 0 -1 D= -> <false> }T
  189. T{ 0 1 0 0 D= -> <false> }T
  190. T{ 0 1 0 1 D= -> <true> }T
  191. T{ max-2int min-2int D= -> <false> }T
  192. T{ max-2int 0. D= -> <false> }T
  193. T{ max-2int max-2int D= -> <true> }T
  194. T{ max-2int hi-2int D= -> <false> }T
  195. T{ max-2int min-2int D= -> <false> }T
  196. T{ min-2int min-2int D= -> <true> }T
  197. T{ min-2int lo-2int D= -> <false> }T
  198. T{ min-2int max-2int D= -> <false> }T
  199. \ --------------------------------------------------------------------
  200. testing 2LITERAL 2VARIABLE
  201. T{ : cd1 [ max-2int ] 2LITERAL ; -> }T
  202. T{ cd1 -> max-2int }T
  203. T{ 2VARIABLE 2v1 -> }T
  204. T{ 0. 2v1 2! -> }T
  205. T{ 2v1 2@ -> 0. }T
  206. T{ -1 -2 2v1 2! -> }T
  207. T{ 2v1 2@ -> -1 -2 }T
  208. T{ : cd2 2VARIABLE ; -> }T
  209. T{ cd2 2v2 -> }T
  210. T{ : cd3 2v2 2! ; -> }T
  211. T{ -2 -1 cd3 -> }T
  212. T{ 2v2 2@ -> -2 -1 }T
  213. \ --------------------------------------------------------------------
  214. testing DMAX DMIN
  215. T{ 1. 2. DMAX -> 2. }T
  216. T{ 1. 0. DMAX -> 1. }T
  217. T{ 1. -1. DMAX -> 1. }T
  218. T{ 1. 1. DMAX -> 1. }T
  219. T{ 0. 1. DMAX -> 1. }T
  220. T{ 0. -1. DMAX -> 0. }T
  221. T{ -1. 1. DMAX -> 1. }T
  222. T{ -1. -2. DMAX -> -1. }T
  223. T{ max-2int hi-2int DMAX -> max-2int }T
  224. T{ max-2int min-2int DMAX -> max-2int }T
  225. T{ min-2int max-2int DMAX -> max-2int }T
  226. T{ min-2int lo-2int DMAX -> lo-2int }T
  227. T{ max-2int 1. DMAX -> max-2int }T
  228. T{ max-2int -1. DMAX -> max-2int }T
  229. T{ min-2int 1. DMAX -> 1. }T
  230. T{ min-2int -1. DMAX -> -1. }T
  231. T{ 1. 2. DMIN -> 1. }T
  232. T{ 1. 0. DMIN -> 0. }T
  233. T{ 1. -1. DMIN -> -1. }T
  234. T{ 1. 1. DMIN -> 1. }T
  235. T{ 0. 1. DMIN -> 0. }T
  236. T{ 0. -1. DMIN -> -1. }T
  237. T{ -1. 1. DMIN -> -1. }T
  238. T{ -1. -2. DMIN -> -2. }T
  239. T{ max-2int hi-2int DMIN -> hi-2int }T
  240. T{ max-2int min-2int DMIN -> min-2int }T
  241. T{ min-2int max-2int DMIN -> min-2int }T
  242. T{ min-2int lo-2int DMIN -> min-2int }T
  243. T{ max-2int 1. DMIN -> 1. }T
  244. T{ max-2int -1. DMIN -> -1. }T
  245. T{ min-2int 1. DMIN -> min-2int }T
  246. T{ min-2int -1. DMIN -> min-2int }T
  247. \ --------------------------------------------------------------------
  248. testing D>S DABS
  249. T{ 1234 0 D>S -> 1234 }T
  250. T{ -1234 -1 D>S -> -1234 }T
  251. T{ max-int 0 D>S -> max-int }T
  252. T{ min-int -1 D>S -> min-int }T
  253. T{ 1. DABS -> 1. }T
  254. T{ -1. DABS -> 1. }T
  255. T{ max-2int DABS -> max-2int }T
  256. T{ min-2int 1. D+ DABS -> max-2int }T
  257. \ --------------------------------------------------------------------
  258. testing M+ M*/
  259. T{ hi-2int 1 M+ -> hi-2int 1. D+ }T
  260. T{ max-2int -1 M+ -> max-2int -1. D+ }T
  261. T{ min-2int 1 M+ -> min-2int 1. D+ }T
  262. T{ lo-2int -1 M+ -> lo-2int -1. D+ }T
  263. \ To correct the result if the division is floored, only used when
  264. \ necessary i.e. negative quotient and remainder <> 0
  265. : ?floored [ -3 2 / -2 = ] LITERAL IF 1. D- THEN ;
  266. T{ 5. 7 11 M*/ -> 3. }T
  267. T{ 5. -7 11 M*/ -> -3. ?floored }T \ floored -4.
  268. T{ -5. 7 11 M*/ -> -3. ?floored }T \ floored -4.
  269. T{ -5. -7 11 M*/ -> 3. }T
  270. T{ max-2int 8 16 M*/ -> hi-2int }T
  271. T{ max-2int -8 16 M*/ -> hi-2int DNEGATE ?floored }T \ floored subtract 1
  272. T{ min-2int 8 16 M*/ -> lo-2int }T
  273. T{ min-2int -8 16 M*/ -> lo-2int DNEGATE }T
  274. T{ max-2int max-int max-int M*/ -> max-2int }T
  275. T{ max-2int max-int 2/ max-int M*/ -> max-int 1- hi-2int NIP }T
  276. T{ min-2int lo-2int NIP DUP NEGATE M*/ -> min-2int }T
  277. T{ min-2int lo-2int NIP 1- max-int M*/ -> min-int 3 + hi-2int NIP 2 + }T
  278. T{ max-2int lo-2int NIP DUP NEGATE M*/ -> max-2int DNEGATE }T
  279. T{ min-2int max-int DUP M*/ -> min-2int }T
  280. \ --------------------------------------------------------------------
  281. testing D. D.R
  282. \ Create some large double numbers
  283. max-2int 71 73 m*/ 2CONSTANT dbl1
  284. min-2int 73 79 m*/ 2CONSTANT dbl2
  285. : d>ascii ( d -- caddr u )
  286. DUP >R <# DABS #S R> SIGN #> ( -- caddr1 u )
  287. HERE SWAP 2DUP 2>R CHARS DUP ALLOT MOVE 2R>
  288. ;
  289. dbl1 d>ascii 2CONSTANT "dbl1"
  290. dbl2 d>ascii 2CONSTANT "dbl2"
  291. : DoubleOutput
  292. CR ." You should see lines duplicated:" CR
  293. 5 SPACES "dbl1" TYPE CR
  294. 5 SPACES dbl1 D. CR
  295. 8 SPACES "dbl1" DUP >R TYPE CR
  296. 5 SPACES dbl1 R> 3 + D.R CR
  297. 5 SPACES "dbl2" TYPE CR
  298. 5 SPACES dbl2 D. CR
  299. 10 SPACES "dbl2" DUP >R TYPE CR
  300. 5 SPACES dbl2 R> 5 + D.R CR
  301. ;
  302. T{ DoubleOutput -> }T
  303. \ --------------------------------------------------------------------
  304. testing 2ROT DU< (Double Number extension words)
  305. T{ 1. 2. 3. 2ROT -> 2. 3. 1. }T
  306. T{ max-2int min-2int 1. 2ROT -> min-2int 1. max-2int }T
  307. T{ 1. 1. DU< -> <false> }T
  308. T{ 1. -1. DU< -> <true> }T
  309. T{ -1. 1. DU< -> <false> }T
  310. T{ -1. -2. DU< -> <false> }T
  311. T{ max-2int hi-2int DU< -> <false> }T
  312. T{ hi-2int max-2int DU< -> <true> }T
  313. T{ max-2int min-2int DU< -> <true> }T
  314. T{ min-2int max-2int DU< -> <false> }T
  315. T{ min-2int lo-2int DU< -> <true> }T
  316. \ --------------------------------------------------------------------
  317. CR .( End of Double-Number word tests) CR