diff options
Diffstat (limited to 'js/testing/testing.ts')
-rw-r--r-- | js/testing/testing.ts | 62 |
1 files changed, 61 insertions, 1 deletions
diff --git a/js/testing/testing.ts b/js/testing/testing.ts index 437cb0f38..4cf7ea27f 100644 --- a/js/testing/testing.ts +++ b/js/testing/testing.ts @@ -13,7 +13,67 @@ limitations under the License. */ -export { assert, assertEqual, equal } from "./util"; +// Do not add imports in this file in order to be compatible with Node. + +export function assertEqual(actual: unknown, expected: unknown, msg?: string) { + if (!equal(actual, expected)) { + let actualString: string; + let expectedString: string; + try { + actualString = String(actual); + } catch (e) { + actualString = "[Cannot display]"; + } + try { + expectedString = String(expected); + } catch (e) { + expectedString = "[Cannot display]"; + } + console.error( + "assertEqual failed. actual =", + actualString, + "expected =", + expectedString + ); + if (!msg) { + msg = `actual: ${actualString} expected: ${expectedString}`; + } + throw new Error(msg); + } +} + +export function assert(expr: boolean, msg = "") { + if (!expr) { + throw new Error(msg); + } +} + +// TODO(ry) Use unknown here for parameters types. +// tslint:disable-next-line:no-any +export function equal(c: any, d: any): boolean { + const seen = new Map(); + return (function compare(a, b) { + if (Object.is(a, b)) { + return true; + } + if (a && typeof a === "object" && b && typeof b === "object") { + if (seen.get(a) === b) { + return true; + } + if (Object.keys(a).length !== Object.keys(b).length) { + return false; + } + for (const key in { ...a, ...b }) { + if (!compare(a[key], b[key])) { + return false; + } + } + seen.set(a, b); + return true; + } + return false; + })(c, d); +} export type TestFunction = () => void | Promise<void>; |