export function eq(a: any, b: any): boolean { return Object.is(a, b) || (JSON.stringify(a) === JSON.stringify(b)); } export function fails(cb: () => any | Promise): Promise { return new Promise(resolve => resolve(cb())) .then(() => false, () => true); } export function assert(cb: () => boolean | Promise, message: string = cb.toString()): Promise { return new Promise(resolve => resolve(cb())) .then((result: boolean) => { if (!result) { throw new Error(`Assert failed: ${ message }`); } }); } export function assertFails(cb: () => any | Promise, message: string = cb.toString()): Promise { return assert(() => fails(cb), `expected to fail - ${ message }`); } export function failsSync(cb: () => void): boolean { try { cb(); return false; } catch (e) { return true; } } export function assertFailsSync(cb: () => void): void { if (!failsSync(cb)) { console.log(cb.toString()); throw new Error(`Expected to fail`); } }