summaryrefslogtreecommitdiff
path: root/pbt/ts/src/property.ts
diff options
context:
space:
mode:
Diffstat (limited to 'pbt/ts/src/property.ts')
-rw-r--r--pbt/ts/src/property.ts47
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);
+ }
+};