@hegeldev/hegel 0.1.0
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/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/binary.d.ts +27 -0
- package/dist/binary.d.ts.map +1 -0
- package/dist/binary.js +50 -0
- package/dist/binary.js.map +1 -0
- package/dist/collections.d.ts +114 -0
- package/dist/collections.d.ts.map +1 -0
- package/dist/collections.js +313 -0
- package/dist/collections.js.map +1 -0
- package/dist/combinators.d.ts +34 -0
- package/dist/combinators.d.ts.map +1 -0
- package/dist/combinators.js +152 -0
- package/dist/combinators.js.map +1 -0
- package/dist/conformance.d.ts +31 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +60 -0
- package/dist/conformance.js.map +1 -0
- package/dist/connection.d.ts +82 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +231 -0
- package/dist/connection.js.map +1 -0
- package/dist/crc32.d.ts +13 -0
- package/dist/crc32.d.ts.map +1 -0
- package/dist/crc32.js +30 -0
- package/dist/crc32.js.map +1 -0
- package/dist/derive.d.ts +225 -0
- package/dist/derive.d.ts.map +1 -0
- package/dist/derive.js +296 -0
- package/dist/derive.js.map +1 -0
- package/dist/embedded.d.ts +38 -0
- package/dist/embedded.d.ts.map +1 -0
- package/dist/embedded.js +237 -0
- package/dist/embedded.js.map +1 -0
- package/dist/floats.d.ts +57 -0
- package/dist/floats.d.ts.map +1 -0
- package/dist/floats.js +100 -0
- package/dist/floats.js.map +1 -0
- package/dist/formats.d.ts +62 -0
- package/dist/formats.d.ts.map +1 -0
- package/dist/formats.js +164 -0
- package/dist/formats.js.map +1 -0
- package/dist/generator.d.ts +80 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +128 -0
- package/dist/generator.js.map +1 -0
- package/dist/generators/collections.d.ts +20 -0
- package/dist/generators/collections.d.ts.map +1 -0
- package/dist/generators/collections.js +209 -0
- package/dist/generators/collections.js.map +1 -0
- package/dist/generators/combinators.d.ts +15 -0
- package/dist/generators/combinators.d.ts.map +1 -0
- package/dist/generators/combinators.js +143 -0
- package/dist/generators/combinators.js.map +1 -0
- package/dist/generators/compose.d.ts +27 -0
- package/dist/generators/compose.d.ts.map +1 -0
- package/dist/generators/compose.js +82 -0
- package/dist/generators/compose.js.map +1 -0
- package/dist/generators/core.d.ts +53 -0
- package/dist/generators/core.d.ts.map +1 -0
- package/dist/generators/core.js +134 -0
- package/dist/generators/core.js.map +1 -0
- package/dist/generators/index.d.ts +18 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +15 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/numeric.d.ts +40 -0
- package/dist/generators/numeric.d.ts.map +1 -0
- package/dist/generators/numeric.js +128 -0
- package/dist/generators/numeric.js.map +1 -0
- package/dist/generators/primitives.d.ts +138 -0
- package/dist/generators/primitives.d.ts.map +1 -0
- package/dist/generators/primitives.js +240 -0
- package/dist/generators/primitives.js.map +1 -0
- package/dist/generators/strings.d.ts +73 -0
- package/dist/generators/strings.d.ts.map +1 -0
- package/dist/generators/strings.js +215 -0
- package/dist/generators/strings.js.map +1 -0
- package/dist/generators/tuples.d.ts +11 -0
- package/dist/generators/tuples.d.ts.map +1 -0
- package/dist/generators/tuples.js +43 -0
- package/dist/generators/tuples.js.map +1 -0
- package/dist/generators.d.ts +408 -0
- package/dist/generators.d.ts.map +1 -0
- package/dist/generators.js +898 -0
- package/dist/generators.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +6 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +91 -0
- package/dist/install.js.map +1 -0
- package/dist/integers.d.ts +37 -0
- package/dist/integers.d.ts.map +1 -0
- package/dist/integers.js +63 -0
- package/dist/integers.js.map +1 -0
- package/dist/labels.d.ts +21 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +20 -0
- package/dist/labels.js.map +1 -0
- package/dist/objects.d.ts +39 -0
- package/dist/objects.d.ts.map +1 -0
- package/dist/objects.js +98 -0
- package/dist/objects.js.map +1 -0
- package/dist/primitives.d.ts +14 -0
- package/dist/primitives.d.ts.map +1 -0
- package/dist/primitives.js +51 -0
- package/dist/primitives.js.map +1 -0
- package/dist/protocol.d.ts +25 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +77 -0
- package/dist/protocol.js.map +1 -0
- package/dist/runner.d.ts +115 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +455 -0
- package/dist/runner.js.map +1 -0
- package/dist/session.d.ts +19 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +157 -0
- package/dist/session.js.map +1 -0
- package/dist/spans.d.ts +23 -0
- package/dist/spans.d.ts.map +1 -0
- package/dist/spans.js +51 -0
- package/dist/spans.js.map +1 -0
- package/dist/strings.d.ts +67 -0
- package/dist/strings.d.ts.map +1 -0
- package/dist/strings.js +107 -0
- package/dist/strings.js.map +1 -0
- package/dist/testCase.d.ts +118 -0
- package/dist/testCase.d.ts.map +1 -0
- package/dist/testCase.js +186 -0
- package/dist/testCase.js.map +1 -0
- package/dist/uv-install.sh +2226 -0
- package/dist/uv.d.ts +20 -0
- package/dist/uv.d.ts.map +1 -0
- package/dist/uv.js +103 -0
- package/dist/uv.js.map +1 -0
- package/dist/wtf8.d.ts +16 -0
- package/dist/wtf8.d.ts.map +1 -0
- package/dist/wtf8.js +52 -0
- package/dist/wtf8.js.map +1 -0
- package/package.json +60 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Antithesis, LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
> [!IMPORTANT]
|
|
2
|
+
> We're excited you're checking out Hegel! Hegel is in beta, and we'd love for you to try it and [report any feedback](https://github.com/hegeldev/hegel-typescript/issues/new).
|
|
3
|
+
>
|
|
4
|
+
> As part of our beta, we may make breaking changes if it makes Hegel a better property-based testing library. If that instability bothers you, please check back in a few months for a stable release!
|
|
5
|
+
>
|
|
6
|
+
> See https://hegel.dev/compatibility for more details.
|
|
7
|
+
|
|
8
|
+
# Hegel for TypeScript
|
|
9
|
+
|
|
10
|
+
- [Documentation](https://hegel.dev/typescript)
|
|
11
|
+
- [Website](https://hegel.dev)
|
|
12
|
+
|
|
13
|
+
Hegel is a property-based testing library for TypeScript. Hegel is based on [Hypothesis](https://github.com/hypothesisworks/hypothesis), using the [Hegel protocol](https://hegel.dev/).
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
To install: `npm install --save-dev @hegeldev/hegel`.
|
|
18
|
+
|
|
19
|
+
Hegel requires Node 16+. Bun and Deno are not currently supported.
|
|
20
|
+
|
|
21
|
+
Hegel will use [uv](https://docs.astral.sh/uv/) to install the required [hegel-core](https://github.com/hegeldev/hegel-core) server component.
|
|
22
|
+
If `uv` is already on your path, it will use that, otherwise it will download a private copy of it to ~/.cache/hegel and not put it on your path.
|
|
23
|
+
See https://hegel.dev/reference/installation for details.
|
|
24
|
+
|
|
25
|
+
## Quickstart
|
|
26
|
+
|
|
27
|
+
Here's a quick example of how to write a Hegel test:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { test } from "vitest";
|
|
31
|
+
import * as hegel from "@hegeldev/hegel";
|
|
32
|
+
import * as gs from "@hegeldev/hegel/generators";
|
|
33
|
+
|
|
34
|
+
function mySort(ls: number[]): number[] {
|
|
35
|
+
const result = [...ls].sort((a, b) => a - b);
|
|
36
|
+
return [...new Set(result)];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
test(
|
|
40
|
+
"my_sort matches builtin",
|
|
41
|
+
hegel.test((tc) => {
|
|
42
|
+
const vec1 = tc.draw(gs.arrays(gs.integers()));
|
|
43
|
+
const vec2 = mySort(vec1);
|
|
44
|
+
const sorted = [...vec1].sort((a, b) => a - b);
|
|
45
|
+
if (JSON.stringify(sorted) !== JSON.stringify(vec2)) {
|
|
46
|
+
throw new Error(`sort mismatch: ${JSON.stringify(sorted)} != ${JSON.stringify(vec2)}`);
|
|
47
|
+
}
|
|
48
|
+
}),
|
|
49
|
+
);
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
This test will fail when run with `vitest`! Hegel will produce a minimal failing test case for us:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
Draw 1: [0, 0]
|
|
56
|
+
Error: sort mismatch: [0,0] != [0]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
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).
|
package/dist/binary.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Generator } from "./generator.js";
|
|
2
|
+
/**
|
|
3
|
+
* Options for binary generator.
|
|
4
|
+
*/
|
|
5
|
+
export interface BinaryOptions {
|
|
6
|
+
/** Minimum size in bytes (default: 0) */
|
|
7
|
+
minSize?: number;
|
|
8
|
+
/** Maximum size in bytes (default: no limit) */
|
|
9
|
+
maxSize?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create a generator for binary data (byte sequences).
|
|
13
|
+
*
|
|
14
|
+
* @param options - Size constraints
|
|
15
|
+
* @returns Generator producing Uint8Array
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // Generate any byte sequence
|
|
20
|
+
* const gen = binary();
|
|
21
|
+
*
|
|
22
|
+
* // Generate 16-32 bytes
|
|
23
|
+
* const bounded = binary({ minSize: 16, maxSize: 32 });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare function binary(options?: BinaryOptions): Generator<Uint8Array>;
|
|
27
|
+
//# sourceMappingURL=binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAc,MAAM,gBAAgB,CAAA;AAErE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAmCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,SAAS,CAAC,UAAU,CAAC,CAEzE"}
|
package/dist/binary.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { generateFromSchema } from "./connection.js";
|
|
2
|
+
import { FuncGenerator } from "./generator.js";
|
|
3
|
+
/**
|
|
4
|
+
* Generator for binary data (byte sequences).
|
|
5
|
+
*/
|
|
6
|
+
class BinaryGenerator extends FuncGenerator {
|
|
7
|
+
_binarySchema;
|
|
8
|
+
constructor(options = {}) {
|
|
9
|
+
const schema = {
|
|
10
|
+
type: "binary",
|
|
11
|
+
min_size: options.minSize ?? 0,
|
|
12
|
+
};
|
|
13
|
+
if (options.maxSize !== undefined) {
|
|
14
|
+
schema.max_size = options.maxSize;
|
|
15
|
+
}
|
|
16
|
+
super(() => {
|
|
17
|
+
const b64 = generateFromSchema(schema);
|
|
18
|
+
// Decode base64 to Uint8Array
|
|
19
|
+
const binaryString = atob(b64);
|
|
20
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
21
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
22
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
23
|
+
}
|
|
24
|
+
return bytes;
|
|
25
|
+
}, schema);
|
|
26
|
+
this._binarySchema = schema;
|
|
27
|
+
}
|
|
28
|
+
schema() {
|
|
29
|
+
return this._binarySchema;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a generator for binary data (byte sequences).
|
|
34
|
+
*
|
|
35
|
+
* @param options - Size constraints
|
|
36
|
+
* @returns Generator producing Uint8Array
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* // Generate any byte sequence
|
|
41
|
+
* const gen = binary();
|
|
42
|
+
*
|
|
43
|
+
* // Generate 16-32 bytes
|
|
44
|
+
* const bounded = binary({ minSize: 16, maxSize: 32 });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export function binary(options = {}) {
|
|
48
|
+
return new BinaryGenerator(options);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary.js","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAyB,MAAM,gBAAgB,CAAA;AAYrE;;GAEG;AACH,MAAM,eAAgB,SAAQ,aAAyB;IACpC,aAAa,CAAY;IAE1C,YAAY,UAAyB,EAAE;QACrC,MAAM,MAAM,GAAe;YACzB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC;SAC/B,CAAA;QACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAA;QACnC,CAAC;QAED,KAAK,CAAC,GAAG,EAAE;YACT,MAAM,GAAG,GAAG,kBAAkB,CAAS,MAAM,CAAC,CAAA;YAC9C,8BAA8B;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;YAC9B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC,EAAE,MAAM,CAAC,CAAA;QACV,IAAI,CAAC,aAAa,GAAG,MAAM,CAAA;IAC7B,CAAC;IAEQ,MAAM;QACb,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,MAAM,CAAC,UAAyB,EAAE;IAChD,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;AACrC,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { Generator, JsonSchema, BaseGenerator } from "./generator.js";
|
|
2
|
+
/**
|
|
3
|
+
* Generator for arrays with builder pattern.
|
|
4
|
+
*/
|
|
5
|
+
export declare class ArrayGenerator<T> extends BaseGenerator<T[]> {
|
|
6
|
+
private readonly elements;
|
|
7
|
+
private readonly _minSize;
|
|
8
|
+
private readonly _maxSize?;
|
|
9
|
+
private readonly _unique;
|
|
10
|
+
private constructor();
|
|
11
|
+
static create<T>(elements: Generator<T>): ArrayGenerator<T>;
|
|
12
|
+
/**
|
|
13
|
+
* Set the minimum array size.
|
|
14
|
+
*/
|
|
15
|
+
minSize(value: number): ArrayGenerator<T>;
|
|
16
|
+
/**
|
|
17
|
+
* Set the maximum array size.
|
|
18
|
+
*/
|
|
19
|
+
maxSize(value: number): ArrayGenerator<T>;
|
|
20
|
+
/**
|
|
21
|
+
* Require all elements to be unique.
|
|
22
|
+
*/
|
|
23
|
+
unique(): ArrayGenerator<T>;
|
|
24
|
+
generate(): T[];
|
|
25
|
+
schema(): JsonSchema | null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create a generator for arrays.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* // Generate array of integers
|
|
33
|
+
* const gen = arrays(integers());
|
|
34
|
+
*
|
|
35
|
+
* // Generate array with size bounds
|
|
36
|
+
* const bounded = arrays(integers()).minSize(1).maxSize(10);
|
|
37
|
+
*
|
|
38
|
+
* // Generate array with unique elements
|
|
39
|
+
* const uniqueGen = arrays(integers()).unique();
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function arrays<T>(elements: Generator<T>): ArrayGenerator<T>;
|
|
43
|
+
/**
|
|
44
|
+
* Generator for Sets.
|
|
45
|
+
* Internally generates unique arrays and converts to Set.
|
|
46
|
+
*/
|
|
47
|
+
export declare class SetGenerator<T> extends BaseGenerator<Set<T>> {
|
|
48
|
+
private readonly elements;
|
|
49
|
+
private readonly _minSize;
|
|
50
|
+
private readonly _maxSize?;
|
|
51
|
+
private constructor();
|
|
52
|
+
static create<T>(elements: Generator<T>): SetGenerator<T>;
|
|
53
|
+
/**
|
|
54
|
+
* Set the minimum set size.
|
|
55
|
+
*/
|
|
56
|
+
minSize(value: number): SetGenerator<T>;
|
|
57
|
+
/**
|
|
58
|
+
* Set the maximum set size.
|
|
59
|
+
*/
|
|
60
|
+
maxSize(value: number): SetGenerator<T>;
|
|
61
|
+
generate(): Set<T>;
|
|
62
|
+
schema(): JsonSchema | null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Create a generator for Sets.
|
|
66
|
+
*/
|
|
67
|
+
export declare function sets<T>(elements: Generator<T>): SetGenerator<T>;
|
|
68
|
+
/**
|
|
69
|
+
* Generator for Maps (dictionaries) with configurable key and value types.
|
|
70
|
+
*/
|
|
71
|
+
export declare class MapGenerator<K, V> extends BaseGenerator<Map<K, V>> {
|
|
72
|
+
private readonly keys;
|
|
73
|
+
private readonly values;
|
|
74
|
+
private readonly _minSize;
|
|
75
|
+
private readonly _maxSize?;
|
|
76
|
+
private constructor();
|
|
77
|
+
static create<K, V>(keys: Generator<K>, values: Generator<V>): MapGenerator<K, V>;
|
|
78
|
+
/**
|
|
79
|
+
* Set the minimum map size.
|
|
80
|
+
*/
|
|
81
|
+
minSize(value: number): MapGenerator<K, V>;
|
|
82
|
+
/**
|
|
83
|
+
* Set the maximum map size.
|
|
84
|
+
*/
|
|
85
|
+
maxSize(value: number): MapGenerator<K, V>;
|
|
86
|
+
generate(): Map<K, V>;
|
|
87
|
+
schema(): JsonSchema | null;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create a generator for Maps with configurable key and value types.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* // String keys (common case)
|
|
95
|
+
* const strMap = maps(text(), integers());
|
|
96
|
+
*
|
|
97
|
+
* // Integer keys
|
|
98
|
+
* const intMap = maps(integers(), text());
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export declare function maps<K, V>(keys: Generator<K>, values: Generator<V>): MapGenerator<K, V>;
|
|
102
|
+
/**
|
|
103
|
+
* Create a generator for tuples (fixed-length heterogeneous arrays).
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* const gen = tuples(integers(), text(), booleans());
|
|
108
|
+
* const [num, str, bool] = gen.generate();
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
export declare function tuples<T extends unknown[]>(...generators: {
|
|
112
|
+
[K in keyof T]: Generator<T[K]>;
|
|
113
|
+
}): Generator<T>;
|
|
114
|
+
//# sourceMappingURL=collections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { generateFromSchema, assume } from "./connection.js";
|
|
2
|
+
import { BaseGenerator } from "./generator.js";
|
|
3
|
+
import { integers } from "./integers.js";
|
|
4
|
+
import { LABELS } from "./labels.js";
|
|
5
|
+
import { group } from "./spans.js";
|
|
6
|
+
/**
|
|
7
|
+
* Generator for arrays with builder pattern.
|
|
8
|
+
*/
|
|
9
|
+
export class ArrayGenerator extends BaseGenerator {
|
|
10
|
+
elements;
|
|
11
|
+
_minSize;
|
|
12
|
+
_maxSize;
|
|
13
|
+
_unique;
|
|
14
|
+
constructor(elements, _minSize = 0, _maxSize, _unique = false) {
|
|
15
|
+
super();
|
|
16
|
+
this.elements = elements;
|
|
17
|
+
this._minSize = _minSize;
|
|
18
|
+
this._maxSize = _maxSize;
|
|
19
|
+
this._unique = _unique;
|
|
20
|
+
}
|
|
21
|
+
static create(elements) {
|
|
22
|
+
return new ArrayGenerator(elements);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Set the minimum array size.
|
|
26
|
+
*/
|
|
27
|
+
minSize(value) {
|
|
28
|
+
return new ArrayGenerator(this.elements, value, this._maxSize, this._unique);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Set the maximum array size.
|
|
32
|
+
*/
|
|
33
|
+
maxSize(value) {
|
|
34
|
+
return new ArrayGenerator(this.elements, this._minSize, value, this._unique);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Require all elements to be unique.
|
|
38
|
+
*/
|
|
39
|
+
unique() {
|
|
40
|
+
return new ArrayGenerator(this.elements, this._minSize, this._maxSize, true);
|
|
41
|
+
}
|
|
42
|
+
generate() {
|
|
43
|
+
const schema = this.schema();
|
|
44
|
+
if (schema) {
|
|
45
|
+
// Schema composition: single socket round-trip
|
|
46
|
+
return generateFromSchema(schema);
|
|
47
|
+
}
|
|
48
|
+
// Compositional fallback: generate length, then each element
|
|
49
|
+
return group(LABELS.LIST, () => {
|
|
50
|
+
const maxSize = this._maxSize ?? 100;
|
|
51
|
+
const length = integers().min(this._minSize).max(maxSize).generate();
|
|
52
|
+
if (this._unique) {
|
|
53
|
+
// For unique arrays, track seen values
|
|
54
|
+
const seen = new Set();
|
|
55
|
+
const result = [];
|
|
56
|
+
const maxAttempts = length * 10;
|
|
57
|
+
let attempts = 0;
|
|
58
|
+
while (result.length < length && attempts < maxAttempts) {
|
|
59
|
+
const value = group(LABELS.LIST_ELEMENT, () => this.elements.generate());
|
|
60
|
+
const key = JSON.stringify(value);
|
|
61
|
+
if (!seen.has(key)) {
|
|
62
|
+
seen.add(key);
|
|
63
|
+
result.push(value);
|
|
64
|
+
}
|
|
65
|
+
attempts++;
|
|
66
|
+
}
|
|
67
|
+
assume(result.length >= this._minSize);
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
const result = [];
|
|
71
|
+
for (let i = 0; i < length; i++) {
|
|
72
|
+
result.push(group(LABELS.LIST_ELEMENT, () => this.elements.generate()));
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
schema() {
|
|
78
|
+
const elementSchema = this.elements.schema();
|
|
79
|
+
if (!elementSchema) {
|
|
80
|
+
return null; // Fall back to compositional generation
|
|
81
|
+
}
|
|
82
|
+
const schema = {
|
|
83
|
+
type: this._unique ? "set" : "list",
|
|
84
|
+
elements: elementSchema,
|
|
85
|
+
min_size: this._minSize,
|
|
86
|
+
};
|
|
87
|
+
if (this._maxSize !== undefined) {
|
|
88
|
+
schema.max_size = this._maxSize;
|
|
89
|
+
}
|
|
90
|
+
return schema;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Create a generator for arrays.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* // Generate array of integers
|
|
99
|
+
* const gen = arrays(integers());
|
|
100
|
+
*
|
|
101
|
+
* // Generate array with size bounds
|
|
102
|
+
* const bounded = arrays(integers()).minSize(1).maxSize(10);
|
|
103
|
+
*
|
|
104
|
+
* // Generate array with unique elements
|
|
105
|
+
* const uniqueGen = arrays(integers()).unique();
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
export function arrays(elements) {
|
|
109
|
+
return ArrayGenerator.create(elements);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Generator for Sets.
|
|
113
|
+
* Internally generates unique arrays and converts to Set.
|
|
114
|
+
*/
|
|
115
|
+
export class SetGenerator extends BaseGenerator {
|
|
116
|
+
elements;
|
|
117
|
+
_minSize;
|
|
118
|
+
_maxSize;
|
|
119
|
+
constructor(elements, _minSize = 0, _maxSize) {
|
|
120
|
+
super();
|
|
121
|
+
this.elements = elements;
|
|
122
|
+
this._minSize = _minSize;
|
|
123
|
+
this._maxSize = _maxSize;
|
|
124
|
+
}
|
|
125
|
+
static create(elements) {
|
|
126
|
+
return new SetGenerator(elements);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Set the minimum set size.
|
|
130
|
+
*/
|
|
131
|
+
minSize(value) {
|
|
132
|
+
return new SetGenerator(this.elements, value, this._maxSize);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Set the maximum set size.
|
|
136
|
+
*/
|
|
137
|
+
maxSize(value) {
|
|
138
|
+
return new SetGenerator(this.elements, this._minSize, value);
|
|
139
|
+
}
|
|
140
|
+
generate() {
|
|
141
|
+
// Generate as unique array, then convert to Set
|
|
142
|
+
const arr = arrays(this.elements)
|
|
143
|
+
.minSize(this._minSize)
|
|
144
|
+
.maxSize(this._maxSize ?? 100)
|
|
145
|
+
.unique()
|
|
146
|
+
.generate();
|
|
147
|
+
return new Set(arr);
|
|
148
|
+
}
|
|
149
|
+
schema() {
|
|
150
|
+
const elementSchema = this.elements.schema();
|
|
151
|
+
if (!elementSchema) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const schema = {
|
|
155
|
+
type: "set",
|
|
156
|
+
elements: elementSchema,
|
|
157
|
+
min_size: this._minSize,
|
|
158
|
+
};
|
|
159
|
+
if (this._maxSize !== undefined) {
|
|
160
|
+
schema.max_size = this._maxSize;
|
|
161
|
+
}
|
|
162
|
+
return schema;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Create a generator for Sets.
|
|
167
|
+
*/
|
|
168
|
+
export function sets(elements) {
|
|
169
|
+
return SetGenerator.create(elements);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Generator for Maps (dictionaries) with configurable key and value types.
|
|
173
|
+
*/
|
|
174
|
+
export class MapGenerator extends BaseGenerator {
|
|
175
|
+
keys;
|
|
176
|
+
values;
|
|
177
|
+
_minSize;
|
|
178
|
+
_maxSize;
|
|
179
|
+
constructor(keys, values, _minSize = 0, _maxSize) {
|
|
180
|
+
super();
|
|
181
|
+
this.keys = keys;
|
|
182
|
+
this.values = values;
|
|
183
|
+
this._minSize = _minSize;
|
|
184
|
+
this._maxSize = _maxSize;
|
|
185
|
+
}
|
|
186
|
+
static create(keys, values) {
|
|
187
|
+
return new MapGenerator(keys, values);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Set the minimum map size.
|
|
191
|
+
*/
|
|
192
|
+
minSize(value) {
|
|
193
|
+
return new MapGenerator(this.keys, this.values, value, this._maxSize);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Set the maximum map size.
|
|
197
|
+
*/
|
|
198
|
+
maxSize(value) {
|
|
199
|
+
return new MapGenerator(this.keys, this.values, this._minSize, value);
|
|
200
|
+
}
|
|
201
|
+
generate() {
|
|
202
|
+
const schema = this.schema();
|
|
203
|
+
if (schema) {
|
|
204
|
+
// Schema composition: single socket round-trip
|
|
205
|
+
// Wire format is [[key, value], ...]
|
|
206
|
+
const pairs = generateFromSchema(schema);
|
|
207
|
+
const result = new Map(pairs);
|
|
208
|
+
// Ensure size constraints are met (in case of duplicate keys)
|
|
209
|
+
assume(result.size >= this._minSize);
|
|
210
|
+
if (this._maxSize !== undefined) {
|
|
211
|
+
assume(result.size <= this._maxSize);
|
|
212
|
+
}
|
|
213
|
+
return result;
|
|
214
|
+
}
|
|
215
|
+
// Compositional fallback
|
|
216
|
+
return group(LABELS.MAP, () => {
|
|
217
|
+
const maxSize = this._maxSize ?? 100;
|
|
218
|
+
const targetSize = integers().min(this._minSize).max(maxSize).generate();
|
|
219
|
+
const result = new Map();
|
|
220
|
+
const maxAttempts = targetSize * 10;
|
|
221
|
+
let attempts = 0;
|
|
222
|
+
while (result.size < targetSize && attempts < maxAttempts) {
|
|
223
|
+
group(LABELS.MAP_ENTRY, () => {
|
|
224
|
+
const key = this.keys.generate();
|
|
225
|
+
if (!result.has(key)) {
|
|
226
|
+
result.set(key, this.values.generate());
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
attempts++;
|
|
230
|
+
}
|
|
231
|
+
assume(result.size >= this._minSize);
|
|
232
|
+
return result;
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
schema() {
|
|
236
|
+
const keySchema = this.keys.schema();
|
|
237
|
+
const valueSchema = this.values.schema();
|
|
238
|
+
if (!keySchema || !valueSchema) {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
const schema = {
|
|
242
|
+
type: "dict",
|
|
243
|
+
keys: keySchema,
|
|
244
|
+
values: valueSchema,
|
|
245
|
+
min_size: this._minSize,
|
|
246
|
+
};
|
|
247
|
+
if (this._maxSize !== undefined) {
|
|
248
|
+
schema.max_size = this._maxSize;
|
|
249
|
+
}
|
|
250
|
+
return schema;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Create a generator for Maps with configurable key and value types.
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* ```typescript
|
|
258
|
+
* // String keys (common case)
|
|
259
|
+
* const strMap = maps(text(), integers());
|
|
260
|
+
*
|
|
261
|
+
* // Integer keys
|
|
262
|
+
* const intMap = maps(integers(), text());
|
|
263
|
+
* ```
|
|
264
|
+
*/
|
|
265
|
+
export function maps(keys, values) {
|
|
266
|
+
return MapGenerator.create(keys, values);
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Generator for tuples (fixed-length heterogeneous arrays).
|
|
270
|
+
*/
|
|
271
|
+
class TupleGenerator extends BaseGenerator {
|
|
272
|
+
generators;
|
|
273
|
+
constructor(generators) {
|
|
274
|
+
super();
|
|
275
|
+
this.generators = generators;
|
|
276
|
+
}
|
|
277
|
+
generate() {
|
|
278
|
+
const schema = this.schema();
|
|
279
|
+
if (schema) {
|
|
280
|
+
return generateFromSchema(schema);
|
|
281
|
+
}
|
|
282
|
+
// Compositional fallback
|
|
283
|
+
return group(LABELS.TUPLE, () => {
|
|
284
|
+
return this.generators.map(gen => gen.generate());
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
schema() {
|
|
288
|
+
const schemas = [];
|
|
289
|
+
for (const gen of this.generators) {
|
|
290
|
+
const s = gen.schema();
|
|
291
|
+
if (!s)
|
|
292
|
+
return null;
|
|
293
|
+
schemas.push(s);
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
type: "tuple",
|
|
297
|
+
elements: schemas,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Create a generator for tuples (fixed-length heterogeneous arrays).
|
|
303
|
+
*
|
|
304
|
+
* @example
|
|
305
|
+
* ```typescript
|
|
306
|
+
* const gen = tuples(integers(), text(), booleans());
|
|
307
|
+
* const [num, str, bool] = gen.generate();
|
|
308
|
+
* ```
|
|
309
|
+
*/
|
|
310
|
+
export function tuples(...generators) {
|
|
311
|
+
return new TupleGenerator(generators);
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=collections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Generator } from "./generator.js";
|
|
2
|
+
/**
|
|
3
|
+
* Create a generator that samples uniformly from a fixed collection.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```typescript
|
|
7
|
+
* const colors = sampledFrom(["red", "green", "blue"]);
|
|
8
|
+
* const color: string = colors.generate();
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
export declare function sampledFrom<T>(elements: readonly T[]): Generator<T>;
|
|
12
|
+
/**
|
|
13
|
+
* Create a generator that chooses from one of several generators.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const gen = oneOf(
|
|
18
|
+
* integers().min(0).max(10),
|
|
19
|
+
* integers().min(100).max(110)
|
|
20
|
+
* );
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function oneOf<T>(...generators: Generator<T>[]): Generator<T>;
|
|
24
|
+
/**
|
|
25
|
+
* Create a generator for optional values (T | null).
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const gen = optional(integers());
|
|
30
|
+
* const value: number | null = gen.generate();
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare function optional<T>(inner: Generator<T>): Generator<T | null>;
|
|
34
|
+
//# sourceMappingURL=combinators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combinators.d.ts","sourceRoot":"","sources":["../src/combinators.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAA6B,MAAM,gBAAgB,CAAA;AAkDrE;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAEnE;AAwCD;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAEpE;AAiCD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAEpE"}
|