@fncts/test 0.0.20 → 0.0.21

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 (262) hide show
  1. package/_cjs/api.cjs +39 -31
  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/live.cjs +10 -12
  6. package/_cjs/control/Annotations/live.cjs.map +1 -1
  7. package/_cjs/control/Assertion/api.cjs +45 -33
  8. package/_cjs/control/Assertion/api.cjs.map +1 -1
  9. package/_cjs/control/AssertionIO/api.cjs +20 -14
  10. package/_cjs/control/AssertionIO/api.cjs.map +1 -1
  11. package/_cjs/control/DefaultTestReporter/render.cjs +50 -50
  12. package/_cjs/control/DefaultTestReporter/render.cjs.map +1 -1
  13. package/_cjs/control/FreeBooleanAlgebraIO/api.cjs +20 -16
  14. package/_cjs/control/FreeBooleanAlgebraIO/api.cjs.map +1 -1
  15. package/_cjs/control/Gen/api/array.cjs +23 -17
  16. package/_cjs/control/Gen/api/array.cjs.map +1 -1
  17. package/_cjs/control/Gen/api/char.cjs +2 -2
  18. package/_cjs/control/Gen/api/char.cjs.map +1 -1
  19. package/_cjs/control/Gen/api/conc.cjs +35 -26
  20. package/_cjs/control/Gen/api/conc.cjs.map +1 -1
  21. package/_cjs/control/Gen/api/double.cjs +8 -8
  22. package/_cjs/control/Gen/api/double.cjs.map +1 -1
  23. package/_cjs/control/Gen/api/float.cjs +6 -6
  24. package/_cjs/control/Gen/api/float.cjs.map +1 -1
  25. package/_cjs/control/Gen/api/string.cjs +18 -14
  26. package/_cjs/control/Gen/api/string.cjs.map +1 -1
  27. package/_cjs/control/Gen/api/struct.cjs +4 -4
  28. package/_cjs/control/Gen/api/struct.cjs.map +1 -1
  29. package/_cjs/control/Gen/api.cjs +78 -65
  30. package/_cjs/control/Gen/api.cjs.map +1 -1
  31. package/_cjs/control/Gen.cjs.map +1 -1
  32. package/_cjs/control/Live/definition.cjs +5 -5
  33. package/_cjs/control/Live/definition.cjs.map +1 -1
  34. package/_cjs/control/RunnableSpec.cjs +8 -8
  35. package/_cjs/control/RunnableSpec.cjs.map +1 -1
  36. package/_cjs/control/Sample/api.cjs +66 -52
  37. package/_cjs/control/Sample/api.cjs.map +1 -1
  38. package/_cjs/control/Sized/live.cjs +3 -3
  39. package/_cjs/control/Sized/live.cjs.map +1 -1
  40. package/_cjs/control/Spec/api.cjs +322 -286
  41. package/_cjs/control/Spec/api.cjs.map +1 -1
  42. package/_cjs/control/Spec/definition.cjs.map +1 -1
  43. package/_cjs/control/SummaryBuilder.cjs +10 -10
  44. package/_cjs/control/SummaryBuilder.cjs.map +1 -1
  45. package/_cjs/control/Test.cjs +1 -1
  46. package/_cjs/control/Test.cjs.map +1 -1
  47. package/_cjs/control/TestAnnotationRenderer/api.cjs +28 -26
  48. package/_cjs/control/TestAnnotationRenderer/api.cjs.map +1 -1
  49. package/_cjs/control/TestAnnotationRenderer/definition.cjs +2 -2
  50. package/_cjs/control/TestAnnotationRenderer/definition.cjs.map +1 -1
  51. package/_cjs/control/TestAspect/api.cjs +14 -14
  52. package/_cjs/control/TestAspect/api.cjs.map +1 -1
  53. package/_cjs/control/TestClock/api.cjs +9 -11
  54. package/_cjs/control/TestClock/api.cjs.map +1 -1
  55. package/_cjs/control/TestClock/definition.cjs +65 -75
  56. package/_cjs/control/TestClock/definition.cjs.map +1 -1
  57. package/_cjs/control/TestConsole/api.cjs +3 -3
  58. package/_cjs/control/TestConsole/api.cjs.map +1 -1
  59. package/_cjs/control/TestConsole/definition.cjs +20 -24
  60. package/_cjs/control/TestConsole/definition.cjs.map +1 -1
  61. package/_cjs/control/TestEnvironment.cjs +3 -3
  62. package/_cjs/control/TestEnvironment.cjs.map +1 -1
  63. package/_cjs/control/TestExecutor.cjs +3 -3
  64. package/_cjs/control/TestExecutor.cjs.map +1 -1
  65. package/_cjs/control/TestLogger.cjs +2 -2
  66. package/_cjs/control/TestLogger.cjs.map +1 -1
  67. package/_cjs/control/TestRandom/api.cjs +9 -9
  68. package/_cjs/control/TestRandom/api.cjs.map +1 -1
  69. package/_cjs/control/TestRandom/definition.cjs +65 -71
  70. package/_cjs/control/TestRandom/definition.cjs.map +1 -1
  71. package/_cjs/control/TestRenderer/ConsoleRenderer.cjs +11 -11
  72. package/_cjs/control/TestRenderer/ConsoleRenderer.cjs.map +1 -1
  73. package/_cjs/control/TestRunner.cjs +1 -1
  74. package/_cjs/control/TestRunner.cjs.map +1 -1
  75. package/_cjs/data/AssertionValue/api.cjs +22 -14
  76. package/_cjs/data/AssertionValue/api.cjs.map +1 -1
  77. package/_cjs/data/AssertionValue/definition.cjs.map +1 -1
  78. package/_cjs/data/ExecutedSpec/api.cjs +61 -53
  79. package/_cjs/data/ExecutedSpec/api.cjs.map +1 -1
  80. package/_cjs/data/ExecutionResult.cjs +42 -38
  81. package/_cjs/data/ExecutionResult.cjs.map +1 -1
  82. package/_cjs/data/FreeBooleanAlgebra/api.cjs +93 -77
  83. package/_cjs/data/FreeBooleanAlgebra/api.cjs.map +1 -1
  84. package/_cjs/data/LogLine/Fragment.cjs +2 -2
  85. package/_cjs/data/LogLine/Fragment.cjs.map +1 -1
  86. package/_cjs/data/LogLine/Line.cjs +11 -9
  87. package/_cjs/data/LogLine/Line.cjs.map +1 -1
  88. package/_cjs/data/LogLine/Message.cjs +32 -24
  89. package/_cjs/data/LogLine/Message.cjs.map +1 -1
  90. package/_cjs/data/LogLine/Style.cjs.map +1 -1
  91. package/_cjs/data/Render/definition.cjs +1 -1
  92. package/_cjs/data/Render/definition.cjs.map +1 -1
  93. package/_cjs/data/TestAnnotation/api.cjs +2 -2
  94. package/_cjs/data/TestAnnotation/api.cjs.map +1 -1
  95. package/_cjs/data/TestAnnotation/definition.cjs.map +1 -1
  96. package/_cjs/data/TestAnnotationMap.cjs +3 -3
  97. package/_cjs/data/TestAnnotationMap.cjs.map +1 -1
  98. package/_cjs/demo.cjs +5 -5
  99. package/_cjs/demo.cjs.map +1 -1
  100. package/_cjs/util/math.cjs +6 -6
  101. package/_cjs/util/math.cjs.map +1 -1
  102. package/_mjs/api.mjs +37 -29
  103. package/_mjs/api.mjs.map +1 -1
  104. package/_mjs/control/AbstractRunnableSpec.mjs +1 -1
  105. package/_mjs/control/AbstractRunnableSpec.mjs.map +1 -1
  106. package/_mjs/control/Annotations/live.mjs +10 -11
  107. package/_mjs/control/Annotations/live.mjs.map +1 -1
  108. package/_mjs/control/Assertion/api.mjs +40 -28
  109. package/_mjs/control/Assertion/api.mjs.map +1 -1
  110. package/_mjs/control/AssertionIO/api.mjs +17 -11
  111. package/_mjs/control/AssertionIO/api.mjs.map +1 -1
  112. package/_mjs/control/DefaultTestReporter/render.mjs +50 -50
  113. package/_mjs/control/DefaultTestReporter/render.mjs.map +1 -1
  114. package/_mjs/control/FreeBooleanAlgebraIO/api.mjs +18 -14
  115. package/_mjs/control/FreeBooleanAlgebraIO/api.mjs.map +1 -1
  116. package/_mjs/control/Gen/api/array.mjs +20 -14
  117. package/_mjs/control/Gen/api/array.mjs.map +1 -1
  118. package/_mjs/control/Gen/api/char.mjs +2 -2
  119. package/_mjs/control/Gen/api/char.mjs.map +1 -1
  120. package/_mjs/control/Gen/api/conc.mjs +30 -22
  121. package/_mjs/control/Gen/api/conc.mjs.map +1 -1
  122. package/_mjs/control/Gen/api/double.mjs +8 -8
  123. package/_mjs/control/Gen/api/double.mjs.map +1 -1
  124. package/_mjs/control/Gen/api/float.mjs +6 -6
  125. package/_mjs/control/Gen/api/float.mjs.map +1 -1
  126. package/_mjs/control/Gen/api/string.mjs +18 -14
  127. package/_mjs/control/Gen/api/string.mjs.map +1 -1
  128. package/_mjs/control/Gen/api/struct.mjs +4 -4
  129. package/_mjs/control/Gen/api/struct.mjs.map +1 -1
  130. package/_mjs/control/Gen/api.mjs +68 -54
  131. package/_mjs/control/Gen/api.mjs.map +1 -1
  132. package/_mjs/control/Gen.mjs.map +1 -1
  133. package/_mjs/control/Live/definition.mjs +5 -5
  134. package/_mjs/control/Live/definition.mjs.map +1 -1
  135. package/_mjs/control/RunnableSpec.mjs +8 -8
  136. package/_mjs/control/RunnableSpec.mjs.map +1 -1
  137. package/_mjs/control/Sample/api.mjs +57 -43
  138. package/_mjs/control/Sample/api.mjs.map +1 -1
  139. package/_mjs/control/Sized/live.mjs +3 -3
  140. package/_mjs/control/Sized/live.mjs.map +1 -1
  141. package/_mjs/control/Spec/api.mjs +300 -265
  142. package/_mjs/control/Spec/api.mjs.map +1 -1
  143. package/_mjs/control/Spec/definition.mjs.map +1 -1
  144. package/_mjs/control/SummaryBuilder.mjs +10 -10
  145. package/_mjs/control/SummaryBuilder.mjs.map +1 -1
  146. package/_mjs/control/Test.mjs +1 -1
  147. package/_mjs/control/Test.mjs.map +1 -1
  148. package/_mjs/control/TestAnnotationRenderer/api.mjs +27 -25
  149. package/_mjs/control/TestAnnotationRenderer/api.mjs.map +1 -1
  150. package/_mjs/control/TestAnnotationRenderer/definition.mjs +2 -2
  151. package/_mjs/control/TestAnnotationRenderer/definition.mjs.map +1 -1
  152. package/_mjs/control/TestAspect/api.mjs +14 -14
  153. package/_mjs/control/TestAspect/api.mjs.map +1 -1
  154. package/_mjs/control/TestClock/api.mjs +9 -10
  155. package/_mjs/control/TestClock/api.mjs.map +1 -1
  156. package/_mjs/control/TestClock/definition.mjs +65 -72
  157. package/_mjs/control/TestClock/definition.mjs.map +1 -1
  158. package/_mjs/control/TestConsole/api.mjs +3 -3
  159. package/_mjs/control/TestConsole/api.mjs.map +1 -1
  160. package/_mjs/control/TestConsole/definition.mjs +20 -22
  161. package/_mjs/control/TestConsole/definition.mjs.map +1 -1
  162. package/_mjs/control/TestEnvironment.mjs +3 -3
  163. package/_mjs/control/TestEnvironment.mjs.map +1 -1
  164. package/_mjs/control/TestExecutor.mjs +3 -3
  165. package/_mjs/control/TestExecutor.mjs.map +1 -1
  166. package/_mjs/control/TestLogger.mjs +2 -2
  167. package/_mjs/control/TestLogger.mjs.map +1 -1
  168. package/_mjs/control/TestRandom/api.mjs +9 -9
  169. package/_mjs/control/TestRandom/api.mjs.map +1 -1
  170. package/_mjs/control/TestRandom/definition.mjs +65 -68
  171. package/_mjs/control/TestRandom/definition.mjs.map +1 -1
  172. package/_mjs/control/TestRenderer/ConsoleRenderer.mjs +11 -11
  173. package/_mjs/control/TestRenderer/ConsoleRenderer.mjs.map +1 -1
  174. package/_mjs/control/TestRunner.mjs +1 -1
  175. package/_mjs/control/TestRunner.mjs.map +1 -1
  176. package/_mjs/data/AssertionValue/api.mjs +22 -14
  177. package/_mjs/data/AssertionValue/api.mjs.map +1 -1
  178. package/_mjs/data/AssertionValue/definition.mjs.map +1 -1
  179. package/_mjs/data/ExecutedSpec/api.mjs +55 -47
  180. package/_mjs/data/ExecutedSpec/api.mjs.map +1 -1
  181. package/_mjs/data/ExecutionResult.mjs +40 -36
  182. package/_mjs/data/ExecutionResult.mjs.map +1 -1
  183. package/_mjs/data/FreeBooleanAlgebra/api.mjs +81 -65
  184. package/_mjs/data/FreeBooleanAlgebra/api.mjs.map +1 -1
  185. package/_mjs/data/LogLine/Fragment.mjs +2 -2
  186. package/_mjs/data/LogLine/Fragment.mjs.map +1 -1
  187. package/_mjs/data/LogLine/Line.mjs +11 -9
  188. package/_mjs/data/LogLine/Line.mjs.map +1 -1
  189. package/_mjs/data/LogLine/Message.mjs +26 -18
  190. package/_mjs/data/LogLine/Message.mjs.map +1 -1
  191. package/_mjs/data/LogLine/Style.mjs.map +1 -1
  192. package/_mjs/data/Render/definition.mjs +1 -1
  193. package/_mjs/data/Render/definition.mjs.map +1 -1
  194. package/_mjs/data/TestAnnotation/api.mjs +2 -2
  195. package/_mjs/data/TestAnnotation/api.mjs.map +1 -1
  196. package/_mjs/data/TestAnnotation/definition.mjs.map +1 -1
  197. package/_mjs/data/TestAnnotationMap.mjs +3 -3
  198. package/_mjs/data/TestAnnotationMap.mjs.map +1 -1
  199. package/_mjs/demo.mjs +5 -5
  200. package/_mjs/demo.mjs.map +1 -1
  201. package/_mjs/util/math.mjs +6 -6
  202. package/_mjs/util/math.mjs.map +1 -1
  203. package/_src/api.ts +36 -35
  204. package/_src/control/AbstractRunnableSpec.ts +0 -3
  205. package/_src/control/Annotations/live.ts +0 -4
  206. package/_src/control/Assertion/api.ts +31 -20
  207. package/_src/control/AssertionIO/api.ts +23 -17
  208. package/_src/control/DefaultTestReporter/render.ts +1 -11
  209. package/_src/control/FreeBooleanAlgebraIO/api.ts +12 -14
  210. package/_src/control/Gen/api/array.ts +18 -15
  211. package/_src/control/Gen/api/conc.ts +31 -26
  212. package/_src/control/Gen/api/string.ts +13 -9
  213. package/_src/control/Gen/api/struct.ts +12 -2
  214. package/_src/control/Gen/api.ts +56 -40
  215. package/_src/control/Gen.ts +0 -1
  216. package/_src/control/Live/definition.ts +0 -4
  217. package/_src/control/Sample/api.ts +77 -66
  218. package/_src/control/Spec/api.ts +235 -222
  219. package/_src/control/Spec/definition.ts +0 -2
  220. package/_src/control/SummaryBuilder.ts +0 -1
  221. package/_src/control/TestAnnotationRenderer/api.ts +17 -15
  222. package/_src/control/TestAnnotationRenderer/definition.ts +0 -2
  223. package/_src/control/TestAspect/api.ts +0 -1
  224. package/_src/control/TestClock/definition.ts +4 -17
  225. package/_src/control/TestConsole/definition.ts +0 -1
  226. package/_src/control/TestLogger.ts +0 -2
  227. package/_src/control/TestRandom/api.ts +5 -0
  228. package/_src/control/TestRandom/definition.ts +3 -37
  229. package/_src/control/TestRenderer/ConsoleRenderer.ts +0 -1
  230. package/_src/data/AssertionValue/api.ts +26 -22
  231. package/_src/data/AssertionValue/definition.ts +0 -1
  232. package/_src/data/ExecutedSpec/api.ts +41 -36
  233. package/_src/data/ExecutionResult.ts +54 -51
  234. package/_src/data/FreeBooleanAlgebra/api.ts +68 -58
  235. package/_src/data/LogLine/Line.ts +5 -3
  236. package/_src/data/LogLine/Message.ts +26 -18
  237. package/_src/data/LogLine/Style.ts +0 -1
  238. package/_src/data/Render/definition.ts +0 -2
  239. package/_src/data/TestAnnotation/api.ts +3 -1
  240. package/_src/data/TestAnnotation/definition.ts +0 -3
  241. package/_src/data/TestAnnotationMap.ts +0 -6
  242. package/_src/demo.ts +3 -4
  243. package/_src/util/math.ts +31 -17
  244. package/api.d.ts +12 -12
  245. package/control/Assertion/api.d.ts +14 -10
  246. package/control/AssertionIO/api.d.ts +8 -8
  247. package/control/FreeBooleanAlgebraIO/api.d.ts +6 -6
  248. package/control/Gen/api/array.d.ts +6 -6
  249. package/control/Gen/api/conc.d.ts +8 -8
  250. package/control/Gen/api/string.d.ts +4 -4
  251. package/control/Gen/api.d.ts +15 -15
  252. package/control/Sample/api.d.ts +14 -14
  253. package/control/Spec/api.d.ts +38 -41
  254. package/control/TestAnnotationRenderer/api.d.ts +3 -3
  255. package/control/TestConsole/definition.d.ts +2 -2
  256. package/data/AssertionValue/api.d.ts +8 -8
  257. package/data/ExecutedSpec/api.d.ts +8 -8
  258. package/data/ExecutionResult.d.ts +4 -4
  259. package/data/FreeBooleanAlgebra/api.d.ts +20 -20
  260. package/data/LogLine/Line.d.ts +2 -2
  261. package/data/LogLine/Message.d.ts +10 -10
  262. package/package.json +3 -3
