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