@hegeldev/hegel 0.1.5 → 0.2.1
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/README.md +21 -4
- package/dist/generators/core.d.ts +2 -2
- package/dist/generators/core.d.ts.map +1 -1
- package/dist/generators/core.js.map +1 -1
- package/dist/index.d.ts +223 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +222 -7
- package/dist/index.js.map +1 -1
- package/dist/runner.d.ts +44 -18
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +114 -90
- package/dist/runner.js.map +1 -1
- package/dist/testCase.d.ts +6 -9
- package/dist/testCase.d.ts.map +1 -1
- package/dist/testCase.js +4 -7
- package/dist/testCase.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -36,8 +36,7 @@ function mySort(ls: number[]): number[] {
|
|
|
36
36
|
return [...new Set(result)];
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
test(
|
|
40
|
-
"my_sort matches builtin",
|
|
39
|
+
test("my_sort matches builtin", () =>
|
|
41
40
|
hegel.test((tc) => {
|
|
42
41
|
const vec1 = tc.draw(gs.arrays(gs.integers()));
|
|
43
42
|
const vec2 = mySort(vec1);
|
|
@@ -45,8 +44,7 @@ test(
|
|
|
45
44
|
if (JSON.stringify(sorted) !== JSON.stringify(vec2)) {
|
|
46
45
|
throw new Error(`sort mismatch: ${JSON.stringify(sorted)} != ${JSON.stringify(vec2)}`);
|
|
47
46
|
}
|
|
48
|
-
})
|
|
49
|
-
);
|
|
47
|
+
}));
|
|
50
48
|
```
|
|
51
49
|
|
|
52
50
|
This test will fail when run with `vitest`! Hegel will produce a minimal failing test case for us:
|
|
@@ -57,3 +55,22 @@ Error: sort mismatch: [0,0] != [0]
|
|
|
57
55
|
```
|
|
58
56
|
|
|
59
57
|
Hegel reports the minimal example showing that our sort is incorrectly dropping duplicates. If we remove the `new Set(...)` deduplication from `mySort()`, this test will then pass (because it's just comparing the standard sort against itself).
|
|
58
|
+
|
|
59
|
+
## Async tests
|
|
60
|
+
|
|
61
|
+
For async tests, use `hegel.testAsync`:
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import { test } from "vitest";
|
|
65
|
+
import * as hegel from "@hegeldev/hegel";
|
|
66
|
+
import * as gs from "@hegeldev/hegel/generators";
|
|
67
|
+
|
|
68
|
+
test("fetch returns a value matching its input", () =>
|
|
69
|
+
hegel.testAsync(async (tc) => {
|
|
70
|
+
const id = tc.draw(gs.integers({ minValue: 1, maxValue: 1000 }));
|
|
71
|
+
const result = await fetchUser(id);
|
|
72
|
+
if (result.id !== id) {
|
|
73
|
+
throw new Error(`Expected id=${id}, got ${result.id}`);
|
|
74
|
+
}
|
|
75
|
+
}));
|
|
76
|
+
```
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @packageDocumentation
|
|
5
5
|
*/
|
|
6
|
-
import { TestCase
|
|
6
|
+
import { TestCase } from "../testCase.js";
|
|
7
7
|
/**
|
|
8
8
|
* Base class for all generators. Generators produce values of type T
|
|
9
9
|
* synchronously by communicating with the hegel server.
|
|
10
10
|
*/
|
|
11
|
-
export declare abstract class Generator<T>
|
|
11
|
+
export declare abstract class Generator<T> {
|
|
12
12
|
/** @internal */
|
|
13
13
|
abstract doDraw(tc: TestCase): T;
|
|
14
14
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/generators/core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAuB,
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/generators/core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAuB,MAAM,gBAAgB,CAAC;AAE/D;;;GAGG;AACH,8BAAsB,SAAS,CAAC,CAAC;IAC/B,gBAAgB;IAChB,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,CAAC;IAEhC;;;;;;OAMG;IACH,OAAO,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAInC;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAIxC;;OAEG;IACH,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAIvD;;;OAGG;IACH,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC;CAGvD;AAED;;;;;;;GAOG;AACH,qBAAa,cAAc,CAAC,CAAC,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAEzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC;IAMxE,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,CAAC;IAId,OAAO,IAAI,cAAc,CAAC,CAAC,CAAC;IAIrC,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC;CAG1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/generators/core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAY,MAAM,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/generators/core.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,16 +1,229 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Hegel property-based testing library for TypeScript.
|
|
2
|
+
* Hegel is a property-based testing library for TypeScript. Hegel is based on
|
|
3
|
+
* [Hypothesis](https://github.com/hypothesisworks/hypothesis), using the
|
|
4
|
+
* [Hegel protocol](https://hegel.dev/).
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
+
* # Getting started
|
|
7
|
+
*
|
|
8
|
+
* This guide walks you through the basics of installing Hegel and writing your
|
|
9
|
+
* first tests.
|
|
10
|
+
*
|
|
11
|
+
* ## Install Hegel
|
|
12
|
+
*
|
|
13
|
+
* Add `@hegeldev/hegel` to your project as a dev dependency:
|
|
14
|
+
*
|
|
15
|
+
* ```bash
|
|
16
|
+
* npm install --save-dev @hegeldev/hegel
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Hegel requires Node 16+. Bun and Deno are not currently supported.
|
|
20
|
+
*
|
|
21
|
+
* ## Write your first test
|
|
22
|
+
*
|
|
23
|
+
* You're now ready to write your first test. We'll use
|
|
24
|
+
* [Vitest](https://vitest.dev/) as the test runner for the purposes of this
|
|
25
|
+
* guide. Create a new test file:
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* import { test } from "vitest";
|
|
29
|
+
* import * as hegel from "@hegeldev/hegel";
|
|
30
|
+
* import * as gs from "@hegeldev/hegel/generators";
|
|
31
|
+
*
|
|
32
|
+
* test(
|
|
33
|
+
* "integer self equality",
|
|
34
|
+
* hegel.test((tc) => {
|
|
35
|
+
* const n = tc.draw(gs.integers());
|
|
36
|
+
* if (n !== n) {
|
|
37
|
+
* throw new Error("integer was not equal to itself");
|
|
38
|
+
* }
|
|
39
|
+
* }),
|
|
40
|
+
* );
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* Now run the test using `npx vitest run`. You should see that this test
|
|
44
|
+
* passes.
|
|
45
|
+
*
|
|
46
|
+
* Let's look at what's happening in more detail. {@link test} runs your test
|
|
47
|
+
* many times (100, by default). The test function receives a {@link TestCase},
|
|
48
|
+
* which provides a {@link TestCase.draw | draw} method for drawing different
|
|
49
|
+
* values. This test draws a random integer and checks that it should be equal
|
|
50
|
+
* to itself.
|
|
51
|
+
*
|
|
52
|
+
* Next, try a test that fails:
|
|
53
|
+
*
|
|
54
|
+
* ```ts
|
|
55
|
+
* test(
|
|
56
|
+
* "integers always below 50",
|
|
57
|
+
* hegel.test((tc) => {
|
|
58
|
+
* const n = tc.draw(gs.integers());
|
|
59
|
+
* if (n >= 50) {
|
|
60
|
+
* throw new Error(`n=${n} is too large`);
|
|
61
|
+
* }
|
|
62
|
+
* }),
|
|
63
|
+
* );
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* This test asserts that any integer is less than 50, which is obviously
|
|
67
|
+
* incorrect. Hegel will find a test case that makes this assertion fail, and
|
|
68
|
+
* then shrink it to find the smallest counterexample — in this case, `n = 50`.
|
|
69
|
+
*
|
|
70
|
+
* To fix this test, you can constrain the integers you generate with the
|
|
71
|
+
* `minValue` and `maxValue` options:
|
|
72
|
+
*
|
|
73
|
+
* ```ts
|
|
74
|
+
* test(
|
|
75
|
+
* "bounded integers always below 50",
|
|
76
|
+
* hegel.test((tc) => {
|
|
77
|
+
* const n = tc.draw(gs.integers({ minValue: 0, maxValue: 49 }));
|
|
78
|
+
* if (n >= 50) {
|
|
79
|
+
* throw new Error(`n=${n} is too large`);
|
|
80
|
+
* }
|
|
81
|
+
* }),
|
|
82
|
+
* );
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* Run the test again. It should now pass.
|
|
86
|
+
*
|
|
87
|
+
* ## Use generators
|
|
88
|
+
*
|
|
89
|
+
* Hegel provides a rich library of generators that you can use out of the box.
|
|
90
|
+
* There are primitive generators, such as `integers`, `floats`, and `text`,
|
|
91
|
+
* and combinators that allow you to make generators out of other generators,
|
|
92
|
+
* such as `arrays` and `maps`.
|
|
93
|
+
*
|
|
94
|
+
* For example, you can use `arrays` to generate an array of integers:
|
|
95
|
+
*
|
|
96
|
+
* ```ts
|
|
97
|
+
* test(
|
|
98
|
+
* "append increases length",
|
|
99
|
+
* hegel.test((tc) => {
|
|
100
|
+
* const xs = tc.draw(gs.arrays(gs.integers()));
|
|
101
|
+
* const initialLength = xs.length;
|
|
102
|
+
* xs.push(tc.draw(gs.integers()));
|
|
103
|
+
* if (xs.length <= initialLength) {
|
|
104
|
+
* throw new Error("length did not increase");
|
|
105
|
+
* }
|
|
106
|
+
* }),
|
|
107
|
+
* );
|
|
108
|
+
* ```
|
|
109
|
+
*
|
|
110
|
+
* This test checks that appending an element to a random array of integers
|
|
111
|
+
* should always increase its length.
|
|
112
|
+
*
|
|
113
|
+
* You can also build composite values out of multiple generators. The simplest
|
|
114
|
+
* way is to draw fields directly inside the test body:
|
|
115
|
+
*
|
|
116
|
+
* ```ts
|
|
117
|
+
* interface Person {
|
|
118
|
+
* age: number;
|
|
119
|
+
* name: string;
|
|
120
|
+
* }
|
|
121
|
+
*
|
|
122
|
+
* test(
|
|
123
|
+
* "person",
|
|
124
|
+
* hegel.test((tc) => {
|
|
125
|
+
* const person: Person = {
|
|
126
|
+
* age: tc.draw(gs.integers({ minValue: 0, maxValue: 120 })),
|
|
127
|
+
* name: tc.draw(gs.text({ minSize: 1, maxSize: 50 })),
|
|
128
|
+
* };
|
|
129
|
+
* // use person in your test
|
|
130
|
+
* void person;
|
|
131
|
+
* }),
|
|
132
|
+
* );
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* For composite values you want to reuse across tests, build a generator with
|
|
136
|
+
* `composite` (imperative — call `tc.draw()` on inner generators inside a
|
|
137
|
+
* builder function) or `record` (declarative — pass a schema mapping field
|
|
138
|
+
* names to generators). Both produce a generator that supports `.map()`,
|
|
139
|
+
* `.filter()`, and `.flatMap()` like any other generator.
|
|
140
|
+
*
|
|
141
|
+
* ```ts
|
|
142
|
+
* const personGen = gs.record({
|
|
143
|
+
* age: gs.integers({ minValue: 0, maxValue: 120 }),
|
|
144
|
+
* name: gs.text({ minSize: 1, maxSize: 50 }),
|
|
145
|
+
* });
|
|
146
|
+
*
|
|
147
|
+
* test(
|
|
148
|
+
* "person via record",
|
|
149
|
+
* hegel.test((tc) => {
|
|
150
|
+
* const person = tc.draw(personGen);
|
|
151
|
+
* void person;
|
|
152
|
+
* }),
|
|
153
|
+
* );
|
|
154
|
+
* ```
|
|
155
|
+
*
|
|
156
|
+
* Note that you can feed the results of one `draw` into subsequent calls — this
|
|
157
|
+
* is what `composite` is for. For example, say that you extend the `Person`
|
|
158
|
+
* interface to include a `drivingLicense` boolean field, where the field
|
|
159
|
+
* depends on `age`:
|
|
160
|
+
*
|
|
161
|
+
* ```ts
|
|
162
|
+
* interface Person {
|
|
163
|
+
* age: number;
|
|
164
|
+
* name: string;
|
|
165
|
+
* drivingLicense: boolean;
|
|
166
|
+
* }
|
|
167
|
+
*
|
|
168
|
+
* const personGen = gs.composite<Person>((tc) => {
|
|
169
|
+
* const age = tc.draw(gs.integers({ minValue: 0, maxValue: 120 }));
|
|
170
|
+
* const name = tc.draw(gs.text({ minSize: 1, maxSize: 50 }));
|
|
171
|
+
* const drivingLicense = age >= 18 ? tc.draw(gs.booleans()) : false;
|
|
172
|
+
* return { age, name, drivingLicense };
|
|
173
|
+
* });
|
|
174
|
+
* ```
|
|
175
|
+
*
|
|
176
|
+
* ## Debug your failing test cases
|
|
177
|
+
*
|
|
178
|
+
* Use the {@link TestCase.note | note} method to attach debug information:
|
|
179
|
+
*
|
|
180
|
+
* ```ts
|
|
181
|
+
* test(
|
|
182
|
+
* "addition is commutative",
|
|
183
|
+
* hegel.test((tc) => {
|
|
184
|
+
* const x = tc.draw(gs.integers());
|
|
185
|
+
* const y = tc.draw(gs.integers());
|
|
186
|
+
* tc.note(`x + y = ${x + y}, y + x = ${y + x}`);
|
|
187
|
+
* if (x + y !== y + x) {
|
|
188
|
+
* throw new Error("addition is not commutative");
|
|
189
|
+
* }
|
|
190
|
+
* }),
|
|
191
|
+
* );
|
|
192
|
+
* ```
|
|
193
|
+
*
|
|
194
|
+
* Notes only appear when Hegel replays the minimal failing example.
|
|
195
|
+
*
|
|
196
|
+
* ## Change the number of test cases
|
|
197
|
+
*
|
|
198
|
+
* By default Hegel runs 100 test cases. To override this, pass a
|
|
199
|
+
* {@link Settings} override as the second argument to {@link test}:
|
|
200
|
+
*
|
|
201
|
+
* ```ts
|
|
202
|
+
* test(
|
|
203
|
+
* "integers many",
|
|
204
|
+
* hegel.test(
|
|
205
|
+
* (tc) => {
|
|
206
|
+
* const n = tc.draw(gs.integers());
|
|
207
|
+
* if (n !== n) {
|
|
208
|
+
* throw new Error("integer was not equal to itself");
|
|
209
|
+
* }
|
|
210
|
+
* },
|
|
211
|
+
* { testCases: 500 },
|
|
212
|
+
* ),
|
|
213
|
+
* );
|
|
214
|
+
* ```
|
|
215
|
+
*
|
|
216
|
+
* ## Learning more
|
|
217
|
+
*
|
|
218
|
+
* - Browse the `@hegeldev/hegel/generators` module for the full list of
|
|
219
|
+
* available generators.
|
|
220
|
+
* - See {@link Settings} for more configuration settings to customize how
|
|
221
|
+
* your test runs.
|
|
6
222
|
*
|
|
7
223
|
* @packageDocumentation
|
|
8
224
|
*/
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export {
|
|
12
|
-
export type { Settings
|
|
13
|
-
export type { Packet } from "./protocol.js";
|
|
14
|
-
export { Connection, Stream } from "./connection.js";
|
|
15
|
-
export { HegelSession, HEGEL_SERVER_VERSION } from "./session.js";
|
|
225
|
+
export * as generators from "./generators/index.js";
|
|
226
|
+
export { TestCase } from "./testCase.js";
|
|
227
|
+
export { test, testAsync, Verbosity, HealthCheck, Database } from "./runner.js";
|
|
228
|
+
export type { Settings } from "./runner.js";
|
|
16
229
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+NG;AAEH,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,228 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Hegel property-based testing library for TypeScript.
|
|
2
|
+
* Hegel is a property-based testing library for TypeScript. Hegel is based on
|
|
3
|
+
* [Hypothesis](https://github.com/hypothesisworks/hypothesis), using the
|
|
4
|
+
* [Hegel protocol](https://hegel.dev/).
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
+
* # Getting started
|
|
7
|
+
*
|
|
8
|
+
* This guide walks you through the basics of installing Hegel and writing your
|
|
9
|
+
* first tests.
|
|
10
|
+
*
|
|
11
|
+
* ## Install Hegel
|
|
12
|
+
*
|
|
13
|
+
* Add `@hegeldev/hegel` to your project as a dev dependency:
|
|
14
|
+
*
|
|
15
|
+
* ```bash
|
|
16
|
+
* npm install --save-dev @hegeldev/hegel
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Hegel requires Node 16+. Bun and Deno are not currently supported.
|
|
20
|
+
*
|
|
21
|
+
* ## Write your first test
|
|
22
|
+
*
|
|
23
|
+
* You're now ready to write your first test. We'll use
|
|
24
|
+
* [Vitest](https://vitest.dev/) as the test runner for the purposes of this
|
|
25
|
+
* guide. Create a new test file:
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* import { test } from "vitest";
|
|
29
|
+
* import * as hegel from "@hegeldev/hegel";
|
|
30
|
+
* import * as gs from "@hegeldev/hegel/generators";
|
|
31
|
+
*
|
|
32
|
+
* test(
|
|
33
|
+
* "integer self equality",
|
|
34
|
+
* hegel.test((tc) => {
|
|
35
|
+
* const n = tc.draw(gs.integers());
|
|
36
|
+
* if (n !== n) {
|
|
37
|
+
* throw new Error("integer was not equal to itself");
|
|
38
|
+
* }
|
|
39
|
+
* }),
|
|
40
|
+
* );
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* Now run the test using `npx vitest run`. You should see that this test
|
|
44
|
+
* passes.
|
|
45
|
+
*
|
|
46
|
+
* Let's look at what's happening in more detail. {@link test} runs your test
|
|
47
|
+
* many times (100, by default). The test function receives a {@link TestCase},
|
|
48
|
+
* which provides a {@link TestCase.draw | draw} method for drawing different
|
|
49
|
+
* values. This test draws a random integer and checks that it should be equal
|
|
50
|
+
* to itself.
|
|
51
|
+
*
|
|
52
|
+
* Next, try a test that fails:
|
|
53
|
+
*
|
|
54
|
+
* ```ts
|
|
55
|
+
* test(
|
|
56
|
+
* "integers always below 50",
|
|
57
|
+
* hegel.test((tc) => {
|
|
58
|
+
* const n = tc.draw(gs.integers());
|
|
59
|
+
* if (n >= 50) {
|
|
60
|
+
* throw new Error(`n=${n} is too large`);
|
|
61
|
+
* }
|
|
62
|
+
* }),
|
|
63
|
+
* );
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* This test asserts that any integer is less than 50, which is obviously
|
|
67
|
+
* incorrect. Hegel will find a test case that makes this assertion fail, and
|
|
68
|
+
* then shrink it to find the smallest counterexample — in this case, `n = 50`.
|
|
69
|
+
*
|
|
70
|
+
* To fix this test, you can constrain the integers you generate with the
|
|
71
|
+
* `minValue` and `maxValue` options:
|
|
72
|
+
*
|
|
73
|
+
* ```ts
|
|
74
|
+
* test(
|
|
75
|
+
* "bounded integers always below 50",
|
|
76
|
+
* hegel.test((tc) => {
|
|
77
|
+
* const n = tc.draw(gs.integers({ minValue: 0, maxValue: 49 }));
|
|
78
|
+
* if (n >= 50) {
|
|
79
|
+
* throw new Error(`n=${n} is too large`);
|
|
80
|
+
* }
|
|
81
|
+
* }),
|
|
82
|
+
* );
|
|
83
|
+
* ```
|
|
84
|
+
*
|
|
85
|
+
* Run the test again. It should now pass.
|
|
86
|
+
*
|
|
87
|
+
* ## Use generators
|
|
88
|
+
*
|
|
89
|
+
* Hegel provides a rich library of generators that you can use out of the box.
|
|
90
|
+
* There are primitive generators, such as `integers`, `floats`, and `text`,
|
|
91
|
+
* and combinators that allow you to make generators out of other generators,
|
|
92
|
+
* such as `arrays` and `maps`.
|
|
93
|
+
*
|
|
94
|
+
* For example, you can use `arrays` to generate an array of integers:
|
|
95
|
+
*
|
|
96
|
+
* ```ts
|
|
97
|
+
* test(
|
|
98
|
+
* "append increases length",
|
|
99
|
+
* hegel.test((tc) => {
|
|
100
|
+
* const xs = tc.draw(gs.arrays(gs.integers()));
|
|
101
|
+
* const initialLength = xs.length;
|
|
102
|
+
* xs.push(tc.draw(gs.integers()));
|
|
103
|
+
* if (xs.length <= initialLength) {
|
|
104
|
+
* throw new Error("length did not increase");
|
|
105
|
+
* }
|
|
106
|
+
* }),
|
|
107
|
+
* );
|
|
108
|
+
* ```
|
|
109
|
+
*
|
|
110
|
+
* This test checks that appending an element to a random array of integers
|
|
111
|
+
* should always increase its length.
|
|
112
|
+
*
|
|
113
|
+
* You can also build composite values out of multiple generators. The simplest
|
|
114
|
+
* way is to draw fields directly inside the test body:
|
|
115
|
+
*
|
|
116
|
+
* ```ts
|
|
117
|
+
* interface Person {
|
|
118
|
+
* age: number;
|
|
119
|
+
* name: string;
|
|
120
|
+
* }
|
|
121
|
+
*
|
|
122
|
+
* test(
|
|
123
|
+
* "person",
|
|
124
|
+
* hegel.test((tc) => {
|
|
125
|
+
* const person: Person = {
|
|
126
|
+
* age: tc.draw(gs.integers({ minValue: 0, maxValue: 120 })),
|
|
127
|
+
* name: tc.draw(gs.text({ minSize: 1, maxSize: 50 })),
|
|
128
|
+
* };
|
|
129
|
+
* // use person in your test
|
|
130
|
+
* void person;
|
|
131
|
+
* }),
|
|
132
|
+
* );
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* For composite values you want to reuse across tests, build a generator with
|
|
136
|
+
* `composite` (imperative — call `tc.draw()` on inner generators inside a
|
|
137
|
+
* builder function) or `record` (declarative — pass a schema mapping field
|
|
138
|
+
* names to generators). Both produce a generator that supports `.map()`,
|
|
139
|
+
* `.filter()`, and `.flatMap()` like any other generator.
|
|
140
|
+
*
|
|
141
|
+
* ```ts
|
|
142
|
+
* const personGen = gs.record({
|
|
143
|
+
* age: gs.integers({ minValue: 0, maxValue: 120 }),
|
|
144
|
+
* name: gs.text({ minSize: 1, maxSize: 50 }),
|
|
145
|
+
* });
|
|
146
|
+
*
|
|
147
|
+
* test(
|
|
148
|
+
* "person via record",
|
|
149
|
+
* hegel.test((tc) => {
|
|
150
|
+
* const person = tc.draw(personGen);
|
|
151
|
+
* void person;
|
|
152
|
+
* }),
|
|
153
|
+
* );
|
|
154
|
+
* ```
|
|
155
|
+
*
|
|
156
|
+
* Note that you can feed the results of one `draw` into subsequent calls — this
|
|
157
|
+
* is what `composite` is for. For example, say that you extend the `Person`
|
|
158
|
+
* interface to include a `drivingLicense` boolean field, where the field
|
|
159
|
+
* depends on `age`:
|
|
160
|
+
*
|
|
161
|
+
* ```ts
|
|
162
|
+
* interface Person {
|
|
163
|
+
* age: number;
|
|
164
|
+
* name: string;
|
|
165
|
+
* drivingLicense: boolean;
|
|
166
|
+
* }
|
|
167
|
+
*
|
|
168
|
+
* const personGen = gs.composite<Person>((tc) => {
|
|
169
|
+
* const age = tc.draw(gs.integers({ minValue: 0, maxValue: 120 }));
|
|
170
|
+
* const name = tc.draw(gs.text({ minSize: 1, maxSize: 50 }));
|
|
171
|
+
* const drivingLicense = age >= 18 ? tc.draw(gs.booleans()) : false;
|
|
172
|
+
* return { age, name, drivingLicense };
|
|
173
|
+
* });
|
|
174
|
+
* ```
|
|
175
|
+
*
|
|
176
|
+
* ## Debug your failing test cases
|
|
177
|
+
*
|
|
178
|
+
* Use the {@link TestCase.note | note} method to attach debug information:
|
|
179
|
+
*
|
|
180
|
+
* ```ts
|
|
181
|
+
* test(
|
|
182
|
+
* "addition is commutative",
|
|
183
|
+
* hegel.test((tc) => {
|
|
184
|
+
* const x = tc.draw(gs.integers());
|
|
185
|
+
* const y = tc.draw(gs.integers());
|
|
186
|
+
* tc.note(`x + y = ${x + y}, y + x = ${y + x}`);
|
|
187
|
+
* if (x + y !== y + x) {
|
|
188
|
+
* throw new Error("addition is not commutative");
|
|
189
|
+
* }
|
|
190
|
+
* }),
|
|
191
|
+
* );
|
|
192
|
+
* ```
|
|
193
|
+
*
|
|
194
|
+
* Notes only appear when Hegel replays the minimal failing example.
|
|
195
|
+
*
|
|
196
|
+
* ## Change the number of test cases
|
|
197
|
+
*
|
|
198
|
+
* By default Hegel runs 100 test cases. To override this, pass a
|
|
199
|
+
* {@link Settings} override as the second argument to {@link test}:
|
|
200
|
+
*
|
|
201
|
+
* ```ts
|
|
202
|
+
* test(
|
|
203
|
+
* "integers many",
|
|
204
|
+
* hegel.test(
|
|
205
|
+
* (tc) => {
|
|
206
|
+
* const n = tc.draw(gs.integers());
|
|
207
|
+
* if (n !== n) {
|
|
208
|
+
* throw new Error("integer was not equal to itself");
|
|
209
|
+
* }
|
|
210
|
+
* },
|
|
211
|
+
* { testCases: 500 },
|
|
212
|
+
* ),
|
|
213
|
+
* );
|
|
214
|
+
* ```
|
|
215
|
+
*
|
|
216
|
+
* ## Learning more
|
|
217
|
+
*
|
|
218
|
+
* - Browse the `@hegeldev/hegel/generators` module for the full list of
|
|
219
|
+
* available generators.
|
|
220
|
+
* - See {@link Settings} for more configuration settings to customize how
|
|
221
|
+
* your test runs.
|
|
6
222
|
*
|
|
7
223
|
* @packageDocumentation
|
|
8
224
|
*/
|
|
9
|
-
export
|
|
10
|
-
export {
|
|
11
|
-
export {
|
|
12
|
-
export { HegelSession, HEGEL_SERVER_VERSION } from "./session.js";
|
|
225
|
+
export * as generators from "./generators/index.js";
|
|
226
|
+
export { TestCase } from "./testCase.js";
|
|
227
|
+
export { test, testAsync, Verbosity, HealthCheck, Database } from "./runner.js";
|
|
13
228
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+NG;AAEH,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/runner.d.ts
CHANGED
|
@@ -66,6 +66,7 @@ export type TestCaseResult = {
|
|
|
66
66
|
status: "interesting";
|
|
67
67
|
error: unknown;
|
|
68
68
|
};
|
|
69
|
+
export declare function runTestCaseAsync(dataSource: DataSource, testFn: (tc: TestCase) => void | Promise<void>, isFinal: boolean): Promise<TestCaseResult>;
|
|
69
70
|
export declare function runTestCase(dataSource: DataSource, testFn: (tc: TestCase) => void, isFinal: boolean): TestCaseResult;
|
|
70
71
|
export interface TestLocation {
|
|
71
72
|
function: string;
|
|
@@ -76,27 +77,50 @@ export interface TestLocation {
|
|
|
76
77
|
export declare class Hegel {
|
|
77
78
|
private testFn;
|
|
78
79
|
private _settings;
|
|
79
|
-
private _databaseKey;
|
|
80
80
|
private _testLocation;
|
|
81
|
-
constructor(testFn: (tc: TestCase) => void);
|
|
81
|
+
constructor(testFn: (tc: TestCase) => void | Promise<void>);
|
|
82
82
|
/** Override default settings. Returns this for chaining. */
|
|
83
83
|
settings(s: Partial<Settings>): this;
|
|
84
|
-
/** Set the database key for persisting failing examples across runs. */
|
|
85
|
-
databaseKey(key: string): this;
|
|
86
84
|
/** Set the test location for Antithesis integration. */
|
|
87
85
|
testLocation(location: TestLocation): this;
|
|
88
86
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
87
|
+
* Generator that drives the wire protocol but yields a `ServerDataSource`
|
|
88
|
+
* (plus an `isFinal` flag) each time a test case needs to be executed.
|
|
89
|
+
* The driver ({@link run} or {@link runSync}) calls the user's test body
|
|
90
|
+
* and resumes the generator with the resulting {@link TestCaseResult}.
|
|
91
|
+
* This factoring lets the sync and async drivers share one implementation
|
|
92
|
+
* of the protocol loop.
|
|
95
93
|
*/
|
|
96
|
-
|
|
94
|
+
private runSteps;
|
|
95
|
+
run(): Promise<void>;
|
|
96
|
+
runSync(): void;
|
|
97
97
|
}
|
|
98
98
|
/**
|
|
99
|
-
*
|
|
99
|
+
* Run a property-based test.
|
|
100
|
+
*
|
|
101
|
+
* If your property is async, see {@link testAsync} instead.
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```ts
|
|
105
|
+
* import { test } from 'vitest';
|
|
106
|
+
* import * as hegel from 'hegel';
|
|
107
|
+
* import * as gs from 'hegel/generators';
|
|
108
|
+
*
|
|
109
|
+
* test('addition is commutative', () =>
|
|
110
|
+
* hegel.test((tc) => {
|
|
111
|
+
* const x = tc.draw(gs.integers());
|
|
112
|
+
* const y = tc.draw(gs.integers());
|
|
113
|
+
* expect(x + y).toBe(y + x);
|
|
114
|
+
* }),
|
|
115
|
+
* );
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export declare function test(testFn: (tc: TestCase) => void, settings?: Partial<Settings>): void;
|
|
119
|
+
/**
|
|
120
|
+
* Run a property-based test with an asynchronous test body.
|
|
121
|
+
*
|
|
122
|
+
* Returns a `Promise<void>` that resolves when the test completes and
|
|
123
|
+
* rejects if any test case fails.
|
|
100
124
|
*
|
|
101
125
|
* @example
|
|
102
126
|
* ```ts
|
|
@@ -104,12 +128,14 @@ export declare class Hegel {
|
|
|
104
128
|
* import * as hegel from 'hegel';
|
|
105
129
|
* import * as gs from 'hegel/generators';
|
|
106
130
|
*
|
|
107
|
-
* test('
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
131
|
+
* test('my async test', () =>
|
|
132
|
+
* hegel.testAsync(async (tc) => {
|
|
133
|
+
* const x = tc.draw(gs.integers());
|
|
134
|
+
* const result = await someAsyncOperation(x);
|
|
135
|
+
* expect(result).toEqual(expected(x));
|
|
136
|
+
* }),
|
|
137
|
+
* );
|
|
112
138
|
* ```
|
|
113
139
|
*/
|
|
114
|
-
export declare function
|
|
140
|
+
export declare function testAsync(testFn: (tc: TestCase) => void | Promise<void>, settings?: Partial<Settings>): Promise<void>;
|
|
115
141
|
//# sourceMappingURL=runner.d.ts.map
|
package/dist/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,QAAQ,EAA8B,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAEtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE1D,oBAAY,SAAS;IACnB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,KAAK,UAAU;CAChB;AAED,oBAAY,WAAW;IACrB,aAAa,oBAAoB;IACjC,OAAO,aAAa;IACpB,iBAAiB,yBAAyB;IAC1C,oBAAoB,4BAA4B;CACjD;AAED,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG,eAAO,MAAM,QAAQ;WACS,QAAQ;cACF,QAAQ;qBACzB,MAAM,KAAG,QAAQ;CACnC,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,QAAQ,CAAC;IACnB,mBAAmB,EAAE,WAAW,EAAE,CAAC;CACpC;AAyBD,wBAAgB,eAAe,IAAI,QAAQ,CAU1C;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.js
CHANGED
|
@@ -63,9 +63,6 @@ export function defaultSettings() {
|
|
|
63
63
|
// ---------------------------------------------------------------------------
|
|
64
64
|
// ServerDataSource
|
|
65
65
|
// ---------------------------------------------------------------------------
|
|
66
|
-
function isRecord(value) {
|
|
67
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
68
|
-
}
|
|
69
66
|
/**
|
|
70
67
|
* DataSource implementation that communicates with the hegel server
|
|
71
68
|
* over a multiplexed stream connection.
|
|
@@ -89,14 +86,8 @@ export class ServerDataSource {
|
|
|
89
86
|
const id = this.stream.sendRequest(encoded);
|
|
90
87
|
const responseBytes = this.stream.receiveReply(id);
|
|
91
88
|
const response = decode(responseBytes);
|
|
92
|
-
/* v8 ignore start: server always returns CBOR maps */
|
|
93
|
-
if (!isRecord(response))
|
|
94
|
-
return response;
|
|
95
|
-
/* v8 ignore stop */
|
|
96
89
|
if ("error" in response) {
|
|
97
|
-
|
|
98
|
-
const errorType = String(response["type"] ?? "");
|
|
99
|
-
/* v8 ignore stop */
|
|
90
|
+
const errorType = response["type"];
|
|
100
91
|
const errorMsg = JSON.stringify(response["error"]);
|
|
101
92
|
if (errorMsg.includes("overflow") ||
|
|
102
93
|
errorMsg.includes("StopTest") ||
|
|
@@ -120,12 +111,7 @@ export class ServerDataSource {
|
|
|
120
111
|
/* v8 ignore stop */
|
|
121
112
|
throw new Error(`Server error (${errorType}): ${errorMsg}`);
|
|
122
113
|
}
|
|
123
|
-
|
|
124
|
-
if ("result" in response) {
|
|
125
|
-
return response["result"];
|
|
126
|
-
}
|
|
127
|
-
return response;
|
|
128
|
-
/* v8 ignore stop */
|
|
114
|
+
return response["result"];
|
|
129
115
|
}
|
|
130
116
|
generate(schema) {
|
|
131
117
|
return this.sendRequest("generate", { schema });
|
|
@@ -141,22 +127,12 @@ export class ServerDataSource {
|
|
|
141
127
|
if (maxSize !== undefined) {
|
|
142
128
|
payload["max_size"] = maxSize;
|
|
143
129
|
}
|
|
144
|
-
|
|
145
|
-
/* v8 ignore start: server always returns integer for new_collection */
|
|
146
|
-
if (typeof result !== "number")
|
|
147
|
-
throw new Error(`Expected integer from new_collection, got ${typeof result}`);
|
|
148
|
-
/* v8 ignore stop */
|
|
149
|
-
return result;
|
|
130
|
+
return this.sendRequest("new_collection", payload);
|
|
150
131
|
}
|
|
151
132
|
collectionMore(collectionId) {
|
|
152
|
-
|
|
133
|
+
return this.sendRequest("collection_more", {
|
|
153
134
|
collection_id: collectionId,
|
|
154
135
|
});
|
|
155
|
-
/* v8 ignore start: server always returns boolean for collection_more */
|
|
156
|
-
if (typeof result !== "boolean")
|
|
157
|
-
throw new Error(`Expected boolean from collection_more, got ${typeof result}`);
|
|
158
|
-
/* v8 ignore stop */
|
|
159
|
-
return result;
|
|
160
136
|
}
|
|
161
137
|
collectionReject(collectionId, why) {
|
|
162
138
|
const payload = {
|
|
@@ -203,6 +179,40 @@ function extractOrigin(error) {
|
|
|
203
179
|
return null;
|
|
204
180
|
/* v8 ignore stop */
|
|
205
181
|
}
|
|
182
|
+
function classifyResult(e, isFinal) {
|
|
183
|
+
if (e instanceof AssumeError)
|
|
184
|
+
return { result: { status: "invalid" }, origin: null };
|
|
185
|
+
if (e instanceof StopTestError)
|
|
186
|
+
return { result: { status: "invalid" }, origin: null };
|
|
187
|
+
if (isFinal) {
|
|
188
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
189
|
+
console.error(`\n${msg}`);
|
|
190
|
+
if (e instanceof Error && e.stack) {
|
|
191
|
+
console.error(e.stack);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return { result: { status: "interesting", error: e }, origin: extractOrigin(e) };
|
|
195
|
+
}
|
|
196
|
+
function finalizeTestCase(tc, dataSource, result, origin) {
|
|
197
|
+
if (tc.testAborted)
|
|
198
|
+
return;
|
|
199
|
+
const status = result.status === "valid" ? "VALID" : result.status === "invalid" ? "INVALID" : "INTERESTING";
|
|
200
|
+
dataSource.markComplete(status, origin);
|
|
201
|
+
}
|
|
202
|
+
export async function runTestCaseAsync(dataSource, testFn, isFinal) {
|
|
203
|
+
const tc = new TestCase(dataSource, isFinal);
|
|
204
|
+
let result;
|
|
205
|
+
let origin = null;
|
|
206
|
+
try {
|
|
207
|
+
await testFn(tc);
|
|
208
|
+
result = { status: "valid" };
|
|
209
|
+
}
|
|
210
|
+
catch (e) {
|
|
211
|
+
({ result, origin } = classifyResult(e, isFinal));
|
|
212
|
+
}
|
|
213
|
+
finalizeTestCase(tc, dataSource, result, origin);
|
|
214
|
+
return result;
|
|
215
|
+
}
|
|
206
216
|
export function runTestCase(dataSource, testFn, isFinal) {
|
|
207
217
|
const tc = new TestCase(dataSource, isFinal);
|
|
208
218
|
let result;
|
|
@@ -212,29 +222,9 @@ export function runTestCase(dataSource, testFn, isFinal) {
|
|
|
212
222
|
result = { status: "valid" };
|
|
213
223
|
}
|
|
214
224
|
catch (e) {
|
|
215
|
-
|
|
216
|
-
result = { status: "invalid" };
|
|
217
|
-
}
|
|
218
|
-
else if (e instanceof StopTestError) {
|
|
219
|
-
result = { status: "invalid" };
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
result = { status: "interesting", error: e };
|
|
223
|
-
origin = extractOrigin(e);
|
|
224
|
-
if (isFinal) {
|
|
225
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
226
|
-
console.error(`\n${msg}`);
|
|
227
|
-
if (e instanceof Error && e.stack) {
|
|
228
|
-
console.error(e.stack);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
// Send mark_complete unless test was aborted (server already closed stream)
|
|
234
|
-
if (!tc.testAborted) {
|
|
235
|
-
const status = result.status === "valid" ? "VALID" : result.status === "invalid" ? "INVALID" : "INTERESTING";
|
|
236
|
-
dataSource.markComplete(status, origin);
|
|
225
|
+
({ result, origin } = classifyResult(e, isFinal));
|
|
237
226
|
}
|
|
227
|
+
finalizeTestCase(tc, dataSource, result, origin);
|
|
238
228
|
return result;
|
|
239
229
|
}
|
|
240
230
|
/* v8 ignore start: only runs inside Antithesis */
|
|
@@ -285,7 +275,6 @@ function emitAntithesisAssertion(location, passed) {
|
|
|
285
275
|
export class Hegel {
|
|
286
276
|
testFn;
|
|
287
277
|
_settings;
|
|
288
|
-
_databaseKey = null;
|
|
289
278
|
_testLocation = null;
|
|
290
279
|
constructor(testFn) {
|
|
291
280
|
this.testFn = testFn;
|
|
@@ -296,11 +285,6 @@ export class Hegel {
|
|
|
296
285
|
Object.assign(this._settings, s);
|
|
297
286
|
return this;
|
|
298
287
|
}
|
|
299
|
-
/** Set the database key for persisting failing examples across runs. */
|
|
300
|
-
databaseKey(key) {
|
|
301
|
-
this._databaseKey = key;
|
|
302
|
-
return this;
|
|
303
|
-
}
|
|
304
288
|
/** Set the test location for Antithesis integration. */
|
|
305
289
|
/* v8 ignore start: only used inside Antithesis */
|
|
306
290
|
testLocation(location) {
|
|
@@ -309,29 +293,26 @@ export class Hegel {
|
|
|
309
293
|
}
|
|
310
294
|
/* v8 ignore stop */
|
|
311
295
|
/**
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
*
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
296
|
+
* Generator that drives the wire protocol but yields a `ServerDataSource`
|
|
297
|
+
* (plus an `isFinal` flag) each time a test case needs to be executed.
|
|
298
|
+
* The driver ({@link run} or {@link runSync}) calls the user's test body
|
|
299
|
+
* and resumes the generator with the resulting {@link TestCaseResult}.
|
|
300
|
+
* This factoring lets the sync and async drivers share one implementation
|
|
301
|
+
* of the protocol loop.
|
|
318
302
|
*/
|
|
319
|
-
|
|
303
|
+
*runSteps() {
|
|
320
304
|
const session = HegelSession.get();
|
|
321
305
|
const connection = session.connection;
|
|
322
306
|
const testStream = connection.newStream();
|
|
323
307
|
// Build run_test message
|
|
324
308
|
const suppressNames = this._settings.suppressHealthCheck.map((c) => c);
|
|
325
|
-
const databaseKeyValue = this._databaseKey !== null ? Buffer.from(this._databaseKey, "utf-8") : null;
|
|
326
309
|
const runTestMsg = {
|
|
327
310
|
command: "run_test",
|
|
328
311
|
test_cases: this._settings.testCases,
|
|
329
312
|
seed: this._settings.seed,
|
|
330
313
|
stream_id: testStream.streamId,
|
|
331
|
-
database_key: databaseKeyValue,
|
|
332
314
|
derandomize: this._settings.derandomize,
|
|
333
315
|
};
|
|
334
|
-
// Database field
|
|
335
316
|
if (this._settings.database.kind === "disabled") {
|
|
336
317
|
runTestMsg["database"] = null;
|
|
337
318
|
}
|
|
@@ -358,8 +339,7 @@ export class Hegel {
|
|
|
358
339
|
// Ack BEFORE running the test
|
|
359
340
|
testStream.writeReply(eventId, ackNull);
|
|
360
341
|
const ds = new ServerDataSource(connection, testCaseStream);
|
|
361
|
-
|
|
362
|
-
// Track interesting cases (server uses this for final replay decisions)
|
|
342
|
+
yield { ds, isFinal: false };
|
|
363
343
|
}
|
|
364
344
|
else {
|
|
365
345
|
/* v8 ignore start: server only sends test_case and test_done events */
|
|
@@ -369,9 +349,7 @@ export class Hegel {
|
|
|
369
349
|
/* v8 ignore stop */
|
|
370
350
|
const ackTrue = encode({ result: true });
|
|
371
351
|
testStream.writeReply(eventId, ackTrue);
|
|
372
|
-
|
|
373
|
-
resultData = event["results"] ?? {};
|
|
374
|
-
/* v8 ignore stop */
|
|
352
|
+
resultData = event["results"];
|
|
375
353
|
break;
|
|
376
354
|
}
|
|
377
355
|
}
|
|
@@ -387,9 +365,7 @@ export class Hegel {
|
|
|
387
365
|
if (resultData["flaky"]) {
|
|
388
366
|
throw new Error(`Flaky test detected: ${resultData["flaky"]}`);
|
|
389
367
|
}
|
|
390
|
-
|
|
391
|
-
const nInteresting = resultData["interesting_test_cases"] ?? 0;
|
|
392
|
-
/* v8 ignore stop */
|
|
368
|
+
const nInteresting = resultData["interesting_test_cases"];
|
|
393
369
|
// Final replays for interesting test cases
|
|
394
370
|
let finalResult = null;
|
|
395
371
|
for (let i = 0; i < nInteresting; i++) {
|
|
@@ -399,7 +375,7 @@ export class Hegel {
|
|
|
399
375
|
const testCaseStream = connection.connectStream(streamId);
|
|
400
376
|
testStream.writeReply(eventId, ackNull);
|
|
401
377
|
const ds = new ServerDataSource(connection, testCaseStream);
|
|
402
|
-
const result =
|
|
378
|
+
const result = yield { ds, isFinal: true };
|
|
403
379
|
/* v8 ignore start: replay cases are always interesting */
|
|
404
380
|
if (result.status === "interesting") {
|
|
405
381
|
finalResult = result;
|
|
@@ -407,9 +383,7 @@ export class Hegel {
|
|
|
407
383
|
/* v8 ignore stop */
|
|
408
384
|
}
|
|
409
385
|
testStream.close();
|
|
410
|
-
|
|
411
|
-
const passed = resultData["passed"] ?? true;
|
|
412
|
-
/* v8 ignore stop */
|
|
386
|
+
const passed = resultData["passed"];
|
|
413
387
|
const testFailed = !passed;
|
|
414
388
|
/* v8 ignore start: only runs inside Antithesis */
|
|
415
389
|
if (isRunningInAntithesis() && this._testLocation) {
|
|
@@ -427,9 +401,29 @@ export class Hegel {
|
|
|
427
401
|
throw new Error(`Property test failed: ${msg}`);
|
|
428
402
|
}
|
|
429
403
|
}
|
|
404
|
+
async run() {
|
|
405
|
+
const gen = this.runSteps();
|
|
406
|
+
let next = gen.next();
|
|
407
|
+
while (!next.done) {
|
|
408
|
+
const { ds, isFinal } = next.value;
|
|
409
|
+
const result = await runTestCaseAsync(ds, this.testFn, isFinal);
|
|
410
|
+
next = gen.next(result);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
runSync() {
|
|
414
|
+
const gen = this.runSteps();
|
|
415
|
+
let next = gen.next();
|
|
416
|
+
while (!next.done) {
|
|
417
|
+
const { ds, isFinal } = next.value;
|
|
418
|
+
const result = runTestCase(ds, this.testFn, isFinal);
|
|
419
|
+
next = gen.next(result);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
430
422
|
}
|
|
431
423
|
/**
|
|
432
|
-
*
|
|
424
|
+
* Run a property-based test.
|
|
425
|
+
*
|
|
426
|
+
* If your property is async, see {@link testAsync} instead.
|
|
433
427
|
*
|
|
434
428
|
* @example
|
|
435
429
|
* ```ts
|
|
@@ -437,19 +431,49 @@ export class Hegel {
|
|
|
437
431
|
* import * as hegel from 'hegel';
|
|
438
432
|
* import * as gs from 'hegel/generators';
|
|
439
433
|
*
|
|
440
|
-
* test('addition is commutative',
|
|
441
|
-
*
|
|
442
|
-
*
|
|
443
|
-
*
|
|
444
|
-
*
|
|
434
|
+
* test('addition is commutative', () =>
|
|
435
|
+
* hegel.test((tc) => {
|
|
436
|
+
* const x = tc.draw(gs.integers());
|
|
437
|
+
* const y = tc.draw(gs.integers());
|
|
438
|
+
* expect(x + y).toBe(y + x);
|
|
439
|
+
* }),
|
|
440
|
+
* );
|
|
445
441
|
* ```
|
|
446
442
|
*/
|
|
447
443
|
export function test(testFn, settings) {
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
444
|
+
if (testFn.constructor.name === "AsyncFunction") {
|
|
445
|
+
throw new TypeError("hegel.test received an async test body. Use hegel.testAsync instead.");
|
|
446
|
+
}
|
|
447
|
+
const h = new Hegel(testFn);
|
|
448
|
+
if (settings)
|
|
449
|
+
h.settings(settings);
|
|
450
|
+
h.runSync();
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Run a property-based test with an asynchronous test body.
|
|
454
|
+
*
|
|
455
|
+
* Returns a `Promise<void>` that resolves when the test completes and
|
|
456
|
+
* rejects if any test case fails.
|
|
457
|
+
*
|
|
458
|
+
* @example
|
|
459
|
+
* ```ts
|
|
460
|
+
* import { test } from 'vitest';
|
|
461
|
+
* import * as hegel from 'hegel';
|
|
462
|
+
* import * as gs from 'hegel/generators';
|
|
463
|
+
*
|
|
464
|
+
* test('my async test', () =>
|
|
465
|
+
* hegel.testAsync(async (tc) => {
|
|
466
|
+
* const x = tc.draw(gs.integers());
|
|
467
|
+
* const result = await someAsyncOperation(x);
|
|
468
|
+
* expect(result).toEqual(expected(x));
|
|
469
|
+
* }),
|
|
470
|
+
* );
|
|
471
|
+
* ```
|
|
472
|
+
*/
|
|
473
|
+
export async function testAsync(testFn, settings) {
|
|
474
|
+
const h = new Hegel(testFn);
|
|
475
|
+
if (settings)
|
|
476
|
+
h.settings(settings);
|
|
477
|
+
await h.run();
|
|
454
478
|
}
|
|
455
479
|
//# sourceMappingURL=runner.js.map
|
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/testCase.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @packageDocumentation
|
|
8
8
|
*/
|
|
9
|
+
import type { Generator } from "./generators/core.js";
|
|
9
10
|
export declare class StopTestError extends Error {
|
|
10
11
|
constructor();
|
|
11
12
|
}
|
|
@@ -29,9 +30,6 @@ export declare const Labels: {
|
|
|
29
30
|
readonly SAMPLED_FROM: 14;
|
|
30
31
|
readonly ENUM_VARIANT: 15;
|
|
31
32
|
};
|
|
32
|
-
export interface GeneratorLike<T> {
|
|
33
|
-
doDraw(tc: TestCase): T;
|
|
34
|
-
}
|
|
35
33
|
/**
|
|
36
34
|
* Abstraction over the data backend for a test case.
|
|
37
35
|
*
|
|
@@ -58,17 +56,14 @@ export declare class TestCase {
|
|
|
58
56
|
constructor(dataSource: DataSource, isLastRun: boolean);
|
|
59
57
|
/** @internal */
|
|
60
58
|
dataSource(): DataSource;
|
|
59
|
+
/** @internal */
|
|
61
60
|
get isLastRun(): boolean;
|
|
61
|
+
/** @internal */
|
|
62
62
|
get testAborted(): boolean;
|
|
63
63
|
/**
|
|
64
64
|
* Draw a value from a generator.
|
|
65
65
|
*/
|
|
66
|
-
draw<T>(generator:
|
|
67
|
-
/**
|
|
68
|
-
* Draw a value from a generator without recording it in the output.
|
|
69
|
-
* Unlike draw(), this does not print the value during the final replay.
|
|
70
|
-
*/
|
|
71
|
-
drawSilent<T>(generator: GeneratorLike<T>): T;
|
|
66
|
+
draw<T>(generator: Generator<T>): T;
|
|
72
67
|
/**
|
|
73
68
|
* Reject the current test case if the condition is false.
|
|
74
69
|
*/
|
|
@@ -79,10 +74,12 @@ export declare class TestCase {
|
|
|
79
74
|
note(message: string): void;
|
|
80
75
|
/**
|
|
81
76
|
* Start a shrinking span with the given label.
|
|
77
|
+
* @internal
|
|
82
78
|
*/
|
|
83
79
|
startSpan(label: number): void;
|
|
84
80
|
/**
|
|
85
81
|
* Stop the current shrinking span.
|
|
82
|
+
* @internal
|
|
86
83
|
*/
|
|
87
84
|
stopSpan(discard?: boolean): void;
|
|
88
85
|
}
|
package/dist/testCase.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testCase.d.ts","sourceRoot":"","sources":["../src/testCase.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,qBAAa,aAAc,SAAQ,KAAK;;CAKvC;AAED,qBAAa,WAAY,SAAQ,KAAK;;CAKrC;AAMD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;CAgBT,CAAC;AAEX
|
|
1
|
+
{"version":3,"file":"testCase.d.ts","sourceRoot":"","sources":["../src/testCase.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,qBAAa,aAAc,SAAQ,KAAK;;CAKvC;AAED,qBAAa,WAAY,SAAQ,KAAK;;CAKrC;AAMD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;CAgBT,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IACnD,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzD,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9C,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1D,WAAW,IAAI,OAAO,CAAC;CACxB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;IAEtB,gBAAgB;gBACJ,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO;IAKtD,gBAAgB;IAChB,UAAU,IAAI,UAAU;IAIxB,gBAAgB;IAChB,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,gBAAgB;IAChB,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IAWnC;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAMhC;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM3B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAU9B;;;OAGG;IACH,QAAQ,CAAC,OAAO,UAAQ,GAAG,IAAI;CAQhC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAElF;AAED;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,QAAQ,CAAS;gBAEb,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAM3D,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,IAAI,IAAI,OAAO;IAkBf;;OAEG;IACH,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;CAK3B"}
|
package/dist/testCase.js
CHANGED
|
@@ -53,9 +53,11 @@ export class TestCase {
|
|
|
53
53
|
dataSource() {
|
|
54
54
|
return this._dataSource;
|
|
55
55
|
}
|
|
56
|
+
/** @internal */
|
|
56
57
|
get isLastRun() {
|
|
57
58
|
return this._isLastRun;
|
|
58
59
|
}
|
|
60
|
+
/** @internal */
|
|
59
61
|
get testAborted() {
|
|
60
62
|
return this._dataSource.testAborted();
|
|
61
63
|
}
|
|
@@ -72,13 +74,6 @@ export class TestCase {
|
|
|
72
74
|
}
|
|
73
75
|
return value;
|
|
74
76
|
}
|
|
75
|
-
/**
|
|
76
|
-
* Draw a value from a generator without recording it in the output.
|
|
77
|
-
* Unlike draw(), this does not print the value during the final replay.
|
|
78
|
-
*/
|
|
79
|
-
drawSilent(generator) {
|
|
80
|
-
return generator.doDraw(this);
|
|
81
|
-
}
|
|
82
77
|
/**
|
|
83
78
|
* Reject the current test case if the condition is false.
|
|
84
79
|
*/
|
|
@@ -97,6 +92,7 @@ export class TestCase {
|
|
|
97
92
|
}
|
|
98
93
|
/**
|
|
99
94
|
* Start a shrinking span with the given label.
|
|
95
|
+
* @internal
|
|
100
96
|
*/
|
|
101
97
|
startSpan(label) {
|
|
102
98
|
this.spanDepth++;
|
|
@@ -110,6 +106,7 @@ export class TestCase {
|
|
|
110
106
|
}
|
|
111
107
|
/**
|
|
112
108
|
* Stop the current shrinking span.
|
|
109
|
+
* @internal
|
|
113
110
|
*/
|
|
114
111
|
stopSpan(discard = false) {
|
|
115
112
|
this.spanDepth--;
|
package/dist/testCase.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testCase.js","sourceRoot":"","sources":["../src/testCase.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"testCase.js","sourceRoot":"","sources":["../src/testCase.ts"],"names":[],"mappings":"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"}
|