From 9807c3a6dea54d78571576d429ac66b52c80e021 Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Tue, 18 Dec 2012 17:01:46 -0500 Subject: [PATCH] Bug 792108 - Add more truthiness tests to ensure strict equality isn't affected by JSCLASS_EMULATES_UNDEFINED, and that falsy objects don't compare equal unless they're actually the same object. Just tests, they pass locally for me with the --tbpl driver option to do what Tinderbox does, r=sparky --- .../tests/truthiness/if-strict-equal-null.js | 46 +++++++++++++++++++ .../truthiness/if-strict-equal-undefined.js | 46 +++++++++++++++++++ .../truthiness/if-strict-not-equal-null.js | 46 +++++++++++++++++++ .../if-strict-not-equal-undefined.js | 46 +++++++++++++++++++ .../tests/truthiness/obj-obj-equal.js | 23 ++++++++++ .../tests/truthiness/obj-obj-not-equal.js | 23 ++++++++++ .../tests/truthiness/strict-equal-null.js | 37 +++++++++++++++ .../truthiness/strict-equal-undefined.js | 37 +++++++++++++++ .../tests/truthiness/strict-not-equal-null.js | 37 +++++++++++++++ .../truthiness/strict-not-equal-undefined.js | 37 +++++++++++++++ 10 files changed, 378 insertions(+) create mode 100644 js/src/jit-test/tests/truthiness/if-strict-equal-null.js create mode 100644 js/src/jit-test/tests/truthiness/if-strict-equal-undefined.js create mode 100644 js/src/jit-test/tests/truthiness/if-strict-not-equal-null.js create mode 100644 js/src/jit-test/tests/truthiness/if-strict-not-equal-undefined.js create mode 100644 js/src/jit-test/tests/truthiness/obj-obj-equal.js create mode 100644 js/src/jit-test/tests/truthiness/obj-obj-not-equal.js create mode 100644 js/src/jit-test/tests/truthiness/strict-equal-null.js create mode 100644 js/src/jit-test/tests/truthiness/strict-equal-undefined.js create mode 100644 js/src/jit-test/tests/truthiness/strict-not-equal-null.js create mode 100644 js/src/jit-test/tests/truthiness/strict-not-equal-undefined.js diff --git a/js/src/jit-test/tests/truthiness/if-strict-equal-null.js b/js/src/jit-test/tests/truthiness/if-strict-equal-null.js new file mode 100644 index 000000000000..1c9e829feb07 --- /dev/null +++ b/js/src/jit-test/tests/truthiness/if-strict-equal-null.js @@ -0,0 +1,46 @@ +var counterF = 0; + +function f(v, value) +{ + if (v === null) + counterF++; + assertEq(counterF, value, + "failed: " + v + " " + value); +} + +f({}, 0); +f({}, 0); +f(null, 1); +f(null, 2); +f(undefined, 2); +f(undefined, 2); +f(objectEmulatingUndefined(), 2); +f(objectEmulatingUndefined(), 2); +f(Object.prototype, 2); +f(Object.prototype, 2); + +var counterG = 0; + +function g(v, value) +{ + if (v === null) + counterG++; + assertEq(counterG, value, + "failed: " + v + " " + value); +} + +g({}, 0); +g({}, 0); + +var counterH = 0; + +function h(v, value) +{ + if (v === null) + counterH++; + assertEq(counterH, value, + "failed: " + v + " " + value); +} + +h(objectEmulatingUndefined(), 0); +h(objectEmulatingUndefined(), 0); diff --git a/js/src/jit-test/tests/truthiness/if-strict-equal-undefined.js b/js/src/jit-test/tests/truthiness/if-strict-equal-undefined.js new file mode 100644 index 000000000000..04ea4ee52e81 --- /dev/null +++ b/js/src/jit-test/tests/truthiness/if-strict-equal-undefined.js @@ -0,0 +1,46 @@ +var counterF = 0; + +function f(v, value) +{ + if (v === undefined) + counterF++; + assertEq(counterF, value, + "failed: " + v + " " + value); +} + +f({}, 0); +f({}, 0); +f(null, 0); +f(null, 0); +f(undefined, 1); +f(undefined, 2); +f(objectEmulatingUndefined(), 2); +f(objectEmulatingUndefined(), 2); +f(Object.prototype, 2); +f(Object.prototype, 2); + +var counterG = 0; + +function g(v, value) +{ + if (v === undefined) + counterG++; + assertEq(counterG, value, + "failed: " + v + " " + value); +} + +g({}, 0); +g({}, 0); + +var counterH = 0; + +function h(v, value) +{ + if (v === undefined) + counterH++; + assertEq(counterH, value, + "failed: " + v + " " + value); +} + +h(objectEmulatingUndefined(), 0); +h(objectEmulatingUndefined(), 0); diff --git a/js/src/jit-test/tests/truthiness/if-strict-not-equal-null.js b/js/src/jit-test/tests/truthiness/if-strict-not-equal-null.js new file mode 100644 index 000000000000..6facef8160b0 --- /dev/null +++ b/js/src/jit-test/tests/truthiness/if-strict-not-equal-null.js @@ -0,0 +1,46 @@ +var counterF = 0; + +function f(v, value) +{ + if (v !== null) + counterF++; + assertEq(counterF, value, + "failed: " + v + " " + value); +} + +f({}, 1); +f({}, 2); +f(null, 2); +f(null, 2); +f(undefined, 3); +f(undefined, 4); +f(objectEmulatingUndefined(), 5); +f(objectEmulatingUndefined(), 6); +f(Object.prototype, 7); +f(Object.prototype, 8); + +var counterG = 0; + +function g(v, value) +{ + if (v !== null) + counterG++; + assertEq(counterG, value, + "failed: " + v + " " + value); +} + +g({}, 1); +g({}, 2); + +var counterH = 0; + +function h(v, value) +{ + if (v !== null) + counterH++; + assertEq(counterH, value, + "failed: " + v + " " + value); +} + +h(objectEmulatingUndefined(), 1); +h(objectEmulatingUndefined(), 2); diff --git a/js/src/jit-test/tests/truthiness/if-strict-not-equal-undefined.js b/js/src/jit-test/tests/truthiness/if-strict-not-equal-undefined.js new file mode 100644 index 000000000000..d75caae48eb7 --- /dev/null +++ b/js/src/jit-test/tests/truthiness/if-strict-not-equal-undefined.js @@ -0,0 +1,46 @@ +var counterF = 0; + +function f(v, value) +{ + if (v !== undefined) + counterF++; + assertEq(counterF, value, + "failed: " + v + " " + value); +} + +f({}, 1); +f({}, 2); +f(null, 3); +f(null, 4); +f(undefined, 4); +f(undefined, 4); +f(objectEmulatingUndefined(), 5); +f(objectEmulatingUndefined(), 6); +f(Object.prototype, 7); +f(Object.prototype, 8); + +var counterG = 0; + +function g(v, value) +{ + if (v !== undefined) + counterG++; + assertEq(counterG, value, + "failed: " + v + " " + value); +} + +g({}, 1); +g({}, 2); + +var counterH = 0; + +function h(v, value) +{ + if (v !== undefined) + counterH++; + assertEq(counterH, value, + "failed: " + v + " " + value); +} + +h(objectEmulatingUndefined(), 1); +h(objectEmulatingUndefined(), 2); diff --git a/js/src/jit-test/tests/truthiness/obj-obj-equal.js b/js/src/jit-test/tests/truthiness/obj-obj-equal.js new file mode 100644 index 000000000000..77c6683f1847 --- /dev/null +++ b/js/src/jit-test/tests/truthiness/obj-obj-equal.js @@ -0,0 +1,23 @@ +function f(v1, v2, value) +{ + var b = v1 == v2; + assertEq(b, value, + "failed: " + v1 + ", " + v2 + ": " + value); +} + +var obj = {}; +var emul = objectEmulatingUndefined(); + +f(obj, obj, true); +f(obj, obj, true); +f(emul, obj, false); +f(emul, obj, false); +f(obj, emul, false); +f(obj, emul, false); +f(Object.prototype, obj, false); +f(Object.prototype, obj, false); +f(emul, emul, true); +f(objectEmulatingUndefined(), emul, false); +f(objectEmulatingUndefined(), emul, false); +f(emul, objectEmulatingUndefined(), false); +f(emul, objectEmulatingUndefined(), false); diff --git a/js/src/jit-test/tests/truthiness/obj-obj-not-equal.js b/js/src/jit-test/tests/truthiness/obj-obj-not-equal.js new file mode 100644 index 000000000000..f1b2d7c1927a --- /dev/null +++ b/js/src/jit-test/tests/truthiness/obj-obj-not-equal.js @@ -0,0 +1,23 @@ +function f(v1, v2, value) +{ + var b = v1 != v2; + assertEq(b, value, + "failed: " + v1 + ", " + v2 + ": " + value); +} + +var obj = {}; +var emul = objectEmulatingUndefined(); + +f(obj, obj, false); +f(obj, obj, false); +f(emul, obj, true); +f(emul, obj, true); +f(obj, emul, true); +f(obj, emul, true); +f(Object.prototype, obj, true); +f(Object.prototype, obj, true); +f(emul, emul, false); +f(objectEmulatingUndefined(), emul, true); +f(objectEmulatingUndefined(), emul, true); +f(emul, objectEmulatingUndefined(), true); +f(emul, objectEmulatingUndefined(), true); diff --git a/js/src/jit-test/tests/truthiness/strict-equal-null.js b/js/src/jit-test/tests/truthiness/strict-equal-null.js new file mode 100644 index 000000000000..00062d16d78c --- /dev/null +++ b/js/src/jit-test/tests/truthiness/strict-equal-null.js @@ -0,0 +1,37 @@ +function f(v, value) +{ + var b = v === null; + assertEq(b, value, + "failed: " + v + " " + value); +} + +f({}, false); +f({}, false); +f(null, true); +f(null, true); +f(undefined, false); +f(undefined, false); +f(objectEmulatingUndefined(), false); +f(objectEmulatingUndefined(), false); +f(Object.prototype, false); +f(Object.prototype, false); + +function g(v, value) +{ + var b = v === null; + assertEq(b, value, + "failed: " + v + " " + value); +} + +g({}, false); +g({}, false); + +function h(v, value) +{ + var b = v === null; + assertEq(b, value, + "failed: " + v + " " + value); +} + +h(objectEmulatingUndefined(), false); +h(objectEmulatingUndefined(), false); diff --git a/js/src/jit-test/tests/truthiness/strict-equal-undefined.js b/js/src/jit-test/tests/truthiness/strict-equal-undefined.js new file mode 100644 index 000000000000..2535cd06f639 --- /dev/null +++ b/js/src/jit-test/tests/truthiness/strict-equal-undefined.js @@ -0,0 +1,37 @@ +function f(v, value) +{ + var b = v === undefined; + assertEq(b, value, + "failed: " + v + " " + value); +} + +f({}, false); +f({}, false); +f(null, false); +f(null, false); +f(undefined, true); +f(undefined, true); +f(objectEmulatingUndefined(), false); +f(objectEmulatingUndefined(), false); +f(Object.prototype, false); +f(Object.prototype, false); + +function g(v, value) +{ + var b = v === undefined; + assertEq(b, value, + "failed: " + v + " " + value); +} + +g({}, false); +g({}, false); + +function h(v, value) +{ + var b = v === undefined; + assertEq(b, value, + "failed: " + v + " " + value); +} + +h(objectEmulatingUndefined(), false); +h(objectEmulatingUndefined(), false); diff --git a/js/src/jit-test/tests/truthiness/strict-not-equal-null.js b/js/src/jit-test/tests/truthiness/strict-not-equal-null.js new file mode 100644 index 000000000000..9352ae99d81d --- /dev/null +++ b/js/src/jit-test/tests/truthiness/strict-not-equal-null.js @@ -0,0 +1,37 @@ +function f(v, value) +{ + var b = v !== null; + assertEq(b, value, + "failed: " + v + " " + value); +} + +f({}, true); +f({}, true); +f(null, false); +f(null, false); +f(undefined, true); +f(undefined, true); +f(objectEmulatingUndefined(), true); +f(objectEmulatingUndefined(), true); +f(Object.prototype, true); +f(Object.prototype, true); + +function g(v, value) +{ + var b = v !== null; + assertEq(b, value, + "failed: " + v + " " + value); +} + +g({}, true); +g({}, true); + +function h(v, value) +{ + var b = v !== null; + assertEq(b, value, + "failed: " + v + " " + value); +} + +h(objectEmulatingUndefined(), true); +h(objectEmulatingUndefined(), true); diff --git a/js/src/jit-test/tests/truthiness/strict-not-equal-undefined.js b/js/src/jit-test/tests/truthiness/strict-not-equal-undefined.js new file mode 100644 index 000000000000..21790b23e651 --- /dev/null +++ b/js/src/jit-test/tests/truthiness/strict-not-equal-undefined.js @@ -0,0 +1,37 @@ +function f(v, value) +{ + var b = v !== undefined; + assertEq(b, value, + "failed: " + v + " " + value); +} + +f({}, true); +f({}, true); +f(null, true); +f(null, true); +f(undefined, false); +f(undefined, false); +f(objectEmulatingUndefined(), true); +f(objectEmulatingUndefined(), true); +f(Object.prototype, true); +f(Object.prototype, true); + +function g(v, value) +{ + var b = v !== undefined; + assertEq(b, value, + "failed: " + v + " " + value); +} + +g({}, true); +g({}, true); + +function h(v, value) +{ + var b = v !== undefined; + assertEq(b, value, + "failed: " + v + " " + value); +} + +h(objectEmulatingUndefined(), true); +h(objectEmulatingUndefined(), true);