@fncts/test 0.0.19 → 0.0.21
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|