michael@0: // Tests for the assertEqual function in jit-test/lib/asserts.js michael@0: michael@0: load(libdir + "asserts.js"); michael@0: michael@0: function assertNotDeepEq(a, b, options) { michael@0: assertThrowsInstanceOf(() => assertDeepEq(a, b, options), Error); michael@0: } michael@0: michael@0: // primitives michael@0: assertDeepEq(undefined, undefined); michael@0: assertDeepEq("1", "1"); michael@0: assertNotDeepEq(1, "1"); michael@0: assertNotDeepEq(undefined, null); michael@0: assertNotDeepEq({}, null); michael@0: michael@0: // objects michael@0: assertDeepEq({}, {}); michael@0: assertDeepEq({one: 1, two: 2}, {one: 1, two: 2}); michael@0: assertNotDeepEq(Object.freeze({}), {}); michael@0: assertDeepEq(Object.create(null), Object.create(null)); michael@0: assertNotDeepEq(Object.create(null, {a: {configurable: false, value: 3}}), michael@0: Object.create(null, {a: {configurable: true, value: 3}})); michael@0: assertNotDeepEq({one: 1}, {one: 1, two: 2}); michael@0: assertNotDeepEq({yes: true}, {oui: true}); michael@0: assertNotDeepEq({zero: 0}, {zero: "0"}); michael@0: michael@0: // test the comment michael@0: var x = {}, y = {}, ax = [x]; michael@0: assertDeepEq([ax, x], [ax, y]); // passes (bogusly) michael@0: assertNotDeepEq([ax, x], [ax, y], {strictEquivalence: true}); michael@0: assertDeepEq([x, ax], [y, ax]); // passes (bogusly) michael@0: assertNotDeepEq([x, ax], [y, ax], {strictEquivalence: true}); michael@0: michael@0: // object identity michael@0: assertNotDeepEq([x, y], [x, x]); michael@0: assertDeepEq([x, y], [x, y]); michael@0: assertDeepEq([y, x], [x, y]); michael@0: michael@0: // proto chain michael@0: var x = {}; michael@0: assertDeepEq(Object.create(x), Object.create(x)); michael@0: assertDeepEq(Object.create({}), Object.create({})); // equivalent but not identical proto objects michael@0: michael@0: // arrays michael@0: assertDeepEq([], []); michael@0: assertNotDeepEq([], [1]); michael@0: assertDeepEq([1], [1]); michael@0: assertNotDeepEq([0], [1]); michael@0: assertDeepEq([1, 2, 3], [1, 2, 3]); michael@0: assertNotDeepEq([1, , 3], [1, undefined, 3]); michael@0: var p = [], q = []; michael@0: p.prop = 1; michael@0: assertNotDeepEq(p, q); michael@0: assertNotDeepEq(q, p); michael@0: q.prop = 1; michael@0: assertDeepEq(q, p); michael@0: michael@0: // functions michael@0: assertNotDeepEq(() => 1, () => 2); michael@0: assertNotDeepEq((...x) => 1, x => 1); michael@0: assertNotDeepEq(function f(){}, function g(){}); michael@0: var f1 = function () {}, f2 = function () {}; michael@0: assertDeepEq(f1, f1); michael@0: assertDeepEq(f1, f2); // same text, close enough michael@0: f1.prop = 1; michael@0: assertNotDeepEq(f1, f2); michael@0: f2.prop = 1; michael@0: assertDeepEq(f1, f2); michael@0: michael@0: // recursion michael@0: var a = [], b = []; michael@0: a[0] = a; michael@0: b[0] = b; michael@0: assertDeepEq(a, b); michael@0: a[0] = b; michael@0: assertNotDeepEq(a, b); // [#1=[#1#]] is not structurally equivalent to #1=[[#1#]] michael@0: b[0] = a; michael@0: assertDeepEq(a, b); michael@0: b[0] = [a]; // a[0] === b, b[0] === c, c[0] === a michael@0: assertDeepEq(a, b); michael@0: michael@0: // objects that merge michael@0: var x = {}; michael@0: assertDeepEq({x: x}, {x: x}); michael@0: var y = [x]; michael@0: assertDeepEq([y], [y]); michael@0: michael@0: // cross-compartment michael@0: var g1 = newGlobal(), g2 = newGlobal(); michael@0: assertDeepEq(g1, g2); michael@0: assertDeepEq(g1, g2, {strictEquivalence: true}); michael@0: Object.preventExtensions(g2.Math.abs); // make some miniscule change michael@0: assertNotDeepEq(g1, g2);