@fncts/test 0.0.32 → 0.0.34

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 (258) hide show
  1. package/_cjs/api.cjs +11 -11
  2. package/_cjs/api.cjs.map +1 -1
  3. package/_cjs/control/AbstractRunnableSpec.cjs +1 -1
  4. package/_cjs/control/AbstractRunnableSpec.cjs.map +1 -1
  5. package/_cjs/control/Annotations/api.cjs.map +1 -1
  6. package/_cjs/control/Annotations/definition.cjs.map +1 -1
  7. package/_cjs/control/Annotations/live.cjs.map +1 -1
  8. package/_cjs/control/Annotations.cjs.map +1 -1
  9. package/_cjs/control/Assertion/api.cjs +9 -5
  10. package/_cjs/control/Assertion/api.cjs.map +1 -1
  11. package/_cjs/control/Assertion/definition.cjs.map +1 -1
  12. package/_cjs/control/Assertion.cjs.map +1 -1
  13. package/_cjs/control/AssertionIO/api.cjs.map +1 -1
  14. package/_cjs/control/AssertionIO/definition.cjs.map +1 -1
  15. package/_cjs/control/AssertionIO.cjs.map +1 -1
  16. package/_cjs/control/DefaultRunnableSpec.cjs.map +1 -1
  17. package/_cjs/control/DefaultTestReporter/definition.cjs.map +1 -1
  18. package/_cjs/control/DefaultTestReporter/render.cjs +4 -9
  19. package/_cjs/control/DefaultTestReporter/render.cjs.map +1 -1
  20. package/_cjs/control/DefaultTestReporter.cjs.map +1 -1
  21. package/_cjs/control/FreeBooleanAlgebraIO/api.cjs.map +1 -1
  22. package/_cjs/control/FreeBooleanAlgebraIO/definition.cjs.map +1 -1
  23. package/_cjs/control/FreeBooleanAlgebraIO.cjs.map +1 -1
  24. package/_cjs/control/Gen/api.cjs +216 -78
  25. package/_cjs/control/Gen/api.cjs.map +1 -1
  26. package/_cjs/control/Gen/constraints.cjs.map +1 -1
  27. package/_cjs/control/Gen/definition.cjs.map +1 -1
  28. package/_cjs/control/Gen.cjs.map +1 -1
  29. package/_cjs/control/Live/definition.cjs +9 -8
  30. package/_cjs/control/Live/definition.cjs.map +1 -1
  31. package/_cjs/control/Live.cjs.map +1 -1
  32. package/_cjs/control/Sample/api.cjs +16 -16
  33. package/_cjs/control/Sample/api.cjs.map +1 -1
  34. package/_cjs/control/Sample/definition.cjs.map +1 -1
  35. package/_cjs/control/Sample.cjs.map +1 -1
  36. package/_cjs/control/Sized/api.cjs.map +1 -1
  37. package/_cjs/control/Sized/definition.cjs.map +1 -1
  38. package/_cjs/control/Sized/live.cjs.map +1 -1
  39. package/_cjs/control/Sized.cjs.map +1 -1
  40. package/_cjs/control/Spec/api.cjs +7 -7
  41. package/_cjs/control/Spec/api.cjs.map +1 -1
  42. package/_cjs/control/Spec/definition.cjs.map +1 -1
  43. package/_cjs/control/Spec.cjs.map +1 -1
  44. package/_cjs/control/SummaryBuilder.cjs.map +1 -1
  45. package/_cjs/control/Test.cjs.map +1 -1
  46. package/_cjs/control/TestAnnotationRenderer/api.cjs +6 -5
  47. package/_cjs/control/TestAnnotationRenderer/api.cjs.map +1 -1
  48. package/_cjs/control/TestAnnotationRenderer/definition.cjs.map +1 -1
  49. package/_cjs/control/TestAnnotationRenderer.cjs.map +1 -1
  50. package/_cjs/control/TestAspect/api.cjs +2 -3
  51. package/_cjs/control/TestAspect/api.cjs.map +1 -1
  52. package/_cjs/control/TestAspect/definition.cjs.map +1 -1
  53. package/_cjs/control/TestAspect.cjs.map +1 -1
  54. package/_cjs/control/TestClock/api.cjs.map +1 -1
  55. package/_cjs/control/TestClock/definition.cjs +6 -6
  56. package/_cjs/control/TestClock/definition.cjs.map +1 -1
  57. package/_cjs/control/TestClock.cjs.map +1 -1
  58. package/_cjs/control/TestConsole/api.cjs.map +1 -1
  59. package/_cjs/control/TestConsole/definition.cjs.map +1 -1
  60. package/_cjs/control/TestConsole.cjs.map +1 -1
  61. package/_cjs/control/TestEnvironment.cjs.map +1 -1
  62. package/_cjs/control/TestLogger.cjs.map +1 -1
  63. package/_cjs/control/TestRandom/api.cjs.map +1 -1
  64. package/_cjs/control/TestRandom/definition.cjs.map +1 -1
  65. package/_cjs/control/TestRandom.cjs.map +1 -1
  66. package/_cjs/control/TestRenderer/ConsoleRenderer.cjs +14 -0
  67. package/_cjs/control/TestRenderer/ConsoleRenderer.cjs.map +1 -1
  68. package/_cjs/control/TestRenderer/definition.cjs.map +1 -1
  69. package/_cjs/control.cjs.map +1 -1
  70. package/_cjs/data/AssertionData.cjs.map +1 -1
  71. package/_cjs/data/AssertionResult.cjs +3 -2
  72. package/_cjs/data/AssertionResult.cjs.map +1 -1
  73. package/_cjs/data/AssertionValue/api.cjs.map +1 -1
  74. package/_cjs/data/AssertionValue/definition.cjs +2 -1
  75. package/_cjs/data/AssertionValue/definition.cjs.map +1 -1
  76. package/_cjs/data/AssertionValue.cjs.map +1 -1
  77. package/_cjs/data/ExecutedSpec/api.cjs.map +1 -1
  78. package/_cjs/data/ExecutedSpec/definition.cjs.map +1 -1
  79. package/_cjs/data/ExecutedSpec.cjs.map +1 -1
  80. package/_cjs/data/ExecutionResult.cjs.map +1 -1
  81. package/_cjs/data/FailureDetails.cjs.map +1 -1
  82. package/_cjs/data/FreeBooleanAlgebra/api.cjs +5 -4
  83. package/_cjs/data/FreeBooleanAlgebra/api.cjs.map +1 -1
  84. package/_cjs/data/FreeBooleanAlgebra/definition.cjs.map +1 -1
  85. package/_cjs/data/FreeBooleanAlgebra.cjs.map +1 -1
  86. package/_cjs/data/GenFailureDetails.cjs.map +1 -1
  87. package/_cjs/data/LogLine/Fragment.cjs.map +1 -1
  88. package/_cjs/data/LogLine/Line.cjs.map +1 -1
  89. package/_cjs/data/LogLine/Message.cjs.map +1 -1
  90. package/_cjs/data/LogLine/Style.cjs.map +1 -1
  91. package/_cjs/data/LogLine/api.cjs.map +1 -1
  92. package/_cjs/data/LogLine.cjs.map +1 -1
  93. package/_cjs/data/Render/api.cjs.map +1 -1
  94. package/_cjs/data/Render/definition.cjs.map +1 -1
  95. package/_cjs/data/Render.cjs.map +1 -1
  96. package/_cjs/data/RenderParam/api.cjs.map +1 -1
  97. package/_cjs/data/RenderParam/definition.cjs.map +1 -1
  98. package/_cjs/data/RenderParam.cjs.map +1 -1
  99. package/_cjs/data/Summary.cjs.map +1 -1
  100. package/_cjs/data/TestAnnotation/api.cjs +3 -2
  101. package/_cjs/data/TestAnnotation/api.cjs.map +1 -1
  102. package/_cjs/data/TestAnnotation/definition.cjs.map +1 -1
  103. package/_cjs/data/TestAnnotation.cjs.map +1 -1
  104. package/_cjs/data/TestAnnotationMap.cjs.map +1 -1
  105. package/_cjs/data/TestArgs/definition.cjs.map +1 -1
  106. package/_cjs/data/TestArgs.cjs.map +1 -1
  107. package/_cjs/data/TestConfig.cjs.map +1 -1
  108. package/_cjs/data/TestFailure.cjs.map +1 -1
  109. package/_cjs/data/TestSuccess.cjs.map +1 -1
  110. package/_cjs/data/TestTimeoutException.cjs.map +1 -1
  111. package/_cjs/data.cjs.map +1 -1
  112. package/_cjs/demo.cjs +1 -1
  113. package/_cjs/demo.cjs.map +1 -1
  114. package/_cjs/global.cjs.map +1 -1
  115. package/_cjs/index.cjs.map +1 -1
  116. package/_cjs/util/math.cjs.map +1 -1
  117. package/_cjs/util.cjs.map +1 -1
  118. package/_cjs/vitest.cjs +90 -0
  119. package/_cjs/vitest.cjs.map +1 -0
  120. package/_mjs/api.mjs +9 -9
  121. package/_mjs/api.mjs.map +1 -1
  122. package/_mjs/control/AbstractRunnableSpec.mjs +1 -1
  123. package/_mjs/control/AbstractRunnableSpec.mjs.map +1 -1
  124. package/_mjs/control/Annotations/api.mjs.map +1 -1
  125. package/_mjs/control/Annotations/definition.mjs.map +1 -1
  126. package/_mjs/control/Annotations/live.mjs.map +1 -1
  127. package/_mjs/control/Annotations.mjs.map +1 -1
  128. package/_mjs/control/Assertion/api.mjs +9 -5
  129. package/_mjs/control/Assertion/api.mjs.map +1 -1
  130. package/_mjs/control/Assertion/definition.mjs.map +1 -1
  131. package/_mjs/control/Assertion.mjs.map +1 -1
  132. package/_mjs/control/AssertionIO/api.mjs.map +1 -1
  133. package/_mjs/control/AssertionIO/definition.mjs.map +1 -1
  134. package/_mjs/control/AssertionIO.mjs.map +1 -1
  135. package/_mjs/control/DefaultRunnableSpec.mjs.map +1 -1
  136. package/_mjs/control/DefaultTestReporter/definition.mjs.map +1 -1
  137. package/_mjs/control/DefaultTestReporter/render.mjs +4 -12
  138. package/_mjs/control/DefaultTestReporter/render.mjs.map +1 -1
  139. package/_mjs/control/DefaultTestReporter.mjs.map +1 -1
  140. package/_mjs/control/FreeBooleanAlgebraIO/api.mjs.map +1 -1
  141. package/_mjs/control/FreeBooleanAlgebraIO/definition.mjs.map +1 -1
  142. package/_mjs/control/FreeBooleanAlgebraIO.mjs.map +1 -1
  143. package/_mjs/control/Gen/api.mjs +198 -71
  144. package/_mjs/control/Gen/api.mjs.map +1 -1
  145. package/_mjs/control/Gen/constraints.mjs.map +1 -1
  146. package/_mjs/control/Gen/definition.mjs.map +1 -1
  147. package/_mjs/control/Gen.mjs.map +1 -1
  148. package/_mjs/control/Live/definition.mjs +8 -7
  149. package/_mjs/control/Live/definition.mjs.map +1 -1
  150. package/_mjs/control/Live.mjs.map +1 -1
  151. package/_mjs/control/Sample/api.mjs +16 -16
  152. package/_mjs/control/Sample/api.mjs.map +1 -1
  153. package/_mjs/control/Sample/definition.mjs.map +1 -1
  154. package/_mjs/control/Sample.mjs.map +1 -1
  155. package/_mjs/control/Sized/api.mjs.map +1 -1
  156. package/_mjs/control/Sized/definition.mjs.map +1 -1
  157. package/_mjs/control/Sized/live.mjs.map +1 -1
  158. package/_mjs/control/Sized.mjs.map +1 -1
  159. package/_mjs/control/Spec/api.mjs +7 -7
  160. package/_mjs/control/Spec/api.mjs.map +1 -1
  161. package/_mjs/control/Spec/definition.mjs.map +1 -1
  162. package/_mjs/control/Spec.mjs.map +1 -1
  163. package/_mjs/control/SummaryBuilder.mjs.map +1 -1
  164. package/_mjs/control/Test.mjs.map +1 -1
  165. package/_mjs/control/TestAnnotationRenderer/api.mjs +6 -5
  166. package/_mjs/control/TestAnnotationRenderer/api.mjs.map +1 -1
  167. package/_mjs/control/TestAnnotationRenderer/definition.mjs.map +1 -1
  168. package/_mjs/control/TestAnnotationRenderer.mjs.map +1 -1
  169. package/_mjs/control/TestAspect/api.mjs +2 -3
  170. package/_mjs/control/TestAspect/api.mjs.map +1 -1
  171. package/_mjs/control/TestAspect/definition.mjs.map +1 -1
  172. package/_mjs/control/TestAspect.mjs.map +1 -1
  173. package/_mjs/control/TestClock/api.mjs.map +1 -1
  174. package/_mjs/control/TestClock/definition.mjs +6 -6
  175. package/_mjs/control/TestClock/definition.mjs.map +1 -1
  176. package/_mjs/control/TestClock.mjs.map +1 -1
  177. package/_mjs/control/TestConsole/api.mjs.map +1 -1
  178. package/_mjs/control/TestConsole/definition.mjs.map +1 -1
  179. package/_mjs/control/TestConsole.mjs.map +1 -1
  180. package/_mjs/control/TestEnvironment.mjs.map +1 -1
  181. package/_mjs/control/TestLogger.mjs.map +1 -1
  182. package/_mjs/control/TestRandom/api.mjs.map +1 -1
  183. package/_mjs/control/TestRandom/definition.mjs.map +1 -1
  184. package/_mjs/control/TestRandom.mjs.map +1 -1
  185. package/_mjs/control/TestRenderer/ConsoleRenderer.mjs +13 -0
  186. package/_mjs/control/TestRenderer/ConsoleRenderer.mjs.map +1 -1
  187. package/_mjs/control/TestRenderer/definition.mjs.map +1 -1
  188. package/_mjs/control.mjs.map +1 -1
  189. package/_mjs/data/AssertionData.mjs.map +1 -1
  190. package/_mjs/data/AssertionResult.mjs +3 -2
  191. package/_mjs/data/AssertionResult.mjs.map +1 -1
  192. package/_mjs/data/AssertionValue/api.mjs.map +1 -1
  193. package/_mjs/data/AssertionValue/definition.mjs +2 -1
  194. package/_mjs/data/AssertionValue/definition.mjs.map +1 -1
  195. package/_mjs/data/AssertionValue.mjs.map +1 -1
  196. package/_mjs/data/ExecutedSpec/api.mjs.map +1 -1
  197. package/_mjs/data/ExecutedSpec/definition.mjs.map +1 -1
  198. package/_mjs/data/ExecutedSpec.mjs.map +1 -1
  199. package/_mjs/data/ExecutionResult.mjs.map +1 -1
  200. package/_mjs/data/FailureDetails.mjs.map +1 -1
  201. package/_mjs/data/FreeBooleanAlgebra/api.mjs +5 -4
  202. package/_mjs/data/FreeBooleanAlgebra/api.mjs.map +1 -1
  203. package/_mjs/data/FreeBooleanAlgebra/definition.mjs.map +1 -1
  204. package/_mjs/data/FreeBooleanAlgebra.mjs.map +1 -1
  205. package/_mjs/data/GenFailureDetails.mjs.map +1 -1
  206. package/_mjs/data/LogLine/Fragment.mjs.map +1 -1
  207. package/_mjs/data/LogLine/Line.mjs.map +1 -1
  208. package/_mjs/data/LogLine/Message.mjs.map +1 -1
  209. package/_mjs/data/LogLine/Style.mjs.map +1 -1
  210. package/_mjs/data/LogLine/api.mjs.map +1 -1
  211. package/_mjs/data/LogLine.mjs.map +1 -1
  212. package/_mjs/data/Render/api.mjs.map +1 -1
  213. package/_mjs/data/Render/definition.mjs.map +1 -1
  214. package/_mjs/data/Render.mjs.map +1 -1
  215. package/_mjs/data/RenderParam/api.mjs.map +1 -1
  216. package/_mjs/data/RenderParam/definition.mjs.map +1 -1
  217. package/_mjs/data/RenderParam.mjs.map +1 -1
  218. package/_mjs/data/Summary.mjs.map +1 -1
  219. package/_mjs/data/TestAnnotation/api.mjs +3 -2
  220. package/_mjs/data/TestAnnotation/api.mjs.map +1 -1
  221. package/_mjs/data/TestAnnotation/definition.mjs.map +1 -1
  222. package/_mjs/data/TestAnnotation.mjs.map +1 -1
  223. package/_mjs/data/TestAnnotationMap.mjs.map +1 -1
  224. package/_mjs/data/TestArgs/definition.mjs.map +1 -1
  225. package/_mjs/data/TestArgs.mjs.map +1 -1
  226. package/_mjs/data/TestConfig.mjs.map +1 -1
  227. package/_mjs/data/TestFailure.mjs.map +1 -1
  228. package/_mjs/data/TestSuccess.mjs.map +1 -1
  229. package/_mjs/data/TestTimeoutException.mjs.map +1 -1
  230. package/_mjs/data.mjs.map +1 -1
  231. package/_mjs/demo.mjs +1 -1
  232. package/_mjs/demo.mjs.map +1 -1
  233. package/_mjs/global.mjs.map +1 -1
  234. package/_mjs/index.mjs.map +1 -1
  235. package/_mjs/util/math.mjs.map +1 -1
  236. package/_mjs/util.mjs.map +1 -1
  237. package/_mjs/vitest.mjs +79 -0
  238. package/_mjs/vitest.mjs.map +1 -0
  239. package/_src/api.ts +5 -5
  240. package/_src/control/Assertion/api.ts +3 -0
  241. package/_src/control/DefaultTestReporter/render.ts +3 -12
  242. package/_src/control/Gen/api.ts +166 -1
  243. package/_src/control/Live/definition.ts +8 -9
  244. package/_src/control/TestAspect/api.ts +2 -2
  245. package/_src/control/TestRenderer/ConsoleRenderer.ts +14 -0
  246. package/_src/demo.ts +1 -1
  247. package/_src/index.ts +1 -1
  248. package/_src/vitest.ts +99 -0
  249. package/api.d.ts +5 -5
  250. package/control/Assertion/api.d.ts +4 -0
  251. package/control/DefaultTestReporter/render.d.ts +6 -0
  252. package/control/Gen/api.d.ts +46 -1
  253. package/control/Live/definition.d.ts +6 -2
  254. package/control/TestRenderer/ConsoleRenderer.d.ts +5 -0
  255. package/package.json +6 -3
  256. package/vitest.d.ts +33 -0
  257. package/TestSpec.d.ts +0 -6
  258. package/runTests.d.ts +0 -1
