@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.
- package/_cjs/api.cjs +39 -31
- package/_cjs/api.cjs.map +1 -1
- package/_cjs/control/AbstractRunnableSpec.cjs +1 -1
- package/_cjs/control/AbstractRunnableSpec.cjs.map +1 -1
- package/_cjs/control/Annotations/live.cjs +10 -12
- package/_cjs/control/Annotations/live.cjs.map +1 -1
- package/_cjs/control/Assertion/api.cjs +45 -33
- package/_cjs/control/Assertion/api.cjs.map +1 -1
- package/_cjs/control/AssertionIO/api.cjs +20 -14
- package/_cjs/control/AssertionIO/api.cjs.map +1 -1
- package/_cjs/control/DefaultTestReporter/render.cjs +50 -50
- package/_cjs/control/DefaultTestReporter/render.cjs.map +1 -1
- package/_cjs/control/FreeBooleanAlgebraIO/api.cjs +20 -16
- package/_cjs/control/FreeBooleanAlgebraIO/api.cjs.map +1 -1
- package/_cjs/control/Gen/api/array.cjs +23 -17
- package/_cjs/control/Gen/api/array.cjs.map +1 -1
- package/_cjs/control/Gen/api/char.cjs +2 -2
- package/_cjs/control/Gen/api/char.cjs.map +1 -1
- package/_cjs/control/Gen/api/conc.cjs +35 -26
- package/_cjs/control/Gen/api/conc.cjs.map +1 -1
- package/_cjs/control/Gen/api/double.cjs +8 -8
- package/_cjs/control/Gen/api/double.cjs.map +1 -1
- package/_cjs/control/Gen/api/float.cjs +6 -6
- package/_cjs/control/Gen/api/float.cjs.map +1 -1
- package/_cjs/control/Gen/api/string.cjs +18 -14
- package/_cjs/control/Gen/api/string.cjs.map +1 -1
- package/_cjs/control/Gen/api/struct.cjs +4 -4
- package/_cjs/control/Gen/api/struct.cjs.map +1 -1
- package/_cjs/control/Gen/api.cjs +78 -65
- package/_cjs/control/Gen/api.cjs.map +1 -1
- package/_cjs/control/Gen.cjs.map +1 -1
- package/_cjs/control/Live/definition.cjs +5 -5
- package/_cjs/control/Live/definition.cjs.map +1 -1
- package/_cjs/control/RunnableSpec.cjs +8 -8
- package/_cjs/control/RunnableSpec.cjs.map +1 -1
- package/_cjs/control/Sample/api.cjs +66 -52
- package/_cjs/control/Sample/api.cjs.map +1 -1
- package/_cjs/control/Sized/live.cjs +3 -3
- package/_cjs/control/Sized/live.cjs.map +1 -1
- package/_cjs/control/Spec/api.cjs +322 -286
- package/_cjs/control/Spec/api.cjs.map +1 -1
- package/_cjs/control/Spec/definition.cjs.map +1 -1
- package/_cjs/control/SummaryBuilder.cjs +10 -10
- package/_cjs/control/SummaryBuilder.cjs.map +1 -1
- package/_cjs/control/Test.cjs +1 -1
- package/_cjs/control/Test.cjs.map +1 -1
- package/_cjs/control/TestAnnotationRenderer/api.cjs +28 -26
- package/_cjs/control/TestAnnotationRenderer/api.cjs.map +1 -1
- package/_cjs/control/TestAnnotationRenderer/definition.cjs +2 -2
- package/_cjs/control/TestAnnotationRenderer/definition.cjs.map +1 -1
- package/_cjs/control/TestAspect/api.cjs +14 -14
- package/_cjs/control/TestAspect/api.cjs.map +1 -1
- package/_cjs/control/TestClock/api.cjs +9 -11
- package/_cjs/control/TestClock/api.cjs.map +1 -1
- package/_cjs/control/TestClock/definition.cjs +65 -75
- package/_cjs/control/TestClock/definition.cjs.map +1 -1
- package/_cjs/control/TestConsole/api.cjs +3 -3
- package/_cjs/control/TestConsole/api.cjs.map +1 -1
- package/_cjs/control/TestConsole/definition.cjs +20 -24
- package/_cjs/control/TestConsole/definition.cjs.map +1 -1
- package/_cjs/control/TestEnvironment.cjs +3 -3
- package/_cjs/control/TestEnvironment.cjs.map +1 -1
- package/_cjs/control/TestExecutor.cjs +3 -3
- package/_cjs/control/TestExecutor.cjs.map +1 -1
- package/_cjs/control/TestLogger.cjs +2 -2
- package/_cjs/control/TestLogger.cjs.map +1 -1
- package/_cjs/control/TestRandom/api.cjs +9 -9
- package/_cjs/control/TestRandom/api.cjs.map +1 -1
- package/_cjs/control/TestRandom/definition.cjs +65 -71
- package/_cjs/control/TestRandom/definition.cjs.map +1 -1
- package/_cjs/control/TestRenderer/ConsoleRenderer.cjs +11 -11
- package/_cjs/control/TestRenderer/ConsoleRenderer.cjs.map +1 -1
- package/_cjs/control/TestRunner.cjs +1 -1
- package/_cjs/control/TestRunner.cjs.map +1 -1
- package/_cjs/data/AssertionValue/api.cjs +22 -14
- package/_cjs/data/AssertionValue/api.cjs.map +1 -1
- package/_cjs/data/AssertionValue/definition.cjs.map +1 -1
- package/_cjs/data/ExecutedSpec/api.cjs +61 -53
- package/_cjs/data/ExecutedSpec/api.cjs.map +1 -1
- package/_cjs/data/ExecutionResult.cjs +42 -38
- package/_cjs/data/ExecutionResult.cjs.map +1 -1
- package/_cjs/data/FreeBooleanAlgebra/api.cjs +93 -77
- package/_cjs/data/FreeBooleanAlgebra/api.cjs.map +1 -1
- package/_cjs/data/LogLine/Fragment.cjs +2 -2
- package/_cjs/data/LogLine/Fragment.cjs.map +1 -1
- package/_cjs/data/LogLine/Line.cjs +11 -9
- package/_cjs/data/LogLine/Line.cjs.map +1 -1
- package/_cjs/data/LogLine/Message.cjs +32 -24
- package/_cjs/data/LogLine/Message.cjs.map +1 -1
- package/_cjs/data/LogLine/Style.cjs.map +1 -1
- package/_cjs/data/Render/definition.cjs +1 -1
- package/_cjs/data/Render/definition.cjs.map +1 -1
- package/_cjs/data/TestAnnotation/api.cjs +2 -2
- package/_cjs/data/TestAnnotation/api.cjs.map +1 -1
- package/_cjs/data/TestAnnotation/definition.cjs.map +1 -1
- package/_cjs/data/TestAnnotationMap.cjs +3 -3
- package/_cjs/data/TestAnnotationMap.cjs.map +1 -1
- package/_cjs/demo.cjs +5 -5
- package/_cjs/demo.cjs.map +1 -1
- package/_cjs/util/math.cjs +6 -6
- package/_cjs/util/math.cjs.map +1 -1
- package/_mjs/api.mjs +37 -29
- package/_mjs/api.mjs.map +1 -1
- package/_mjs/control/AbstractRunnableSpec.mjs +1 -1
- package/_mjs/control/AbstractRunnableSpec.mjs.map +1 -1
- package/_mjs/control/Annotations/live.mjs +10 -11
- package/_mjs/control/Annotations/live.mjs.map +1 -1
- package/_mjs/control/Assertion/api.mjs +40 -28
- package/_mjs/control/Assertion/api.mjs.map +1 -1
- package/_mjs/control/AssertionIO/api.mjs +17 -11
- package/_mjs/control/AssertionIO/api.mjs.map +1 -1
- package/_mjs/control/DefaultTestReporter/render.mjs +50 -50
- package/_mjs/control/DefaultTestReporter/render.mjs.map +1 -1
- package/_mjs/control/FreeBooleanAlgebraIO/api.mjs +18 -14
- package/_mjs/control/FreeBooleanAlgebraIO/api.mjs.map +1 -1
- package/_mjs/control/Gen/api/array.mjs +20 -14
- package/_mjs/control/Gen/api/array.mjs.map +1 -1
- package/_mjs/control/Gen/api/char.mjs +2 -2
- package/_mjs/control/Gen/api/char.mjs.map +1 -1
- package/_mjs/control/Gen/api/conc.mjs +30 -22
- package/_mjs/control/Gen/api/conc.mjs.map +1 -1
- package/_mjs/control/Gen/api/double.mjs +8 -8
- package/_mjs/control/Gen/api/double.mjs.map +1 -1
- package/_mjs/control/Gen/api/float.mjs +6 -6
- package/_mjs/control/Gen/api/float.mjs.map +1 -1
- package/_mjs/control/Gen/api/string.mjs +18 -14
- package/_mjs/control/Gen/api/string.mjs.map +1 -1
- package/_mjs/control/Gen/api/struct.mjs +4 -4
- package/_mjs/control/Gen/api/struct.mjs.map +1 -1
- package/_mjs/control/Gen/api.mjs +68 -54
- package/_mjs/control/Gen/api.mjs.map +1 -1
- package/_mjs/control/Gen.mjs.map +1 -1
- package/_mjs/control/Live/definition.mjs +5 -5
- package/_mjs/control/Live/definition.mjs.map +1 -1
- package/_mjs/control/RunnableSpec.mjs +8 -8
- package/_mjs/control/RunnableSpec.mjs.map +1 -1
- package/_mjs/control/Sample/api.mjs +57 -43
- package/_mjs/control/Sample/api.mjs.map +1 -1
- package/_mjs/control/Sized/live.mjs +3 -3
- package/_mjs/control/Sized/live.mjs.map +1 -1
- package/_mjs/control/Spec/api.mjs +300 -265
- package/_mjs/control/Spec/api.mjs.map +1 -1
- package/_mjs/control/Spec/definition.mjs.map +1 -1
- package/_mjs/control/SummaryBuilder.mjs +10 -10
- package/_mjs/control/SummaryBuilder.mjs.map +1 -1
- package/_mjs/control/Test.mjs +1 -1
- package/_mjs/control/Test.mjs.map +1 -1
- package/_mjs/control/TestAnnotationRenderer/api.mjs +27 -25
- package/_mjs/control/TestAnnotationRenderer/api.mjs.map +1 -1
- package/_mjs/control/TestAnnotationRenderer/definition.mjs +2 -2
- package/_mjs/control/TestAnnotationRenderer/definition.mjs.map +1 -1
- package/_mjs/control/TestAspect/api.mjs +14 -14
- package/_mjs/control/TestAspect/api.mjs.map +1 -1
- package/_mjs/control/TestClock/api.mjs +9 -10
- package/_mjs/control/TestClock/api.mjs.map +1 -1
- package/_mjs/control/TestClock/definition.mjs +65 -72
- package/_mjs/control/TestClock/definition.mjs.map +1 -1
- package/_mjs/control/TestConsole/api.mjs +3 -3
- package/_mjs/control/TestConsole/api.mjs.map +1 -1
- package/_mjs/control/TestConsole/definition.mjs +20 -22
- package/_mjs/control/TestConsole/definition.mjs.map +1 -1
- package/_mjs/control/TestEnvironment.mjs +3 -3
- package/_mjs/control/TestEnvironment.mjs.map +1 -1
- package/_mjs/control/TestExecutor.mjs +3 -3
- package/_mjs/control/TestExecutor.mjs.map +1 -1
- package/_mjs/control/TestLogger.mjs +2 -2
- package/_mjs/control/TestLogger.mjs.map +1 -1
- package/_mjs/control/TestRandom/api.mjs +9 -9
- package/_mjs/control/TestRandom/api.mjs.map +1 -1
- package/_mjs/control/TestRandom/definition.mjs +65 -68
- package/_mjs/control/TestRandom/definition.mjs.map +1 -1
- package/_mjs/control/TestRenderer/ConsoleRenderer.mjs +11 -11
- package/_mjs/control/TestRenderer/ConsoleRenderer.mjs.map +1 -1
- package/_mjs/control/TestRunner.mjs +1 -1
- package/_mjs/control/TestRunner.mjs.map +1 -1
- package/_mjs/data/AssertionValue/api.mjs +22 -14
- package/_mjs/data/AssertionValue/api.mjs.map +1 -1
- package/_mjs/data/AssertionValue/definition.mjs.map +1 -1
- package/_mjs/data/ExecutedSpec/api.mjs +55 -47
- package/_mjs/data/ExecutedSpec/api.mjs.map +1 -1
- package/_mjs/data/ExecutionResult.mjs +40 -36
- package/_mjs/data/ExecutionResult.mjs.map +1 -1
- package/_mjs/data/FreeBooleanAlgebra/api.mjs +81 -65
- package/_mjs/data/FreeBooleanAlgebra/api.mjs.map +1 -1
- package/_mjs/data/LogLine/Fragment.mjs +2 -2
- package/_mjs/data/LogLine/Fragment.mjs.map +1 -1
- package/_mjs/data/LogLine/Line.mjs +11 -9
- package/_mjs/data/LogLine/Line.mjs.map +1 -1
- package/_mjs/data/LogLine/Message.mjs +26 -18
- package/_mjs/data/LogLine/Message.mjs.map +1 -1
- package/_mjs/data/LogLine/Style.mjs.map +1 -1
- package/_mjs/data/Render/definition.mjs +1 -1
- package/_mjs/data/Render/definition.mjs.map +1 -1
- package/_mjs/data/TestAnnotation/api.mjs +2 -2
- package/_mjs/data/TestAnnotation/api.mjs.map +1 -1
- package/_mjs/data/TestAnnotation/definition.mjs.map +1 -1
- package/_mjs/data/TestAnnotationMap.mjs +3 -3
- package/_mjs/data/TestAnnotationMap.mjs.map +1 -1
- package/_mjs/demo.mjs +5 -5
- package/_mjs/demo.mjs.map +1 -1
- package/_mjs/util/math.mjs +6 -6
- package/_mjs/util/math.mjs.map +1 -1
- package/_src/api.ts +36 -35
- package/_src/control/AbstractRunnableSpec.ts +0 -3
- package/_src/control/Annotations/live.ts +0 -4
- package/_src/control/Assertion/api.ts +31 -20
- package/_src/control/AssertionIO/api.ts +23 -17
- package/_src/control/DefaultTestReporter/render.ts +1 -11
- package/_src/control/FreeBooleanAlgebraIO/api.ts +12 -14
- package/_src/control/Gen/api/array.ts +18 -15
- package/_src/control/Gen/api/conc.ts +31 -26
- package/_src/control/Gen/api/string.ts +13 -9
- package/_src/control/Gen/api/struct.ts +12 -2
- package/_src/control/Gen/api.ts +56 -40
- package/_src/control/Gen.ts +0 -1
- package/_src/control/Live/definition.ts +0 -4
- package/_src/control/Sample/api.ts +77 -66
- package/_src/control/Spec/api.ts +235 -222
- package/_src/control/Spec/definition.ts +0 -2
- package/_src/control/SummaryBuilder.ts +0 -1
- package/_src/control/TestAnnotationRenderer/api.ts +17 -15
- package/_src/control/TestAnnotationRenderer/definition.ts +0 -2
- package/_src/control/TestAspect/api.ts +0 -1
- package/_src/control/TestClock/definition.ts +4 -17
- package/_src/control/TestConsole/definition.ts +0 -1
- package/_src/control/TestLogger.ts +0 -2
- package/_src/control/TestRandom/api.ts +5 -0
- package/_src/control/TestRandom/definition.ts +3 -37
- package/_src/control/TestRenderer/ConsoleRenderer.ts +0 -1
- package/_src/data/AssertionValue/api.ts +26 -22
- package/_src/data/AssertionValue/definition.ts +0 -1
- package/_src/data/ExecutedSpec/api.ts +41 -36
- package/_src/data/ExecutionResult.ts +54 -51
- package/_src/data/FreeBooleanAlgebra/api.ts +68 -58
- package/_src/data/LogLine/Line.ts +5 -3
- package/_src/data/LogLine/Message.ts +26 -18
- package/_src/data/LogLine/Style.ts +0 -1
- package/_src/data/Render/definition.ts +0 -2
- package/_src/data/TestAnnotation/api.ts +3 -1
- package/_src/data/TestAnnotation/definition.ts +0 -3
- package/_src/data/TestAnnotationMap.ts +0 -6
- package/_src/demo.ts +3 -4
- package/_src/util/math.ts +31 -17
- package/api.d.ts +12 -12
- package/control/Assertion/api.d.ts +14 -10
- package/control/AssertionIO/api.d.ts +8 -8
- package/control/FreeBooleanAlgebraIO/api.d.ts +6 -6
- package/control/Gen/api/array.d.ts +6 -6
- package/control/Gen/api/conc.d.ts +8 -8
- package/control/Gen/api/string.d.ts +4 -4
- package/control/Gen/api.d.ts +15 -15
- package/control/Sample/api.d.ts +14 -14
- package/control/Spec/api.d.ts +38 -41
- package/control/TestAnnotationRenderer/api.d.ts +3 -3
- package/control/TestConsole/definition.d.ts +2 -2
- package/data/AssertionValue/api.d.ts +8 -8
- package/data/ExecutedSpec/api.d.ts +8 -8
- package/data/ExecutionResult.d.ts +4 -4
- package/data/FreeBooleanAlgebra/api.d.ts +20 -20
- package/data/LogLine/Line.d.ts +2 -2
- package/data/LogLine/Message.d.ts +10 -10
- package/package.json +3 -3
@@ -10,14 +10,16 @@ import { RenderParam } from "../../data/RenderParam.js";
|
|
10
10
|
import { Assertion } from "./definition.js";
|
11
11
|
|
12
12
|
/**
|
13
|
-
* @tsplus
|
14
|
-
* @tsplus operator fncts.test.Assertion &&
|
13
|
+
* @tsplus pipeable fncts.test.Assertion and
|
14
|
+
* @tsplus pipeable-operator fncts.test.Assertion &&
|
15
15
|
*/
|
16
|
-
export function
|
17
|
-
return
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
export function and<A>(that: Assertion<A>) {
|
17
|
+
return (self: Assertion<A>): Assertion<A> => {
|
18
|
+
return new Assertion(
|
19
|
+
Render.infix(RenderParam(self), "&&", RenderParam(that)),
|
20
|
+
(actual) => self.run(actual) && that.run(actual),
|
21
|
+
);
|
22
|
+
};
|
21
23
|
}
|
22
24
|
|
23
25
|
/**
|
@@ -210,10 +212,12 @@ export function isLessThanOrEqualTo(n: number): Assertion<number> {
|
|
210
212
|
}
|
211
213
|
|
212
214
|
/**
|
213
|
-
* @tsplus
|
215
|
+
* @tsplus pipeable fncts.test.Assertion label
|
214
216
|
*/
|
215
|
-
export function
|
216
|
-
return
|
217
|
+
export function label(label: string) {
|
218
|
+
return <A>(self: Assertion<A>): Assertion<A> => {
|
219
|
+
return new Assertion(Render.infix(RenderParam(self), ":", RenderParam(label)), self.run);
|
220
|
+
};
|
217
221
|
}
|
218
222
|
|
219
223
|
/**
|
@@ -224,16 +228,21 @@ export function not<A>(assertion: Assertion<A>): Assertion<A> {
|
|
224
228
|
}
|
225
229
|
|
226
230
|
/**
|
227
|
-
* @tsplus
|
228
|
-
* @tsplus operator fncts.test.Assertion ||
|
231
|
+
* @tsplus pipeable fncts.test.Assertion or
|
232
|
+
* @tsplus pipeable-operator fncts.test.Assertion ||
|
229
233
|
*/
|
230
|
-
export function
|
231
|
-
return
|
232
|
-
|
233
|
-
|
234
|
-
|
234
|
+
export function or<A>(that: Assertion<A>) {
|
235
|
+
return (self: Assertion<A>): Assertion<A> => {
|
236
|
+
return new Assertion(
|
237
|
+
Render.infix(RenderParam(self), "||", RenderParam(that)),
|
238
|
+
(actual) => self.run(actual) || that.run(actual),
|
239
|
+
);
|
240
|
+
};
|
235
241
|
}
|
236
242
|
|
243
|
+
/**
|
244
|
+
* @tsplus getter fncts.test.Assertion succeeds
|
245
|
+
*/
|
237
246
|
export function succeeds<A>(assertion: Assertion<A>): Assertion<Exit<any, A>> {
|
238
247
|
return Assertion.rec("succeeds", [RenderParam(assertion)], assertion, (exit) =>
|
239
248
|
exit.match(
|
@@ -244,10 +253,12 @@ export function succeeds<A>(assertion: Assertion<A>): Assertion<Exit<any, A>> {
|
|
244
253
|
}
|
245
254
|
|
246
255
|
/**
|
247
|
-
* @tsplus
|
256
|
+
* @tsplus pipeable fncts.test.Assertion test
|
248
257
|
*/
|
249
|
-
export function
|
250
|
-
return self
|
258
|
+
export function test<A>(actual: A) {
|
259
|
+
return (self: Assertion<A>): boolean => {
|
260
|
+
return self.run(actual).isSuccess;
|
261
|
+
};
|
251
262
|
}
|
252
263
|
|
253
264
|
export const completes = Assertion.make("completes", [], () => true);
|
@@ -3,30 +3,36 @@ import { RenderParam } from "../../data/RenderParam.js";
|
|
3
3
|
import { AssertionIO } from "./definition.js";
|
4
4
|
|
5
5
|
/**
|
6
|
-
* @tsplus
|
7
|
-
* @tsplus operator fncts.test.AssertionIO &&
|
6
|
+
* @tsplus pipeable fncts.test.AssertionIO and
|
7
|
+
* @tsplus pipeable-operator fncts.test.AssertionIO &&
|
8
8
|
*/
|
9
|
-
export function
|
10
|
-
return
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
export function and<A>(that: AssertionIO<A>) {
|
10
|
+
return (self: AssertionIO<A>): AssertionIO<A> => {
|
11
|
+
return new AssertionIO(
|
12
|
+
Render.infix(RenderParam(self), "&&", RenderParam(that)),
|
13
|
+
(actual) => self.runIO(actual) && that.runIO(actual),
|
14
|
+
);
|
15
|
+
};
|
14
16
|
}
|
15
17
|
|
16
18
|
/**
|
17
|
-
* @tsplus
|
18
|
-
* @tsplus operator fncts.test.AssertionIO ||
|
19
|
+
* @tsplus pipeable fncts.test.AssertionIO or
|
20
|
+
* @tsplus pipeable-operator fncts.test.AssertionIO ||
|
19
21
|
*/
|
20
|
-
export function
|
21
|
-
return
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
export function or<A>(that: AssertionIO<A>) {
|
23
|
+
return (self: AssertionIO<A>): AssertionIO<A> => {
|
24
|
+
return new AssertionIO(
|
25
|
+
Render.infix(RenderParam(self), "||", RenderParam(that)),
|
26
|
+
(actual) => self.runIO(actual) || that.runIO(actual),
|
27
|
+
);
|
28
|
+
};
|
25
29
|
}
|
26
30
|
|
27
31
|
/**
|
28
|
-
* @tsplus
|
32
|
+
* @tsplus pipeable fncts.test.AssertionIO label
|
29
33
|
*/
|
30
|
-
export function
|
31
|
-
return
|
34
|
+
export function label(label: string) {
|
35
|
+
return <A>(self: AssertionIO<A>): AssertionIO<A> => {
|
36
|
+
return new AssertionIO(Render.infix(RenderParam(self), ":", RenderParam(label)), self.runIO);
|
37
|
+
};
|
32
38
|
}
|
@@ -51,15 +51,12 @@ export function renderStats<E>(duration: number, executedSpec: ExecutedSpec<E>)
|
|
51
51
|
],
|
52
52
|
}),
|
53
53
|
);
|
54
|
-
|
55
54
|
const total = success + ignore + failure;
|
56
|
-
|
57
55
|
const stats = detail(
|
58
56
|
`Ran ${total} test${
|
59
57
|
total === 1 ? "" : "s"
|
60
58
|
} in ${duration}ms: ${success} succeeded, ${ignore} ignored, ${failure} failed`,
|
61
59
|
);
|
62
|
-
|
63
60
|
return rendered(Other, "", Passed, 0, List(stats.toLine));
|
64
61
|
}
|
65
62
|
|
@@ -89,7 +86,6 @@ function renderLoop<E>(
|
|
89
86
|
return false;
|
90
87
|
}
|
91
88
|
});
|
92
|
-
|
93
89
|
const annotations = executedSpec.fold<E, TestAnnotationMap>(
|
94
90
|
matchTag({
|
95
91
|
Labeled: ({ spec }) => spec,
|
@@ -97,19 +93,15 @@ function renderLoop<E>(
|
|
97
93
|
Test: ({ annotations }) => annotations,
|
98
94
|
}),
|
99
95
|
);
|
100
|
-
|
101
96
|
const [status, renderedLabel] = specs.isEmpty
|
102
97
|
? [Ignored, Vector(renderSuiteIgnored(labels.reverse.join(" - "), depth))]
|
103
98
|
: hasFailures
|
104
99
|
? [Failed, Vector(renderSuiteFailed(labels.reverse.join(" - "), depth))]
|
105
100
|
: [Passed, Vector(renderSuiteSucceeded(labels.reverse.join(" - "), depth))];
|
106
|
-
|
107
101
|
const allAnnotations = ancestors.prepend(annotations);
|
108
|
-
|
109
|
-
const rest = Vector.from(specs).flatMap((spec) =>
|
102
|
+
const rest = Vector.from(specs).flatMap((spec) =>
|
110
103
|
renderLoop(spec, depth + 1, ancestors.prepend(annotations), List.empty()),
|
111
104
|
);
|
112
|
-
|
113
105
|
return rest.prepend(
|
114
106
|
rendered(
|
115
107
|
Suite,
|
@@ -215,7 +207,6 @@ function renderGenFailureDetails(failureDetails: Maybe<GenFailureDetails>, offse
|
|
215
207
|
`Test failed after ${details.iterations + 1} iteration${details.iterations > 0 ? "s" : ""} with input: `,
|
216
208
|
) + error(shrunken)
|
217
209
|
).withOffset(offset + 1);
|
218
|
-
|
219
210
|
return initial === shrunken
|
220
211
|
? renderShrunken.toMessage
|
221
212
|
: renderShrunken | (Fragment("Original input before shrinking was: ") + error(initial)).withOffset(offset + 1);
|
@@ -246,7 +237,6 @@ function renderValue<A>(av: AssertionValue<A>, offset: number) {
|
|
246
237
|
|
247
238
|
function expressionRedundant(valueStr: string, expression: string) {
|
248
239
|
const strip = (s: string) => s.replace('"', "").replace(" ", "").replace("\n", "").replace("\\n", "");
|
249
|
-
|
250
240
|
return strip(valueStr) === strip(expression);
|
251
241
|
}
|
252
242
|
|
@@ -3,25 +3,23 @@ import type { FreeBooleanAlgebraIO } from "./definition.js";
|
|
3
3
|
import { FreeBooleanAlgebra } from "../../data/FreeBooleanAlgebra.js";
|
4
4
|
|
5
5
|
/**
|
6
|
-
* @tsplus
|
7
|
-
* @tsplus operator fncts.test.FreeBooleanAlgebraIO &&
|
6
|
+
* @tsplus pipeable fncts.test.FreeBooleanAlgebraIO and
|
7
|
+
* @tsplus pipeable-operator fncts.test.FreeBooleanAlgebraIO &&
|
8
8
|
*/
|
9
|
-
export function
|
10
|
-
self: FreeBooleanAlgebraIO<R, E, A
|
11
|
-
|
12
|
-
|
13
|
-
return self.zipWith(that, (a, b) => a && b);
|
9
|
+
export function and<R1, E1, A1>(that: FreeBooleanAlgebraIO<R1, E1, A1>) {
|
10
|
+
return <R, E, A extends A1>(self: FreeBooleanAlgebraIO<R, E, A>): FreeBooleanAlgebraIO<R | R1, E | E1, A | A1> => {
|
11
|
+
return self.zipWith(that, (a, b) => a && b);
|
12
|
+
};
|
14
13
|
}
|
15
14
|
|
16
15
|
/**
|
17
|
-
* @tsplus
|
18
|
-
* @tsplus operator fncts.test.FreeBooleanAlgebraIO ||
|
16
|
+
* @tsplus pipeable fncts.test.FreeBooleanAlgebraIO or
|
17
|
+
* @tsplus pipeable-operator fncts.test.FreeBooleanAlgebraIO ||
|
19
18
|
*/
|
20
|
-
export function
|
21
|
-
self: FreeBooleanAlgebraIO<R, E, A
|
22
|
-
|
23
|
-
|
24
|
-
return self.zipWith(that, (a, b) => a || b);
|
19
|
+
export function or<R1, E1, A1>(that: FreeBooleanAlgebraIO<R1, E1, A1>) {
|
20
|
+
return <R, E, A extends A1>(self: FreeBooleanAlgebraIO<R, E, A>): FreeBooleanAlgebraIO<R | R1, E | E1, A | A1> => {
|
21
|
+
return self.zipWith(that, (a, b) => a || b);
|
22
|
+
};
|
25
23
|
}
|
26
24
|
|
27
25
|
/**
|
@@ -4,28 +4,31 @@ import type { EqConstraint, LengthConstraints } from "../constraints.js";
|
|
4
4
|
import { Gen } from "../definition.js";
|
5
5
|
|
6
6
|
/**
|
7
|
-
* @tsplus
|
7
|
+
* @tsplus pipeable fncts.test.Gen array
|
8
8
|
*/
|
9
|
-
export function array
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
export function array(constraints: LengthConstraints = {}) {
|
10
|
+
return <R, A>(g: Gen<R, A>): Gen<R | Sized, ReadonlyArray<A>> => {
|
11
|
+
const minLength = constraints.minLength || 0;
|
12
|
+
return constraints.maxLength
|
13
|
+
? Gen.int({ min: minLength, max: constraints.maxLength }).flatMap((n) => g.arrayN(n))
|
14
|
+
: Gen.small((n) => g.arrayN(n), minLength);
|
15
|
+
};
|
14
16
|
}
|
15
17
|
|
16
18
|
/**
|
17
|
-
* @tsplus
|
19
|
+
* @tsplus pipeable fncts.test.Gen arrayN
|
18
20
|
*/
|
19
|
-
export function
|
20
|
-
return self
|
21
|
+
export function arrayN(n: number) {
|
22
|
+
return <R, A>(self: Gen<R, A>): Gen<R, ReadonlyArray<A>> => {
|
23
|
+
return self.concN(n).map((conc) => conc.toArray);
|
24
|
+
};
|
21
25
|
}
|
22
26
|
|
23
27
|
/**
|
24
|
-
* @tsplus
|
28
|
+
* @tsplus pipeable fncts.test.Gen uniqueArray
|
25
29
|
*/
|
26
|
-
export function
|
27
|
-
gen: Gen<R, A
|
28
|
-
|
29
|
-
|
30
|
-
return gen.uniqueConc(constraints).map((conc) => conc.toArray);
|
30
|
+
export function uniqueArray<A>(constraints: LengthConstraints & EqConstraint<A> = {}) {
|
31
|
+
return <R>(gen: Gen<R, A>): Gen<Sized | R, ReadonlyArray<A>> => {
|
32
|
+
return gen.uniqueConc(constraints).map((conc) => conc.toArray);
|
33
|
+
};
|
31
34
|
}
|
@@ -6,43 +6,48 @@ import { Eq, Equatable } from "@fncts/base/typeclass";
|
|
6
6
|
import { Gen } from "../definition.js";
|
7
7
|
|
8
8
|
/**
|
9
|
-
* @tsplus
|
9
|
+
* @tsplus pipeable fncts.test.Gen conc
|
10
10
|
*/
|
11
|
-
export function conc
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
export function conc(constraints: LengthConstraints = {}) {
|
12
|
+
return <R, A>(self: Gen<R, A>): Gen<R | Sized, Conc<A>> => {
|
13
|
+
const minLength = constraints.minLength ?? 0;
|
14
|
+
return constraints.maxLength
|
15
|
+
? Gen.int({ min: minLength, max: constraints.maxLength }).flatMap((n) => self.concN(n))
|
16
|
+
: Gen.small((n) => self.concN(n), minLength);
|
17
|
+
};
|
16
18
|
}
|
17
19
|
|
18
20
|
/**
|
19
|
-
* @tsplus
|
21
|
+
* @tsplus pipeable fncts.test.Gen concN
|
20
22
|
*/
|
21
|
-
export function
|
22
|
-
return
|
23
|
-
|
24
|
-
|
23
|
+
export function concN(n: number) {
|
24
|
+
return <R, A>(g: Gen<R, A>): Gen<R, Conc<A>> => {
|
25
|
+
return Conc.replicate(n, g).foldLeft(Gen.constant(Conc.empty()) as Gen<R, Conc<A>>, (gen, a) =>
|
26
|
+
gen.zipWith(a, (as, a) => as.append(a)),
|
27
|
+
);
|
28
|
+
};
|
25
29
|
}
|
26
30
|
|
27
31
|
/**
|
28
|
-
* @tsplus
|
32
|
+
* @tsplus pipeable fncts.test.Gen uniqueConc
|
29
33
|
*/
|
30
|
-
export function
|
31
|
-
self: Gen<R, A
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
: Gen.small((n) => self.uniqueConcN(n, eq), minLength);
|
34
|
+
export function uniqueConc<A>(constraints: LengthConstraints & EqConstraint<A> = {}) {
|
35
|
+
return <R>(self: Gen<R, A>): Gen<Sized | R, Conc<A>> => {
|
36
|
+
const minLength = constraints.minLength ?? 0;
|
37
|
+
const eq = constraints.eq ?? Eq({ equals: Equatable.strictEquals });
|
38
|
+
return constraints.maxLength
|
39
|
+
? Gen.bounded(minLength, constraints.maxLength, (n) => self.uniqueConcN(n, eq))
|
40
|
+
: Gen.small((n) => self.uniqueConcN(n, eq), minLength);
|
41
|
+
};
|
39
42
|
}
|
40
43
|
|
41
44
|
/**
|
42
|
-
* @tsplus
|
45
|
+
* @tsplus pipeable fncts.test.Gen uniqueConcN
|
43
46
|
*/
|
44
|
-
export function
|
45
|
-
return
|
46
|
-
|
47
|
-
|
47
|
+
export function uniqueConcN<A>(n: number, /** @tsplus auto */ E: Eq<A>) {
|
48
|
+
return <R>(self: Gen<R, A>): Gen<R, Conc<A>> => {
|
49
|
+
return Conc.replicate(n, self).foldLeft(Gen.constant(Conc.empty()) as Gen<R, Conc<A>>, (gen, a) =>
|
50
|
+
gen.zipWith(a, (as, a) => (as.elem(a, E) ? as : as.append(a))),
|
51
|
+
);
|
52
|
+
};
|
48
53
|
}
|
@@ -47,20 +47,24 @@ export function string16(constraints: LengthConstraints = {}): Gen<Sized, string
|
|
47
47
|
}
|
48
48
|
|
49
49
|
/**
|
50
|
-
* @tsplus
|
50
|
+
* @tsplus pipeable fncts.test.Gen string
|
51
51
|
*/
|
52
|
-
export function string
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
52
|
+
export function string(constraints: LengthConstraints = {}) {
|
53
|
+
return <R>(char: Gen<R, string>): Gen<R | Sized, string> => {
|
54
|
+
const min = constraints.minLength || 0;
|
55
|
+
return constraints.maxLength
|
56
|
+
? Gen.bounded(min, constraints.maxLength, (n) => char.stringN(n))
|
57
|
+
: Gen.small((n) => char.stringN(n), min);
|
58
|
+
};
|
57
59
|
}
|
58
60
|
|
59
61
|
/**
|
60
|
-
* @tsplus
|
62
|
+
* @tsplus pipeable fncts.test.Gen stringN
|
61
63
|
*/
|
62
|
-
export function stringN
|
63
|
-
return char
|
64
|
+
export function stringN(n: number) {
|
65
|
+
return <R>(char: Gen<R, string>): Gen<R, string> => {
|
66
|
+
return char.arrayN(n).map((arr) => arr.join(""));
|
67
|
+
};
|
64
68
|
}
|
65
69
|
|
66
70
|
/**
|
@@ -4,7 +4,12 @@ import { Gen } from "../definition.js";
|
|
4
4
|
|
5
5
|
export function struct<P extends Record<string, Gen<any, any>>>(
|
6
6
|
properties: P,
|
7
|
-
): Gen<
|
7
|
+
): Gen<
|
8
|
+
_R<P[keyof P]>,
|
9
|
+
{
|
10
|
+
readonly [K in keyof P]: _A<P[K]>;
|
11
|
+
}
|
12
|
+
> {
|
8
13
|
const entries = Object.entries(properties);
|
9
14
|
return entries.foldLeft(Gen.constant({}) as Gen<any, any>, (b, [k, gen]) =>
|
10
15
|
b.zipWith(gen, (out, a) => ({ ...out, [k]: a })),
|
@@ -13,7 +18,12 @@ export function struct<P extends Record<string, Gen<any, any>>>(
|
|
13
18
|
|
14
19
|
export function partial<P extends Record<string, Gen<any, any>>>(
|
15
20
|
properties: P,
|
16
|
-
): Gen<
|
21
|
+
): Gen<
|
22
|
+
unknown & _R<P[keyof P]>,
|
23
|
+
Partial<{
|
24
|
+
readonly [K in keyof P]: _A<P[K]>;
|
25
|
+
}>
|
26
|
+
> {
|
17
27
|
const entries = Object.entries(properties);
|
18
28
|
return entries.foldLeft(Gen.constant({}) as Gen<any, any>, (b, [k, gen]) =>
|
19
29
|
Gen.unwrap(Random.nextBoolean.ifIO(IO.succeed(b.zipWith(gen, (r, a) => ({ ...r, [k]: a }))), IO.succeed(b))),
|
package/_src/control/Gen/api.ts
CHANGED
@@ -45,16 +45,18 @@ export function constant<A>(a: A): Gen<never, A> {
|
|
45
45
|
}
|
46
46
|
|
47
47
|
/**
|
48
|
-
* @tsplus
|
48
|
+
* @tsplus pipeable fncts.test.Gen flatMap
|
49
49
|
*/
|
50
|
-
export function
|
51
|
-
return
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
50
|
+
export function flatMap<A, R1, B>(f: (a: A) => Gen<R1, B>) {
|
51
|
+
return <R>(ma: Gen<R, A>): Gen<R | R1, B> => {
|
52
|
+
return new Gen(
|
53
|
+
Sample.flatMapStream(ma.sample, (sample) => {
|
54
|
+
const values = f(sample.value).sample;
|
55
|
+
const shrinks = new Gen(sample.shrink).flatMap((a) => f(a)).sample;
|
56
|
+
return values.map((maybeSample) => maybeSample.map((sample) => sample.flatMap((b) => new Sample(b, shrinks))));
|
57
|
+
}),
|
58
|
+
);
|
59
|
+
};
|
58
60
|
}
|
59
61
|
|
60
62
|
/**
|
@@ -70,19 +72,23 @@ export function defer<R, A>(gen: Lazy<Gen<R, A>>): Gen<R, A> {
|
|
70
72
|
export const empty: Gen<never, never> = new Gen(Stream.empty);
|
71
73
|
|
72
74
|
/**
|
73
|
-
* @tsplus
|
75
|
+
* @tsplus pipeable fncts.test.Gen filter
|
74
76
|
*/
|
75
|
-
export function
|
76
|
-
export function
|
77
|
-
export function
|
78
|
-
return fa
|
77
|
+
export function filter<A, B extends A>(p: Refinement<A, B>): <R>(fa: Gen<R, A>) => Gen<R, B>;
|
78
|
+
export function filter<A>(p: Predicate<A>): <R>(fa: Gen<R, A>) => Gen<R, A>;
|
79
|
+
export function filter<A>(p: Predicate<A>) {
|
80
|
+
return <R>(fa: Gen<R, A>): Gen<R, A> => {
|
81
|
+
return fa.flatMap((a) => (p(a) ? Gen.constant(a) : Gen.empty));
|
82
|
+
};
|
79
83
|
}
|
80
84
|
|
81
85
|
/**
|
82
|
-
* @tsplus
|
86
|
+
* @tsplus pipeable fncts.test.Gen filterNot
|
83
87
|
*/
|
84
|
-
export function
|
85
|
-
return fa
|
88
|
+
export function filterNot<A>(p: Predicate<A>) {
|
89
|
+
return <R>(fa: Gen<R, A>): Gen<R, A> => {
|
90
|
+
return fa.filter((a) => !p(a));
|
91
|
+
};
|
86
92
|
}
|
87
93
|
|
88
94
|
/**
|
@@ -124,24 +130,28 @@ export function int(constraints: NumberConstraints = {}): Gen<never, number> {
|
|
124
130
|
}
|
125
131
|
|
126
132
|
/**
|
127
|
-
* @tsplus
|
133
|
+
* @tsplus pipeable fncts.test.Gen map
|
128
134
|
*/
|
129
|
-
export function
|
130
|
-
return
|
135
|
+
export function map<A, B>(f: (a: A) => B) {
|
136
|
+
return <R>(self: Gen<R, A>): Gen<R, B> => {
|
137
|
+
return new Gen(self.sample.map((maybeSample) => maybeSample.map((sample) => sample.map(f))));
|
138
|
+
};
|
131
139
|
}
|
132
140
|
|
133
141
|
/**
|
134
|
-
* @tsplus
|
142
|
+
* @tsplus pipeable fncts.test.Gen mapIO
|
135
143
|
*/
|
136
|
-
export function
|
137
|
-
return
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
144
|
+
export function mapIO<A, R1, B>(f: (a: A) => IO<R1, never, B>) {
|
145
|
+
return <R>(self: Gen<R, A>): Gen<R | R1, B> => {
|
146
|
+
return new Gen(
|
147
|
+
self.sample.mapIO((maybeSample) =>
|
148
|
+
maybeSample.match(
|
149
|
+
() => IO.succeedNow(Nothing()),
|
150
|
+
(sample) => sample.foreach(f).map(Maybe.just),
|
151
|
+
),
|
142
152
|
),
|
143
|
-
)
|
144
|
-
|
153
|
+
);
|
154
|
+
};
|
145
155
|
}
|
146
156
|
|
147
157
|
/**
|
@@ -168,7 +178,9 @@ export function medium<R, A>(f: (n: number) => Gen<R, A>, min = 0): Gen<R | Size
|
|
168
178
|
* @tsplus static fncts.test.GenOps memo
|
169
179
|
*/
|
170
180
|
export function memo<R, A>(builder: (maxDepth: number) => Gen<R, A>): (maxDepth?: number) => Gen<R, A> {
|
171
|
-
const previous: {
|
181
|
+
const previous: {
|
182
|
+
[depth: number]: Gen<R, A>;
|
183
|
+
} = {};
|
172
184
|
let remainingDepth = 10;
|
173
185
|
return (maxDepth?: number): Gen<R, A> => {
|
174
186
|
const n = maxDepth !== undefined ? maxDepth : remainingDepth;
|
@@ -198,14 +210,16 @@ export function oneOf<A extends ReadonlyArray<Gen<any, any>>>(...gens: A): Gen<_
|
|
198
210
|
}
|
199
211
|
|
200
212
|
/**
|
201
|
-
* @tsplus
|
213
|
+
* @tsplus pipeable fncts.test.Gen reshrink
|
202
214
|
*/
|
203
|
-
export function
|
204
|
-
return
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
215
|
+
export function reshrink<A, R1, B>(f: (a: A) => Sample<R1, B>) {
|
216
|
+
return <R>(gen: Gen<R, A>): Gen<R | R1, B> => {
|
217
|
+
return new Gen(
|
218
|
+
(gen.sample as Stream<R | R1, never, Maybe<Sample<R, A>>>).map((maybeSample) =>
|
219
|
+
maybeSample.map((sample) => f(sample.value)),
|
220
|
+
),
|
221
|
+
);
|
222
|
+
};
|
209
223
|
}
|
210
224
|
|
211
225
|
/**
|
@@ -269,8 +283,10 @@ export function weighted<R, A>(...gens: ReadonlyArray<readonly [Gen<R, A>, numbe
|
|
269
283
|
}
|
270
284
|
|
271
285
|
/**
|
272
|
-
* @tsplus
|
286
|
+
* @tsplus pipeable fncts.test.Gen zipWith
|
273
287
|
*/
|
274
|
-
export function
|
275
|
-
return self
|
288
|
+
export function zipWith<A, R1, B, C>(that: Gen<R1, B>, f: (a: A, b: B) => C) {
|
289
|
+
return <R>(self: Gen<R, A>): Gen<R | R1, C> => {
|
290
|
+
return self.flatMap((a) => that.map((b) => f(a, b)));
|
291
|
+
};
|
276
292
|
}
|
package/_src/control/Gen.ts
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
import type { Erase } from "@fncts/typelevel/Intersection";
|
2
|
-
|
3
1
|
import { IOEnv } from "@fncts/io/IOEnv";
|
4
2
|
|
5
3
|
/**
|
@@ -12,7 +10,6 @@ export const LiveTag = Tag<Live>("fncts.test.Live");
|
|
12
10
|
*/
|
13
11
|
export abstract class Live {
|
14
12
|
abstract provide<R, E, A>(io: IO<R, E, A>): IO<R, E, A>;
|
15
|
-
|
16
13
|
static Default: Layer<IOEnv, never, Live> = Layer.fromIO(
|
17
14
|
IO.environmentWith(
|
18
15
|
(env) =>
|
@@ -24,7 +21,6 @@ export abstract class Live {
|
|
24
21
|
),
|
25
22
|
LiveTag,
|
26
23
|
);
|
27
|
-
|
28
24
|
static Live<R extends Live, E, A>(io: IO<R, E, A>): IO<R | Live, E, A> {
|
29
25
|
return IO.serviceWithIO((live) => live.provide(io), LiveTag);
|
30
26
|
}
|