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