invar-tools 1.16.0__py3-none-any.whl → 1.17.1__py3-none-any.whl

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,338 @@
1
+ /**
2
+ * @invar/fc-runner - Programmatic fast-check runner with rich failure analysis
3
+ *
4
+ * Provides:
5
+ * - Typed counterexamples (not just strings)
6
+ * - Shrinking path and step count
7
+ * - Root cause classification
8
+ * - Suggested fix based on failure pattern
9
+ */
10
+ import * as fc from 'fast-check';
11
+ import { z } from 'zod';
12
+ export declare const RootCauseSchema: z.ZodEnum<["boundary_violation", "null_reference", "type_coercion", "floating_point", "empty_collection", "overflow", "invalid_state", "race_condition", "unknown"]>;
13
+ export type RootCause = z.infer<typeof RootCauseSchema>;
14
+ export declare const CounterexampleSchema: z.ZodObject<{
15
+ values: z.ZodRecord<z.ZodString, z.ZodUnknown>;
16
+ shrunk: z.ZodBoolean;
17
+ shrinkSteps: z.ZodNumber;
18
+ seed: z.ZodOptional<z.ZodNumber>;
19
+ }, "strip", z.ZodTypeAny, {
20
+ values: Record<string, unknown>;
21
+ shrunk: boolean;
22
+ shrinkSteps: number;
23
+ seed?: number | undefined;
24
+ }, {
25
+ values: Record<string, unknown>;
26
+ shrunk: boolean;
27
+ shrinkSteps: number;
28
+ seed?: number | undefined;
29
+ }>;
30
+ export type Counterexample = z.infer<typeof CounterexampleSchema>;
31
+ export declare const FailureAnalysisSchema: z.ZodObject<{
32
+ failedAssertion: z.ZodString;
33
+ actual: z.ZodOptional<z.ZodUnknown>;
34
+ expected: z.ZodOptional<z.ZodUnknown>;
35
+ rootCause: z.ZodEnum<["boundary_violation", "null_reference", "type_coercion", "floating_point", "empty_collection", "overflow", "invalid_state", "race_condition", "unknown"]>;
36
+ suggestedFix: z.ZodString;
37
+ }, "strip", z.ZodTypeAny, {
38
+ failedAssertion: string;
39
+ rootCause: "boundary_violation" | "null_reference" | "type_coercion" | "floating_point" | "empty_collection" | "overflow" | "invalid_state" | "race_condition" | "unknown";
40
+ suggestedFix: string;
41
+ expected?: unknown;
42
+ actual?: unknown;
43
+ }, {
44
+ failedAssertion: string;
45
+ rootCause: "boundary_violation" | "null_reference" | "type_coercion" | "floating_point" | "empty_collection" | "overflow" | "invalid_state" | "race_condition" | "unknown";
46
+ suggestedFix: string;
47
+ expected?: unknown;
48
+ actual?: unknown;
49
+ }>;
50
+ export type FailureAnalysis = z.infer<typeof FailureAnalysisSchema>;
51
+ export declare const PropertyResultSchema: z.ZodObject<{
52
+ name: z.ZodString;
53
+ passed: z.ZodBoolean;
54
+ numRuns: z.ZodNumber;
55
+ counterexample: z.ZodOptional<z.ZodObject<{
56
+ values: z.ZodRecord<z.ZodString, z.ZodUnknown>;
57
+ shrunk: z.ZodBoolean;
58
+ shrinkSteps: z.ZodNumber;
59
+ seed: z.ZodOptional<z.ZodNumber>;
60
+ }, "strip", z.ZodTypeAny, {
61
+ values: Record<string, unknown>;
62
+ shrunk: boolean;
63
+ shrinkSteps: number;
64
+ seed?: number | undefined;
65
+ }, {
66
+ values: Record<string, unknown>;
67
+ shrunk: boolean;
68
+ shrinkSteps: number;
69
+ seed?: number | undefined;
70
+ }>>;
71
+ analysis: z.ZodOptional<z.ZodObject<{
72
+ failedAssertion: z.ZodString;
73
+ actual: z.ZodOptional<z.ZodUnknown>;
74
+ expected: z.ZodOptional<z.ZodUnknown>;
75
+ rootCause: z.ZodEnum<["boundary_violation", "null_reference", "type_coercion", "floating_point", "empty_collection", "overflow", "invalid_state", "race_condition", "unknown"]>;
76
+ suggestedFix: z.ZodString;
77
+ }, "strip", z.ZodTypeAny, {
78
+ failedAssertion: string;
79
+ rootCause: "boundary_violation" | "null_reference" | "type_coercion" | "floating_point" | "empty_collection" | "overflow" | "invalid_state" | "race_condition" | "unknown";
80
+ suggestedFix: string;
81
+ expected?: unknown;
82
+ actual?: unknown;
83
+ }, {
84
+ failedAssertion: string;
85
+ rootCause: "boundary_violation" | "null_reference" | "type_coercion" | "floating_point" | "empty_collection" | "overflow" | "invalid_state" | "race_condition" | "unknown";
86
+ suggestedFix: string;
87
+ expected?: unknown;
88
+ actual?: unknown;
89
+ }>>;
90
+ duration_ms: z.ZodNumber;
91
+ error: z.ZodOptional<z.ZodString>;
92
+ }, "strip", z.ZodTypeAny, {
93
+ name: string;
94
+ passed: boolean;
95
+ numRuns: number;
96
+ duration_ms: number;
97
+ counterexample?: {
98
+ values: Record<string, unknown>;
99
+ shrunk: boolean;
100
+ shrinkSteps: number;
101
+ seed?: number | undefined;
102
+ } | undefined;
103
+ analysis?: {
104
+ failedAssertion: string;
105
+ rootCause: "boundary_violation" | "null_reference" | "type_coercion" | "floating_point" | "empty_collection" | "overflow" | "invalid_state" | "race_condition" | "unknown";
106
+ suggestedFix: string;
107
+ expected?: unknown;
108
+ actual?: unknown;
109
+ } | undefined;
110
+ error?: string | undefined;
111
+ }, {
112
+ name: string;
113
+ passed: boolean;
114
+ numRuns: number;
115
+ duration_ms: number;
116
+ counterexample?: {
117
+ values: Record<string, unknown>;
118
+ shrunk: boolean;
119
+ shrinkSteps: number;
120
+ seed?: number | undefined;
121
+ } | undefined;
122
+ analysis?: {
123
+ failedAssertion: string;
124
+ rootCause: "boundary_violation" | "null_reference" | "type_coercion" | "floating_point" | "empty_collection" | "overflow" | "invalid_state" | "race_condition" | "unknown";
125
+ suggestedFix: string;
126
+ expected?: unknown;
127
+ actual?: unknown;
128
+ } | undefined;
129
+ error?: string | undefined;
130
+ }>;
131
+ export type PropertyResult = z.infer<typeof PropertyResultSchema>;
132
+ export declare const RunnerResultSchema: z.ZodObject<{
133
+ passed: z.ZodBoolean;
134
+ total: z.ZodNumber;
135
+ failed: z.ZodNumber;
136
+ duration_ms: z.ZodNumber;
137
+ properties: z.ZodArray<z.ZodObject<{
138
+ name: z.ZodString;
139
+ passed: z.ZodBoolean;
140
+ numRuns: z.ZodNumber;
141
+ counterexample: z.ZodOptional<z.ZodObject<{
142
+ values: z.ZodRecord<z.ZodString, z.ZodUnknown>;
143
+ shrunk: z.ZodBoolean;
144
+ shrinkSteps: z.ZodNumber;
145
+ seed: z.ZodOptional<z.ZodNumber>;
146
+ }, "strip", z.ZodTypeAny, {
147
+ values: Record<string, unknown>;
148
+ shrunk: boolean;
149
+ shrinkSteps: number;
150
+ seed?: number | undefined;
151
+ }, {
152
+ values: Record<string, unknown>;
153
+ shrunk: boolean;
154
+ shrinkSteps: number;
155
+ seed?: number | undefined;
156
+ }>>;
157
+ analysis: z.ZodOptional<z.ZodObject<{
158
+ failedAssertion: z.ZodString;
159
+ actual: z.ZodOptional<z.ZodUnknown>;
160
+ expected: z.ZodOptional<z.ZodUnknown>;
161
+ rootCause: z.ZodEnum<["boundary_violation", "null_reference", "type_coercion", "floating_point", "empty_collection", "overflow", "invalid_state", "race_condition", "unknown"]>;
162
+ suggestedFix: z.ZodString;
163
+ }, "strip", z.ZodTypeAny, {
164
+ failedAssertion: string;
165
+ rootCause: "boundary_violation" | "null_reference" | "type_coercion" | "floating_point" | "empty_collection" | "overflow" | "invalid_state" | "race_condition" | "unknown";
166
+ suggestedFix: string;
167
+ expected?: unknown;
168
+ actual?: unknown;
169
+ }, {
170
+ failedAssertion: string;
171
+ rootCause: "boundary_violation" | "null_reference" | "type_coercion" | "floating_point" | "empty_collection" | "overflow" | "invalid_state" | "race_condition" | "unknown";
172
+ suggestedFix: string;
173
+ expected?: unknown;
174
+ actual?: unknown;
175
+ }>>;
176
+ duration_ms: z.ZodNumber;
177
+ error: z.ZodOptional<z.ZodString>;
178
+ }, "strip", z.ZodTypeAny, {
179
+ name: string;
180
+ passed: boolean;
181
+ numRuns: number;
182
+ duration_ms: number;
183
+ counterexample?: {
184
+ values: Record<string, unknown>;
185
+ shrunk: boolean;
186
+ shrinkSteps: number;
187
+ seed?: number | undefined;
188
+ } | undefined;
189
+ analysis?: {
190
+ failedAssertion: string;
191
+ rootCause: "boundary_violation" | "null_reference" | "type_coercion" | "floating_point" | "empty_collection" | "overflow" | "invalid_state" | "race_condition" | "unknown";
192
+ suggestedFix: string;
193
+ expected?: unknown;
194
+ actual?: unknown;
195
+ } | undefined;
196
+ error?: string | undefined;
197
+ }, {
198
+ name: string;
199
+ passed: boolean;
200
+ numRuns: number;
201
+ duration_ms: number;
202
+ counterexample?: {
203
+ values: Record<string, unknown>;
204
+ shrunk: boolean;
205
+ shrinkSteps: number;
206
+ seed?: number | undefined;
207
+ } | undefined;
208
+ analysis?: {
209
+ failedAssertion: string;
210
+ rootCause: "boundary_violation" | "null_reference" | "type_coercion" | "floating_point" | "empty_collection" | "overflow" | "invalid_state" | "race_condition" | "unknown";
211
+ suggestedFix: string;
212
+ expected?: unknown;
213
+ actual?: unknown;
214
+ } | undefined;
215
+ error?: string | undefined;
216
+ }>, "many">;
217
+ confidence: z.ZodEnum<["statistical", "exhaustive"]>;
218
+ }, "strip", z.ZodTypeAny, {
219
+ passed: boolean;
220
+ duration_ms: number;
221
+ total: number;
222
+ failed: number;
223
+ properties: {
224
+ name: string;
225
+ passed: boolean;
226
+ numRuns: number;
227
+ duration_ms: number;
228
+ counterexample?: {
229
+ values: Record<string, unknown>;
230
+ shrunk: boolean;
231
+ shrinkSteps: number;
232
+ seed?: number | undefined;
233
+ } | undefined;
234
+ analysis?: {
235
+ failedAssertion: string;
236
+ rootCause: "boundary_violation" | "null_reference" | "type_coercion" | "floating_point" | "empty_collection" | "overflow" | "invalid_state" | "race_condition" | "unknown";
237
+ suggestedFix: string;
238
+ expected?: unknown;
239
+ actual?: unknown;
240
+ } | undefined;
241
+ error?: string | undefined;
242
+ }[];
243
+ confidence: "statistical" | "exhaustive";
244
+ }, {
245
+ passed: boolean;
246
+ duration_ms: number;
247
+ total: number;
248
+ failed: number;
249
+ properties: {
250
+ name: string;
251
+ passed: boolean;
252
+ numRuns: number;
253
+ duration_ms: number;
254
+ counterexample?: {
255
+ values: Record<string, unknown>;
256
+ shrunk: boolean;
257
+ shrinkSteps: number;
258
+ seed?: number | undefined;
259
+ } | undefined;
260
+ analysis?: {
261
+ failedAssertion: string;
262
+ rootCause: "boundary_violation" | "null_reference" | "type_coercion" | "floating_point" | "empty_collection" | "overflow" | "invalid_state" | "race_condition" | "unknown";
263
+ suggestedFix: string;
264
+ expected?: unknown;
265
+ actual?: unknown;
266
+ } | undefined;
267
+ error?: string | undefined;
268
+ }[];
269
+ confidence: "statistical" | "exhaustive";
270
+ }>;
271
+ export type RunnerResult = z.infer<typeof RunnerResultSchema>;
272
+ export declare const RunnerOptionsSchema: z.ZodObject<{
273
+ seed: z.ZodOptional<z.ZodNumber>;
274
+ numRuns: z.ZodDefault<z.ZodNumber>;
275
+ verbose: z.ZodDefault<z.ZodBoolean>;
276
+ endOnFailure: z.ZodDefault<z.ZodBoolean>;
277
+ }, "strip", z.ZodTypeAny, {
278
+ numRuns: number;
279
+ verbose: boolean;
280
+ endOnFailure: boolean;
281
+ seed?: number | undefined;
282
+ }, {
283
+ seed?: number | undefined;
284
+ numRuns?: number | undefined;
285
+ verbose?: boolean | undefined;
286
+ endOnFailure?: boolean | undefined;
287
+ }>;
288
+ export type RunnerOptions = z.infer<typeof RunnerOptionsSchema>;
289
+ export interface PropertyDefinition<T extends Record<string, unknown>> {
290
+ name: string;
291
+ arbitraries: {
292
+ [K in keyof T]: fc.Arbitrary<T[K]>;
293
+ };
294
+ predicate: (input: T) => boolean | void;
295
+ }
296
+ /**
297
+ * Define a property test.
298
+ *
299
+ * @example
300
+ * ```typescript
301
+ * const prop = defineProperty({
302
+ * name: 'addition is commutative',
303
+ * arbitraries: {
304
+ * a: fc.integer(),
305
+ * b: fc.integer(),
306
+ * },
307
+ * predicate: ({ a, b }) => a + b === b + a,
308
+ * });
309
+ * ```
310
+ */
311
+ export declare function defineProperty<T extends Record<string, unknown>>(def: PropertyDefinition<T>): PropertyDefinition<T>;
312
+ /**
313
+ * Run multiple property tests.
314
+ *
315
+ * @param properties - Array of property definitions
316
+ * @param options - Runner options
317
+ * @returns Combined result
318
+ *
319
+ * @example
320
+ * ```typescript
321
+ * import { runProperties, defineProperty } from '@invar/fc-runner';
322
+ *
323
+ * const props = [
324
+ * defineProperty({
325
+ * name: 'addition is commutative',
326
+ * arbitraries: { a: fc.integer(), b: fc.integer() },
327
+ * predicate: ({ a, b }) => a + b === b + a,
328
+ * }),
329
+ * ];
330
+ *
331
+ * const result = runProperties(props, { numRuns: 1000 });
332
+ * console.log(`Passed: ${result.passed}`);
333
+ * ```
334
+ */
335
+ export declare function runProperties(properties: PropertyDefinition<Record<string, unknown>>[], options?: Partial<RunnerOptions>): RunnerResult;
336
+ export { fc };
337
+ export default runProperties;
338
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,eAAe,sKAU1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;EAK/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;EAMhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQ/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;EAK9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAwFhE,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;IACpD,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;CACzC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC,GACzB,kBAAkB,CAAC,CAAC,CAAC,CAEvB;AA+ED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,EACzD,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GACnC,YAAY,CAwBd;AAGD,OAAO,EAAE,EAAE,EAAE,CAAC;AAEd,eAAe,aAAa,CAAC"}
@@ -0,0 +1,260 @@
1
+ /**
2
+ * @invar/fc-runner - Programmatic fast-check runner with rich failure analysis
3
+ *
4
+ * Provides:
5
+ * - Typed counterexamples (not just strings)
6
+ * - Shrinking path and step count
7
+ * - Root cause classification
8
+ * - Suggested fix based on failure pattern
9
+ */
10
+ import * as fc from 'fast-check';
11
+ import { z } from 'zod';
12
+ // ============================================================================
13
+ // Schemas
14
+ // ============================================================================
15
+ export const RootCauseSchema = z.enum([
16
+ 'boundary_violation', // Off-by-one, bounds exceeded
17
+ 'null_reference', // Null/undefined access
18
+ 'type_coercion', // Unexpected type conversion
19
+ 'floating_point', // Precision issues
20
+ 'empty_collection', // Empty array/object issues
21
+ 'overflow', // Integer overflow
22
+ 'invalid_state', // State machine violation
23
+ 'race_condition', // Concurrent access issues
24
+ 'unknown', // Unclassified
25
+ ]);
26
+ export const CounterexampleSchema = z.object({
27
+ values: z.record(z.unknown()),
28
+ shrunk: z.boolean(),
29
+ shrinkSteps: z.number(),
30
+ seed: z.number().optional(),
31
+ });
32
+ export const FailureAnalysisSchema = z.object({
33
+ failedAssertion: z.string(),
34
+ actual: z.unknown().optional(),
35
+ expected: z.unknown().optional(),
36
+ rootCause: RootCauseSchema,
37
+ suggestedFix: z.string(),
38
+ });
39
+ export const PropertyResultSchema = z.object({
40
+ name: z.string(),
41
+ passed: z.boolean(),
42
+ numRuns: z.number(),
43
+ counterexample: CounterexampleSchema.optional(),
44
+ analysis: FailureAnalysisSchema.optional(),
45
+ duration_ms: z.number(),
46
+ error: z.string().optional(),
47
+ });
48
+ export const RunnerResultSchema = z.object({
49
+ passed: z.boolean(),
50
+ total: z.number(),
51
+ failed: z.number(),
52
+ duration_ms: z.number(),
53
+ properties: z.array(PropertyResultSchema),
54
+ confidence: z.enum(['statistical', 'exhaustive']),
55
+ });
56
+ export const RunnerOptionsSchema = z.object({
57
+ seed: z.number().optional(),
58
+ numRuns: z.number().default(100),
59
+ verbose: z.boolean().default(false),
60
+ endOnFailure: z.boolean().default(false),
61
+ });
62
+ // ============================================================================
63
+ // Root Cause Detection
64
+ // ============================================================================
65
+ /**
66
+ * Analyze error to determine root cause.
67
+ */
68
+ function classifyRootCause(error, counterexample) {
69
+ const errorStr = String(error).toLowerCase();
70
+ // Check for null/undefined
71
+ if (errorStr.includes('null') || errorStr.includes('undefined') || errorStr.includes('cannot read')) {
72
+ return 'null_reference';
73
+ }
74
+ // Check for type errors
75
+ if (errorStr.includes('type') || errorStr.includes('nan') || errorStr.includes('not a')) {
76
+ return 'type_coercion';
77
+ }
78
+ // Check for boundary issues
79
+ if (errorStr.includes('index') || errorStr.includes('bound') || errorStr.includes('range')) {
80
+ return 'boundary_violation';
81
+ }
82
+ // Check for overflow
83
+ if (errorStr.includes('overflow') || errorStr.includes('infinity')) {
84
+ return 'overflow';
85
+ }
86
+ // Check counterexample values for patterns
87
+ const values = Object.values(counterexample);
88
+ // Empty collections
89
+ if (values.some(v => Array.isArray(v) && v.length === 0)) {
90
+ return 'empty_collection';
91
+ }
92
+ // Floating point precision
93
+ if (values.some(v => typeof v === 'number' && !Number.isInteger(v))) {
94
+ if (errorStr.includes('precision') || errorStr.includes('equal')) {
95
+ return 'floating_point';
96
+ }
97
+ }
98
+ // Boundary values
99
+ if (values.some(v => v === 0 || v === -1 || v === 1 ||
100
+ v === Number.MAX_SAFE_INTEGER || v === Number.MIN_SAFE_INTEGER)) {
101
+ return 'boundary_violation';
102
+ }
103
+ return 'unknown';
104
+ }
105
+ /**
106
+ * Generate suggested fix based on root cause.
107
+ */
108
+ function suggestFix(rootCause, _counterexample) {
109
+ switch (rootCause) {
110
+ case 'boundary_violation':
111
+ return 'Add bounds checking: validate array indices and loop boundaries';
112
+ case 'null_reference':
113
+ return 'Add null check: use optional chaining (?.) or explicit null guard';
114
+ case 'type_coercion':
115
+ return 'Add type validation: use Zod schema or explicit type check';
116
+ case 'floating_point':
117
+ return 'Use Math.round() or Number.EPSILON for floating point comparison';
118
+ case 'empty_collection':
119
+ return 'Add empty check: validate collection length before access';
120
+ case 'overflow':
121
+ return 'Add overflow protection: use BigInt or clamp values';
122
+ case 'invalid_state':
123
+ return 'Add state validation: check preconditions before state transition';
124
+ case 'race_condition':
125
+ return 'Add synchronization: use mutex or atomic operations';
126
+ default:
127
+ return 'Review the counterexample and add appropriate validation';
128
+ }
129
+ }
130
+ /**
131
+ * Define a property test.
132
+ *
133
+ * @example
134
+ * ```typescript
135
+ * const prop = defineProperty({
136
+ * name: 'addition is commutative',
137
+ * arbitraries: {
138
+ * a: fc.integer(),
139
+ * b: fc.integer(),
140
+ * },
141
+ * predicate: ({ a, b }) => a + b === b + a,
142
+ * });
143
+ * ```
144
+ */
145
+ export function defineProperty(def) {
146
+ return def;
147
+ }
148
+ // ============================================================================
149
+ // Runner
150
+ // ============================================================================
151
+ /**
152
+ * Run a single property test.
153
+ */
154
+ function runProperty(prop, options) {
155
+ const start = Date.now();
156
+ // Create record arbitrary
157
+ const recordArbitrary = fc.record(prop.arbitraries);
158
+ try {
159
+ const checkParams = {
160
+ numRuns: options.numRuns,
161
+ verbose: options.verbose ? fc.VerbosityLevel.Verbose : fc.VerbosityLevel.None,
162
+ endOnFailure: options.endOnFailure,
163
+ };
164
+ if (options.seed !== undefined) {
165
+ checkParams.seed = options.seed;
166
+ }
167
+ const property = fc.property(recordArbitrary, (input) => {
168
+ return prop.predicate(input);
169
+ });
170
+ const result = fc.check(property, checkParams);
171
+ if (result.failed) {
172
+ const counterexampleValues = result.counterexample?.[0] ?? {};
173
+ const counterexample = {
174
+ values: counterexampleValues,
175
+ shrunk: (result.numShrinks ?? 0) > 0,
176
+ shrinkSteps: result.numShrinks ?? 0,
177
+ seed: result.seed,
178
+ };
179
+ const rootCause = classifyRootCause(result.error, counterexampleValues);
180
+ const analysis = {
181
+ failedAssertion: prop.name,
182
+ actual: result.error,
183
+ rootCause,
184
+ suggestedFix: suggestFix(rootCause, counterexampleValues),
185
+ };
186
+ return {
187
+ name: prop.name,
188
+ passed: false,
189
+ numRuns: result.numRuns,
190
+ counterexample,
191
+ analysis,
192
+ duration_ms: Date.now() - start,
193
+ error: String(result.error),
194
+ };
195
+ }
196
+ return {
197
+ name: prop.name,
198
+ passed: true,
199
+ numRuns: result.numRuns,
200
+ duration_ms: Date.now() - start,
201
+ };
202
+ }
203
+ catch (error) {
204
+ return {
205
+ name: prop.name,
206
+ passed: false,
207
+ numRuns: 0,
208
+ duration_ms: Date.now() - start,
209
+ error: String(error),
210
+ };
211
+ }
212
+ }
213
+ /**
214
+ * Run multiple property tests.
215
+ *
216
+ * @param properties - Array of property definitions
217
+ * @param options - Runner options
218
+ * @returns Combined result
219
+ *
220
+ * @example
221
+ * ```typescript
222
+ * import { runProperties, defineProperty } from '@invar/fc-runner';
223
+ *
224
+ * const props = [
225
+ * defineProperty({
226
+ * name: 'addition is commutative',
227
+ * arbitraries: { a: fc.integer(), b: fc.integer() },
228
+ * predicate: ({ a, b }) => a + b === b + a,
229
+ * }),
230
+ * ];
231
+ *
232
+ * const result = runProperties(props, { numRuns: 1000 });
233
+ * console.log(`Passed: ${result.passed}`);
234
+ * ```
235
+ */
236
+ export function runProperties(properties, options = {}) {
237
+ const opts = RunnerOptionsSchema.parse(options);
238
+ const start = Date.now();
239
+ const results = [];
240
+ for (const prop of properties) {
241
+ const result = runProperty(prop, opts);
242
+ results.push(result);
243
+ if (!result.passed && opts.endOnFailure) {
244
+ break;
245
+ }
246
+ }
247
+ const failed = results.filter(r => !r.passed).length;
248
+ return {
249
+ passed: failed === 0,
250
+ total: results.length,
251
+ failed,
252
+ duration_ms: Date.now() - start,
253
+ properties: results,
254
+ confidence: 'statistical',
255
+ };
256
+ }
257
+ // Re-export fast-check arbitraries for convenience
258
+ export { fc };
259
+ export default runProperties;
260
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}