@fncts/test 0.0.20 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/_cjs/api.cjs +39 -76
  2. package/_cjs/api.cjs.map +1 -1
  3. package/_cjs/control/AbstractRunnableSpec.cjs +1 -12
  4. package/_cjs/control/AbstractRunnableSpec.cjs.map +1 -1
  5. package/_cjs/control/Annotations/api.cjs +0 -12
  6. package/_cjs/control/Annotations/api.cjs.map +1 -1
  7. package/_cjs/control/Annotations/definition.cjs +0 -6
  8. package/_cjs/control/Annotations/definition.cjs.map +1 -1
  9. package/_cjs/control/Annotations/live.cjs +6 -29
  10. package/_cjs/control/Annotations/live.cjs.map +1 -1
  11. package/_cjs/control/Annotations.cjs +0 -6
  12. package/_cjs/control/Annotations.cjs.map +1 -1
  13. package/_cjs/control/Assertion/api.cjs +50 -100
  14. package/_cjs/control/Assertion/api.cjs.map +1 -1
  15. package/_cjs/control/Assertion/definition.cjs +0 -8
  16. package/_cjs/control/Assertion/definition.cjs.map +1 -1
  17. package/_cjs/control/Assertion.cjs +0 -4
  18. package/_cjs/control/Assertion.cjs.map +1 -1
  19. package/_cjs/control/AssertionIO/api.cjs +20 -26
  20. package/_cjs/control/AssertionIO/api.cjs.map +1 -1
  21. package/_cjs/control/AssertionIO/definition.cjs +0 -8
  22. package/_cjs/control/AssertionIO/definition.cjs.map +1 -1
  23. package/_cjs/control/AssertionIO.cjs +0 -4
  24. package/_cjs/control/AssertionIO.cjs.map +1 -1
  25. package/_cjs/control/DefaultRunnableSpec.cjs +0 -12
  26. package/_cjs/control/DefaultRunnableSpec.cjs.map +1 -1
  27. package/_cjs/control/DefaultTestReporter/definition.cjs.map +1 -1
  28. package/_cjs/control/DefaultTestReporter/render.cjs +54 -123
  29. package/_cjs/control/DefaultTestReporter/render.cjs.map +1 -1
  30. package/_cjs/control/DefaultTestReporter.cjs +0 -4
  31. package/_cjs/control/DefaultTestReporter.cjs.map +1 -1
  32. package/_cjs/control/FreeBooleanAlgebraIO/api.cjs +20 -36
  33. package/_cjs/control/FreeBooleanAlgebraIO/api.cjs.map +1 -1
  34. package/_cjs/control/FreeBooleanAlgebraIO/definition.cjs.map +1 -1
  35. package/_cjs/control/FreeBooleanAlgebraIO.cjs +0 -4
  36. package/_cjs/control/FreeBooleanAlgebraIO.cjs.map +1 -1
  37. package/_cjs/control/Gen/api.cjs +533 -200
  38. package/_cjs/control/Gen/api.cjs.map +1 -1
  39. package/_cjs/control/Gen/definition.cjs +0 -3
  40. package/_cjs/control/Gen/definition.cjs.map +1 -1
  41. package/_cjs/control/Gen.cjs +0 -97
  42. package/_cjs/control/Gen.cjs.map +1 -1
  43. package/_cjs/control/Live/definition.cjs +5 -23
  44. package/_cjs/control/Live/definition.cjs.map +1 -1
  45. package/_cjs/control/Live.cjs +0 -2
  46. package/_cjs/control/Live.cjs.map +1 -1
  47. package/_cjs/control/RunnableSpec.cjs +8 -28
  48. package/_cjs/control/RunnableSpec.cjs.map +1 -1
  49. package/_cjs/control/Sample/api.cjs +66 -107
  50. package/_cjs/control/Sample/api.cjs.map +1 -1
  51. package/_cjs/control/Sample/definition.cjs +0 -3
  52. package/_cjs/control/Sample/definition.cjs.map +1 -1
  53. package/_cjs/control/Sample.cjs +0 -4
  54. package/_cjs/control/Sample.cjs.map +1 -1
  55. package/_cjs/control/Sized/api.cjs +0 -8
  56. package/_cjs/control/Sized/api.cjs.map +1 -1
  57. package/_cjs/control/Sized/definition.cjs +0 -6
  58. package/_cjs/control/Sized/definition.cjs.map +1 -1
  59. package/_cjs/control/Sized/live.cjs +3 -15
  60. package/_cjs/control/Sized/live.cjs.map +1 -1
  61. package/_cjs/control/Sized.cjs +0 -6
  62. package/_cjs/control/Sized.cjs.map +1 -1
  63. package/_cjs/control/Spec/api.cjs +322 -367
  64. package/_cjs/control/Spec/api.cjs.map +1 -1
  65. package/_cjs/control/Spec/definition.cjs +6 -45
  66. package/_cjs/control/Spec/definition.cjs.map +1 -1
  67. package/_cjs/control/Spec.cjs +0 -4
  68. package/_cjs/control/Spec.cjs.map +1 -1
  69. package/_cjs/control/SummaryBuilder.cjs +10 -31
  70. package/_cjs/control/SummaryBuilder.cjs.map +1 -1
  71. package/_cjs/control/Test.cjs +1 -11
  72. package/_cjs/control/Test.cjs.map +1 -1
  73. package/_cjs/control/TestAnnotationRenderer/api.cjs +20 -45
  74. package/_cjs/control/TestAnnotationRenderer/api.cjs.map +1 -1
  75. package/_cjs/control/TestAnnotationRenderer/definition.cjs +4 -20
  76. package/_cjs/control/TestAnnotationRenderer/definition.cjs.map +1 -1
  77. package/_cjs/control/TestAnnotationRenderer.cjs +0 -4
  78. package/_cjs/control/TestAnnotationRenderer.cjs.map +1 -1
  79. package/_cjs/control/TestAspect/api.cjs +14 -55
  80. package/_cjs/control/TestAspect/api.cjs.map +1 -1
  81. package/_cjs/control/TestAspect.cjs +0 -4
  82. package/_cjs/control/TestAspect.cjs.map +1 -1
  83. package/_cjs/control/TestClock/api.cjs +1 -22
  84. package/_cjs/control/TestClock/api.cjs.map +1 -1
  85. package/_cjs/control/TestClock/definition.cjs +50 -110
  86. package/_cjs/control/TestClock/definition.cjs.map +1 -1
  87. package/_cjs/control/TestClock.cjs +0 -4
  88. package/_cjs/control/TestClock.cjs.map +1 -1
  89. package/_cjs/control/TestConsole/api.cjs +3 -21
  90. package/_cjs/control/TestConsole/api.cjs.map +1 -1
  91. package/_cjs/control/TestConsole/definition.cjs +23 -48
  92. package/_cjs/control/TestConsole/definition.cjs.map +1 -1
  93. package/_cjs/control/TestConsole.cjs +0 -4
  94. package/_cjs/control/TestConsole.cjs.map +1 -1
  95. package/_cjs/control/TestEnvironment.cjs +3 -15
  96. package/_cjs/control/TestEnvironment.cjs.map +1 -1
  97. package/_cjs/control/TestExecutor.cjs +3 -17
  98. package/_cjs/control/TestExecutor.cjs.map +1 -1
  99. package/_cjs/control/TestLogger.cjs +2 -17
  100. package/_cjs/control/TestLogger.cjs.map +1 -1
  101. package/_cjs/control/TestRandom/api.cjs +9 -39
  102. package/_cjs/control/TestRandom/api.cjs.map +1 -1
  103. package/_cjs/control/TestRandom/definition.cjs +61 -145
  104. package/_cjs/control/TestRandom/definition.cjs.map +1 -1
  105. package/_cjs/control/TestRandom.cjs +0 -4
  106. package/_cjs/control/TestRandom.cjs.map +1 -1
  107. package/_cjs/control/TestRenderer/ConsoleRenderer.cjs +11 -36
  108. package/_cjs/control/TestRenderer/ConsoleRenderer.cjs.map +1 -1
  109. package/_cjs/control/TestRunner.cjs +2 -19
  110. package/_cjs/control/TestRunner.cjs.map +1 -1
  111. package/_cjs/data/AssertionData.cjs +0 -14
  112. package/_cjs/data/AssertionData.cjs.map +1 -1
  113. package/_cjs/data/AssertionResult.cjs +0 -8
  114. package/_cjs/data/AssertionResult.cjs.map +1 -1
  115. package/_cjs/data/AssertionValue/api.cjs +23 -30
  116. package/_cjs/data/AssertionValue/api.cjs.map +1 -1
  117. package/_cjs/data/AssertionValue/definition.cjs +0 -8
  118. package/_cjs/data/AssertionValue/definition.cjs.map +1 -1
  119. package/_cjs/data/AssertionValue.cjs +0 -4
  120. package/_cjs/data/AssertionValue.cjs.map +1 -1
  121. package/_cjs/data/ExecutedSpec/api.cjs +61 -75
  122. package/_cjs/data/ExecutedSpec/api.cjs.map +1 -1
  123. package/_cjs/data/ExecutedSpec/definition.cjs +3 -21
  124. package/_cjs/data/ExecutedSpec/definition.cjs.map +1 -1
  125. package/_cjs/data/ExecutedSpec.cjs +0 -4
  126. package/_cjs/data/ExecutedSpec.cjs.map +1 -1
  127. package/_cjs/data/ExecutionResult.cjs +42 -67
  128. package/_cjs/data/ExecutionResult.cjs.map +1 -1
  129. package/_cjs/data/FailureDetails.cjs +0 -3
  130. package/_cjs/data/FailureDetails.cjs.map +1 -1
  131. package/_cjs/data/FreeBooleanAlgebra/api.cjs +82 -115
  132. package/_cjs/data/FreeBooleanAlgebra/api.cjs.map +1 -1
  133. package/_cjs/data/FreeBooleanAlgebra/definition.cjs +4 -24
  134. package/_cjs/data/FreeBooleanAlgebra/definition.cjs.map +1 -1
  135. package/_cjs/data/FreeBooleanAlgebra.cjs +0 -4
  136. package/_cjs/data/FreeBooleanAlgebra.cjs.map +1 -1
  137. package/_cjs/data/GenFailureDetails.cjs +0 -3
  138. package/_cjs/data/GenFailureDetails.cjs.map +1 -1
  139. package/_cjs/data/LogLine/Fragment.cjs +2 -24
  140. package/_cjs/data/LogLine/Fragment.cjs.map +1 -1
  141. package/_cjs/data/LogLine/Line.cjs +11 -41
  142. package/_cjs/data/LogLine/Line.cjs.map +1 -1
  143. package/_cjs/data/LogLine/Message.cjs +32 -58
  144. package/_cjs/data/LogLine/Message.cjs.map +1 -1
  145. package/_cjs/data/LogLine/Style.cjs +10 -44
  146. package/_cjs/data/LogLine/Style.cjs.map +1 -1
  147. package/_cjs/data/LogLine/api.cjs +0 -15
  148. package/_cjs/data/LogLine/api.cjs.map +1 -1
  149. package/_cjs/data/LogLine.cjs +0 -4
  150. package/_cjs/data/LogLine.cjs.map +1 -1
  151. package/_cjs/data/Render/api.cjs +0 -4
  152. package/_cjs/data/Render/api.cjs.map +1 -1
  153. package/_cjs/data/Render/definition.cjs +3 -17
  154. package/_cjs/data/Render/definition.cjs.map +1 -1
  155. package/_cjs/data/Render.cjs +0 -4
  156. package/_cjs/data/Render.cjs.map +1 -1
  157. package/_cjs/data/RenderParam/api.cjs +3 -15
  158. package/_cjs/data/RenderParam/api.cjs.map +1 -1
  159. package/_cjs/data/RenderParam/definition.cjs +2 -12
  160. package/_cjs/data/RenderParam/definition.cjs.map +1 -1
  161. package/_cjs/data/RenderParam.cjs +0 -4
  162. package/_cjs/data/RenderParam.cjs.map +1 -1
  163. package/_cjs/data/Summary.cjs +0 -3
  164. package/_cjs/data/Summary.cjs.map +1 -1
  165. package/_cjs/data/TestAnnotation/api.cjs +2 -17
  166. package/_cjs/data/TestAnnotation/api.cjs.map +1 -1
  167. package/_cjs/data/TestAnnotation/definition.cjs +4 -19
  168. package/_cjs/data/TestAnnotation/definition.cjs.map +1 -1
  169. package/_cjs/data/TestAnnotation.cjs +0 -4
  170. package/_cjs/data/TestAnnotation.cjs.map +1 -1
  171. package/_cjs/data/TestAnnotationMap.cjs +4 -19
  172. package/_cjs/data/TestAnnotationMap.cjs.map +1 -1
  173. package/_cjs/data/TestArgs/definition.cjs +0 -3
  174. package/_cjs/data/TestArgs/definition.cjs.map +1 -1
  175. package/_cjs/data/TestArgs.cjs +0 -2
  176. package/_cjs/data/TestArgs.cjs.map +1 -1
  177. package/_cjs/data/TestConfig.cjs +0 -17
  178. package/_cjs/data/TestConfig.cjs.map +1 -1
  179. package/_cjs/data/TestFailure.cjs +2 -23
  180. package/_cjs/data/TestFailure.cjs.map +1 -1
  181. package/_cjs/data/TestSuccess.cjs +2 -16
  182. package/_cjs/data/TestSuccess.cjs.map +1 -1
  183. package/_cjs/data/TestTimeoutException.cjs +0 -3
  184. package/_cjs/data/TestTimeoutException.cjs.map +1 -1
  185. package/_cjs/demo.cjs +5 -15
  186. package/_cjs/demo.cjs.map +1 -1
  187. package/_cjs/util/math.cjs +20 -148
  188. package/_cjs/util/math.cjs.map +1 -1
  189. package/_mjs/api.mjs +37 -40
  190. package/_mjs/api.mjs.map +1 -1
  191. package/_mjs/control/AbstractRunnableSpec.mjs +1 -7
  192. package/_mjs/control/AbstractRunnableSpec.mjs.map +1 -1
  193. package/_mjs/control/Annotations/api.mjs +0 -4
  194. package/_mjs/control/Annotations/api.mjs.map +1 -1
  195. package/_mjs/control/Annotations/definition.mjs +0 -2
  196. package/_mjs/control/Annotations/definition.mjs.map +1 -1
  197. package/_mjs/control/Annotations/live.mjs +6 -11
  198. package/_mjs/control/Annotations/live.mjs.map +1 -1
  199. package/_mjs/control/Annotations.mjs.map +1 -1
  200. package/_mjs/control/Assertion/api.mjs +43 -46
  201. package/_mjs/control/Assertion/api.mjs.map +1 -1
  202. package/_mjs/control/Assertion/definition.mjs +0 -2
  203. package/_mjs/control/Assertion/definition.mjs.map +1 -1
  204. package/_mjs/control/Assertion.mjs.map +1 -1
  205. package/_mjs/control/AssertionIO/api.mjs +17 -14
  206. package/_mjs/control/AssertionIO/api.mjs.map +1 -1
  207. package/_mjs/control/AssertionIO/definition.mjs +0 -3
  208. package/_mjs/control/AssertionIO/definition.mjs.map +1 -1
  209. package/_mjs/control/AssertionIO.mjs.map +1 -1
  210. package/_mjs/control/DefaultRunnableSpec.mjs +0 -1
  211. package/_mjs/control/DefaultRunnableSpec.mjs.map +1 -1
  212. package/_mjs/control/DefaultTestReporter/definition.mjs.map +1 -1
  213. package/_mjs/control/DefaultTestReporter/render.mjs +54 -87
  214. package/_mjs/control/DefaultTestReporter/render.mjs.map +1 -1
  215. package/_mjs/control/DefaultTestReporter.mjs.map +1 -1
  216. package/_mjs/control/FreeBooleanAlgebraIO/api.mjs +18 -22
  217. package/_mjs/control/FreeBooleanAlgebraIO/api.mjs.map +1 -1
  218. package/_mjs/control/FreeBooleanAlgebraIO/definition.mjs.map +1 -1
  219. package/_mjs/control/FreeBooleanAlgebraIO.mjs.map +1 -1
  220. package/_mjs/control/Gen/api.mjs +462 -138
  221. package/_mjs/control/Gen/api.mjs.map +1 -1
  222. package/_mjs/control/Gen/definition.mjs +0 -1
  223. package/_mjs/control/Gen/definition.mjs.map +1 -1
  224. package/_mjs/control/Gen.mjs +1 -10
  225. package/_mjs/control/Gen.mjs.map +1 -1
  226. package/_mjs/control/Live/definition.mjs +5 -10
  227. package/_mjs/control/Live/definition.mjs.map +1 -1
  228. package/_mjs/control/Live.mjs.map +1 -1
  229. package/_mjs/control/RunnableSpec.mjs +8 -11
  230. package/_mjs/control/RunnableSpec.mjs.map +1 -1
  231. package/_mjs/control/Sample/api.mjs +57 -73
  232. package/_mjs/control/Sample/api.mjs.map +1 -1
  233. package/_mjs/control/Sample/definition.mjs +0 -1
  234. package/_mjs/control/Sample/definition.mjs.map +1 -1
  235. package/_mjs/control/Sample.mjs.map +1 -1
  236. package/_mjs/control/Sized/api.mjs +0 -2
  237. package/_mjs/control/Sized/api.mjs.map +1 -1
  238. package/_mjs/control/Sized/definition.mjs +0 -2
  239. package/_mjs/control/Sized/definition.mjs.map +1 -1
  240. package/_mjs/control/Sized/live.mjs +3 -6
  241. package/_mjs/control/Sized/live.mjs.map +1 -1
  242. package/_mjs/control/Sized.mjs.map +1 -1
  243. package/_mjs/control/Spec/api.mjs +300 -309
  244. package/_mjs/control/Spec/api.mjs.map +1 -1
  245. package/_mjs/control/Spec/definition.mjs +6 -31
  246. package/_mjs/control/Spec/definition.mjs.map +1 -1
  247. package/_mjs/control/Spec.mjs.map +1 -1
  248. package/_mjs/control/SummaryBuilder.mjs +10 -15
  249. package/_mjs/control/SummaryBuilder.mjs.map +1 -1
  250. package/_mjs/control/Test.mjs +1 -2
  251. package/_mjs/control/Test.mjs.map +1 -1
  252. package/_mjs/control/TestAnnotationRenderer/api.mjs +20 -34
  253. package/_mjs/control/TestAnnotationRenderer/api.mjs.map +1 -1
  254. package/_mjs/control/TestAnnotationRenderer/definition.mjs +4 -10
  255. package/_mjs/control/TestAnnotationRenderer/definition.mjs.map +1 -1
  256. package/_mjs/control/TestAnnotationRenderer.mjs.map +1 -1
  257. package/_mjs/control/TestAspect/api.mjs +14 -18
  258. package/_mjs/control/TestAspect/api.mjs.map +1 -1
  259. package/_mjs/control/TestAspect.mjs.map +1 -1
  260. package/_mjs/control/TestClock/api.mjs +1 -5
  261. package/_mjs/control/TestClock/api.mjs.map +1 -1
  262. package/_mjs/control/TestClock/definition.mjs +50 -72
  263. package/_mjs/control/TestClock/definition.mjs.map +1 -1
  264. package/_mjs/control/TestClock.mjs.map +1 -1
  265. package/_mjs/control/TestConsole/api.mjs +3 -6
  266. package/_mjs/control/TestConsole/api.mjs.map +1 -1
  267. package/_mjs/control/TestConsole/definition.mjs +23 -32
  268. package/_mjs/control/TestConsole/definition.mjs.map +1 -1
  269. package/_mjs/control/TestConsole.mjs.map +1 -1
  270. package/_mjs/control/TestEnvironment.mjs +3 -3
  271. package/_mjs/control/TestEnvironment.mjs.map +1 -1
  272. package/_mjs/control/TestExecutor.mjs +3 -3
  273. package/_mjs/control/TestExecutor.mjs.map +1 -1
  274. package/_mjs/control/TestLogger.mjs +2 -7
  275. package/_mjs/control/TestLogger.mjs.map +1 -1
  276. package/_mjs/control/TestRandom/api.mjs +9 -19
  277. package/_mjs/control/TestRandom/api.mjs.map +1 -1
  278. package/_mjs/control/TestRandom/definition.mjs +61 -121
  279. package/_mjs/control/TestRandom/definition.mjs.map +1 -1
  280. package/_mjs/control/TestRandom.mjs.map +1 -1
  281. package/_mjs/control/TestRenderer/ConsoleRenderer.mjs +11 -21
  282. package/_mjs/control/TestRenderer/ConsoleRenderer.mjs.map +1 -1
  283. package/_mjs/control/TestRunner.mjs +2 -6
  284. package/_mjs/control/TestRunner.mjs.map +1 -1
  285. package/_mjs/data/AssertionData.mjs +0 -5
  286. package/_mjs/data/AssertionData.mjs.map +1 -1
  287. package/_mjs/data/AssertionResult.mjs +0 -2
  288. package/_mjs/data/AssertionResult.mjs.map +1 -1
  289. package/_mjs/data/AssertionValue/api.mjs +23 -20
  290. package/_mjs/data/AssertionValue/api.mjs.map +1 -1
  291. package/_mjs/data/AssertionValue/definition.mjs +0 -2
  292. package/_mjs/data/AssertionValue/definition.mjs.map +1 -1
  293. package/_mjs/data/AssertionValue.mjs.map +1 -1
  294. package/_mjs/data/ExecutedSpec/api.mjs +55 -57
  295. package/_mjs/data/ExecutedSpec/api.mjs.map +1 -1
  296. package/_mjs/data/ExecutedSpec/definition.mjs +5 -13
  297. package/_mjs/data/ExecutedSpec/definition.mjs.map +1 -1
  298. package/_mjs/data/ExecutedSpec.mjs.map +1 -1
  299. package/_mjs/data/ExecutionResult.mjs +40 -52
  300. package/_mjs/data/ExecutionResult.mjs.map +1 -1
  301. package/_mjs/data/FailureDetails.mjs +0 -1
  302. package/_mjs/data/FailureDetails.mjs.map +1 -1
  303. package/_mjs/data/FreeBooleanAlgebra/api.mjs +70 -87
  304. package/_mjs/data/FreeBooleanAlgebra/api.mjs.map +1 -1
  305. package/_mjs/data/FreeBooleanAlgebra/definition.mjs +8 -16
  306. package/_mjs/data/FreeBooleanAlgebra/definition.mjs.map +1 -1
  307. package/_mjs/data/FreeBooleanAlgebra.mjs.map +1 -1
  308. package/_mjs/data/GenFailureDetails.mjs +0 -1
  309. package/_mjs/data/GenFailureDetails.mjs.map +1 -1
  310. package/_mjs/data/LogLine/Fragment.mjs +2 -11
  311. package/_mjs/data/LogLine/Fragment.mjs.map +1 -1
  312. package/_mjs/data/LogLine/Line.mjs +11 -24
  313. package/_mjs/data/LogLine/Line.mjs.map +1 -1
  314. package/_mjs/data/LogLine/Message.mjs +26 -36
  315. package/_mjs/data/LogLine/Message.mjs.map +1 -1
  316. package/_mjs/data/LogLine/Style.mjs +10 -39
  317. package/_mjs/data/LogLine/Style.mjs.map +1 -1
  318. package/_mjs/data/LogLine/api.mjs.map +1 -1
  319. package/_mjs/data/LogLine.mjs.map +1 -1
  320. package/_mjs/data/Render/api.mjs +0 -2
  321. package/_mjs/data/Render/api.mjs.map +1 -1
  322. package/_mjs/data/Render/definition.mjs +3 -9
  323. package/_mjs/data/Render/definition.mjs.map +1 -1
  324. package/_mjs/data/Render.mjs.map +1 -1
  325. package/_mjs/data/RenderParam/api.mjs +3 -10
  326. package/_mjs/data/RenderParam/api.mjs.map +1 -1
  327. package/_mjs/data/RenderParam/definition.mjs +4 -8
  328. package/_mjs/data/RenderParam/definition.mjs.map +1 -1
  329. package/_mjs/data/RenderParam.mjs.map +1 -1
  330. package/_mjs/data/Summary.mjs +0 -1
  331. package/_mjs/data/Summary.mjs.map +1 -1
  332. package/_mjs/data/TestAnnotation/api.mjs +2 -8
  333. package/_mjs/data/TestAnnotation/api.mjs.map +1 -1
  334. package/_mjs/data/TestAnnotation/definition.mjs +4 -8
  335. package/_mjs/data/TestAnnotation/definition.mjs.map +1 -1
  336. package/_mjs/data/TestAnnotation.mjs.map +1 -1
  337. package/_mjs/data/TestAnnotationMap.mjs +4 -10
  338. package/_mjs/data/TestAnnotationMap.mjs.map +1 -1
  339. package/_mjs/data/TestArgs/definition.mjs +0 -1
  340. package/_mjs/data/TestArgs/definition.mjs.map +1 -1
  341. package/_mjs/data/TestArgs.mjs.map +1 -1
  342. package/_mjs/data/TestConfig.mjs +0 -8
  343. package/_mjs/data/TestConfig.mjs.map +1 -1
  344. package/_mjs/data/TestFailure.mjs +4 -12
  345. package/_mjs/data/TestFailure.mjs.map +1 -1
  346. package/_mjs/data/TestSuccess.mjs +4 -10
  347. package/_mjs/data/TestSuccess.mjs.map +1 -1
  348. package/_mjs/data/TestTimeoutException.mjs +0 -1
  349. package/_mjs/data/TestTimeoutException.mjs.map +1 -1
  350. package/_mjs/demo.mjs +5 -8
  351. package/_mjs/demo.mjs.map +1 -1
  352. package/_mjs/util/math.mjs +20 -117
  353. package/_mjs/util/math.mjs.map +1 -1
  354. package/_src/api.ts +36 -35
  355. package/_src/control/AbstractRunnableSpec.ts +0 -6
  356. package/_src/control/Annotations/live.ts +4 -10
  357. package/_src/control/Assertion/api.ts +36 -25
  358. package/_src/control/AssertionIO/api.ts +23 -17
  359. package/_src/control/DefaultTestReporter/render.ts +2 -12
  360. package/_src/control/FreeBooleanAlgebraIO/api.ts +12 -14
  361. package/_src/control/Gen/api.ts +476 -71
  362. package/_src/control/Gen.ts +0 -10
  363. package/_src/control/Live/definition.ts +0 -4
  364. package/_src/control/RunnableSpec.ts +1 -1
  365. package/_src/control/Sample/api.ts +78 -67
  366. package/_src/control/Spec/api.ts +235 -222
  367. package/_src/control/Spec/definition.ts +0 -2
  368. package/_src/control/SummaryBuilder.ts +0 -1
  369. package/_src/control/TestAnnotationRenderer/api.ts +17 -15
  370. package/_src/control/TestAnnotationRenderer/definition.ts +0 -2
  371. package/_src/control/TestAspect/api.ts +2 -3
  372. package/_src/control/TestClock/definition.ts +13 -25
  373. package/_src/control/TestConsole/definition.ts +1 -2
  374. package/_src/control/TestLogger.ts +0 -2
  375. package/_src/control/TestRandom/api.ts +5 -0
  376. package/_src/control/TestRandom/definition.ts +3 -37
  377. package/_src/control/TestRenderer/ConsoleRenderer.ts +0 -1
  378. package/_src/control/TestRunner.ts +0 -3
  379. package/_src/data/AssertionValue/api.ts +27 -23
  380. package/_src/data/AssertionValue/definition.ts +0 -1
  381. package/_src/data/ExecutedSpec/api.ts +41 -36
  382. package/_src/data/ExecutionResult.ts +54 -51
  383. package/_src/data/FreeBooleanAlgebra/api.ts +68 -58
  384. package/_src/data/LogLine/Line.ts +5 -3
  385. package/_src/data/LogLine/Message.ts +26 -18
  386. package/_src/data/LogLine/Style.ts +0 -1
  387. package/_src/data/Render/definition.ts +0 -2
  388. package/_src/data/RenderParam/api.ts +1 -1
  389. package/_src/data/TestAnnotation/api.ts +4 -2
  390. package/_src/data/TestAnnotation/definition.ts +0 -3
  391. package/_src/data/TestAnnotationMap.ts +2 -8
  392. package/_src/demo.ts +3 -4
  393. package/_src/util/math.ts +31 -17
  394. package/api.d.ts +12 -12
  395. package/control/AbstractRunnableSpec.d.ts +0 -1
  396. package/control/Annotations/live.d.ts +1 -1
  397. package/control/Assertion/api.d.ts +16 -12
  398. package/control/AssertionIO/api.d.ts +8 -8
  399. package/control/FreeBooleanAlgebraIO/api.d.ts +6 -6
  400. package/control/Gen/api.d.ts +216 -33
  401. package/control/Gen.d.ts +0 -7
  402. package/control/Sample/api.d.ts +14 -14
  403. package/control/Spec/api.d.ts +38 -41
  404. package/control/TestAnnotationRenderer/api.d.ts +3 -3
  405. package/control/TestClock/definition.d.ts +2 -2
  406. package/control/TestConsole/definition.d.ts +1 -1
  407. package/control/TestRandom/definition.d.ts +1 -1
  408. package/control/TestRunner.d.ts +1 -3
  409. package/data/AssertionValue/api.d.ts +8 -8
  410. package/data/ExecutedSpec/api.d.ts +8 -8
  411. package/data/ExecutionResult.d.ts +4 -4
  412. package/data/FreeBooleanAlgebra/api.d.ts +20 -20
  413. package/data/LogLine/Line.d.ts +2 -2
  414. package/data/LogLine/Message.d.ts +10 -10
  415. package/data/TestAnnotation/api.d.ts +1 -1
  416. package/data/TestAnnotation/definition.d.ts +2 -2
  417. package/package.json +4 -4
  418. package/_cjs/control/Gen/api/array.cjs +0 -50
  419. package/_cjs/control/Gen/api/array.cjs.map +0 -1
  420. package/_cjs/control/Gen/api/char.cjs +0 -129
  421. package/_cjs/control/Gen/api/char.cjs.map +0 -1
  422. package/_cjs/control/Gen/api/conc.cjs +0 -73
  423. package/_cjs/control/Gen/api/conc.cjs.map +0 -1
  424. package/_cjs/control/Gen/api/double.cjs +0 -82
  425. package/_cjs/control/Gen/api/double.cjs.map +0 -1
  426. package/_cjs/control/Gen/api/float.cjs +0 -55
  427. package/_cjs/control/Gen/api/float.cjs.map +0 -1
  428. package/_cjs/control/Gen/api/string.cjs +0 -102
  429. package/_cjs/control/Gen/api/string.cjs.map +0 -1
  430. package/_cjs/control/Gen/api/struct.cjs +0 -36
  431. package/_cjs/control/Gen/api/struct.cjs.map +0 -1
  432. package/_mjs/control/Gen/api/array.mjs +0 -31
  433. package/_mjs/control/Gen/api/array.mjs.map +0 -1
  434. package/_mjs/control/Gen/api/char.mjs +0 -95
  435. package/_mjs/control/Gen/api/char.mjs.map +0 -1
  436. package/_mjs/control/Gen/api/conc.mjs +0 -49
  437. package/_mjs/control/Gen/api/conc.mjs.map +0 -1
  438. package/_mjs/control/Gen/api/double.mjs +0 -60
  439. package/_mjs/control/Gen/api/double.mjs.map +0 -1
  440. package/_mjs/control/Gen/api/float.mjs +0 -41
  441. package/_mjs/control/Gen/api/float.mjs.map +0 -1
  442. package/_mjs/control/Gen/api/string.mjs +0 -72
  443. package/_mjs/control/Gen/api/string.mjs.map +0 -1
  444. package/_mjs/control/Gen/api/struct.mjs +0 -18
  445. package/_mjs/control/Gen/api/struct.mjs.map +0 -1
  446. package/_src/control/Gen/api/array.ts +0 -31
  447. package/_src/control/Gen/api/char.ts +0 -83
  448. package/_src/control/Gen/api/conc.ts +0 -48
  449. package/_src/control/Gen/api/double.ts +0 -64
  450. package/_src/control/Gen/api/float.ts +0 -36
  451. package/_src/control/Gen/api/string.ts +0 -71
  452. package/_src/control/Gen/api/struct.ts +0 -21
  453. package/control/Gen/api/array.d.ts +0 -18
  454. package/control/Gen/api/char.d.ts +0 -47
  455. package/control/Gen/api/conc.d.ts +0 -25
  456. package/control/Gen/api/double.d.ts +0 -13
  457. package/control/Gen/api/float.d.ts +0 -7
  458. package/control/Gen/api/string.d.ts +0 -48
  459. package/control/Gen/api/struct.d.ts +0 -8
