import 'dotenv/config'; import Prando from 'prando'; import {Gen, Property, listOf, property, shrinklist, someInt} from './property'; function arrayEquals(a: A[], b: A[]): boolean { return ( Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.every((val, index) => val === b[index]) ); } function reverse(arr: A[]): A[] { let result = []; for (let i = arr.length - 1; i >= 0; i--) { result.push(arr[i]); } return result; } function reverse_is_self_inverse(arr: number[]): boolean { return arrayEquals(reverse(reverse(arr)), arr); } function gen2lists(gen: Gen): Gen<[A[], A[]]> { return (rng: Prando) => { let gl = listOf(gen)(rng); return (size: number) => { return [gl(size), gl(size)]; }; }; } function reverse_with_two_lists(arrs: [A[], A[]]): boolean { return arrayEquals( reverse(arrs[0].concat(arrs[1])), reverse(arrs[1]).concat(reverse(arrs[0])), ); } function shrink2lists([l1, l2]: [A[], A[]]): [A[], A[]][] { let result: [A[], A[]][] = []; let s1 = shrinklist(l1); let s2 = shrinklist(l2); for (let i = 0; i < s1.length; i++) { let j = s2.length - i - 1; let news2 = j >= 0 ? s2[j] : []; result.push([s1[i], news2]); } return result; } export let prop_reverse_with_two_lists = property<[number[], number[]]>( gen2lists(someInt), reverse_with_two_lists, shrink2lists, ); let prop_reverse_is_self_inverse = property( listOf(someInt), reverse_is_self_inverse, shrinklist, ); async function main(): Promise { let reverse_append_result = Property.run(prop_reverse_with_two_lists); let reverse_reverse_result = Property.run(prop_reverse_is_self_inverse); console.log( 'reverse_append_result: ' + JSON.stringify(reverse_append_result), ); console.log( 'reverse_reverse_result: ' + JSON.stringify(reverse_reverse_result), ); }