@@ -0,0 +1,79 @@
1
+ const fileName_1 = "(@fncts/test) src/vitest.ts";
2
+ import * as tsplus_module_1 from "@fncts/test/data/FreeBooleanAlgebra/api";
3
+ import * as tsplus_module_2 from "@fncts/base/collection/immutable/List/constructors";
4
+ import * as tsplus_module_3 from "@fncts/base/collection/immutable/List/api";
5
+ import * as tsplus_module_4 from "@fncts/test/data/ExecutionResult";
6
+ import * as tsplus_module_5 from "@fncts/test/control/TestAnnotationRenderer/api";
7
+ import * as tsplus_module_6 from "@fncts/test/control/TestRenderer/ConsoleRenderer";
8
+ import * as tsplus_module_7 from "@fncts/io/IO/api";
9
+ import * as tsplus_module_8 from "@fncts/io/IO/api/provideLayer";
10
+ import * as tsplus_module_9 from "@fncts/io/IO/runtime";
11
+ import { check, checkAllConcurrently, checkAllIOConcurrently, checkIO } from "@fncts/test/api";
12
+ import { renderFragment } from "@fncts/test/control/DefaultTestReporter";
13
+ import { TestEnvironment } from "@fncts/test/control/TestEnvironment";
14
+ import { Failed, rendered, Test } from "@fncts/test/data/ExecutionResult";
15
+ import * as V from "vitest";
16
+ export const describe = V.describe;
17
+ export const suite = V.suite;
18
+ export const it = /*#__PURE__*/(() => {
19
+ function runTest(test) {
20
+ const result = test();
21
+ if (tsplus_module_1.isFailure(result)) {
22
+ const lines = assertionValues => tsplus_module_3.flatMap(value => tsplus_module_2.from(renderFragment(value, 0).lines))(assertionValues);
23
+ const renderedResult = tsplus_module_6.renderSingle(tsplus_module_1.fold({
24
+ Value: details => rendered(Test, "", Failed, 0, lines(details.failureDetails.assertion)),
25
+ And: (l, r) => tsplus_module_4.and(r)(l),
26
+ Or: (l, r) => tsplus_module_4.or(r)(l),
27
+ Not: v => tsplus_module_4.invert(v)
28
+ })(tsplus_module_1.not(result)), tsplus_module_5.Default);
29
+ const error = new Error(renderedResult);
30
+ error.stack = undefined;
31
+ throw error;
32
+ }
33
+ }
34
+ function it(name, test, timeout = 5000) {
35
+ return V.it.concurrent(name, () => runTest(test), timeout);
36
+ }
37
+ function runTestIO(io) {
38
+ return tsplus_module_9.unsafeRunPromise(tsplus_module_8.provideLayer(TestEnvironment, fileName_1 + ":69:20")(tsplus_module_7.flatMap(result => tsplus_module_7.defer(() => {
39
+ if (tsplus_module_1.isFailure(result)) {
40
+ const lines = assertionValues => tsplus_module_3.flatMap(value => tsplus_module_2.from(renderFragment(value, 0).lines))(assertionValues);
41
+ const renderedResult = tsplus_module_6.renderSingle(tsplus_module_1.fold({
42
+ Value: details => rendered(Test, "", Failed, 0, lines(details.failureDetails.assertion)),
43
+ And: (l, r) => tsplus_module_4.and(r)(l),
44
+ Or: (l, r) => tsplus_module_4.or(r)(l),
45
+ Not: v => tsplus_module_4.invert(v)
46
+ })(tsplus_module_1.not(result)), tsplus_module_5.Default);
47
+ const error = new Error(renderedResult);
48
+ error.stack = undefined;
49
+ return tsplus_module_7.haltNow(error, fileName_1 + ":63:30");
50
+ }
51
+ return tsplus_module_7.unit;
52
+ }, fileName_1 + ":48:17"), fileName_1 + ":46:23")(tsplus_module_7.defer(io, fileName_1 + ":46:32"))), fileName_1 + ":70:24");
53
+ }
54
+ function itIO(name, io, timeout = 5000) {
55
+ return V.it.concurrent(name, () => runTestIO(io), timeout);
56
+ }
57
+ return Object.assign(it, {
58
+ skip: (name, test, timeout = 5000) => {
59
+ return V.it.skip(name, () => runTest(test), timeout);
60
+ },
61
+ only: (name, test, timeout = 5000) => {
62
+ return V.it.only(name, () => runTest(test), timeout);
63
+ },
64
+ check: check,
65
+ checkIO: checkIO,
66
+ checkAll: checkAllConcurrently,
67
+ checkAllIO: checkAllIOConcurrently,
68
+ io: Object.assign(itIO, {
69
+ skip: (name, io, timeout = 5000) => {
70
+ return V.it.skip(name, () => runTestIO(io), timeout);
71
+ },
72
+ only: (name, io, timeout = 5000) => {
73
+ return V.it.only(name, () => runTestIO(io), timeout);
74
+ }
75
+ })
76
+ });
77
+ })();
78
+ export const test = it;
79
+ //# sourceMappingURL=vitest.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.mjs","names":["check","checkAllConcurrently","checkAllIOConcurrently","checkIO","renderFragment","TestEnvironment","Failed","rendered","Test","V","describe","suite","it","runTest","test","result","tsplus_module_1","isFailure","lines","assertionValues","tsplus_module_3","flatMap","value","tsplus_module_2","from","renderedResult","tsplus_module_6","renderSingle","fold","Value","details","failureDetails","assertion","And","l","r","tsplus_module_4","and","Or","or","Not","v","invert","not","tsplus_module_5","Default","error","Error","stack","undefined","name","timeout","concurrent","runTestIO","io","tsplus_module_9","unsafeRunPromise","tsplus_module_8","provideLayer","fileName_1","tsplus_module_7","defer","haltNow","unit","itIO","Object","assign","skip","only","checkAll","checkAllIO"],"sources":["../_src/vitest.ts"],"sourcesContent":[null],"mappings":"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"}
package/_src/api.ts CHANGED
@@ -59,7 +59,7 @@ export function assert<A>(assertion: Assertion<A>) {
59
59
  }