@@ -1,60 +1,209 @@
1
- import type { NumberConstraints } from "./constraints.js";
1
+ import type { EqConstraint, FloatConstraints, LengthConstraints, NumberConstraints } from "./constraints.js";
2
2
  import type { _A, _R } from "@fncts/base/types.js";
3
+ import type { ArrayInt64 } from "@fncts/base/util/rand";
3
4
 
4
5
  import { SortedMap } from "@fncts/base/collection/immutable/SortedMap";
5
6
  import { IllegalArgumentError, NoSuchElementError } from "@fncts/base/data/exceptions";
6
7
  import { tuple } from "@fncts/base/data/function";
7
8
  import { identity } from "@fncts/base/data/function";
8
9
 
9
- import { clamp } from "../../util/math.js";
10
+ import {
11
+ add64,
12
+ clamp,
13
+ computeArrayInt64GenerateRange,
14
+ indexToDouble,
15
+ indexToFloat,
16
+ isStrictlyPositive64,
17
+ isStrictlySmaller64,
18
+ MAX_VALUE_32,
19
+ safeDoubleToIndex,
20
+ safeFloatToIndex,
21
+ substract64,
22
+ Unit64,
23
+ } from "../../util/math.js";
10
24
  import { Sample } from "../Sample.js";
11
25
  import { Sized } from "../Sized.js";
