@fncts/test 0.0.12 → 0.0.13
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/TestSpec.d.ts +1 -1
- package/_cjs/control/Annotations/api.cjs +1 -1
- package/_cjs/control/Annotations/api.cjs.map +1 -1
- package/_cjs/control/Gen/api/char.cjs.map +1 -1
- package/_cjs/control/Gen/api.cjs +3 -3
- package/_cjs/control/Gen/api.cjs.map +1 -1
- package/_cjs/control/Gen/definition.cjs.map +1 -1
- package/_cjs/control/Live/definition.cjs +1 -1
- package/_cjs/control/Live/definition.cjs.map +1 -1
- package/_cjs/control/RunnableSpec.cjs +9 -11
- package/_cjs/control/RunnableSpec.cjs.map +1 -1
- package/_cjs/control/Sized/api.cjs +1 -1
- package/_cjs/control/Sized/api.cjs.map +1 -1
- package/_cjs/control/Spec/api.cjs +1 -1
- package/_cjs/control/Spec/api.cjs.map +1 -1
- package/_cjs/control/Spec/definition.cjs.map +1 -1
- package/_cjs/control/TestAspect/api.cjs +3 -3
- package/_cjs/control/TestAspect/api.cjs.map +1 -1
- package/_cjs/control/TestClock/api.cjs +14 -22
- package/_cjs/control/TestClock/api.cjs.map +1 -1
- package/_cjs/control/TestConsole/api.cjs +12 -15
- package/_cjs/control/TestConsole/api.cjs.map +1 -1
- package/_cjs/control/TestEnvironment.cjs.map +1 -1
- package/_cjs/control/TestExecutor.cjs +6 -6
- package/_cjs/control/TestExecutor.cjs.map +1 -1
- package/_cjs/control/TestLogger.cjs.map +1 -1
- package/_cjs/control/TestRandom/api.cjs +10 -18
- package/_cjs/control/TestRandom/api.cjs.map +1 -1
- package/_cjs/control/TestRunner.cjs.map +1 -1
- package/_mjs/control/Annotations/api.mjs +1 -1
- package/_mjs/control/Annotations/api.mjs.map +1 -1
- package/_mjs/control/Gen/api/char.mjs.map +1 -1
- package/_mjs/control/Gen/api.mjs +3 -3
- package/_mjs/control/Gen/api.mjs.map +1 -1
- package/_mjs/control/Gen/definition.mjs.map +1 -1
- package/_mjs/control/Live/definition.mjs +1 -1
- package/_mjs/control/Live/definition.mjs.map +1 -1
- package/_mjs/control/RunnableSpec.mjs +9 -11
- package/_mjs/control/RunnableSpec.mjs.map +1 -1
- package/_mjs/control/Sized/api.mjs +1 -1
- package/_mjs/control/Sized/api.mjs.map +1 -1
- package/_mjs/control/Spec/api.mjs +1 -1
- package/_mjs/control/Spec/api.mjs.map +1 -1
- package/_mjs/control/Spec/definition.mjs.map +1 -1
- package/_mjs/control/TestAspect/api.mjs +3 -3
- package/_mjs/control/TestAspect/api.mjs.map +1 -1
- package/_mjs/control/TestClock/api.mjs +13 -21
- package/_mjs/control/TestClock/api.mjs.map +1 -1
- package/_mjs/control/TestConsole/api.mjs +10 -13
- package/_mjs/control/TestConsole/api.mjs.map +1 -1
- package/_mjs/control/TestEnvironment.mjs.map +1 -1
- package/_mjs/control/TestExecutor.mjs +6 -6
- package/_mjs/control/TestExecutor.mjs.map +1 -1
- package/_mjs/control/TestLogger.mjs.map +1 -1
- package/_mjs/control/TestRandom/api.mjs +10 -18
- package/_mjs/control/TestRandom/api.mjs.map +1 -1
- package/_mjs/control/TestRunner.mjs.map +1 -1
- package/_src/api.ts +8 -8
- package/_src/control/AbstractRunnableSpec.ts +2 -2
- package/_src/control/Annotations/api.ts +4 -4
- package/_src/control/AssertionIO/definition.ts +1 -1
- package/_src/control/DefaultTestReporter/render.ts +1 -1
- package/_src/control/FreeBooleanAlgebraIO/api.ts +4 -4
- package/_src/control/Gen/api/array.ts +2 -2
- package/_src/control/Gen/api/char.ts +10 -10
- package/_src/control/Gen/api/conc.ts +2 -2
- package/_src/control/Gen/api/double.ts +2 -2
- package/_src/control/Gen/api/float.ts +1 -1
- package/_src/control/Gen/api/string.ts +8 -8
- package/_src/control/Gen/api.ts +20 -20
- package/_src/control/Gen/definition.ts +2 -0
- package/_src/control/Live/definition.ts +7 -7
- package/_src/control/RunnableSpec.ts +4 -4
- package/_src/control/Sample/api.ts +12 -12
- package/_src/control/Sized/api.ts +2 -2
- package/_src/control/Sized/live.ts +1 -1
- package/_src/control/Spec/api.ts +18 -21
- package/_src/control/Spec/definition.ts +3 -3
- package/_src/control/TestAspect/api.ts +12 -14
- package/_src/control/TestAspect/definition.ts +1 -1
- package/_src/control/TestClock/api.ts +10 -10
- package/_src/control/TestClock/definition.ts +3 -3
- package/_src/control/TestConsole/api.ts +5 -5
- package/_src/control/TestEnvironment.ts +11 -10
- package/_src/control/TestExecutor.ts +4 -6
- package/_src/control/TestLogger.ts +2 -2
- package/_src/control/TestRandom/api.ts +10 -10
- package/_src/control/TestRunner.ts +3 -3
- package/_src/data/TestConfig.ts +1 -1
- package/_src/util/math.ts +3 -3
- package/api.d.ts +5 -6
- package/control/AbstractRunnableSpec.d.ts +2 -3
- package/control/Annotations/api.d.ts +4 -5
- package/control/Annotations/live.d.ts +3 -3
- package/control/AssertionIO/definition.d.ts +1 -1
- package/control/DefaultRunnableSpec.d.ts +2 -2
- package/control/DefaultTestReporter/render.d.ts +1 -2
- package/control/FreeBooleanAlgebraIO/api.d.ts +4 -4
- package/control/Gen/api/array.d.ts +2 -3
- package/control/Gen/api/char.d.ts +9 -9
- package/control/Gen/api/conc.d.ts +2 -3
- package/control/Gen/api/double.d.ts +2 -2
- package/control/Gen/api/float.d.ts +1 -1
- package/control/Gen/api/string.d.ts +8 -9
- package/control/Gen/api.d.ts +19 -20
- package/control/Gen/definition.d.ts +2 -0
- package/control/Live/definition.d.ts +4 -6
- package/control/RunnableSpec.d.ts +2 -3
- package/control/Sample/api.d.ts +10 -10
- package/control/Sized/api.d.ts +2 -3
- package/control/Sized/live.d.ts +1 -2
- package/control/Spec/api.d.ts +12 -14
- package/control/Spec/definition.d.ts +4 -5
- package/control/TestAspect/api.d.ts +6 -7
- package/control/TestAspect/definition.d.ts +1 -1
- package/control/TestClock/api.d.ts +3 -4
- package/control/TestClock/definition.d.ts +3 -3
- package/control/TestConsole/api.d.ts +2 -3
- package/control/TestConsole/definition.d.ts +5 -5
- package/control/TestEnvironment.d.ts +2 -3
- package/control/TestExecutor.d.ts +2 -3
- package/control/TestLogger.d.ts +2 -3
- package/control/TestRandom/api.d.ts +10 -10
- package/control/TestRunner.d.ts +3 -4
- package/data/TestConfig.d.ts +5 -6
- package/package.json +4 -4
- package/util/math.d.ts +4 -4
package/_src/control/Gen/api.ts
CHANGED
|
@@ -14,7 +14,7 @@ import { Gen } from "./definition.js";
|
|
|
14
14
|
/**
|
|
15
15
|
* @tsplus static fncts.test.GenOps anyBigInt
|
|
16
16
|
*/
|
|
17
|
-
export const anyBigInt: Gen<
|
|
17
|
+
export const anyBigInt: Gen<never, bigint> = fromIOSample(
|
|
18
18
|
Random.nextBigIntBetween(BigInt(-1) << BigInt(255), (BigInt(1) << BigInt(255)) - BigInt(1)).map(
|
|
19
19
|
Sample.shrinkBigInt(BigInt(0)),
|
|
20
20
|
),
|
|
@@ -23,12 +23,12 @@ export const anyBigInt: Gen<unknown, bigint> = fromIOSample(
|
|
|
23
23
|
/**
|
|
24
24
|
* @tsplus static fncts.test.GenOps anyDouble
|
|
25
25
|
*/
|
|
26
|
-
export const anyDouble: Gen<
|
|
26
|
+
export const anyDouble: Gen<never, number> = Gen.fromIOSample(Random.nextDouble.map(Sample.shrinkFractional(0)));
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* @tsplus static fncts.test.GenOps anyInt
|
|
30
30
|
*/
|
|
31
|
-
export const anyInt: Gen<
|
|
31
|
+
export const anyInt: Gen<never, number> = Gen.fromIOSample(Random.nextInt.map(Sample.shrinkIntegral(0)));
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* @tsplus static fncts.test.GenOps bounded
|
|
@@ -40,14 +40,14 @@ export function bounded<R, A>(min: number, max: number, f: (n: number) => Gen<R,
|
|
|
40
40
|
/**
|
|
41
41
|
* @tsplus static fncts.test.GenOps constant
|
|
42
42
|
*/
|
|
43
|
-
export function constant<A>(a: A): Gen<
|
|
43
|
+
export function constant<A>(a: A): Gen<never, A> {
|
|
44
44
|
return new Gen(Stream.succeedNow(Just(Sample.noShrink(a))));
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
48
|
* @tsplus fluent fncts.test.Gen flatMap
|
|
49
49
|
*/
|
|
50
|
-
export function flatMap_<R, A, R1, B>(ma: Gen<R, A>, f: (a: A) => Gen<R1, B>): Gen<R
|
|
50
|
+
export function flatMap_<R, A, R1, B>(ma: Gen<R, A>, f: (a: A) => Gen<R1, B>): Gen<R | R1, B> {
|
|
51
51
|
return new Gen(
|
|
52
52
|
Sample.flatMapStream(ma.sample, (sample) => {
|
|
53
53
|
const values = f(sample.value).sample;
|
|
@@ -67,7 +67,7 @@ export function defer<R, A>(gen: Lazy<Gen<R, A>>): Gen<R, A> {
|
|
|
67
67
|
/**
|
|
68
68
|
* @tsplus static fncts.test.GenOps empty
|
|
69
69
|
*/
|
|
70
|
-
export const empty: Gen<
|
|
70
|
+
export const empty: Gen<never, never> = new Gen(Stream.empty);
|
|
71
71
|
|
|
72
72
|
/**
|
|
73
73
|
* @tsplus fluent fncts.test.Gen filter
|
|
@@ -88,7 +88,7 @@ export function filterNot_<R, A>(fa: Gen<R, A>, p: Predicate<A>): Gen<R, A> {
|
|
|
88
88
|
/**
|
|
89
89
|
* @tsplus getter fncts.test.Gen flatten
|
|
90
90
|
*/
|
|
91
|
-
export function flatten<R, R1, A>(mma: Gen<R, Gen<R1, A>>): Gen<R
|
|
91
|
+
export function flatten<R, R1, A>(mma: Gen<R, Gen<R1, A>>): Gen<R | R1, A> {
|
|
92
92
|
return mma.flatMap(identity);
|
|
93
93
|
}
|
|
94
94
|
|
|
@@ -109,7 +109,7 @@ export function fromIOSample<R, A>(effect: IO<R, never, Sample<R, A>>): Gen<R, A
|
|
|
109
109
|
/**
|
|
110
110
|
* @tsplus static fncts.test.GenOps int
|
|
111
111
|
*/
|
|
112
|
-
export function int(constraints: NumberConstraints = {}): Gen<
|
|
112
|
+
export function int(constraints: NumberConstraints = {}): Gen<never, number> {
|
|
113
113
|
return Gen.fromIOSample(
|
|
114
114
|
IO.defer(() => {
|
|
115
115
|
const min = constraints.min ?? -0x80000000;
|
|
@@ -133,7 +133,7 @@ export function map_<R, A, B>(self: Gen<R, A>, f: (a: A) => B): Gen<R, B> {
|
|
|
133
133
|
/**
|
|
134
134
|
* @tsplus fluent fncts.test.Gen mapIO
|
|
135
135
|
*/
|
|
136
|
-
export function mapIO_<R, A, R1, B>(self: Gen<R, A>, f: (a: A) => IO<R1, never, B>): Gen<R
|
|
136
|
+
export function mapIO_<R, A, R1, B>(self: Gen<R, A>, f: (a: A) => IO<R1, never, B>): Gen<R | R1, B> {
|
|
137
137
|
return new Gen(
|
|
138
138
|
self.sample.mapIO((maybeSample) =>
|
|
139
139
|
maybeSample.match(
|
|
@@ -147,17 +147,17 @@ export function mapIO_<R, A, R1, B>(self: Gen<R, A>, f: (a: A) => IO<R1, never,
|
|
|
147
147
|
/**
|
|
148
148
|
* @tsplus static fncts.test.GenOps exponential
|
|
149
149
|
*/
|
|
150
|
-
export const exponential: Gen<
|
|
150
|
+
export const exponential: Gen<never, number> = Gen.uniform.map((n) => -Math.log(1 - n));
|
|
151
151
|
|
|
152
152
|
/**
|
|
153
153
|
* @tsplus static fncts.test.GenOps size
|
|
154
154
|
*/
|
|
155
|
-
export const size: Gen<
|
|
155
|
+
export const size: Gen<Sized, number> = Gen.fromIO(Sized.size);
|
|
156
156
|
|
|
157
157
|
/**
|
|
158
158
|
* @tsplus static fncts.test.GenOps medium
|
|
159
159
|
*/
|
|
160
|
-
export function medium<R, A>(f: (n: number) => Gen<R, A>, min = 0): Gen<R
|
|
160
|
+
export function medium<R, A>(f: (n: number) => Gen<R, A>, min = 0): Gen<R | Sized, A> {
|
|
161
161
|
return Gen.size
|
|
162
162
|
.flatMap((max) => Gen.exponential.map((n) => clamp(Math.round((n * max) / 10.0), min, max)))
|
|
163
163
|
.reshrink(Sample.shrinkIntegral(min))
|
|
@@ -200,9 +200,9 @@ export function oneOf<A extends ReadonlyArray<Gen<any, any>>>(...gens: A): Gen<_
|
|
|
200
200
|
/**
|
|
201
201
|
* @tsplus fluent fncts.test.Gen reshrink
|
|
202
202
|
*/
|
|
203
|
-
export function reshrink_<R, A, R1, B>(gen: Gen<R, A>, f: (a: A) => Sample<R1, B>): Gen<R
|
|
203
|
+
export function reshrink_<R, A, R1, B>(gen: Gen<R, A>, f: (a: A) => Sample<R1, B>): Gen<R | R1, B> {
|
|
204
204
|
return new Gen(
|
|
205
|
-
(gen.sample as Stream<R
|
|
205
|
+
(gen.sample as Stream<R | R1, never, Maybe<Sample<R, A>>>).map((maybeSample) =>
|
|
206
206
|
maybeSample.map((sample) => f(sample.value)),
|
|
207
207
|
),
|
|
208
208
|
);
|
|
@@ -211,14 +211,14 @@ export function reshrink_<R, A, R1, B>(gen: Gen<R, A>, f: (a: A) => Sample<R1, B
|
|
|
211
211
|
/**
|
|
212
212
|
* @tsplus static fncts.test.GenOps sized
|
|
213
213
|
*/
|
|
214
|
-
export function sized<R, A>(f: (size: number) => Gen<R, A>): Gen<R
|
|
214
|
+
export function sized<R, A>(f: (size: number) => Gen<R, A>): Gen<R | Sized, A> {
|
|
215
215
|
return Gen.size.flatMap(f);
|
|
216
216
|
}
|
|
217
217
|
|
|
218
218
|
/**
|
|
219
219
|
* @tsplus static fncts.test.GenOps small
|
|
220
220
|
*/
|
|
221
|
-
export function small<R, A>(f: (size: number) => Gen<R, A>, min = 0): Gen<R
|
|
221
|
+
export function small<R, A>(f: (size: number) => Gen<R, A>, min = 0): Gen<R | Sized, A> {
|
|
222
222
|
return Gen.size
|
|
223
223
|
.flatMap((max) => Gen.exponential.map((n) => clamp(Math.round((n * max) / 25), min, max)))
|
|
224
224
|
.reshrink(Sample.shrinkIntegral(min))
|
|
@@ -228,7 +228,7 @@ export function small<R, A>(f: (size: number) => Gen<R, A>, min = 0): Gen<R & Ha
|
|
|
228
228
|
/**
|
|
229
229
|
* @tsplus static fncts.test.GenOps unfoldGen
|
|
230
230
|
*/
|
|
231
|
-
export function unfoldGen<S, R, A>(s: S, f: (s: S) => Gen<R, readonly [S, A]>): Gen<R
|
|
231
|
+
export function unfoldGen<S, R, A>(s: S, f: (s: S) => Gen<R, readonly [S, A]>): Gen<R | Sized, Conc<A>> {
|
|
232
232
|
return Gen.small((n) => Gen.unfoldGenN(n, s, f));
|
|
233
233
|
}
|
|
234
234
|
|
|
@@ -243,12 +243,12 @@ export function unfoldGenN<S, R, A>(n: number, s: S, f: (s: S) => Gen<R, readonl
|
|
|
243
243
|
/**
|
|
244
244
|
* @tsplus static fncts.test.GenOps uniform
|
|
245
245
|
*/
|
|
246
|
-
export const uniform: Gen<
|
|
246
|
+
export const uniform: Gen<never, number> = Gen.fromIOSample(Random.nextDouble.map(Sample.shrinkFractional(0.0)));
|
|
247
247
|
|
|
248
248
|
/**
|
|
249
249
|
* @tsplus static fncts.test.GenOps unwrap
|
|
250
250
|
*/
|
|
251
|
-
export function unwrap<R, R1, A>(effect: URIO<R, Gen<R1, A>>): Gen<R
|
|
251
|
+
export function unwrap<R, R1, A>(effect: URIO<R, Gen<R1, A>>): Gen<R | R1, A> {
|
|
252
252
|
return Gen.fromIO(effect).flatten;
|
|
253
253
|
}
|
|
254
254
|
|
|
@@ -271,6 +271,6 @@ export function weighted<R, A>(...gens: ReadonlyArray<readonly [Gen<R, A>, numbe
|
|
|
271
271
|
/**
|
|
272
272
|
* @tsplus fluent fncts.test.Gen zipWith
|
|
273
273
|
*/
|
|
274
|
-
export function zipWith_<R, A, R1, B, C>(self: Gen<R, A>, that: Gen<R1, B>, f: (a: A, b: B) => C): Gen<R
|
|
274
|
+
export function zipWith_<R, A, R1, B, C>(self: Gen<R, A>, that: Gen<R1, B>, f: (a: A, b: B) => C): Gen<R | R1, C> {
|
|
275
275
|
return self.flatMap((a) => that.map((b) => f(a, b)));
|
|
276
276
|
}
|
|
@@ -13,7 +13,7 @@ export const LiveTag = Tag<Live>();
|
|
|
13
13
|
export abstract class Live {
|
|
14
14
|
abstract provide<R, E, A>(io: IO<R, E, A>): IO<R, E, A>;
|
|
15
15
|
|
|
16
|
-
static Default: Layer<IOEnv, never,
|
|
16
|
+
static Default: Layer<IOEnv, never, Live> = Layer.fromIO(
|
|
17
17
|
IO.environmentWith(
|
|
18
18
|
(env) =>
|
|
19
19
|
new (class extends Live {
|
|
@@ -25,7 +25,7 @@ export abstract class Live {
|
|
|
25
25
|
LiveTag,
|
|
26
26
|
);
|
|
27
27
|
|
|
28
|
-
static Live<R extends
|
|
28
|
+
static Live<R extends Live, E, A>(io: IO<R, E, A>): IO<R | Live, E, A> {
|
|
29
29
|
return IO.serviceWithIO((live) => live.provide(io), LiveTag);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -35,13 +35,13 @@ export abstract class Live {
|
|
|
35
35
|
*/
|
|
36
36
|
export function withLive_<R, E, A, E1, B>(
|
|
37
37
|
io: IO<R, E, A>,
|
|
38
|
-
f: (_: IO<
|
|
39
|
-
): IO<
|
|
38
|
+
f: (_: IO<never, E, A>) => IO<IOEnv, E1, B>,
|
|
39
|
+
): IO<Exclude<R, Live>, E | E1, B> {
|
|
40
40
|
// @ts-expect-error
|
|
41
|
-
return IO.environment<R
|
|
41
|
+
return IO.environment<R | Live>().flatMap((r) => Live.Live(f(io.provideEnvironment(r))));
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
export function withLive<R extends
|
|
45
|
-
return <E1, B>(f: (_: IO<R, E, A>) => IO<R, E1, B>): IO<R
|
|
44
|
+
export function withLive<R extends Live, E, A>(io: IO<R, E, A>) {
|
|
45
|
+
return <E1, B>(f: (_: IO<R, E, A>) => IO<R, E1, B>): IO<R | Live, E1, B> =>
|
|
46
46
|
IOEnv.services.getWith((services) => Live.Live(f(IOEnv.services.locally(services)(io))));
|
|
47
47
|
}
|
|
@@ -9,10 +9,10 @@ import { TestLogger } from "@fncts/test/control/TestLogger";
|
|
|
9
9
|
|
|
10
10
|
export abstract class RunnableSpec<R, E> extends AbstractRunnableSpec<R, E> {
|
|
11
11
|
readonly _tag = "RunnableSpec";
|
|
12
|
-
run(spec: Spec<R, E>): URIO<
|
|
12
|
+
run(spec: Spec<R, E>): URIO<TestLogger, number> {
|
|
13
13
|
const self = this;
|
|
14
|
-
return
|
|
15
|
-
const results =
|
|
14
|
+
return Do((_) => {
|
|
15
|
+
const results = _(self.runSpec(spec));
|
|
16
16
|
const hasFailures = results.exists(
|
|
17
17
|
matchTag(
|
|
18
18
|
{
|
|
@@ -22,7 +22,7 @@ export abstract class RunnableSpec<R, E> extends AbstractRunnableSpec<R, E> {
|
|
|
22
22
|
),
|
|
23
23
|
);
|
|
24
24
|
const summary = SummaryBuilder.buildSummary(results);
|
|
25
|
-
|
|
25
|
+
_(TestLogger.logLine(summary.summary));
|
|
26
26
|
return hasFailures ? 1 : 0;
|
|
27
27
|
});
|
|
28
28
|
}
|
|
@@ -10,7 +10,7 @@ import { Sample } from "./definition.js";
|
|
|
10
10
|
/**
|
|
11
11
|
* @tsplus fluent fncts.test.Sample flatMap
|
|
12
12
|
*/
|
|
13
|
-
export function flatMap_<R, A, R1, B>(ma: Sample<R, A>, f: (a: A) => Sample<R1, B>): Sample<R
|
|
13
|
+
export function flatMap_<R, A, R1, B>(ma: Sample<R, A>, f: (a: A) => Sample<R1, B>): Sample<R | R1, B> {
|
|
14
14
|
const sample = f(ma.value);
|
|
15
15
|
return new Sample(
|
|
16
16
|
sample.value,
|
|
@@ -45,7 +45,7 @@ export function filter_<R, A>(ma: Sample<R, A>, f: Predicate<A>): Stream<R, neve
|
|
|
45
45
|
export function foreach_<R, A, R1, B>(
|
|
46
46
|
ma: Sample<R, A>,
|
|
47
47
|
f: (a: A) => IO<R1, never, B>,
|
|
48
|
-
): IO<R
|
|
48
|
+
): IO<R | R1, never, Sample<R | R1, B>> {
|
|
49
49
|
return f(ma.value).map(
|
|
50
50
|
(b) =>
|
|
51
51
|
new Sample(
|
|
@@ -104,28 +104,28 @@ export function unfold<R, A, S>(s: S, f: (s: S) => readonly [A, Stream<R, never,
|
|
|
104
104
|
/**
|
|
105
105
|
* @tsplus fluent fncts.test.Sample zip
|
|
106
106
|
*/
|
|
107
|
-
export function zip<R, A, R1, B>(ma: Sample<R, A>, mb: Sample<R1, B>): Sample<R
|
|
107
|
+
export function zip<R, A, R1, B>(ma: Sample<R, A>, mb: Sample<R1, B>): Sample<R | R1, readonly [A, B]> {
|
|
108
108
|
return ma.zipWith(mb, tuple);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
/**
|
|
112
112
|
* @tsplus fluent fncts.test.Sample zipWith
|
|
113
113
|
*/
|
|
114
|
-
export function zipWith_<R, A, R1, B, C>(ma: Sample<R, A>, mb: Sample<R1, B>, f: (a: A, b: B) => C): Sample<R
|
|
114
|
+
export function zipWith_<R, A, R1, B, C>(ma: Sample<R, A>, mb: Sample<R1, B>, f: (a: A, b: B) => C): Sample<R | R1, C> {
|
|
115
115
|
return ma.flatMap((a) => map_(mb, (b) => f(a, b)));
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
/**
|
|
119
119
|
* @tsplus static fncts.test.SampleOps noShrink
|
|
120
120
|
*/
|
|
121
|
-
export function noShrink<A>(a: A): Sample<
|
|
121
|
+
export function noShrink<A>(a: A): Sample<never, A> {
|
|
122
122
|
return new Sample(a, Stream.empty);
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
/**
|
|
126
126
|
* @tsplus static fncts.test.SampleOps shrinkFractional
|
|
127
127
|
*/
|
|
128
|
-
export function shrinkFractional(smallest: number): (a: number) => Sample<
|
|
128
|
+
export function shrinkFractional(smallest: number): (a: number) => Sample<never, number> {
|
|
129
129
|
return (a) =>
|
|
130
130
|
Sample.unfold(a, (max) =>
|
|
131
131
|
tuple(
|
|
@@ -155,7 +155,7 @@ function bigIntAbs(x: bigint): bigint {
|
|
|
155
155
|
/**
|
|
156
156
|
* @tsplus static fncts.test.SampleOps shrinkBigInt
|
|
157
157
|
*/
|
|
158
|
-
export function shrinkBigInt(smallest: bigint): (a: bigint) => Sample<
|
|
158
|
+
export function shrinkBigInt(smallest: bigint): (a: bigint) => Sample<never, bigint> {
|
|
159
159
|
return (a) =>
|
|
160
160
|
Sample.unfold(a, (max) =>
|
|
161
161
|
tuple(
|
|
@@ -177,7 +177,7 @@ export function shrinkBigInt(smallest: bigint): (a: bigint) => Sample<unknown, b
|
|
|
177
177
|
/**
|
|
178
178
|
* @tsplus static fncts.test.SampleOps shrinkIntegral
|
|
179
179
|
*/
|
|
180
|
-
export function shrinkIntegral(smallest: number): (a: number) => Sample<
|
|
180
|
+
export function shrinkIntegral(smallest: number): (a: number) => Sample<never, number> {
|
|
181
181
|
return (a) =>
|
|
182
182
|
Sample.unfold(a, (max) =>
|
|
183
183
|
tuple(
|
|
@@ -199,7 +199,7 @@ export function shrinkIntegral(smallest: number): (a: number) => Sample<unknown,
|
|
|
199
199
|
/**
|
|
200
200
|
* @tsplus static fncts.test.SampleOps shrinkArrayInt64
|
|
201
201
|
*/
|
|
202
|
-
export function shrinkArrayInt64(target: ArrayInt64): (value: ArrayInt64) => Sample<
|
|
202
|
+
export function shrinkArrayInt64(target: ArrayInt64): (value: ArrayInt64) => Sample<never, ArrayInt64> {
|
|
203
203
|
return (value) =>
|
|
204
204
|
Sample.unfold(value, (max) =>
|
|
205
205
|
tuple(
|
|
@@ -219,8 +219,8 @@ export function shrinkArrayInt64(target: ArrayInt64): (value: ArrayInt64) => Sam
|
|
|
219
219
|
function mergeStream<R, A, R1, B>(
|
|
220
220
|
left: Stream<R, never, Maybe<A>>,
|
|
221
221
|
right: Stream<R1, never, Maybe<B>>,
|
|
222
|
-
): Stream<R
|
|
223
|
-
return flatMapStream(Stream.fromChunk(Conc(Just<Stream<R
|
|
222
|
+
): Stream<R | R1, never, Maybe<A | B>> {
|
|
223
|
+
return flatMapStream(Stream.fromChunk(Conc(Just<Stream<R | R1, never, Maybe<A | B>>>(left), Just(right))), identity);
|
|
224
224
|
}
|
|
225
225
|
|
|
226
226
|
/**
|
|
@@ -229,7 +229,7 @@ function mergeStream<R, A, R1, B>(
|
|
|
229
229
|
export function flatMapStream<R, A, R1, B>(
|
|
230
230
|
stream: Stream<R, never, Maybe<A>>,
|
|
231
231
|
f: (a: A) => Stream<R1, never, Maybe<B>>,
|
|
232
|
-
): Stream<R
|
|
232
|
+
): Stream<R | R1, never, Maybe<B>> {
|
|
233
233
|
return new Stream(
|
|
234
234
|
stream.rechunk(1).channel.concatMapWithCustom(
|
|
235
235
|
(values) =>
|
|
@@ -3,12 +3,12 @@ import { Sized } from "./definition.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* @tsplus static fncts.test.SizedOps size
|
|
5
5
|
*/
|
|
6
|
-
export const size: URIO<
|
|
6
|
+
export const size: URIO<Sized, number> = IO.serviceWithIO((sized) => sized.size, Sized.Tag);
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* @tsplus static fncts.test.SizedOps withSize
|
|
10
10
|
*/
|
|
11
11
|
export function withSize(size: number) {
|
|
12
|
-
return <R, E, A>(io: IO<R, E, A>): IO<R
|
|
12
|
+
return <R, E, A>(io: IO<R, E, A>): IO<R | Sized, E, A> =>
|
|
13
13
|
IO.serviceWithIO((sized) => sized.withSize(size)(io), Sized.Tag);
|
|
14
14
|
}
|
|
@@ -3,7 +3,7 @@ import { Sized } from "./definition.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* @tsplus static fncts.test.SizedOps Live
|
|
5
5
|
*/
|
|
6
|
-
export function Live(size: number): Layer<
|
|
6
|
+
export function Live(size: number): Layer<never, never, Sized> {
|
|
7
7
|
return Layer.scoped(
|
|
8
8
|
FiberRef.make(size).map(
|
|
9
9
|
(ref) =>
|
package/_src/control/Spec/api.ts
CHANGED
|
@@ -17,7 +17,7 @@ import { ExecCase, LabeledCase, MultipleCase, PSpec, ScopedCase, TestCase } from
|
|
|
17
17
|
/**
|
|
18
18
|
* @tsplus getter fncts.test.PSpec annotated
|
|
19
19
|
*/
|
|
20
|
-
export function annotated<R, E, T>(spec: PSpec<R, E, T>): PSpec<R
|
|
20
|
+
export function annotated<R, E, T>(spec: PSpec<R, E, T>): PSpec<R | Annotations, Annotated<E>, Annotated<T>> {
|
|
21
21
|
return spec.transform(
|
|
22
22
|
matchTag(
|
|
23
23
|
{
|
|
@@ -35,7 +35,7 @@ export function annotated<R, E, T>(spec: PSpec<R, E, T>): PSpec<R & Has<Annotati
|
|
|
35
35
|
export function combine_<R, E, T, R1, E1, T1>(
|
|
36
36
|
self: PSpec<R, E, T>,
|
|
37
37
|
that: PSpec<R1, E1, T1>,
|
|
38
|
-
): PSpec<R
|
|
38
|
+
): PSpec<R | R1, E | E1, T | T1> {
|
|
39
39
|
if (self.caseValue.isMultiple() && that.caseValue.isMultiple()) {
|
|
40
40
|
return MultipleCase(self.caseValue.specs.concat(that.caseValue.specs));
|
|
41
41
|
}
|
|
@@ -45,7 +45,7 @@ export function combine_<R, E, T, R1, E1, T1>(
|
|
|
45
45
|
if (that.caseValue.isMultiple()) {
|
|
46
46
|
return MultipleCase(that.caseValue.specs.prepend(self));
|
|
47
47
|
}
|
|
48
|
-
return MultipleCase(Conc<PSpec<R
|
|
48
|
+
return MultipleCase(Conc<PSpec<R | R1, E | E1, T | T1>>(self, that));
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
/**
|
|
@@ -60,8 +60,8 @@ export function contramapEnvironment_<R, E, T, R0>(
|
|
|
60
60
|
{
|
|
61
61
|
Scoped: ({ scoped }) =>
|
|
62
62
|
new ScopedCase(
|
|
63
|
-
scoped.contramapEnvironment((r: Environment<R0
|
|
64
|
-
Environment.empty.add(r.get(Scope.Tag), Scope.Tag).union(f(r)),
|
|
63
|
+
scoped.contramapEnvironment((r: Environment<R0 | Scope>) =>
|
|
64
|
+
Environment.empty.add(r.get(Scope.Tag), Scope.Tag).union(f(r as Environment<R0>)),
|
|
65
65
|
),
|
|
66
66
|
),
|
|
67
67
|
Test: ({ test, annotations }) => new TestCase(test.contramapEnvironment(f), annotations),
|
|
@@ -74,7 +74,7 @@ export function contramapEnvironment_<R, E, T, R0>(
|
|
|
74
74
|
/**
|
|
75
75
|
* @tsplus fluent fncts.test.PSpec countTests
|
|
76
76
|
*/
|
|
77
|
-
export function countTests_<R, E, T>(spec: PSpec<R, E, T>, f: (t: T) => boolean): IO<R
|
|
77
|
+
export function countTests_<R, E, T>(spec: PSpec<R, E, T>, f: (t: T) => boolean): IO<R | Scope, E, number> {
|
|
78
78
|
return spec.fold(
|
|
79
79
|
matchTag({
|
|
80
80
|
Exec: ({ spec }) => spec,
|
|
@@ -89,7 +89,7 @@ export function countTests_<R, E, T>(spec: PSpec<R, E, T>, f: (t: T) => boolean)
|
|
|
89
89
|
/**
|
|
90
90
|
* @tsplus static fncts.test.PSpecOps empty
|
|
91
91
|
*/
|
|
92
|
-
export const empty: PSpec<
|
|
92
|
+
export const empty: PSpec<never, never, never> = multipleCase(Conc.empty());
|
|
93
93
|
|
|
94
94
|
/**
|
|
95
95
|
* @tsplus static fncts.test.PSpecOps exec
|
|
@@ -105,8 +105,8 @@ export function exec<R, E, T>(spec: PSpec<R, E, T>, exec: ExecutionStrategy): PS
|
|
|
105
105
|
export function execute<R, E, T>(
|
|
106
106
|
self: PSpec<R, E, T>,
|
|
107
107
|
defExec: ExecutionStrategy,
|
|
108
|
-
): IO<R
|
|
109
|
-
return IO.environmentWithIO((r: Environment<R
|
|
108
|
+
): IO<R | Scope, never, PSpec<never, E, T>> {
|
|
109
|
+
return IO.environmentWithIO((r: Environment<R | Scope>) =>
|
|
110
110
|
self.provideEnvironment(r).foreachExec(IO.failCauseNow, IO.succeedNow, defExec),
|
|
111
111
|
);
|
|
112
112
|
}
|
|
@@ -186,9 +186,9 @@ export function fold_<R, E, T, Z>(spec: PSpec<R, E, T>, f: (_: SpecCase<R, E, T,
|
|
|
186
186
|
*/
|
|
187
187
|
export function foldScoped_<R, E, T, R1, E1, Z>(
|
|
188
188
|
spec: PSpec<R, E, T>,
|
|
189
|
-
f: (_: SpecCase<R, E, T, Z>) => IO<R1
|
|
189
|
+
f: (_: SpecCase<R, E, T, Z>) => IO<R1 | Scope, E1, Z>,
|
|
190
190
|
defExec: ExecutionStrategy,
|
|
191
|
-
): IO<R
|
|
191
|
+
): IO<R | R1 | Scope, E1, Z> {
|
|
192
192
|
return matchTag_(spec.caseValue, {
|
|
193
193
|
Exec: ({ exec, spec }) => spec.foldScoped(f, exec).flatMap((z) => f(new ExecCase(exec, z))),
|
|
194
194
|
Labeled: ({ label, spec }) => spec.foldScoped(f, defExec).flatMap((z) => f(new LabeledCase(label, z))),
|
|
@@ -213,7 +213,7 @@ export function foreachExec_<R, E, T, R1, E1, A, R2, E2, B>(
|
|
|
213
213
|
failure: (c: Cause<E>) => IO<R1, E1, A>,
|
|
214
214
|
success: (t: T) => IO<R2, E2, B>,
|
|
215
215
|
defExec: ExecutionStrategy,
|
|
216
|
-
): IO<R
|
|
216
|
+
): IO<R | R1 | R2 | Scope, never, PSpec<R | R1 | R2, E1 | E2, A | B>> {
|
|
217
217
|
return spec.foldScoped(
|
|
218
218
|
matchTag({
|
|
219
219
|
Exec: ({ exec, spec }) => IO.succeedNow(ExecCase(spec, exec)),
|
|
@@ -248,7 +248,7 @@ export function labeledCase<R, E, T>(spec: PSpec<R, E, T>, label: string): PSpec
|
|
|
248
248
|
* @tsplus static fncts.test.PSpecOps scoped
|
|
249
249
|
* @tsplus static fncts.test.PSpec.ScopedCaseOps __call
|
|
250
250
|
*/
|
|
251
|
-
export function scoped<R, E, T>(managed: IO<R
|
|
251
|
+
export function scoped<R, E, T>(managed: IO<R | Scope, E, PSpec<R, E, T>>): PSpec<R, E, T> {
|
|
252
252
|
return new PSpec(new ScopedCase(managed));
|
|
253
253
|
}
|
|
254
254
|
|
|
@@ -292,21 +292,21 @@ export function multipleCase<R, E, T>(specs: Conc<PSpec<R, E, T>>): PSpec<R, E,
|
|
|
292
292
|
/**
|
|
293
293
|
* @tsplus fluent fncts.test.PSpec provideEnvironment
|
|
294
294
|
*/
|
|
295
|
-
export function provideEnvironment_<R, E, T>(self: PSpec<R, E, T>, r: Environment<R>): PSpec<
|
|
295
|
+
export function provideEnvironment_<R, E, T>(self: PSpec<R, E, T>, r: Environment<R>): PSpec<never, E, T> {
|
|
296
296
|
return self.contramapEnvironment(() => r);
|
|
297
297
|
}
|
|
298
298
|
|
|
299
299
|
/**
|
|
300
300
|
* @tsplus fluent fncts.test.PSpec provideLayer
|
|
301
301
|
*/
|
|
302
|
-
export function provideLayer_<RIn, E, ROut
|
|
302
|
+
export function provideLayer_<RIn, E, ROut, E1, T>(
|
|
303
303
|
self: PSpec<ROut, E1, T>,
|
|
304
304
|
layer: Layer<RIn, E, ROut>,
|
|
305
305
|
): PSpec<RIn, E | E1, T> {
|
|
306
306
|
return self.transform(
|
|
307
307
|
matchTag(
|
|
308
308
|
{
|
|
309
|
-
Scoped: ({ scoped }) => new ScopedCase(scoped.provideLayer(Layer.environment<
|
|
309
|
+
Scoped: ({ scoped }) => new ScopedCase(scoped.provideLayer(Layer.environment<Scope>().and(layer))),
|
|
310
310
|
Test: ({ test, annotations }) => new TestCase(test.provideLayer(layer), annotations),
|
|
311
311
|
},
|
|
312
312
|
identity,
|
|
@@ -359,7 +359,7 @@ export function annotate_<R, E, T, V>(self: PSpec<R, E, T>, key: TestAnnotation<
|
|
|
359
359
|
export function whenIO_<R, E, R1, E1>(
|
|
360
360
|
self: PSpec<R, E, TestSuccess>,
|
|
361
361
|
b: IO<R1, E1, boolean>,
|
|
362
|
-
): PSpec<R
|
|
362
|
+
): PSpec<R | R1 | Annotations, E | E1, TestSuccess> {
|
|
363
363
|
return matchTag_(self.caseValue, {
|
|
364
364
|
Exec: (c) => exec(c.spec.whenIO(b), c.exec),
|
|
365
365
|
Labeled: ({ label, spec }) => Spec.labeled(spec.whenIO(b), label),
|
|
@@ -376,9 +376,6 @@ export function whenIO_<R, E, R1, E1>(
|
|
|
376
376
|
/**
|
|
377
377
|
* @tsplus fluent fncts.test.PSpec when
|
|
378
378
|
*/
|
|
379
|
-
export function when_<R, E>(
|
|
380
|
-
self: PSpec<R, E, TestSuccess>,
|
|
381
|
-
b: Lazy<boolean>,
|
|
382
|
-
): PSpec<R & Has<Annotations>, E, TestSuccess> {
|
|
379
|
+
export function when_<R, E>(self: PSpec<R, E, TestSuccess>, b: Lazy<boolean>): PSpec<R | Annotations, E, TestSuccess> {
|
|
383
380
|
return self.whenIO(IO.succeed(b));
|
|
384
381
|
}
|
|
@@ -8,7 +8,7 @@ import type { _A, _E, _R } from "@fncts/base/types.js";
|
|
|
8
8
|
* @tsplus companion fncts.test.PSpecOps
|
|
9
9
|
*/
|
|
10
10
|
export class PSpec<R, E, T> {
|
|
11
|
-
readonly _R!: (
|
|
11
|
+
readonly _R!: () => R;
|
|
12
12
|
readonly _E!: () => E;
|
|
13
13
|
readonly _A!: () => T;
|
|
14
14
|
|
|
@@ -56,7 +56,7 @@ export class LabeledCase<Spec> {
|
|
|
56
56
|
*/
|
|
57
57
|
export class ScopedCase<R, E, Spec> {
|
|
58
58
|
readonly _tag = SpecCaseTag.Scoped;
|
|
59
|
-
constructor(readonly scoped: IO<R
|
|
59
|
+
constructor(readonly scoped: IO<R | Scope, E, Spec>) {}
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/**
|
|
@@ -71,7 +71,7 @@ export class MultipleCase<Spec> {
|
|
|
71
71
|
* @tsplus companion fncts.test.PSpec.TestCaseOps
|
|
72
72
|
*/
|
|
73
73
|
export class TestCase<R, E, T> {
|
|
74
|
-
readonly _R!: (
|
|
74
|
+
readonly _R!: () => R;
|
|
75
75
|
readonly _E!: () => E;
|
|
76
76
|
readonly _A!: () => T;
|
|
77
77
|
readonly _tag = SpecCaseTag.Test;
|
|
@@ -15,10 +15,10 @@ export type TestAspectPoly = TestAspect<unknown, never>;
|
|
|
15
15
|
|
|
16
16
|
export const id: TestAspectPoly = Function.identity;
|
|
17
17
|
|
|
18
|
-
export const ignore: TestAspectAtLeastR<
|
|
18
|
+
export const ignore: TestAspectAtLeastR<Annotations> = (spec) => spec.when(false);
|
|
19
19
|
|
|
20
20
|
export function perTest<R, E>(
|
|
21
|
-
f: <R1, E1>(test: IO<R1, TestFailure<E1>, TestSuccess>) => IO<R
|
|
21
|
+
f: <R1, E1>(test: IO<R1, TestFailure<E1>, TestSuccess>) => IO<R | R1, TestFailure<E | E1>, TestSuccess>,
|
|
22
22
|
): TestAspect<R, E> {
|
|
23
23
|
return (spec) =>
|
|
24
24
|
spec.transform(
|
|
@@ -41,8 +41,8 @@ export function after<R, E, A>(effect: IO<R, E, A>): TestAspect<R, E> {
|
|
|
41
41
|
);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
export function around<R, E, A, R1>(before: IO<R, E, A>, after: (a: A) => IO<R1, never, any>): TestAspect<R
|
|
45
|
-
return perTest<R
|
|
44
|
+
export function around<R, E, A, R1>(before: IO<R, E, A>, after: (a: A) => IO<R1, never, any>): TestAspect<R | R1, E> {
|
|
45
|
+
return perTest<R | R1, E>((test) =>
|
|
46
46
|
before.catchAllCause((c) => IO.fail(new RuntimeFailure(c))).bracket(() => test, after),
|
|
47
47
|
);
|
|
48
48
|
}
|
|
@@ -50,9 +50,9 @@ export function around<R, E, A, R1>(before: IO<R, E, A>, after: (a: A) => IO<R1,
|
|
|
50
50
|
export function aroundAll<R, E, A, R1>(
|
|
51
51
|
before: IO<R, E, A>,
|
|
52
52
|
after: (a: A) => IO<R1, never, any>,
|
|
53
|
-
): TestAspect<R
|
|
53
|
+
): TestAspect<R | R1, E> {
|
|
54
54
|
return <R0, E0>(spec: Spec<R0, E0>) =>
|
|
55
|
-
Spec.scoped<R
|
|
55
|
+
Spec.scoped<R | R1 | R0, TestFailure<E | E0>, TestSuccess>(
|
|
56
56
|
IO.acquireRelease(before, after)
|
|
57
57
|
.mapError((e) => TestFailure.fail(e))
|
|
58
58
|
.as(spec),
|
|
@@ -69,12 +69,10 @@ export function beforeAll<R0, E0>(effect: IO<R0, E0, any>): TestAspect<R0, E0> {
|
|
|
69
69
|
|
|
70
70
|
export const eventually = perTest((test) => test.eventually);
|
|
71
71
|
|
|
72
|
-
export function repeat<R0>(schedule: Schedule<R0, TestSuccess, any>): TestAspect<R0 &
|
|
73
|
-
return perTest<R0
|
|
74
|
-
<R1, E1>(
|
|
75
|
-
|
|
76
|
-
): IO<R0 & R1 & Has<Annotations>, TestFailure<E1>, TestSuccess> =>
|
|
77
|
-
IO.environmentWithIO((r: Environment<R0 & R1 & Has<Annotations>>) =>
|
|
72
|
+
export function repeat<R0>(schedule: Schedule<R0, TestSuccess, any>): TestAspect<R0 & Annotations, never> {
|
|
73
|
+
return perTest<R0 | Annotations, never>(
|
|
74
|
+
<R1, E1>(test: IO<R1, TestFailure<E1>, TestSuccess>): IO<R0 | R1 | Annotations, TestFailure<E1>, TestSuccess> =>
|
|
75
|
+
IO.environmentWithIO((r: Environment<R0 | R1 | Annotations>) =>
|
|
78
76
|
test
|
|
79
77
|
.provideEnvironment(r)
|
|
80
78
|
.repeat(
|
|
@@ -88,9 +86,9 @@ export function repeat<R0>(schedule: Schedule<R0, TestSuccess, any>): TestAspect
|
|
|
88
86
|
);
|
|
89
87
|
}
|
|
90
88
|
|
|
91
|
-
export function timeoutWarning(duration: Duration): TestAspect<
|
|
89
|
+
export function timeoutWarning(duration: Duration): TestAspect<Live, any> {
|
|
92
90
|
return <R1, E1>(spec: Spec<R1, E1>) => {
|
|
93
|
-
const loop = (labels: Vector<string>, spec: Spec<R1, E1>): Spec<R1
|
|
91
|
+
const loop = (labels: Vector<string>, spec: Spec<R1, E1>): Spec<R1 | Live, E1> =>
|
|
94
92
|
matchTag_(spec.caseValue, {
|
|
95
93
|
Exec: ({ exec, spec }) => Spec.exec(loop(labels, spec), exec),
|
|
96
94
|
Labeled: ({ label, spec }) => Spec.labeled(loop(labels.append(label), spec), label),
|
|
@@ -6,17 +6,17 @@ import { Data, Start, TestClock } from "@fncts/test/control/TestClock/definition
|
|
|
6
6
|
/**
|
|
7
7
|
* @tsplus static fncts.test.TestClockOps make
|
|
8
8
|
*/
|
|
9
|
-
export function make(data: Data): Layer<
|
|
9
|
+
export function make(data: Data): Layer<Live | Annotations, never, TestClock> {
|
|
10
10
|
return Layer.scoped(
|
|
11
|
-
|
|
12
|
-
const live =
|
|
13
|
-
const annotations =
|
|
14
|
-
const ref =
|
|
15
|
-
const synchronized =
|
|
16
|
-
const test =
|
|
11
|
+
Do((_) => {
|
|
12
|
+
const live = _(IO.service(Live.Tag));
|
|
13
|
+
const annotations = _(IO.service(Annotations.Tag));
|
|
14
|
+
const ref = _(Ref.make(data));
|
|
15
|
+
const synchronized = _(Ref.Synchronized.make(Start));
|
|
16
|
+
const test = _(
|
|
17
17
|
IO.acquireRelease(IO.succeed(new TestClock(ref, live, annotations, synchronized)), (tc) => tc.warningDone),
|
|
18
18
|
);
|
|
19
|
-
|
|
19
|
+
_(IOEnv.services.locallyScopedWith((_) => _.add(test, TestClock.Tag)));
|
|
20
20
|
return test;
|
|
21
21
|
}),
|
|
22
22
|
TestClock.Tag,
|
|
@@ -26,11 +26,11 @@ export function make(data: Data): Layer<Has<Live> & Has<Annotations>, never, Has
|
|
|
26
26
|
/**
|
|
27
27
|
* @tsplus static fncts.test.TestClockOps Live
|
|
28
28
|
*/
|
|
29
|
-
export const live: Layer<
|
|
29
|
+
export const live: Layer<Live | Annotations, never, TestClock> = TestClock.make(new Data(0, Nil()));
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
32
|
* @tsplus static fncts.test.TestClockOps adjust
|
|
33
33
|
*/
|
|
34
|
-
export function adjust(duration: number): IO<
|
|
34
|
+
export function adjust(duration: number): IO<TestClock, never, void> {
|
|
35
35
|
return IO.serviceWithIO((service: TestClock) => service.adjust(duration), TestClock.Tag);
|
|
36
36
|
}
|
|
@@ -114,7 +114,7 @@ export class TestClock extends Clock {
|
|
|
114
114
|
);
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
private get freeze(): IO<
|
|
117
|
+
private get freeze(): IO<never, void, HashMap<FiberId, FiberStatus>> {
|
|
118
118
|
return this.supervizedFibers.flatMap((fibers) =>
|
|
119
119
|
IO.foldLeft(fibers, HashMap.makeDefault<FiberId, FiberStatus>(), (map, fiber) =>
|
|
120
120
|
fiber.status.flatMap((status) => {
|
|
@@ -166,7 +166,7 @@ export class TestClock extends Clock {
|
|
|
166
166
|
);
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
-
private get suspended(): IO<
|
|
169
|
+
private get suspended(): IO<never, void, HashMap<FiberId, FiberStatus>> {
|
|
170
170
|
return this.freeze.zip(this.delay > this.freeze).flatMap(([first, last]) => {
|
|
171
171
|
if (Equatable.strictEquals(first, last)) {
|
|
172
172
|
return IO.succeedNow(first);
|
|
@@ -190,7 +190,7 @@ export class TestClock extends Clock {
|
|
|
190
190
|
Start: () =>
|
|
191
191
|
Just(this.live.provide(Clock.sleep((5).seconds) > Console.print(warning)).interruptible.fork.map(Pending)),
|
|
192
192
|
},
|
|
193
|
-
() => Nothing<IO<
|
|
193
|
+
() => Nothing<IO<never, never, WarningData>>(),
|
|
194
194
|
),
|
|
195
195
|
);
|
|
196
196
|
}
|