60
60
 
61
61
  /**
62
- * @tsplus pipeable fncts.io.IO assert
62
+ * @tsplus pipeable global assert
63
63
  */
64
64
  export function assertIO<A>(assertion: AssertionIO<A>) {
65
65
  return <R, E>(io: IO<R, E, A>): IO<R, E, TestResult> => {
@@ -107,18 +107,18 @@ export function checkIO<A, R1, E>(test: (a: A) => IO<R1, E, TestResult>) {
107
107
  }
108
108
 
109
109
  /**
110
- * @tsplus pipeable fncts.test.Gen checkAllC
110
+ * @tsplus pipeable fncts.test.Gen checkAllConcurrently
111
111
  */
112
- export function checkAllC<A>(concurrency: number, test: (a: A) => TestResult) {
112
+ export function checkAllConcurrently<A>(concurrency: number, test: (a: A) => TestResult) {
113
113
  return <R>(rv: Gen<R, A>): IO<R | TestConfig, never, TestResult> => {
114
114
  return checkStreamC(rv.sample.forever.filterMap(identity), concurrency, (a) => IO.succeed(test(a)));
115
115
  };
116
116
  }
117
117
 
118
118
  /**
119
- * @tsplus pipeable fncts.test.Gen checkAllC
119
+ * @tsplus pipeable fncts.test.Gen checkAllConcurrently
120
120
  */
121
- export function checkAllIOC<A, R1, E>(concurrency: number, test: (a: A) => IO<R1, E, TestResult>) {
121
+ export function checkAllIOConcurrently<A, R1, E>(concurrency: number, test: (a: A) => IO<R1, E, TestResult>) {
122
122
  return <R>(rv: Gen<R, A>): IO<R | R1 | TestConfig, E, TestResult> => {
123
123
  return checkStreamC(rv.sample.forever.filterMap(identity), concurrency, test);
124
124
  };
@@ -130,6 +130,9 @@ export function fails<E>(assertion: Assertion<E>): Assertion<Exit<E, any>> {
130
130
  );
131
131
  }
132
132
 
133
+ /**
134
+ * @tsplus getter fncts.test.Assertion every
135
+ */
133
136
  export function every<A>(assertion: Assertion<A>): Assertion<Iterable<A>> {
134
137
  return Assertion.rec(
135
138
  "every",
@@ -159,7 +159,7 @@ function renderFailure(label: string, offset: number, details: AssertionResult):
159
159
  return renderFailureLabel(label, offset).toMessage + renderAssertionResult(details, offset);
160
160
  }
161
161
 
162
- function renderAssertionResult(assertionResult: AssertionResult, offset: number): Message {
162
+ export function renderAssertionResult(assertionResult: AssertionResult, offset: number): Message {
163
163
  return (
164
164
  renderGenFailureDetails(assertionResult.genFailureDetails, offset) +
165
165
  renderAssertionFailureDetails(assertionResult.failureDetails.assertion, offset)
@@ -170,16 +170,7 @@ function renderFailureLabel(label: string, offset: number): Line {
170
170
  return error("- " + label).toLine.withOffset(offset);
171
171
  }
172
172
 
173
- function renderAssertFailure(result: TestResult, label: string, depth: number): ExecutionResult {
174
- return result.fold({
175
- Value: (details) => rendered(Test, label, Failed, depth, List.from(renderFailure(label, depth, details).lines)),
176
- And: (l, r) => l && r,
177
- Or: (l, r) => l || r,
178
- Not: (v) => v.invert,
179
- });
180
- }
181
-
182
- function renderAssertionFailureDetails(failureDetails: Cons<AssertionValue<any>>, offset: number): Message {
173
+ export function renderAssertionFailureDetails(failureDetails: Cons<AssertionValue<any>>, offset: number): Message {
183
174
  /**
184
175
  * @tsplus tailrec
185
176
  */
@@ -214,7 +205,7 @@ function renderGenFailureDetails(failureDetails: Maybe<GenFailureDetails>, offse
214
205
  );
215
206
  }
216
207
 
217
- function renderFragment<A>(fragment: AssertionValue<A>, offset: number): Message {
208
+ export function renderFragment<A>(fragment: AssertionValue<A>, offset: number): Message {
218
209
  return (
219
210
  (primary(renderValue(fragment, offset + 1)) + renderSatisfied(fragment)).withOffset(offset).toMessage +
220
211
  Message(
@@ -1,4 +1,11 @@
1
- import type { EqConstraint, FloatConstraints, LengthConstraints, NumberConstraints } from "./constraints.js";
1
+ import type {
2
+ DateConstraints,
3
+ EqConstraint,
4
+ FloatConstraints,
5
+ LengthConstraints,
6
+ NumberConstraints,
7
+ ObjectConstraints,
8
+ } from "./constraints.js";
2
9
  import type { _A, _R } from "@fncts/base/types.js";
3
10
  import type { ArrayInt64 } from "@fncts/base/util/rand";
4
11
 
@@ -26,6 +33,89 @@ import { Gen } from "./definition.js";
26
33
 
27
34
  const gapSize = 0xdfff + 1 - 0xd800;
28
35
 
36
+ /**
37
+ * @tsplus static fncts.test.GenOps anything
38
+ */
39
+ export function anything<C extends ObjectConstraints>(
40
+ constraints: C = {} as C,
41
+ ): Gen<
42
+ ObjectConstraints extends C
43
+ ? Sized
44
+ : unknown extends C["key"]
45
+ ? Sized
46
+ : _R<C["key"]> | C["values"] extends Array<infer A>
47
+ ? _R<A>
48
+ : Sized,
49
+ unknown
50
+ > {
51
+ const key = constraints.key ?? Gen.alphaNumericString;
52
+ const maxDepth = constraints.maxDepth ?? 2;
53
+ const maxKeys = constraints.maxKeys ?? 5;
54
+ const values = constraints.values ?? [
55
+ Gen.boolean,
56
+ Gen.alphaNumericString,
57
+ Gen.double,
58
+ Gen.int,
59
+ Gen.oneOf(Gen.alphaNumericString, Gen.constant(null), Gen.constant(undefined)),
60
+ ];
61
+
62
+ function mapOf<R, K, R1, V>(key: Gen<R, K>, value: Gen<R1, V>) {
63
+ return Gen.tuple(key, value)
64
+ .uniqueConc({
65
+ eq: Eq({
66
+ equals:
67
+ ([k1]) =>
68
+ ([k]) =>
69
+ Equatable.strictEquals(k, k1),
70
+ }),
71
+ maxLength: maxKeys,
72
+ })
73
+ .map((pairs) => new Map(pairs));
74
+ }
75
+
76
+ function setOf<R, V>(value: Gen<R, V>) {
77
+ return value
78
+ .uniqueConc({ eq: Eq({ equals: (v1) => (v) => Equatable.strictEquals(v, v1) }), maxLength: maxKeys })
79
+ .map((values) => new Set(values));
80
+ }
81
+
82
+ const base = Gen.oneOf(...values);
83
+ const arrayBase = Gen.oneOf(...values.map((gen) => gen.arrayWith({ maxLength: maxKeys })));
84
+ const arrayGen = Gen.memo((n) => Gen.oneOf(arrayBase, gen(n).arrayWith({ maxLength: maxKeys })));
85
+ const objectBase = Gen.oneOf(...values.map((gen) => Gen.record(key, gen)));
86
+ const objectGen = Gen.memo((n) => Gen.oneOf(objectBase, Gen.record(key, gen(n))));
87
+ const setBase = Gen.oneOf(...values.map(setOf));
88
+ const setGen = Gen.memo((n) => Gen.oneOf(setBase, setOf(gen(n))));
89
+ const mapBase = Gen.oneOf(...values.map((value) => mapOf(key, value)));
90
+ const mapGen = Gen.memo((n) => Gen.oneOf(mapBase, mapOf(Gen.oneOf(key, gen(n)), gen(n))));
91
+
92
+ const gen: (n: number) => Gen<any, any> = Gen.memo((n) => {
93
+ if (n <= 0) return base;
94
+ return Gen.oneOf(
95
+ base,
96
+ arrayGen(),
97
+ objectGen(),
98
+ ...(constraints.withDate ? [Gen.date()] : []),
99
+ ...(constraints.withSet ? [setGen()] : []),
100
+ ...(constraints.withMap ? [mapGen()] : []),
101
+ ...(constraints.withTypedArray
102
+ ? [
103
+ Gen.oneOf(
104
+ Gen.int8Array(),
105
+ Gen.uint8Array(),
106
+ Gen.int16Array(),
107
+ Gen.uint16Array(),
108
+ Gen.int32Array(),
109
+ Gen.uint32Array(),
110
+ ),
111
+ ]
112
+ : []),
113
+ );
114
+ });
115
+
116
+ return gen(maxDepth);
117
+ }
118
+
29
119
  /**
30
120
  * @tsplus static fncts.test.GenOps size
31
121
  */
@@ -684,6 +774,81 @@ export function tuple<A extends [...Gen<any, any>[]]>(
684
774
  ) as any;
685
775
  }
686
776
 
777
+ /**
778
+ * @tsplus static fncts.test.GenOps record
779
+ */
780
+ export function record<R, R1, A>(
781
+ key: Gen<R, string>,
782
+ value: Gen<R1, A>,
783
+ constraints?: LengthConstraints,
784
+ ): Gen<Sized | R | R1, Record<string, A>> {
785
+ return Gen.tuple(key, value)
786
+ .uniqueConc({ eq: String.Eq.contramap(([k]) => k), ...constraints })
787
+ .map((pairs) => pairs.foldLeft({} as Record<string, A>, (b, [k, v]) => ({ ...b, [k]: v })));
788
+ }
789
+
790
+ /**
791
+ * @tsplus static fncts.test.GenOps date
792
+ */
793
+ export function date(constraints: DateConstraints = {}): Gen<never, Date> {
794
+ const min = constraints.min ? constraints.min.getTime() : -8_640_000_000_000_000;
795
+ const max = constraints.max ? constraints.max.getTime() : 8_640_000_000_000_000;
796
+ return Gen.intWith({ min, max }).map((n) => new Date(n));
797
+ }
798
+
799
+ function typedArray<A>(
800
+ constraints: LengthConstraints & NumberConstraints,
801
+ minBound: number,
802
+ maxBound: number,
803
+ ctor: { new (arg: ReadonlyArray<number>): A },
804
+ ): Gen<Sized, A> {
805
+ const min = constraints.min ? clamp(constraints.min, minBound, maxBound) : minBound;
806
+ const max = constraints.max ? clamp(constraints.max, minBound, maxBound) : maxBound;
807
+ return Gen.array(Gen.intWith({ min, max })).map((n) => new ctor(n));
808
+ }
809
+
810
+ /**
811
+ * @tsplus static fncts.test.GenOps int8Array
812
+ */
813
+ export function int8Array(constraints: LengthConstraints & NumberConstraints = {}): Gen<Sized, Int8Array> {
814
+ return typedArray(constraints, -128, 127, Int8Array);
815
+ }
816
+
817
+ /**
818
+ * @tsplus static fncts.test.GenOps int16Array
819
+ */
820
+ export function int16Array(constraints: LengthConstraints & NumberConstraints = {}): Gen<Sized, Int16Array> {
821
+ return typedArray(constraints, -32768, 32767, Int16Array);
822
+ }
823
+
824
+ /**
825
+ * @tsplus static fncts.test.GenOps int32Array
826
+ */
827
+ export function int32Array(constraints: LengthConstraints & NumberConstraints = {}): Gen<Sized, Int32Array> {
828
+ return typedArray(constraints, -0x80000000, 0x7fffffff, Int32Array);
829
+ }
830
+
831
+ /**
832
+ * @tsplus static fncts.test.GenOps uint8Array
833
+ */
834
+ export function uint8Array(constraints: LengthConstraints & NumberConstraints = {}): Gen<Sized, Uint8Array> {
835
+ return typedArray(constraints, 0, 255, Uint8Array);
836
+ }
837
+
838
+ /**
839
+ * @tsplus static fncts.test.GenOps uint16Array
840
+ */
841
+ export function uint16Array(constraints: LengthConstraints & NumberConstraints = {}): Gen<Sized, Uint16Array> {
842
+ return typedArray(constraints, 0, 65535, Uint16Array);
843
+ }
844
+
845
+ /**
846
+ * @tsplus static fncts.test.GenOps uint32Array
847
+ */
848
+ export function uint32Array(constraints: LengthConstraints & NumberConstraints = {}): Gen<Sized, Uint32Array> {
849
+ return typedArray(constraints, 0, 0xffffffff, Uint32Array);
850
+ }
851
+
687
852
  function _char(min: number, max: number, mapToCode: (v: number) => number): Gen<never, string> {
688
853
  return Gen.intWith({ min, max }).map((n) => String.fromCharCode(mapToCode(n)));
689
854
  }
@@ -21,23 +21,22 @@ export abstract class Live {
21
21
  ),
22
22
  LiveTag,
23
23
  );
24
- static Live<R extends Live, E, A>(io: IO<R, E, A>): IO<R | Live, E, A> {
24
+ static live<R extends Live, E, A>(io: IO<R, E, A>): IO<R | Live, E, A> {
25
25
  return IO.serviceWithIO((live) => live.provide(io), LiveTag);
26
26
  }
27
27
  }
28
28
 
29
29
  /**
30
- * @tsplus static fncts.test.LiveOps withLive
30
+ * @tsplus static fncts.io.IOOps liveWith
31
31
  */
32
- export function withLive_<R, E, A, E1, B>(
33
- io: IO<R, E, A>,
34
- f: (_: IO<never, E, A>) => IO<IOEnv, E1, B>,
35
- ): IO<Exclude<R, Live>, E | E1, B> {
36
- // @ts-expect-error
37
- return IO.environment<R | Live>().flatMap((r) => Live.Live(f(io.provideEnvironment(r))));
32
+ export function liveWith<R, E, A>(f: (live: Live) => IO<R, E, A>): IO<R | Live, E, A> {
33
+ return IO.environmentWithIO((environment) => f(environment.get(Live.Tag)));
38
34
  }
39
35
 
36
+ /**
37
+ * @tsplus static fncts.test.LiveOps withLive
38
+ */
40
39
  export function withLive<R extends Live, E, A>(io: IO<R, E, A>) {
41
40
  return <E1, B>(f: (_: IO<R, E, A>) => IO<R, E1, B>): IO<R | Live, E1, B> =>
42
- IOEnv.services.getWith((services) => Live.Live(f(IOEnv.services.locally(services)(io))));
41
+ IOEnv.services.getWith((services) => Live.live(f(IOEnv.services.locally(services)(io))));
43
42
  }
@@ -102,14 +102,14 @@ export function timeoutWarning(duration: Duration): TestAspect<Live, any> {
102
102
 
103
103
  function warn<R, E>(labels: Vector<string>, test: IO<R, TestFailure<E>, TestSuccess>, duration: Duration) {
104
104
  return test.raceWith(
105
- Live.withLive(showWarning(labels, duration), (io) => Clock.sleep(duration) > io),
105
+ Live.withLive(showWarning(labels, duration))((io) => Clock.sleep(duration) > io),
106
106
  (result, fiber) => fiber.interrupt > IO.fromExitNow(result),
107
107
  (_, fiber) => fiber.join,
108
108
  );
109
109
  }
110
110
 
111
111
  function showWarning(labels: Vector<string>, duration: Duration) {
112
- return Live.Live(Console.print(renderWarning(labels, duration)));
112
+ return Console.print(renderWarning(labels, duration));
113
113
  }
114
114
 
115
115
  function renderWarning(labels: Vector<string>, duration: Duration) {
@@ -39,6 +39,20 @@ export function render(
39
39
  });
40
40
  }
41
41
 
42
+ /**
43
+ * @tsplus static fncts.test.ConsoleRenderer renderSingle
44
+ */
45
+ export function renderSingle(result: ExecutionResult, testAnnotationRenderer: TestAnnotationRenderer): string {
46
+ const message = new Message(Vector.from(result.lines));
47
+ const output = matchTag_(result.resultType, {
48
+ Suite: () => renderSuite(result.status, result.offset, message),
49
+ Test: () => renderTest(result.status, result.offset, message),
50
+ Other: () => new Message(Vector.from(result.lines)),
51
+ });
52
+ const renderedAnnotations = renderAnnotations(result.annotations, testAnnotationRenderer);
53
+ return renderToStringLines(output + renderedAnnotations).join("");
54
+ }
55
+
42
56
  function renderSuite(status: Status, offset: number, message: Message) {
43
57
  return matchTag_(status, {
44
58
  Passed: () => (info("+") + sp).withOffset(offset).toMessage + message,
package/_src/demo.ts CHANGED
@@ -14,4 +14,4 @@ class DemoSpec extends DefaultRunnableSpec {
14
14
  test("Demo failure", { a: { b: { c: { d: 100 } } } }.assert(strictEqualTo({ a: { b: { c: { d: 0 } } } }))),
15
15
  );
16
16
  }
17
- new DemoSpec().run().unsafeRunAsync()
17
+ new DemoSpec().run().unsafeRunFiber();
package/_src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- // codegen:start { preset: type-barrel, include: ./*.ts }
1
+ // codegen:start { preset: type-barrel, include: ./*.ts, exclude: ./vitest.ts }
2
2
  export type {} from "./api.js";
3
3
  export type {} from "./control.js";
4
4
  export type {} from "./data.js";
package/_src/vitest.ts ADDED
@@ -0,0 +1,99 @@
1
+ import type { AssertionValue } from "@fncts/test/data/AssertionValue";
2
+ import type { TestResult } from "@fncts/test/data/FailureDetails";
3
+
4
+ import { identity } from "@fncts/base/data/function";
5
+ import { check, checkAllConcurrently, checkAllIOConcurrently, checkIO } from "@fncts/test/api";
6
+ import { renderFragment } from "@fncts/test/control/DefaultTestReporter";
7
+ import { Gen } from "@fncts/test/control/Gen";
8
+ import { TestAnnotationRenderer } from "@fncts/test/control/TestAnnotationRenderer";
9
+ import { TestEnvironment } from "@fncts/test/control/TestEnvironment";
10
+ import { ConsoleRenderer } from "@fncts/test/control/TestRenderer/ConsoleRenderer";
11
+ import { Failed, rendered, Test } from "@fncts/test/data/ExecutionResult";
12
+ import { TestConfig } from "@fncts/test/data/TestConfig";
13
+ import * as V from "vitest";
14
+
15
+ export const describe = V.describe;
16
+
17
+ export const suite = V.suite;
18
+
19
+ export const it = (() => {
20
+ function runTest(test: Lazy<TestResult>) {
21
+ const result = test();
22
+ if (result.isFailure) {
23
+ const lines = (assertionValues: Cons<AssertionValue<any>>) =>
24
+ assertionValues.flatMap((value) => List.from(renderFragment(value, 0).lines));
25
+ const renderedResult = ConsoleRenderer.renderSingle(
26
+ result.invert.fold({
27
+ Value: (details) => rendered(Test, "", Failed, 0, lines(details.failureDetails.assertion)),
28
+ And: (l, r) => l && r,
29
+ Or: (l, r) => l || r,
30
+ Not: (v) => v.invert,
31
+ }),
32
+ TestAnnotationRenderer.Default,
33
+ );
34
+ const error = new Error(renderedResult);
35
+ error.stack = undefined;
36
+ throw error;
37
+ }
38
+ }
39
+
40
+ function it(name: string, test: Lazy<TestResult>, timeout = 5_000) {
41
+ return V.it.concurrent(name, () => runTest(test), timeout);
42
+ }
43
+
44
+ function runTestIO<E>(io: Lazy<IO<TestEnvironment, E, TestResult>>) {
45
+ return Do((Δ) => {
46
+ const result = Δ(IO.defer(io));
47
+ return Δ(
48
+ IO.defer(() => {
49
+ if (result.isFailure) {
50
+ const lines = (assertionValues: Cons<AssertionValue<any>>) =>
51
+ assertionValues.flatMap((value) => List.from(renderFragment(value, 0).lines));
52
+ const renderedResult = ConsoleRenderer.renderSingle(
53
+ result.invert.fold({
54
+ Value: (details) => rendered(Test, "", Failed, 0, lines(details.failureDetails.assertion)),
55
+ And: (l, r) => l && r,
56
+ Or: (l, r) => l || r,
57
+ Not: (v) => v.invert,
58
+ }),
59
+ TestAnnotationRenderer.Default,
60
+ );
61
+ const error = new Error(renderedResult);
62
+ error.stack = undefined;
63
+ return IO.haltNow(error);
64
+ }
65
+ return IO.unit;
66
+ }),
67
+ );
68
+ })
69
+ .provideLayer(TestEnvironment)
70
+ .unsafeRunPromise();
71
+ }
72
+
73
+ function itIO<E>(name: string, io: Lazy<IO<TestEnvironment, E, TestResult>>, timeout = 5_000) {
74
+ return V.it.concurrent(name, () => runTestIO(io), timeout);
75
+ }
76
+
77
+ return Object.assign(it, {
78
+ skip: (name: string, test: Lazy<TestResult>, timeout = 5_000) => {
79
+ return V.it.skip(name, () => runTest(test), timeout);
80
+ },
81
+ only: (name: string, test: Lazy<TestResult>, timeout = 5_000) => {
82
+ return V.it.only(name, () => runTest(test), timeout);
83
+ },
84
+ check: check,
85
+ checkIO: checkIO,
86
+ checkAll: checkAllConcurrently,
87
+ checkAllIO: checkAllIOConcurrently,
88
+ io: Object.assign(itIO, {
89
+ skip: <E>(name: string, io: Lazy<IO<TestEnvironment, E, TestResult>>, timeout = 5_000) => {
90
+ return V.it.skip(name, () => runTestIO(io), timeout);
91
+ },
92
+ only: <E, A>(name: string, io: Lazy<IO<TestEnvironment, E, TestResult>>, timeout = 5_000) => {
93
+ return V.it.only(name, () => runTestIO(io), timeout);
94
+ },
95
+ }),
96
+ });
97
+ })();
98
+
99
+ export const test = it;
package/api.d.ts CHANGED
@@ -17,7 +17,7 @@ export declare function traverseResult<A>(value: A, assertResult: AssertResult<A
17
17
  */
18
18
  export declare function assert<A>(assertion: Assertion<A>): (value: A) => TestResult;
19
19
  /**
20
- * @tsplus pipeable fncts.io.IO assert
20
+ * @tsplus pipeable global assert
21
21
  * @tsplus location "@fncts/test/api"
22
22
  */
23
23
  export declare function assertIO<A>(assertion: AssertionIO<A>): <R, E>(io: import("@fncts/io/IO.js").IO<R, E, A>) => import("@fncts/io/IO.js").IO<R, E, TestResult>;
@@ -35,12 +35,12 @@ export declare function check<A>(test: (a: A) => TestResult): <R>(rv: Gen<R, A>)
35
35
  */
36
36
  export declare function checkIO<A, R1, E>(test: (a: A) => IO<R1, E, TestResult>): <R>(rv: Gen<R, A>) => import("@fncts/io/IO.js").IO<TestConfig | R1 | R, E, TestResult>;
37
37
  /**
38
- * @tsplus pipeable fncts.test.Gen checkAllC
38
+ * @tsplus pipeable fncts.test.Gen checkAllConcurrently
39
39
  * @tsplus location "@fncts/test/api"
40
40
  */
41
- export declare function checkAllC<A>(concurrency: number, test: (a: A) => TestResult): <R>(rv: Gen<R, A>) => import("@fncts/io/IO.js").IO<TestConfig | R, never, TestResult>;
41
+ export declare function checkAllConcurrently<A>(concurrency: number, test: (a: A) => TestResult): <R>(rv: Gen<R, A>) => import("@fncts/io/IO.js").IO<TestConfig | R, never, TestResult>;
42
42
  /**
43
- * @tsplus pipeable fncts.test.Gen checkAllC
43
+ * @tsplus pipeable fncts.test.Gen checkAllConcurrently
44
44
  * @tsplus location "@fncts/test/api"
45
45
  */
46
- export declare function checkAllIOC<A, R1, E>(concurrency: number, test: (a: A) => IO<R1, E, TestResult>): <R>(rv: Gen<R, A>) => import("@fncts/io/IO.js").IO<TestConfig | R1 | R, E, TestResult>;
46
+ export declare function checkAllIOConcurrently<A, R1, E>(concurrency: number, test: (a: A) => IO<R1, E, TestResult>): <R>(rv: Gen<R, A>) => import("@fncts/io/IO.js").IO<TestConfig | R1 | R, E, TestResult>;
@@ -45,6 +45,10 @@ export declare function containsCause<E>(cause: Cause<E>): Assertion<Cause<E>>;
45
45
  export declare function containsString(element: string): Assertion<string>;
46
46
  export declare function some<A>(assertion: Assertion<A>): Assertion<Iterable<A>>;
47
47
  export declare function fails<E>(assertion: Assertion<E>): Assertion<Exit<E, any>>;
48
+ /**
49
+ * @tsplus getter fncts.test.Assertion every
50
+ * @tsplus location "@fncts/test/control/Assertion/api"
51
+ */
48
52
  export declare function every<A>(assertion: Assertion<A>): Assertion<Iterable<A>>;
49
53
  export declare function halts(assertion: Assertion<any>): Assertion<Exit<any, any>>;
50
54
  export declare function strictEqualTo<A>(expected: A): Assertion<A>;
@@ -3,10 +3,13 @@ import { Vector } from "@fncts/base/collection/immutable/Vector";
3
3
  import { List, Cons } from "@fncts/base/collection/immutable/List/definition";
4
4
  import { Maybe } from "@fncts/base/data/Maybe/definition";
5
5
  import { Cause } from "@fncts/base/data/Cause/definition";
6
+ import type { AssertionResult } from "../../data/AssertionResult.js";
7
+ import type { AssertionValue } from "../../data/AssertionValue.js";
6
8
  import type { ExecutedSpec } from "../../data/ExecutedSpec.js";
7
9
  import type { ExecutionResult } from "../../data/ExecutionResult.js";
8
10
  import type { TestAnnotationRenderer } from "../TestAnnotationRenderer.js";
9
11
  import type { TestRenderer } from "../TestRenderer/definition.js";
12
+ import { Message } from "../../data/LogLine/Message.js";
10
13
  import { TestLogger } from "../TestLogger.js";
11
14
  export type TestReporter<E> = (duration: number, spec: ExecutedSpec<E>) => URIO<TestLogger, void>;
12
15
  /**
@@ -20,3 +23,6 @@ export declare function renderStats<E>(duration: number, executedSpec: ExecutedS
20
23
  * @tsplus location "@fncts/test/control/DefaultTestReporter/render"
21
24
  */
22
25
  export declare function render<E>(executedSpec: ExecutedSpec<E>): Vector<ExecutionResult>;
26
+ export declare function renderAssertionResult(assertionResult: AssertionResult, offset: number): Message;
27
+ export declare function renderAssertionFailureDetails(failureDetails: Cons<AssertionValue<any>>, offset: number): Message;
28
+ export declare function renderFragment<A>(fragment: AssertionValue<A>, offset: number): Message;