12
26
  import { Gen } from "./definition.js";
13
27
 
28
+ const gapSize = 0xdfff + 1 - 0xd800;
29
+
30
+ /**
31
+ * @tsplus static fncts.test.GenOps size
32
+ */
33
+ export const size: Gen<Sized, number> = Gen.fromIO(Sized.size);
34
+
35
+ /**
36
+ * @tsplus static fncts.test.GenOps uniform
37
+ */
38
+ export const uniform: Gen<never, number> = Gen.fromIOSample(Random.nextDouble.map(Sample.shrinkFractional(0.0)));
39
+
40
+ /**
41
+ * @tsplus static fncts.test.GenOps alphaNumericChar
42
+ */
43
+ export const alphaNumericChar: Gen<never, string> = Gen.weighted(
44
+ [Gen.char({ min: 48, max: 57 }), 10],
45
+ [Gen.char({ min: 65, max: 90 }), 26],
46
+ [Gen.char({ min: 97, max: 122 }), 26],
47
+ );
48
+
49
+ /**
50
+ * @tsplus static fncts.test.GenOps alphaNumericStringWith
51
+ */
52
+ export function alphaNumericStringWith(constraints: LengthConstraints = {}): Gen<Sized, string> {
53
+ return alphaNumericChar.string(constraints);
54
+ }
55
+
56
+ /**
57
+ * @tsplus static fncts.test.GenOps alphaNumericString
58
+ */
59
+ export const alphaNumericString: Gen<Sized, string> = alphaNumericChar.string();
60
+
61
+ /**
62
+ * @tsplus getter fncts.test.Gen array
63
+ */
64
+ export function array<R, A>(self: Gen<R, A>): Gen<R | Sized, ReadonlyArray<A>> {
65
+ return self.arrayWith();
66
+ }
67
+
68
+ /**
69
+ * @tsplus pipeable fncts.test.Gen arrayWith
70
+ */
71
+ export function arrayWith(constraints: LengthConstraints = {}) {
72
+ return <R, A>(g: Gen<R, A>): Gen<R | Sized, ReadonlyArray<A>> => {
73
+ const minLength = constraints.minLength || 0;
74
+ return constraints.maxLength
75
+ ? Gen.intWith({ min: minLength, max: constraints.maxLength }).flatMap((n) => g.arrayN(n))
76
+ : Gen.small((n) => g.arrayN(n), minLength);
77
+ };
78
+ }
79
+
80
+ /**
81
+ * @tsplus pipeable fncts.test.Gen arrayN
82
+ */
83
+ export function arrayN(n: number) {
84
+ return <R, A>(self: Gen<R, A>): Gen<R, ReadonlyArray<A>> => {
85
+ return self.concN(n).map((conc) => conc.toArray);
86
+ };
87
+ }
88
+
89
+ /**
90
+ * @tsplus static fncts.test.GenOps arrayInt64
91
+ */
92
+ export function arrayInt64(min: ArrayInt64, max: ArrayInt64): Gen<never, ArrayInt64> {
93
+ return new Gen(
94
+ Stream.fromIO(computeArrayInt64GenerateRange(min, max, undefined, undefined))
95
+ .flatMap(({ min, max }) => Stream.repeatIO(Random.nextArrayIntBetween(min, max)))
96
+ .map((uncheckedValue) => {
97
+ if (uncheckedValue.data.length === 1) {
98
+ uncheckedValue.data.unshift(0);
99
+ }
100
+ return Just(Sample.shrinkArrayInt64(min)(uncheckedValue as ArrayInt64));
101
+ }),
102
+ );
103
+ }
104
+
105
+ /**
106
+ * @tsplus static fncts.test.GenOps asciiChar
107
+ */
108
+ export const asciiChar: Gen<never, string> = _char(0x00, 0x7f, indexToPrintableIndex);
109
+
110
+ /**
111
+ * @tsplus static fncts.test.GenOps asciiStringWith
112
+ */
113
+ export function asciiStringWith(constraints?: LengthConstraints): Gen<Sized, string> {
114
+ return asciiChar.string(constraints);
115
+ }
116
+
117
+ /**
118
+ * @tsplus static fncts.test.GenOps asciiString
119
+ */
120
+ export const asciiString: Gen<Sized, string> = asciiStringWith();
121
+
122
+ /**
123
+ * @tsplus static fncts.test.GenOps base64Char
124
+ */
125
+ export const base64Char: Gen<never, string> = _char(0, 63, base64ToCharCode);
126
+
127
+ /**
128
+ * @tsplus static fncts.test.GenOps base64String
129
+ */
130
+ export const base64String: Gen<Sized, string> = Gen.base64StringWith();
131
+
132
+ /**
133
+ * @tsplus static fncts.test.GenOps base64StringWith
134
+ */
135
+ export function base64StringWith(constraints: LengthConstraints = {}): Gen<Sized, string> {
136
+ return base64Char.string(constraints);
137
+ }
138
+
14
139
  /**
15
- * @tsplus static fncts.test.GenOps anyBigInt
140
+ * @tsplus static fncts.test.GenOps bigInt
16
141
  */
