export class AssertionError extends Error { constructor(message) { super(message) } } export const assert = (value, message = `assertion error: ${value} is not true`) => { assertEq(value, true, message) } export const assertEq = (a, b, message = `assertion error: ${a} !== ${b}`) => { if (a === b) { return } else if (Array.isArray(b) && a.length === b.length) { b.forEach((n, i) => assertEq(a[i], n)) return } else { throw new AssertionError(message) } } export const assertCallback = () => { let result = false setTimeout(() => assert(result), 0) return () => result = true } export const it = (description, test) => { return () => { try { test() return { success: true, description, error: undefined } } catch (error) { return { success: false, description, error } } } }