summaryrefslogtreecommitdiff
path: root/js/testing/testing.ts
diff options
context:
space:
mode:
Diffstat (limited to 'js/testing/testing.ts')
-rw-r--r--js/testing/testing.ts62
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>;