17
- export const anyBigInt: Gen<never, bigint> = fromIOSample(
142
+ export const bigInt: Gen<never, bigint> = Gen.fromIOSample(
18
143
  Random.nextBigIntBetween(BigInt(-1) << BigInt(255), (BigInt(1) << BigInt(255)) - BigInt(1)).map(
19
144
  Sample.shrinkBigInt(BigInt(0)),
20
145
  ),
21
146
  );
22
147
 
23
148
  /**
24
- * @tsplus static fncts.test.GenOps anyDouble
149
+ * @tsplus static fncts.test.GenOps boolean
25
150
  */
26
- export const anyDouble: Gen<never, number> = Gen.fromIOSample(Random.nextDouble.map(Sample.shrinkFractional(0)));
151
+ export const boolean: Gen<never, boolean> = Gen.defer(Gen.oneOf(Gen.constant(true), Gen.constant(false)));
27
152
 
28
153
  /**
29
- * @tsplus static fncts.test.GenOps anyInt
154
+ * @tsplus static fncts.test.GenOps bounded
30
155
  */
31
- export const anyInt: Gen<never, number> = Gen.fromIOSample(Random.nextInt.map(Sample.shrinkIntegral(0)));
156
+ export function bounded<R, A>(min: number, max: number, f: (n: number) => Gen<R, A>): Gen<R, A> {
157
+ return Gen.intWith({ min, max }).flatMap(f);
158
+ }
32
159
 
33
160
  /**
34
- * @tsplus static fncts.test.GenOps bounded
161
+ * @tsplus static fncts.test.GenOps char
35
162
  */
36
- export function bounded<R, A>(min: number, max: number, f: (n: number) => Gen<R, A>): Gen<R, A> {
37
- return Gen.int({ min, max }).flatMap(f);
163
+ export function char(constraints: Required<NumberConstraints>): Gen<never, string> {
164
+ return _char(constraints.min, constraints.max, identity);
38
165
  }
39
166
 
40
167
  /**
41
- * @tsplus static fncts.test.GenOps constant
168
+ * @tsplus static fncts.test.GenOps char16
42
169
  */
43
- export function constant<A>(a: A): Gen<never, A> {
44
- return new Gen(Stream.succeedNow(Just(Sample.noShrink(a))));
170
+ export const char16: Gen<never, string> = _char(0x0000, 0xffff, indexToPrintableIndex);
171
+
172
+ /**
173
+ * @tsplus pipeable fncts.test.Gen conc
174
+ */
175
+ export function concWith(constraints: LengthConstraints = {}) {
176
+ return <R, A>(self: Gen<R, A>): Gen<R | Sized, Conc<A>> => {
177
+ const minLength = constraints.minLength ?? 0;
178
+ return constraints.maxLength
179
+ ? Gen.intWith({ min: minLength, max: constraints.maxLength }).flatMap((n) => self.concN(n))
180
+ : Gen.small((n) => self.concN(n), minLength);
181
+ };
45
182
  }
46
183
 
47
184
  /**
48
- * @tsplus fluent fncts.test.Gen flatMap
185
+ * @tsplus getter fncts.test.Gen conc
49
186
  */
50
- export function flatMap_<R, A, R1, B>(ma: Gen<R, A>, f: (a: A) => Gen<R1, B>): Gen<R | R1, B> {
51
- return new Gen(
52
- Sample.flatMapStream(ma.sample, (sample) => {
53
- const values = f(sample.value).sample;
54
- const shrinks = new Gen(sample.shrink).flatMap((a) => f(a)).sample;
55
- return values.map((maybeSample) => maybeSample.map((sample) => sample.flatMap((b) => new Sample(b, shrinks))));
56
- }),
57
- );
187
+ export function conc<R, A>(self: Gen<R, A>): Gen<R | Sized, Conc<A>> {
188
+ return self.conc();
189
+ }
190
+
191
+ /**
192
+ * @tsplus pipeable fncts.test.Gen concN
193
+ */
194
+ export function concN(n: number) {
195
+ return <R, A>(g: Gen<R, A>): Gen<R, Conc<A>> => {
196
+ return Conc.replicate(n, g).foldLeft(Gen.constant(Conc.empty()) as Gen<R, Conc<A>>, (gen, a) =>
197
+ gen.zipWith(a, (as, a) => as.append(a)),
198
+ );
199
+ };
200
+ }
201
+
202
+ /**
203
+ * @tsplus static fncts.test.GenOps constant
204
+ */
205
+ export function constant<A>(a: A): Gen<never, A> {
206
+ return new Gen(Stream.succeedNow(Just(Sample.noShrink(a))));
58
207
  }
59
208
 
60
209
  /**
@@ -64,25 +213,85 @@ export function defer<R, A>(gen: Lazy<Gen<R, A>>): Gen<R, A> {
64
213
  return Gen.fromIO(IO.succeed(gen)).flatten;
65
214
  }
66
215
 
216
+ /**
217
+ * @tsplus static fncts.test.GenOps double
218
+ */
219
+ export const double: Gen<never, number> = Gen.fromIOSample(Random.nextDouble.map(Sample.shrinkFractional(0)));
220
+
221
+ /**
222
+ * @tsplus static fncts.test.GenOps doubleWith
223
+ */
224
+ export function doubleWith(constraints: NumberConstraints & FloatConstraints = {}): Gen<never, number> {
225
+ const {
226
+ noDefaultInfinity = false,
227
+ noNaN = false,
228
+ min = noDefaultInfinity ? -Number.MAX_VALUE : Number.NEGATIVE_INFINITY,
229
+ max = noDefaultInfinity ? Number.MAX_VALUE : Number.POSITIVE_INFINITY,
230
+ } = constraints;
231
+ return Gen.unwrap(
232
+ IO.gen(function* (_) {
233
+ const minIndex = yield* _(safeDoubleToIndex(min, "min"));
234
+ const maxIndex = yield* _(safeDoubleToIndex(max, "max"));
235
+ if (isStrictlySmaller64(maxIndex, minIndex)) {
236
+ return yield* _(IO.haltNow(new IllegalArgumentError("min must be less than or equal to max", "Gen.double")));
237
+ }
238
+ if (noNaN) {
239
+ return arrayInt64(minIndex, maxIndex).map(indexToDouble);
240
+ }
241
+ const positiveMaxIdx = isStrictlyPositive64(maxIndex);
242
+ const minIndexWithNaN = positiveMaxIdx ? minIndex : substract64(minIndex, Unit64);
243
+ const maxIndexWithNaN = positiveMaxIdx ? add64(maxIndex, Unit64) : maxIndex;
244
+ return arrayInt64(minIndexWithNaN, maxIndexWithNaN).map((index) => {
245
+ if (isStrictlySmaller64(maxIndex, index) || isStrictlySmaller64(index, minIndex)) return Number.NaN;
246
+ else return indexToDouble(index);
247
+ });
248
+ }),
249
+ );
250
+ }
251
+
67
252
  /**
68
253
  * @tsplus static fncts.test.GenOps empty
69
254
  */
70
255
  export const empty: Gen<never, never> = new Gen(Stream.empty);
71
256
 
72
257
  /**
73
- * @tsplus fluent fncts.test.Gen filter
258
+ * @tsplus static fncts.test.GenOps exponential
74
259
  */
75
- export function filter_<R, A, B extends A>(fa: Gen<R, A>, p: Refinement<A, B>): Gen<R, B>;
76
- export function filter_<R, A>(fa: Gen<R, A>, p: Predicate<A>): Gen<R, A>;
77
- export function filter_<R, A>(fa: Gen<R, A>, p: Predicate<A>): Gen<R, A> {
78
- return fa.flatMap((a) => (p(a) ? Gen.constant(a) : Gen.empty));
260
+ export const exponential: Gen<never, number> = Gen.uniform.map((n) => -Math.log(1 - n));
261
+
262
+ /**
263
+ * @tsplus pipeable fncts.test.Gen filter
264
+ */
265
+ export function filter<A, B extends A>(p: Refinement<A, B>): <R>(fa: Gen<R, A>) => Gen<R, B>;
266
+ export function filter<A>(p: Predicate<A>): <R>(fa: Gen<R, A>) => Gen<R, A>;
267
+ export function filter<A>(p: Predicate<A>) {
268
+ return <R>(fa: Gen<R, A>): Gen<R, A> => {
269
+ return fa.flatMap((a) => (p(a) ? Gen.constant(a) : Gen.empty));
270
+ };
79
271
  }
80
272
 
81
273
  /**
82
- * @tsplus fluent fncts.test.Gen filterNot
274
+ * @tsplus pipeable fncts.test.Gen filterNot
83
275
  */
84
- export function filterNot_<R, A>(fa: Gen<R, A>, p: Predicate<A>): Gen<R, A> {
85
- return fa.filter((a) => !p(a));
276
+ export function filterNot<A>(p: Predicate<A>) {
277
+ return <R>(fa: Gen<R, A>): Gen<R, A> => {
278
+ return fa.filter((a) => !p(a));
279
+ };
280
+ }
281
+
282
+ /**
283
+ * @tsplus pipeable fncts.test.Gen flatMap
284
+ */
285
+ export function flatMap<A, R1, B>(f: (a: A) => Gen<R1, B>) {
286
+ return <R>(ma: Gen<R, A>): Gen<R | R1, B> => {
287
+ return new Gen(
288
+ Sample.flatMapStream(ma.sample, (sample) => {
289
+ const values = f(sample.value).sample;
290
+ const shrinks = new Gen(sample.shrink).flatMap((a) => f(a)).sample;
291
+ return values.map((maybeSample) => maybeSample.map((sample) => sample.flatMap((b) => new Sample(b, shrinks))));
292
+ }),
293
+ );
294
+ };
86
295
  }
87
296
 
88
297
  /**
@@ -106,16 +315,77 @@ export function fromIOSample<R, A>(effect: IO<R, never, Sample<R, A>>): Gen<R, A
106
315
  return new Gen(Stream.fromIO(effect.map(Maybe.just)));
107
316
  }
108
317
 
318
+ /**
319
+ * @tsplus static fncts.test.GenOps floatWith
320
+ */
321
+ export function floatWith(constraints: NumberConstraints & FloatConstraints = {}): Gen<never, number> {
322
+ const {
323
+ noDefaultInfinity = false,
324
+ min = noDefaultInfinity ? -MAX_VALUE_32 : Number.NEGATIVE_INFINITY,
325
+ max = noDefaultInfinity ? MAX_VALUE_32 : Number.POSITIVE_INFINITY,
326
+ noNaN = false,
327
+ } = constraints;
328
+ return Gen.unwrap(
329
+ IO.gen(function* (_) {
330
+ const minIndex = yield* _(safeFloatToIndex(min, "min"));
331
+ const maxIndex = yield* _(safeFloatToIndex(max, "max"));
332
+ if (minIndex > maxIndex) {
333
+ return yield* _(
334
+ IO.haltNow(new Error("Gen.float constraints.min must be less than or equal to constraints.max")),
335
+ );
336
+ }
337
+ if (noNaN) {
338
+ return Gen.intWith({ min: minIndex, max: maxIndex }).map(indexToFloat);
339
+ }
340
+ const minIndexWithNaN = maxIndex > 0 ? minIndex : minIndex - 1;
341
+ const maxIndexWithNaN = maxIndex > 0 ? maxIndex + 1 : maxIndex;
342
+ return Gen.intWith({ min: minIndexWithNaN, max: maxIndexWithNaN }).map((index) => {
343
+ if (index > maxIndex || index < minIndex) return Number.NaN;
344
+ else return indexToFloat(index);
345
+ });
346
+ }),
347
+ );
348
+ }
349
+
350
+ /**
351
+ * @tsplus static fncts.test.GenOps fullUnicodeChar
352
+ */
353
+ export const fullUnicodeChar: Gen<never, string> = _char(0x0000, 0x10ffff - gapSize, unicodeToCharCode);
354
+
355
+ /**
356
+ * @tsplus static fncts.test.GenOps fullUnicodeString
357
+ */
358
+ export function fullUnicodeString(constraints: LengthConstraints = {}): Gen<Sized, string> {
359
+ return fullUnicodeChar.string(constraints);
360
+ }
361
+
362
+ /**
363
+ * @tsplus static fncts.test.GenOps hexChar
364
+ */
365
+ export const hexChar: Gen<never, string> = _char(0, 15, hexToCharCode);
366
+
367
+ /**
368
+ * @tsplus static fncts.test.GenOps hexString
369
+ */
370
+ export function hexString(constraints: LengthConstraints = {}): Gen<Sized, string> {
371
+ return hexChar.string(constraints);
372
+ }
373
+
109
374
  /**
110
375
  * @tsplus static fncts.test.GenOps int
111
376
  */
112
- export function int(constraints: NumberConstraints = {}): Gen<never, number> {
377
+ export const int: Gen<never, number> = Gen.fromIOSample(Random.nextInt.map(Sample.shrinkIntegral(0)));
378
+
379
+ /**
380
+ * @tsplus static fncts.test.GenOps intWith
381
+ */
382
+ export function intWith(constraints: NumberConstraints = {}): Gen<never, number> {
113
383
  return Gen.fromIOSample(
114
384
  IO.defer(() => {
115
385
  const min = constraints.min ?? -0x80000000;
116
386
  const max = constraints.max ?? 0x7fffffff;
117
387
  if (min > max || min < Number.MIN_SAFE_INTEGER || max > Number.MAX_SAFE_INTEGER) {
118
- return IO.haltNow(new IllegalArgumentError("invalid bounds", "Gen.int"));
388
+ return IO.haltNow(new IllegalArgumentError("invalid bounds", "Gen.intWith"));
119
389
  } else {
120
390
  return Random.nextIntBetween(min, max).map(Sample.shrinkIntegral(min));
121
391
  }
@@ -124,36 +394,30 @@ export function int(constraints: NumberConstraints = {}): Gen<never, number> {
124
394
  }
125
395
 
126
396
  /**
127
- * @tsplus fluent fncts.test.Gen map
397
+ * @tsplus pipeable fncts.test.Gen map
128
398
  */
129
- export function map_<R, A, B>(self: Gen<R, A>, f: (a: A) => B): Gen<R, B> {
130
- return new Gen(self.sample.map((maybeSample) => maybeSample.map((sample) => sample.map(f))));
399
+ export function map<A, B>(f: (a: A) => B) {
400
+ return <R>(self: Gen<R, A>): Gen<R, B> => {
401
+ return new Gen(self.sample.map((maybeSample) => maybeSample.map((sample) => sample.map(f))));
402
+ };
131
403
  }
132
404
 
133
405
  /**
134
- * @tsplus fluent fncts.test.Gen mapIO
406
+ * @tsplus pipeable fncts.test.Gen mapIO
135
407
  */
136
- export function mapIO_<R, A, R1, B>(self: Gen<R, A>, f: (a: A) => IO<R1, never, B>): Gen<R | R1, B> {
137
- return new Gen(
138
- self.sample.mapIO((maybeSample) =>
139
- maybeSample.match(
140
- () => IO.succeedNow(Nothing()),
141
- (sample) => sample.foreach(f).map(Maybe.just),
408
+ export function mapIO<A, R1, B>(f: (a: A) => IO<R1, never, B>) {
409
+ return <R>(self: Gen<R, A>): Gen<R | R1, B> => {
410
+ return new Gen(
411
+ self.sample.mapIO((maybeSample) =>
412
+ maybeSample.match(
413
+ () => IO.succeedNow(Nothing()),
414
+ (sample) => sample.foreach(f).map(Maybe.just),
415
+ ),
142
416
  ),
143
- ),
144
- );
417
+ );
418
+ };
145
419
  }
146
420
 
147
- /**
148
- * @tsplus static fncts.test.GenOps exponential
149
- */
150
- export const exponential: Gen<never, number> = Gen.uniform.map((n) => -Math.log(1 - n));
151
-
152
- /**
153
- * @tsplus static fncts.test.GenOps size
154
- */
155
- export const size: Gen<Sized, number> = Gen.fromIO(Sized.size);
156
-
157
421
  /**
158
422
  * @tsplus static fncts.test.GenOps medium
159
423
  */
@@ -168,7 +432,9 @@ export function medium<R, A>(f: (n: number) => Gen<R, A>, min = 0): Gen<R | Size
168
432
  * @tsplus static fncts.test.GenOps memo
169
433
  */
170
434
  export function memo<R, A>(builder: (maxDepth: number) => Gen<R, A>): (maxDepth?: number) => Gen<R, A> {
171
- const previous: { [depth: number]: Gen<R, A> } = {};
435
+ const previous: {
436
+ [depth: number]: Gen<R, A>;
437
+ } = {};
172
438
  let remainingDepth = 10;
173
439
  return (maxDepth?: number): Gen<R, A> => {
174
440
  const n = maxDepth !== undefined ? maxDepth : remainingDepth;
@@ -186,7 +452,7 @@ export function memo<R, A>(builder: (maxDepth: number) => Gen<R, A>): (maxDepth?
186
452
  * @tsplus static fncts.test.GenOps nat
187
453
  */
188
454
  export function nat(max = 0x7fffffff): Gen<unknown, number> {
189
- return Gen.int({ min: 0, max: clamp(max, 0, max) });
455
+ return Gen.intWith({ min: 0, max: clamp(max, 0, max) });
190
456
  }
191
457
 
192
458
  /**
@@ -194,18 +460,39 @@ export function nat(max = 0x7fffffff): Gen<unknown, number> {
194
460
  */
195
461
  export function oneOf<A extends ReadonlyArray<Gen<any, any>>>(...gens: A): Gen<_R<A[number]>, _A<A[number]>> {
196
462
  if (gens.isEmpty()) return Gen.empty;
197
- else return Gen.int({ min: 0, max: gens.length - 1 }).flatMap((i) => gens[i]!);
463
+ else return Gen.intWith({ min: 0, max: gens.length - 1 }).flatMap((i) => gens[i]!);
464
+ }
465
+
466
+ export function partial<P extends Record<string, Gen<any, any>>>(
467
+ properties: P,
468
+ ): Gen<
469
+ _R<P[keyof P]>,
470
+ Partial<{
471
+ readonly [K in keyof P]: _A<P[K]>;
472
+ }>
473
+ > {
474
+ const entries = Object.entries(properties);
475
+ return entries.foldLeft(Gen.constant({}) as Gen<any, any>, (b, [k, gen]) =>
476
+ Gen.unwrap(Random.nextBoolean.ifIO(IO.succeed(b.zipWith(gen, (r, a) => ({ ...r, [k]: a }))), IO.succeed(b))),
477
+ );
198
478
  }
199
479
 
200
480
  /**
201
- * @tsplus fluent fncts.test.Gen reshrink
481
+ * @tsplus static fncts.test.GenOps printableChar
202
482
  */
203
- export function reshrink_<R, A, R1, B>(gen: Gen<R, A>, f: (a: A) => Sample<R1, B>): Gen<R | R1, B> {
204
- return new Gen(
205
- (gen.sample as Stream<R | R1, never, Maybe<Sample<R, A>>>).map((maybeSample) =>
206
- maybeSample.map((sample) => f(sample.value)),
207
- ),
208
- );
483
+ export const printableChar: Gen<never, string> = Gen.char({ min: 0x20, max: 0x7e });
484
+
485
+ /**
486
+ * @tsplus pipeable fncts.test.Gen reshrink
487
+ */
488
+ export function reshrink<A, R1, B>(f: (a: A) => Sample<R1, B>) {
489
+ return <R>(gen: Gen<R, A>): Gen<R | R1, B> => {
490
+ return new Gen(
491
+ (gen.sample as Stream<R | R1, never, Maybe<Sample<R, A>>>).map((maybeSample) =>
492
+ maybeSample.map((sample) => f(sample.value)),
493
+ ),
494
+ );
495
+ };
209
496
  }
210
497
 
211
498
  /**
@@ -225,6 +512,48 @@ export function small<R, A>(f: (size: number) => Gen<R, A>, min = 0): Gen<R | Si
225
512
  .flatMap(f);
226
513
  }
227
514
 
515
+ /**
516
+ * @tsplus static fncts.test.GenOps string16
517
+ */
518
+ export function string16(constraints: LengthConstraints = {}): Gen<Sized, string> {
519
+ return char16.string(constraints);
520
+ }
521
+
522
+ /**
523
+ * @tsplus pipeable fncts.test.Gen string
524
+ */
525
+ export function string(constraints: LengthConstraints = {}) {
526
+ return <R>(char: Gen<R, string>): Gen<R | Sized, string> => {
527
+ const min = constraints.minLength || 0;
528
+ return constraints.maxLength
529
+ ? Gen.bounded(min, constraints.maxLength, (n) => char.stringN(n))
530
+ : Gen.small((n) => char.stringN(n), min);
531
+ };
532
+ }
533
+
534
+ /**
535
+ * @tsplus pipeable fncts.test.Gen stringN
536
+ */
537
+ export function stringN(n: number) {
538
+ return <R>(char: Gen<R, string>): Gen<R, string> => {
539
+ return char.arrayN(n).map((arr) => arr.join(""));
540
+ };
541
+ }
542
+
543
+ export function struct<P extends Record<string, Gen<any, any>>>(
544
+ properties: P,
545
+ ): Gen<
546
+ _R<P[keyof P]>,
547
+ {
548
+ readonly [K in keyof P]: _A<P[K]>;
549
+ }
550
+ > {
551
+ const entries = Object.entries(properties);
552
+ return entries.foldLeft(Gen.constant({}) as Gen<any, any>, (b, [k, gen]) =>
553
+ b.zipWith(gen, (out, a) => ({ ...out, [k]: a })),
554
+ );
555
+ }
556
+
228
557
  /**
229
558
  * @tsplus static fncts.test.GenOps unfoldGen
230
559
  */
@@ -241,9 +570,49 @@ export function unfoldGenN<S, R, A>(n: number, s: S, f: (s: S) => Gen<R, readonl
241
570
  }
242
571
 
243
572
  /**
244
- * @tsplus static fncts.test.GenOps uniform
573
+ * @tsplus static fncts.test.GenOps unicodeChar
245
574
  */
246
- export const uniform: Gen<never, number> = Gen.fromIOSample(Random.nextDouble.map(Sample.shrinkFractional(0.0)));
575
+ export const unicodeChar: Gen<never, string> = _char(0x0000, 0xffff - gapSize, unicodeToCharCode);
576
+
577
+ /**
578
+ * @tsplus static fncts.test.GenOps unicodeString
579
+ */
580
+ export function unicodeString(constraints: LengthConstraints = {}): Gen<Sized, string> {
581
+ return unicodeChar.string(constraints);
582
+ }
583
+
584
+ /**
585
+ * @tsplus pipeable fncts.test.Gen uniqueArray
586
+ */
587
+ export function uniqueArray<A>(constraints: LengthConstraints & EqConstraint<A> = {}) {
588
+ return <R>(gen: Gen<R, A>): Gen<Sized | R, ReadonlyArray<A>> => {
589
+ return gen.uniqueConc(constraints).map((conc) => conc.toArray);
590
+ };
591
+ }
592
+
593
+ /**
594
+ * @tsplus pipeable fncts.test.Gen uniqueConc
595
+ */
596
+ export function uniqueConc<A>(constraints: LengthConstraints & EqConstraint<A> = {}) {
597
+ return <R>(self: Gen<R, A>): Gen<Sized | R, Conc<A>> => {
598
+ const minLength = constraints.minLength ?? 0;
599
+ const eq = constraints.eq ?? Eq({ equals: (y) => (x) => Equatable.strictEquals(x, y) });
600
+ return constraints.maxLength
601
+ ? Gen.bounded(minLength, constraints.maxLength, (n) => self.uniqueConcN(n, eq))
602
+ : Gen.small((n) => self.uniqueConcN(n, eq), minLength);
603
+ };
604
+ }
605
+
606
+ /**
607
+ * @tsplus pipeable fncts.test.Gen uniqueConcN
608
+ */
609
+ export function uniqueConcN<A>(n: number, /** @tsplus auto */ E: Eq<A>) {
610
+ return <R>(self: Gen<R, A>): Gen<R, Conc<A>> => {
611
+ return Conc.replicate(n, self).foldLeft(Gen.constant(Conc.empty()) as Gen<R, Conc<A>>, (gen, a) =>
612
+ gen.zipWith(a, (as, a) => (as.elem(a, E) ? as : as.append(a))),
613
+ );
614
+ };
615
+ }
247
616
 
248
617
  /**
249
618
  * @tsplus static fncts.test.GenOps unwrap
@@ -258,7 +627,7 @@ export function unwrap<R, R1, A>(effect: URIO<R, Gen<R1, A>>): Gen<R | R1, A> {
258
627
  export function weighted<R, A>(...gens: ReadonlyArray<readonly [Gen<R, A>, number]>): Gen<R, A> {
259
628
  const sum = gens.map(([, weight]) => weight).foldLeft(0, (b, a) => b + a);
260
629
  const [map] = gens.foldLeft(tuple(SortedMap.make<number, Gen<R, A>>(Number.Ord), 0), ([map, acc], [gen, d]) => {
261
- if ((acc + d) / sum > acc / sum) return tuple(map.insert((acc + d) / sum, gen), acc + d);
630
+ if ((acc + d) / sum > acc / sum) return tuple(map.set((acc + d) / sum, gen), acc + d);
262
631
  else return tuple(map, acc);
263
632
  });
264
633
  return Gen.uniform.flatMap((n) =>
@@ -269,8 +638,44 @@ export function weighted<R, A>(...gens: ReadonlyArray<readonly [Gen<R, A>, numbe
269
638
  }
270
639
 
271
640
  /**
272
- * @tsplus fluent fncts.test.Gen zipWith
641
+ * @tsplus pipeable fncts.test.Gen zipWith
642
+ */
643
+ export function zipWith<A, R1, B, C>(that: Gen<R1, B>, f: (a: A, b: B) => C) {
644
+ return <R>(self: Gen<R, A>): Gen<R | R1, C> => {
645
+ return self.flatMap((a) => that.map((b) => f(a, b)));
646
+ };
647
+ }
648
+
649
+ /**
650
+ * @tsplus pipeable fncts.test.Gen zip
273
651
  */
274
- export function zipWith_<R, A, R1, B, C>(self: Gen<R, A>, that: Gen<R1, B>, f: (a: A, b: B) => C): Gen<R | R1, C> {
275
- return self.flatMap((a) => that.map((b) => f(a, b)));
652
+ export function zip<R1, B>(that: Gen<R1, B>) {
653
+ return <R, A>(self: Gen<R, A>): Gen<R | R1, readonly [A, B]> => {
654
+ return self.zipWith(that, tuple);
655
+ };
656
+ }
657
+
658
+ function _char(min: number, max: number, mapToCode: (v: number) => number): Gen<never, string> {
659
+ return Gen.intWith({ min, max }).map((n) => String.fromCharCode(mapToCode(n)));
660
+ }
661
+
662
+ function indexToPrintableIndex(v: number): number {
663
+ return v < 95 ? v + 0x20 : v <= 0x7e ? v - 95 : v;
664
+ }
665
+
666
+ function base64ToCharCode(v: number): number {
667
+ if (v < 26) return v + 65; // A-Z
668
+ if (v < 52) return v + 97 - 26; // a-z
669
+ if (v < 62) return v + 48 - 52; // 0-9
670
+ return v === 62 ? 43 : 47; // +/
671
+ }
672
+
673
+ function hexToCharCode(v: number): number {
674
+ return v < 10
675
+ ? v + 48 // 0-9
676
+ : v + 97 - 10; // a-f
677
+ }
678
+
679
+ function unicodeToCharCode(v: number): number {
680
+ return v < 0xd800 ? indexToPrintableIndex(v) : v + gapSize;
276
681
  }