mirror of
https://github.com/tc39/test262.git
synced 2025-07-26 23:44:27 +02:00
Replace assertDeepEq with assert.deepEqual
This commit is contained in:
parent
bbbc23cd41
commit
43670a1912
@ -10,7 +10,7 @@ function assertFalse(a) { assertEq(a, false) }
|
|||||||
function assertTrue(a) { assertEq(a, true) }
|
function assertTrue(a) { assertEq(a, true) }
|
||||||
function assertNotEq(found, not_expected) { assertEq(Object.is(found, not_expected), false) }
|
function assertNotEq(found, not_expected) { assertEq(Object.is(found, not_expected), false) }
|
||||||
function assertIteratorResult(result, value, done) {
|
function assertIteratorResult(result, value, done) {
|
||||||
assertDeepEq(result.value, value);
|
assert.deepEqual(result.value, value);
|
||||||
assertEq(result.done, done);
|
assertEq(result.done, done);
|
||||||
}
|
}
|
||||||
function assertIteratorNext(iter, value) {
|
function assertIteratorNext(iter, value) {
|
||||||
|
@ -188,190 +188,4 @@ allow_unused: True
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
globalThis.assertDeepEq = (function(){
|
|
||||||
var call = Function.prototype.call,
|
|
||||||
Array_isArray = Array.isArray,
|
|
||||||
Array_includes = call.bind(Array.prototype.includes),
|
|
||||||
Map_ = Map,
|
|
||||||
Error_ = Error,
|
|
||||||
Symbol_ = Symbol,
|
|
||||||
Symbol_keyFor = Symbol.keyFor,
|
|
||||||
Symbol_description = call.bind(Object.getOwnPropertyDescriptor(Symbol.prototype, "description").get),
|
|
||||||
Map_has = call.bind(Map.prototype.has),
|
|
||||||
Map_get = call.bind(Map.prototype.get),
|
|
||||||
Map_set = call.bind(Map.prototype.set),
|
|
||||||
Object_toString = call.bind(Object.prototype.toString),
|
|
||||||
Function_toString = call.bind(Function.prototype.toString),
|
|
||||||
Object_getPrototypeOf = Object.getPrototypeOf,
|
|
||||||
Object_hasOwnProperty = call.bind(Object.prototype.hasOwnProperty),
|
|
||||||
Object_getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor,
|
|
||||||
Object_isExtensible = Object.isExtensible,
|
|
||||||
Object_getOwnPropertyNames = Object.getOwnPropertyNames;
|
|
||||||
|
|
||||||
// Return true iff ES6 Type(v) isn't Object.
|
|
||||||
// Note that `typeof document.all === "undefined"`.
|
|
||||||
function isPrimitive(v) {
|
|
||||||
return (v === null ||
|
|
||||||
v === undefined ||
|
|
||||||
typeof v === "boolean" ||
|
|
||||||
typeof v === "number" ||
|
|
||||||
typeof v === "string" ||
|
|
||||||
typeof v === "symbol");
|
|
||||||
}
|
|
||||||
|
|
||||||
function assertSameValue(a, b, msg) {
|
|
||||||
try {
|
|
||||||
assertEq(a, b);
|
|
||||||
} catch (exc) {
|
|
||||||
throw Error_(exc.message + (msg ? " " + msg : ""));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function assertSameClass(a, b, msg) {
|
|
||||||
var ac = Object_toString(a), bc = Object_toString(b);
|
|
||||||
assertSameValue(ac, bc, msg);
|
|
||||||
switch (ac) {
|
|
||||||
case "[object Function]":
|
|
||||||
if (typeof isProxy !== "undefined" && !isProxy(a) && !isProxy(b))
|
|
||||||
assertSameValue(Function_toString(a), Function_toString(b), msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function at(prevmsg, segment) {
|
|
||||||
return prevmsg ? prevmsg + segment : "at _" + segment;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assert that the arguments a and b are thoroughly structurally equivalent.
|
|
||||||
//
|
|
||||||
// For the sake of speed, we cut a corner:
|
|
||||||
// var x = {}, y = {}, ax = [x];
|
|
||||||
// assertDeepEq([ax, x], [ax, y]); // passes (?!)
|
|
||||||
//
|
|
||||||
// Technically this should fail, since the two object graphs are different.
|
|
||||||
// (The graph of [ax, y] contains one more object than the graph of [ax, x].)
|
|
||||||
//
|
|
||||||
// To get technically correct behavior, pass {strictEquivalence: true}.
|
|
||||||
// This is slower because we have to walk the entire graph, and Object.prototype
|
|
||||||
// is big.
|
|
||||||
//
|
|
||||||
return function assertDeepEq(a, b, options) {
|
|
||||||
var strictEquivalence = options ? options.strictEquivalence : false;
|
|
||||||
|
|
||||||
function assertSameProto(a, b, msg) {
|
|
||||||
check(Object_getPrototypeOf(a), Object_getPrototypeOf(b), at(msg, ".__proto__"));
|
|
||||||
}
|
|
||||||
|
|
||||||
function failPropList(na, nb, msg) {
|
|
||||||
throw Error_("got own properties " + JSON.stringify(na) + ", expected " + JSON.stringify(nb) +
|
|
||||||
(msg ? " " + msg : ""));
|
|
||||||
}
|
|
||||||
|
|
||||||
function assertSameProps(a, b, msg) {
|
|
||||||
var na = Object_getOwnPropertyNames(a),
|
|
||||||
nb = Object_getOwnPropertyNames(b);
|
|
||||||
if (na.length !== nb.length)
|
|
||||||
failPropList(na, nb, msg);
|
|
||||||
|
|
||||||
// Ignore differences in whether Array elements are stored densely.
|
|
||||||
if (Array_isArray(a)) {
|
|
||||||
na.sort();
|
|
||||||
nb.sort();
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0; i < na.length; i++) {
|
|
||||||
var name = na[i];
|
|
||||||
if (name !== nb[i])
|
|
||||||
failPropList(na, nb, msg);
|
|
||||||
var da = Object_getOwnPropertyDescriptor(a, name),
|
|
||||||
db = Object_getOwnPropertyDescriptor(b, name);
|
|
||||||
var pmsg = at(msg, /^[_$A-Za-z0-9]+$/.test(name)
|
|
||||||
? /0|[1-9][0-9]*/.test(name) ? "[" + name + "]" : "." + name
|
|
||||||
: "[" + JSON.stringify(name) + "]");
|
|
||||||
assertSameValue(da.configurable, db.configurable, at(pmsg, ".[[Configurable]]"));
|
|
||||||
assertSameValue(da.enumerable, db.enumerable, at(pmsg, ".[[Enumerable]]"));
|
|
||||||
if (Object_hasOwnProperty(da, "value")) {
|
|
||||||
if (!Object_hasOwnProperty(db, "value"))
|
|
||||||
throw Error_("got data property, expected accessor property" + pmsg);
|
|
||||||
check(da.value, db.value, pmsg);
|
|
||||||
} else {
|
|
||||||
if (Object_hasOwnProperty(db, "value"))
|
|
||||||
throw Error_("got accessor property, expected data property" + pmsg);
|
|
||||||
check(da.get, db.get, at(pmsg, ".[[Get]]"));
|
|
||||||
check(da.set, db.set, at(pmsg, ".[[Set]]"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const wellKnownSymbols = Reflect.ownKeys(Symbol)
|
|
||||||
.map(key => Symbol[key])
|
|
||||||
.filter(value => typeof value === "symbol");
|
|
||||||
|
|
||||||
// The standard doesn't offer a convenient way to distinguish well-known
|
|
||||||
// symbols from user-created symbols.
|
|
||||||
function isSimilarSymbol(a, b) {
|
|
||||||
// Fast path for same symbols.
|
|
||||||
if (a === b) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1. Symbol descriptions must match.
|
|
||||||
// 2. Either both symbols are in the registry or none is.
|
|
||||||
// 3. Neither symbol must be a well-known symbol, because those are
|
|
||||||
// already handled through the fast path.
|
|
||||||
return Symbol_description(a) === Symbol_description(b) &&
|
|
||||||
Symbol_keyFor(a) === Symbol_keyFor(b) &&
|
|
||||||
!Array_includes(wellKnownSymbols, a) &&
|
|
||||||
!Array_includes(wellKnownSymbols, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
var ab = new Map_();
|
|
||||||
var bpath = new Map_();
|
|
||||||
|
|
||||||
function check(a, b, path) {
|
|
||||||
if (typeof a === "symbol") {
|
|
||||||
// Symbols are primitives, but they have identity.
|
|
||||||
// Symbol("x") !== Symbol("x") but
|
|
||||||
// assertDeepEq(Symbol("x"), Symbol("x")) should pass.
|
|
||||||
if (typeof b !== "symbol") {
|
|
||||||
throw Error_("got " + String(a) + ", expected " + String(b) + " " + path);
|
|
||||||
} else if (!isSimilarSymbol(a, b)) {
|
|
||||||
throw Error_("got " + String(a) + ", expected " + String(b) + " " + path);
|
|
||||||
} else if (Map_has(ab, a)) {
|
|
||||||
assertSameValue(Map_get(ab, a), b, path);
|
|
||||||
} else if (Map_has(bpath, b)) {
|
|
||||||
var bPrevPath = Map_get(bpath, b) || "_";
|
|
||||||
throw Error_("got distinct symbols " + at(path, "") + " and " +
|
|
||||||
at(bPrevPath, "") + ", expected the same symbol both places");
|
|
||||||
} else {
|
|
||||||
Map_set(ab, a, b);
|
|
||||||
Map_set(bpath, b, path);
|
|
||||||
}
|
|
||||||
} else if (isPrimitive(a)) {
|
|
||||||
assertSameValue(a, b, path);
|
|
||||||
} else if (isPrimitive(b)) {
|
|
||||||
throw Error_("got " + Object_toString(a) + ", expected " + String(b) + " " + path);
|
|
||||||
} else if (Map_has(ab, a)) {
|
|
||||||
assertSameValue(Map_get(ab, a), b, path);
|
|
||||||
} else if (Map_has(bpath, b)) {
|
|
||||||
var bPrevPath = Map_get(bpath, b) || "_";
|
|
||||||
throw Error_("got distinct objects " + at(path, "") + " and " + at(bPrevPath, "") +
|
|
||||||
", expected the same object both places");
|
|
||||||
} else {
|
|
||||||
Map_set(ab, a, b);
|
|
||||||
Map_set(bpath, b, path);
|
|
||||||
if (a !== b || strictEquivalence) {
|
|
||||||
assertSameClass(a, b, path);
|
|
||||||
assertSameProto(a, b, path);
|
|
||||||
assertSameProps(a, b, path);
|
|
||||||
assertSameValue(Object_isExtensible(a),
|
|
||||||
Object_isExtensible(b),
|
|
||||||
at(path, ".[[Extensible]]"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
check(a, b, "");
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
/*---
|
/*---
|
||||||
includes: [sm/non262.js, sm/non262-shell.js, sm/non262-generators-shell.js]
|
includes: [sm/non262.js, sm/non262-shell.js, sm/non262-generators-shell.js, deepEqual.js]
|
||||||
flags:
|
flags:
|
||||||
- noStrict
|
- noStrict
|
||||||
description: |
|
description: |
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
/*---
|
/*---
|
||||||
includes: [sm/non262.js, sm/non262-shell.js, sm/non262-generators-shell.js]
|
includes: [sm/non262.js, sm/non262-shell.js, sm/non262-generators-shell.js, deepEqual.js]
|
||||||
flags:
|
flags:
|
||||||
- noStrict
|
- noStrict
|
||||||
description: |
|
description: |
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
/*---
|
/*---
|
||||||
includes: [sm/non262.js, sm/non262-shell.js, sm/non262-generators-shell.js]
|
includes: [sm/non262.js, sm/non262-shell.js, sm/non262-generators-shell.js, deepEqual.js]
|
||||||
flags:
|
flags:
|
||||||
- noStrict
|
- noStrict
|
||||||
description: |
|
description: |
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
/*---
|
/*---
|
||||||
includes: [sm/non262.js, sm/non262-shell.js, sm/non262-generators-shell.js]
|
includes: [sm/non262.js, sm/non262-shell.js, sm/non262-generators-shell.js, deepEqual.js]
|
||||||
flags:
|
flags:
|
||||||
- noStrict
|
- noStrict
|
||||||
description: |
|
description: |
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
/*---
|
/*---
|
||||||
includes: [sm/non262.js, sm/non262-shell.js, sm/non262-generators-shell.js]
|
includes: [sm/non262.js, sm/non262-shell.js, sm/non262-generators-shell.js, deepEqual.js]
|
||||||
flags:
|
flags:
|
||||||
- noStrict
|
- noStrict
|
||||||
description: |
|
description: |
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
/*---
|
/*---
|
||||||
includes: [sm/non262.js, sm/non262-shell.js, sm/non262-generators-shell.js]
|
includes: [sm/non262.js, sm/non262-shell.js, sm/non262-generators-shell.js, deepEqual.js]
|
||||||
flags:
|
flags:
|
||||||
- noStrict
|
- noStrict
|
||||||
description: |
|
description: |
|
||||||
|
Loading…
x
Reference in New Issue
Block a user