diff options
Diffstat (limited to 'pbt/ts/src/property.ts')
| -rw-r--r-- | pbt/ts/src/property.ts | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/pbt/ts/src/property.ts b/pbt/ts/src/property.ts index d4eea28..7714747 100644 --- a/pbt/ts/src/property.ts +++ b/pbt/ts/src/property.ts @@ -5,6 +5,7 @@ type Result = 'OK' | 'Falsified' | 'Exception'; type ShrinkResult<A> = { counterexample: A, shrinks: number }; type TestResult<A> = { + seed: number | null, result: Result, counterexample: ShrinkResult<A> | null }; @@ -15,8 +16,8 @@ export type Gen<A> = (rng: Prando) => ((size: number) => A); type Shrinker<A> = (a: A) => A[]; -type Property<A> = (rng: Prando, - size: number) => TestResult<A>; +type Property<A> = (seed: number, + size: number) => TestResult<A>; const MAX_SUCCESS = 100; @@ -49,20 +50,21 @@ export function property<A>( predicate: Predicate<A>, generator: Gen<A>, shrinker: Shrinker<A>): Property<A> { - return (rng: Prando, - size: number) => { - let gen = generator(rng); - let i = 0; - for (; i < MAX_SUCCESS; i++) { - let x = gen(size); - if (!predicate(x)) { - let counterexample = findMinimalCounterExample(x, predicate, shrinker); - return { result: 'Falsified', tests: i+1, counterexample }; - } - size++; - } - return { result: 'OK', tests: i, counterexample: null }; - }; + return (seed: number, + size: number) => { + let rng = new Prando(seed); + let gen = generator(rng); + let i = 0; + for (; i < MAX_SUCCESS; i++) { + let x = gen(size); + if (!predicate(x)) { + let counterexample = findMinimalCounterExample(x, predicate, shrinker); + return { seed, result: 'Falsified', tests: i + 1, counterexample }; + } + size++; + } + return { seed, result: 'OK', tests: i, counterexample: null }; + }; } // basic generators @@ -86,9 +88,9 @@ export function shrinklist<A>(arr: A[]): A[][] { let tail = arr.slice(1); let keep1 = arr.slice(); keep1.splice(1, 1); - result.push(tail,keep1); + result.push(tail, keep1); - if (arr.length >3) { + if (arr.length > 3) { let half = Math.floor(arr.length / 2); let copy = arr.slice(); let secondHalf = copy.slice(half); @@ -98,6 +100,13 @@ export function shrinklist<A>(arr: A[]): A[][] { return result; } -export let someInt : Gen<number> = (rng: Prando) => +export let someInt: Gen<number> = (rng: Prando) => (size: number) => rng.nextInt(-size, size); + +export const Property = { + run<A>(prop: Property<A>): TestResult<A> { + let seed = Math.floor(Math.random() * 1000000); + return prop(seed, 0); + } +}; |