@@ -11,7 +11,6 @@ export class LeafRenderer {
11
11
  constructor(
12
12
  readonly use: <X>(f: <V>(annotation: TestAnnotation<V>, render: (_: List<V>) => Maybe<string>) => X) => X,
13
13
  ) {}
14
-
15
14
  run(ancestors: List<TestAnnotationMap>, child: TestAnnotationMap): List<string> {
16
15
  return this.use((annotation, render) =>
17
16
  render(
@@ -30,7 +29,6 @@ export class LeafRenderer {
30
29
  export class CompositeRenderer {
31
30
  readonly _tag = TestAnnotationRendererTag.CompositeRenderer;
32
31
  constructor(readonly renderers: Vector<TestAnnotationRenderer>) {}
33
-
34
32
  run(ancestors: List<TestAnnotationMap>, child: TestAnnotationMap): List<string> {
35
33
  return this.renderers.toList.flatMap((renderer) => renderer.run(ancestors, child));
36
34
  }
@@ -96,7 +96,6 @@ export function timeoutWarning(duration: Duration): TestAspect<Live, any> {
96
96
  Multiple: ({ specs }) => Spec.multiple(specs.map((spec) => loop(labels, spec))),
97
97
  Test: ({ test, annotations }) => Spec.test(warn(labels, test, duration), annotations),
98
98
  });
99
-
100
99
  return loop(Vector(), spec);
101
100
  };
102
101
  }
@@ -60,9 +60,9 @@ export class TestClock extends Clock {
60
60
  }
61
61
  sleep = (ms: Lazy<Duration>) => {
62
62
  const self = this;
63
- return IO.gen(function* (_) {
64
- const promise = yield* _(Future.make<never, void>());
65
- const wait = yield* _(
63
+ return Do((_) => {
64
+ const promise = _(Future.make<never, void>());
65
+ const wait = _(
66
66
  self.clockState.modify((data) => {
67
67
  const end = data.duration + ms().milliseconds;
68
68
  if (end > data.duration) {
@@ -72,7 +72,7 @@ export class TestClock extends Clock {
72
72
  }
73
73
  }),
74
74
  );
75
- yield* _(
75
+ _(
76
76
  IO.defer(() => {
77
77
  if (wait) {
78
78
  return self.warningStart > promise.await;
@@ -83,23 +83,17 @@ export class TestClock extends Clock {
83
83
  );
84
84
  });
85
85
  };
86
-
87
86
  currentTime = this.clockState.get.map((data) => data.duration);
88
-
89
87
  adjust(duration: number): UIO<void> {
90
88
  return this.warningDone > this.run((d) => d + duration);
91
89
  }
92
-
93
90
  setDate(date: Date): UIO<void> {
94
91
  return this.setTime(date.getTime());
95
92
  }
96
-
97
93
  setTime(time: number): UIO<void> {
98
94
  return this.warningDone > this.run((_) => time);
99
95
  }
100
-
101
96
  sleeps = this.clockState.get.map((data) => data.sleeps.map(([_]) => _));
102
-
103
97
  get supervizedFibers(): UIO<HashSet<Fiber.Runtime<any, any>>> {
104
98
  return IO.descriptorWith((descriptor) =>
105
99
  this.annotations.get(TestAnnotation.Fibers).flatMap((_) =>
@@ -113,7 +107,6 @@ export class TestClock extends Clock {
113
107
  ),
114
108
  );
115
109
  }
116
-
117
110
  private get freeze(): IO<never, void, HashMap<FiberId, FiberStatus>> {
118
111
  return this.supervizedFibers.flatMap((fibers) =>
119
112
  IO.foldLeft(fibers, HashMap.makeDefault<FiberId, FiberStatus>(), (map, fiber) =>
@@ -133,17 +126,14 @@ export class TestClock extends Clock {
133
126
  ),
134
127
  );
135
128
  }
136
-
137
129
  private get delay(): UIO<void> {
138
130
  return this.live.provide(Clock.sleep((5).milliseconds));
139
131
  }
140
-
141
132
  private get awaitSuspended(): UIO<void> {
142
133
  return this.suspended
143
134
  .zipWith(this.live.provide(Clock.sleep((10).milliseconds)) > this.suspended, Equatable.strictEquals)
144
135
  .filterOrFail(Function.identity, (): void => undefined).eventually.asUnit;
145
136
  }
146
-
147
137
  private run(f: (duration: number) => number): UIO<void> {
148
138
  return (
149
139
  this.awaitSuspended >
@@ -165,7 +155,6 @@ export class TestClock extends Clock {
165
155
  ),
166
156
  );
167
157
  }
168
-
169
158
  private get suspended(): IO<never, void, HashMap<FiberId, FiberStatus>> {
170
159
  return this.freeze.zip(this.delay > this.freeze).flatMap(([first, last]) => {
171
160
  if (Equatable.strictEquals(first, last)) {
@@ -175,7 +164,6 @@ export class TestClock extends Clock {
175
164
  }
176
165
  });
177
166
  }
178
-
179
167
  warningDone: UIO<void> = this.warningState.updateJustIO(
180
168
  matchTag({
181
169
  Start: () => Just(IO(Done)),
@@ -183,7 +171,6 @@ export class TestClock extends Clock {
183
171
  Done: () => Nothing(),
184
172
  }),
185
173
  );
186
-
187
174
  private warningStart: UIO<void> = this.warningState.updateJustIO(
188
175
  matchTag(
189
176
  {
@@ -54,7 +54,6 @@ export class TestConsole implements Console {
54
54
  return this.debugState.locally(true)(io);
55
55
  }
56
56
  }
57
-
58
57
  /**
59
58
  * @tsplus static fncts.test.TestConsoleOps Tag
60
59
  */
@@ -1,5 +1,3 @@
1
- import { Console } from "@fncts/io/Console";
2
-
3
1
  /**
4
2
  * @tsplus type fncts.test.TestLogger
5
3
  * @tsplus companion fncts.test.TestLoggerOps
@@ -7,30 +7,35 @@ import { Buffer, Data, TestRandom } from "@fncts/test/control/TestRandom";
7
7
  export function feedInts(...ints: ReadonlyArray<number>) {
8
8
  return IO.serviceWithIO((tr) => tr.feedInts(...ints), TestRandom.Tag);
9
9
  }
10
+
10
11
  /**
11
12
  * @tsplus static fncts.test.TestRandom feedBytes
12
13
  */
13
14
  export function feedBytes(...bytes: ReadonlyArray<ReadonlyArray<Byte>>) {
14
15
  return IO.serviceWithIO((tr) => tr.feedBytes(...bytes), TestRandom.Tag);
15
16
  }
17
+
16
18
  /**
17
19
  * @tsplus static fncts.test.TestRandom feedChars
18
20
  */
19
21
  export function feedChars(...chars: ReadonlyArray<string>) {
20
22
  return IO.serviceWithIO((tr) => tr.feedChars(...chars), TestRandom.Tag);
21
23
  }
24
+
22
25
  /**
23
26
  * @tsplus static fncts.test.TestRandom feedDoubles
24
27
  */
25
28
  export function feedDoubles(...doubles: ReadonlyArray<number>) {
26
29
  return IO.serviceWithIO((tr) => tr.feedDoubles(...doubles), TestRandom.Tag);
27
30
  }
31
+
28
32
  /**
29
33
  * @tsplus static fncts.test.TestRandom feedStrings
30
34
  */
31
35
  export function feedStrings(...strings: ReadonlyArray<string>) {
32
36
  return IO.serviceWithIO((tr) => tr.feedStrings(...strings), TestRandom.Tag);
33
37
  }
38
+
34
39
  /**
35
40
  * @tsplus static fncts.test.TestRandom feedBooleans
36
41
  */
@@ -13,7 +13,6 @@ export const TestRandomTag = Tag<TestRandom>("fncts.test.TestRandom");
13
13
  */
14
14
  export class TestRandom implements Random {
15
15
  constructor(readonly randomState: Ref<Data>, readonly bufferState: Ref<Buffer>) {}
16
-
17
16
  clearBooleans: UIO<void> = this.bufferState.update((buff) => buff.copy({ booleans: Vector.empty() }));
18
17
  clearBytes: UIO<void> = this.bufferState.update((buff) => buff.copy({ bytes: Vector.empty() }));
19
18
  clearChars: UIO<void> = this.bufferState.update((buff) => buff.copy({ chars: Vector.empty() }));
@@ -39,7 +38,6 @@ export class TestRandom implements Random {
39
38
  return this.bufferState.update((data) => data.copy({ strings: Vector.from(strings).concat(data.strings) }));
40
39
  }
41
40
  getSeed: UIO<number> = this.randomState.get.map((data) => ((data.seed1 << 24) | data.seed2) ^ 0x5deece66d);
42
-
43
41
  setSeed(seed: number): UIO<void> {
44
42
  const mash = Mash();
45
43
  const newSeed = mash(seed.toString());
@@ -47,7 +45,6 @@ export class TestRandom implements Random {
47
45
  const seed2 = Math.floor(newSeed) & ((1 << 24) - 1);
48
46
  return this.randomState.set(new Data(seed1, seed2, ImmutableQueue.empty()));
49
47
  }
50
-
51
48
  private bufferedBoolean = (buffer: Buffer): readonly [Maybe<boolean>, Buffer] => {
52
49
  return [buffer.booleans.head, buffer.copy({ booleans: buffer.booleans.drop(1) })];
53
50
  };
@@ -57,19 +54,15 @@ export class TestRandom implements Random {
57
54
  private bufferedInt = (buffer: Buffer): readonly [Maybe<number>, Buffer] => {
58
55
  return [buffer.integers.head, buffer.copy({ integers: buffer.integers.drop(1) })];
59
56
  };
60
-
61
57
  private getOrElse = <A>(buffer: (_: Buffer) => readonly [Maybe<A>, Buffer], random: UIO<A>): UIO<A> => {
62
58
  return this.bufferState.modify(buffer).flatMap((_) => _.match(() => random, IO.succeedNow));
63
59
  };
64
-
65
60
  private leastSignificantBits = (x: number): number => {
66
61
  return Math.floor(x) & ((1 << 24) - 1);
67
62
  };
68
-
69
63
  private mostSignificantBits = (x: number): number => {
70
64
  return Math.floor(x / (1 << 24));
71
65
  };
72
-
73
66
  private randomBits = (bits: number): UIO<number> => {
74
67
  return this.randomState.modify((data) => {
75
68
  const multiplier = 0x5deece66d;
@@ -83,10 +76,8 @@ export class TestRandom implements Random {
83
76
  return [result >>> (32 - bits), new Data(newSeed1, newSeed2, data.nextNextGaussians)];
84
77
  });
85
78
  };
86
-
87
79
  private randomBoolean = this.randomBits(1).map((n) => n !== 0);
88
-
89
- private randomBytes = (length: number): UIO<ReadonlyArray<Byte>> => {
80
+ private randomBytes = (length: number): UIO<ReadonlyArray<Byte>> => {
90
81
  const loop = (i: number, rnd: UIO<number>, n: number, acc: UIO<List<Byte>>): UIO<List<Byte>> => {
91
82
  if (i === length) {
92
83
  return acc.map((l) => l.reverse);
@@ -103,10 +94,8 @@ export class TestRandom implements Random {
103
94
  return loop(i, this.nextInt, Math.min(length - i, 4), acc);
104
95
  }
105
96
  };
106
-
107
97
  return loop(0, this.randomInt, Math.min(length, 4), IO.succeedNow(List.empty())).map((list) => Array.from(list));
108
98
  };
109
-
110
99
  private randomIntBounded = (n: number) => {
111
100
  if (n <= 0) {
112
101
  return IO.haltNow(new IllegalArgumentError("n must be positive", "TestRandom.randomIntBounded"));
@@ -121,47 +110,35 @@ export class TestRandom implements Random {
121
110
  return loop;
122
111
  }
123
112
  };
124
-
125
113
  private randomLong: UIO<bigint> = this.randomBits(32).flatMap((i1) =>
126
114
  this.randomBits(32).flatMap((i2) => IO.succeedNow(BigInt(i1 << 32) + BigInt(i2))),
127
115
  );
128
-
129
- private randomInt = this.randomBits(32);
130
-
116
+ private randomInt = this.randomBits(32);
131
117
  private randomDouble = this.randomBits(26).flatMap((i1) =>
132
118
  this.randomBits(27).map((i2) => (i1 * (1 << 27) + i2) / (1 << 53)),
133
119
  );
134
-
135
120
  private random = this.randomBits(26);
136
-
137
121
  get nextInt(): UIO<number> {
138
122
  return this.getOrElse(this.bufferedInt, this.randomInt);
139
123
  }
140
-
141
124
  get nextBoolean(): UIO<boolean> {
142
125
  return this.getOrElse(this.bufferedBoolean, this.randomBoolean);
143
126
  }
144
-
145
127
  get nextDouble(): UIO<number> {
146
128
  return this.getOrElse(this.bufferedDouble, this.randomDouble);
147
129
  }
148
-
149
130
  get next(): UIO<number> {
150
131
  return this.getOrElse(this.bufferedDouble, this.random);
151
132
  }
152
-
153
133
  nextBigIntBetween(low: bigint, high: bigint): UIO<bigint> {
154
134
  return this.randomLong.repeatUntil((n) => low <= n && n < high);
155
135
  }
156
-
157
136
  nextIntBetween(low: number, high: number): UIO<number> {
158
137
  return nextIntBetweenWith(low, high, this.randomInt, this.randomIntBounded);
159
138
  }
160
-
161
139
  nextRange(low: number, high: number): UIO<number> {
162
140
  return this.next.map((n) => (high - low + 1) * n + low);
163
141
  }
164
-
165
142
  nextArrayIntBetween(low: ArrayInt, high: ArrayInt): UIO<ArrayInt> {
166
143
  const self = this;
167
144
  return IO.gen(function* (_) {
@@ -187,7 +164,6 @@ export class TestRandom implements Random {
187
164
  }).map((ns) => trimArrayIntInplace(addArrayIntToNew({ sign: 1, data: ns }, low)));
188
165
  }
189
166
  }
190
-
191
167
  /**
192
168
  * @internal
193
169
  */
@@ -205,7 +181,6 @@ function nextIntBetweenWith(
205
181
  else return nextInt.repeatUntil((n) => min <= n && n < max);
206
182
  }
207
183
  }
208
-
209
184
  export class Data {
210
185
  constructor(
211
186
  readonly seed1: number,
@@ -213,7 +188,6 @@ export class Data {
213
188
  readonly nextNextGaussians: ImmutableQueue<number> = ImmutableQueue.empty(),
214
189
  ) {}
215
190
  }
216
-
217
191
  export class Buffer {
218
192
  constructor(
219
193
  readonly booleans: Vector<boolean> = Vector.empty(),
@@ -223,7 +197,6 @@ export class Buffer {
223
197
  readonly integers: Vector<number> = Vector.empty(),
224
198
  readonly strings: Vector<string> = Vector.empty(),
225
199
  ) {}
226
-
227
200
  copy(_: Partial<Buffer>): Buffer {
228
201
  return new Buffer(
229
202
  _.booleans ?? this.booleans,
@@ -235,7 +208,6 @@ export class Buffer {
235
208
  );
236
209
  }
237
210
  }
238
-
239
211
  /** @internal */
240
212
  function isStrictlySmaller(dataA: number[], dataB: number[]): boolean {
241
213
  const maxLength = Math.max(dataA.length, dataB.length);
@@ -249,7 +221,6 @@ function isStrictlySmaller(dataA: number[], dataB: number[]): boolean {
249
221
  }
250
222
  return false;
251
223
  }
252
-
253
224
  export function substractArrayIntToNew(arrayIntA: ArrayInt, arrayIntB: ArrayInt): ArrayInt {
254
225
  if (arrayIntA.sign !== arrayIntB.sign) {
255
226
  return addArrayIntToNew(arrayIntA, { sign: -arrayIntB.sign as -1 | 1, data: arrayIntB.data });
@@ -272,7 +243,6 @@ export function substractArrayIntToNew(arrayIntA: ArrayInt, arrayIntB: ArrayInt)
272
243
  }
273
244
  return { sign: arrayIntA.sign, data: data.reverse() };
274
245
  }
275
-
276
246
  /**
277
247
  * Trim uneeded zeros in ArrayInt
278
248
  * and uniform notation for zero: {sign: 1, data: [0]}
@@ -292,7 +262,6 @@ export function trimArrayIntInplace(arrayInt: ArrayInt) {
292
262
  return arrayInt;
293
263
  /* eslint-enable */
294
264
  }
295
-
296
265
  /**
297
266
  * Add two ArrayInt
298
267
  * @internal
@@ -320,7 +289,6 @@ export function addArrayIntToNew(arrayIntA: ArrayInt, arrayIntB: ArrayInt): Arra
320
289
  }
321
290
  return { sign: arrayIntA.sign, data: data.reverse() };
322
291
  }
323
-
324
292
  /**
325
293
  * Add one to a given positive ArrayInt
326
294
  * @internal
@@ -342,8 +310,7 @@ export function addOneToPositiveArrayInt(arrayInt: ArrayInt): ArrayInt {
342
310
  }
343
311
 
344
312
  function Mash() {
345
- let n = 0xefc8249d;
346
-
313
+ let n = 0xefc8249d;
347
314
  const mash = function (data: string) {
348
315
  for (let i = 0; i < data.length; i++) {
349
316
  n += data.charCodeAt(i);
@@ -357,6 +324,5 @@ function Mash() {
357
324
  }
358
325
  return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
359
326
  };
360
-
361
327
  return mash;
362
328
  }
@@ -10,7 +10,6 @@ import { fr, info, sp, warn } from "../../data/LogLine.js";
10
10
  import { Line } from "../../data/LogLine/Line.js";
11
11
  import { Message } from "../../data/LogLine/Message.js";
12
12
  import { TestAnnotation } from "../../data/TestAnnotation.js";
13
- import { TestRenderer } from "./definition.js";
14
13
 
15
14
  const tabSize = 2;
16
15
 
@@ -3,30 +3,36 @@ import { showWithOptions } from "@fncts/base/typeclass/Showable";
3
3
  import { AssertionValue } from "./definition.js";
4
4
 
5
5
  /**
6
- * @tsplus fluent fncts.test.data.AssertionValue label
6
+ * @tsplus pipeable fncts.test.data.AssertionValue label
7
7
  */
8
- export function label<A>(self: AssertionValue<A>, string: string): AssertionValue<A> {
9
- return new AssertionValue(
10
- LazyValue(() => self.assertion.value.label(string)),
11
- self.value,
12
- self.result,
13
- self.expression,
14
- self.sourceLocation,
15
- );
8
+ export function label(string: string) {
9
+ return <A>(self: AssertionValue<A>): AssertionValue<A> => {
10
+ return new AssertionValue(
11
+ LazyValue(() => self.assertion.value.label(string)),
12
+ self.value,
13
+ self.result,
14
+ self.expression,
15
+ self.sourceLocation,
16
+ );
17
+ };
16
18
  }
17
19
 
18
20
  /**
19
- * @tsplus fluent fncts.test.data.AssertionValue isSameAssertionAs
21
+ * @tsplus pipeable fncts.test.data.AssertionValue isSameAssertionAs
20
22
  */
21
- export function isSameAssertionAs<A>(self: AssertionValue<A>, that: AssertionValue<A>): boolean {
22
- return self.assertion.value.rendered === that.assertion.value.rendered;
23
+ export function isSameAssertionAs<A>(that: AssertionValue<A>) {
24
+ return (self: AssertionValue<A>): boolean => {
25
+ return self.assertion.value.rendered === that.assertion.value.rendered;
26
+ };
23
27
  }
24
28
 
25
29
  /**
26
- * @tsplus fluent fncts.test.data.AssertionValue showValue
30
+ * @tsplus pipeable fncts.test.data.AssertionValue showValue
27
31
  */
28
- export function showValue<A>(self: AssertionValue<A>, offset = 0): string {
29
- return showWithOptions(self.value, { indentationLevel: offset });
32
+ export function showValue(offset = 0) {
33
+ return <A>(self: AssertionValue<A>): string => {
34
+ return showWithOptions(self.value, { indentationLevel: offset });
35
+ };
30
36
  }
31
37
 
32
38
  /**
@@ -37,12 +43,10 @@ export function printAssertion<A>(self: AssertionValue<A>): string {
37
43
  }
38
44
 
39
45
  /**
40
- * @tsplus fluent fncts.test.data.AssertionValue withContext
46
+ * @tsplus pipeable fncts.test.data.AssertionValue withContext
41
47
  */
42
- export function withContext<A>(
43
- self: AssertionValue<A>,
44
- expr: Maybe<string>,
45
- sourceLocation: Maybe<string>,
46
- ): AssertionValue<A> {
47
- return new AssertionValue(self.assertion, self.value, self.result, expr, sourceLocation);
48
+ export function withContext(expr: Maybe<string>, sourceLocation: Maybe<string>) {
49
+ return <A>(self: AssertionValue<A>): AssertionValue<A> => {
50
+ return new AssertionValue(self.assertion, self.value, self.result, expr, sourceLocation);
51
+ };
48
52
  }
@@ -1,6 +1,5 @@
1
1
  import type { AssertionIO } from "../../control/AssertionIO/definition.js";
2
2
  import type { FreeBooleanAlgebra } from "../FreeBooleanAlgebra.js";
3
-
4
3
  export const AssertionValueTypeId = Symbol.for("fncts.test.data.AssertionValue");
5
4
  export type AssertionValueTypeId = typeof AssertionValueTypeId;
6
5
 
@@ -10,14 +10,16 @@ import { ExecutedSpec, TestCase } from "./definition.js";
10
10
  import { LabeledCase, MultipleCase } from "./definition.js";
11
11
 
12
12
  /**
13
- * @tsplus fluent fncts.test.data.ExecutedSpec fold
13
+ * @tsplus pipeable fncts.test.data.ExecutedSpec fold
14
14
  */
15
- export function fold_<E, Z>(self: ExecutedSpec<E>, f: (_: SpecCase<E, Z>) => Z): Z {
16
- return matchTag_(self.caseValue, {
17
- Labeled: ({ label, spec }) => f(new LabeledCase(label, spec.fold(f))),
18
- Multiple: ({ specs }) => f(new MultipleCase(specs.map((spec) => spec.fold(f)))),
19
- Test: f,
20
- });
15
+ export function fold<E, Z>(f: (_: SpecCase<E, Z>) => Z) {
16
+ return (self: ExecutedSpec<E>): Z => {
17
+ return matchTag_(self.caseValue, {
18
+ Labeled: ({ label, spec }) => f(new LabeledCase(label, spec.fold(f))),
19
+ Multiple: ({ specs }) => f(new MultipleCase(specs.map((spec) => spec.fold(f)))),
20
+ Test: f,
21
+ });
22
+ };
21
23
  }
22
24
 
23
25
  /**
@@ -28,17 +30,19 @@ export function labeled<E>(spec: ExecutedSpec<E>, label: string): ExecutedSpec<E
28
30
  }
29
31
 
30
32
  /**
31
- * @tsplus fluent fncts.test.data.ExecutedSpecCase map
33
+ * @tsplus pipeable fncts.test.data.ExecutedSpecCase map
32
34
  */
33
- export function mapSpecCase_<E, A, B>(self: SpecCase<E, A>, f: (a: A) => B): SpecCase<E, B> {
34
- return matchTag_(
35
- self,
36
- {
37
- Labeled: ({ label, spec }) => new LabeledCase(label, f(spec)),
38
- Multiple: ({ specs }) => new MultipleCase(specs.map(f)),
39
- },
40
- identity,
41
- );
35
+ export function mapSpecCase<A, B>(f: (a: A) => B) {
36
+ return <E>(self: SpecCase<E, A>): SpecCase<E, B> => {
37
+ return matchTag_(
38
+ self,
39
+ {
40
+ Labeled: ({ label, spec }) => new LabeledCase(label, f(spec)),
41
+ Multiple: ({ specs }) => new MultipleCase(specs.map(f)),
42
+ },
43
+ identity,
44
+ );
45
+ };
42
46
  }
43
47
 
44
48
  /**
@@ -56,30 +60,31 @@ export function test<E>(test: Either<TestFailure<E>, TestSuccess>, annotations:
56
60
  }
57
61
 
58
62
  /**
59
- * @tsplus fluent fncts.test.data.ExecutedSpec transform
63
+ * @tsplus pipeable fncts.test.data.ExecutedSpec transform
60
64
  */
61
- export function transform_<E, E1>(
62
- self: ExecutedSpec<E>,
63
- f: (_: SpecCase<E, ExecutedSpec<E1>>) => SpecCase<E1, ExecutedSpec<E1>>,
64
- ): ExecutedSpec<E1> {
65
- return matchTag_(self.caseValue, {
66
- Labeled: ({ label, spec }) => new ExecutedSpec(f(new LabeledCase(label, spec.transform(f)))),
67
- Multiple: ({ specs }) => new ExecutedSpec(f(new MultipleCase(specs.map((spec) => spec.transform(f))))),
68
- Test: (t) => new ExecutedSpec(f(t)),
69
- });
65
+ export function transform<E, E1>(f: (_: SpecCase<E, ExecutedSpec<E1>>) => SpecCase<E1, ExecutedSpec<E1>>) {
66
+ return (self: ExecutedSpec<E>): ExecutedSpec<E1> => {
67
+ return matchTag_(self.caseValue, {
68
+ Labeled: ({ label, spec }) => new ExecutedSpec(f(new LabeledCase(label, spec.transform(f)))),
69
+ Multiple: ({ specs }) => new ExecutedSpec(f(new MultipleCase(specs.map((spec) => spec.transform(f))))),
70
+ Test: (t) => new ExecutedSpec(f(t)),
71
+ });
72
+ };
70
73
  }
71
74
 
72
75
  /**
73
- * @tsplus fluent fncts.test.data.ExecutedSpec exists
76
+ * @tsplus pipeable fncts.test.data.ExecutedSpec exists
74
77
  */
75
- export function exists_<E>(self: ExecutedSpec<E>, f: (_: SpecCase<E, boolean>) => boolean): boolean {
76
- return self.fold(
77
- matchTag({
78
- Labeled: (c) => c.spec || f(c),
79
- Multiple: (c) => c.specs.exists(identity) || f(c),
80
- Test: f,
81
- }),
82
- );
78
+ export function exists<E>(f: (_: SpecCase<E, boolean>) => boolean) {
79
+ return (self: ExecutedSpec<E>): boolean => {
80
+ return self.fold(
81
+ matchTag({
82
+ Labeled: (c) => c.spec || f(c),
83
+ Multiple: (c) => c.specs.exists(identity) || f(c),
84
+ Test: f,
85
+ }),
86
+ );
87
+ };
83
88
  }
84
89
 
85
90
  /**