import "dotenv/config"; import Prando from 'prando'; import { Gen, 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[0]).concat(reverse(arrs[1]))); } 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; } let prop_reverse_with_two_lists = property<[number[], number[]]>(reverse_with_two_lists, gen2lists(someInt), shrink2lists); let prop_reverse_is_self_inverse = property(reverse_is_self_inverse, listOf(someInt), shrinklist); async function main() { let rng = new Prando(Math.random() * 1000); let reverse_append_result = prop_reverse_with_two_lists(rng, 0); let reverse_reverse_result = prop_reverse_is_self_inverse(rng, 0); console.log('result: ' + JSON.stringify(reverse_append_result)); console.log('result: ' + JSON.stringify(reverse_reverse_result)); } main();