Index: test/webkit/fast/js/kde/operators.js |
diff --git a/test/webkit/fast/js/kde/operators.js b/test/webkit/fast/js/kde/operators.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..185ae01eab9385968c52060f1601fe1fc1d3e191 |
--- /dev/null |
+++ b/test/webkit/fast/js/kde/operators.js |
@@ -0,0 +1,504 @@ |
+// Copyright 2013 the V8 project authors. All rights reserved. |
+// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
+// |
+// Redistribution and use in source and binary forms, with or without |
+// modification, are permitted provided that the following conditions |
+// are met: |
+// 1. Redistributions of source code must retain the above copyright |
+// notice, this list of conditions and the following disclaimer. |
+// 2. Redistributions in binary form must reproduce the above copyright |
+// notice, this list of conditions and the following disclaimer in the |
+// documentation and/or other materials provided with the distribution. |
+// |
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY |
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
+// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
+// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+description("KDE JS Test"); |
+function nonSpeculativeNotInner(argument, o1, o2) |
+{ |
+ // The + operator on objects is a reliable way to avoid the speculative JIT path for now at least. |
+ o1 + o2; |
+ return !argument; |
+} |
+function nonSpeculativeNot(argument) |
+{ |
+ return nonSpeculativeNotInner(argument, {}, {}); |
+} |
+ |
+function nonSpeculativeLessInner(a, b, o1, o2) |
+{ |
+ // The + operator on objects is a reliable way to avoid the speculative JIT path for now at least. |
+ o1 + o2; |
+ return a < b; |
+} |
+function nonSpeculativeLess(a, b) |
+{ |
+ return nonSpeculativeLessInner(a, b, {}, {}); |
+} |
+ |
+function nonSpeculativeLessEqInner(a, b, o1, o2) |
+{ |
+ // The + operator on objects is a reliable way to avoid the speculative JIT path for now at least. |
+ o1 + o2; |
+ return a <= b; |
+} |
+function nonSpeculativeLessEq(a, b) |
+{ |
+ return nonSpeculativeLessEqInner(a, b, {}, {}); |
+} |
+ |
+function nonSpeculativeGreaterInner(a, b, o1, o2) |
+{ |
+ // The + operator on objects is a reliable way to avoid the speculative JIT path for now at least. |
+ o1 + o2; |
+ return a > b; |
+} |
+function nonSpeculativeGreater(a, b) |
+{ |
+ return nonSpeculativeGreaterInner(a, b, {}, {}); |
+} |
+ |
+function nonSpeculativeGreaterEqInner(a, b, o1, o2) |
+{ |
+ // The + operator on objects is a reliable way to avoid the speculative JIT path for now at least. |
+ o1 + o2; |
+ return a >= b; |
+} |
+function nonSpeculativeGreaterEq(a, b) |
+{ |
+ return nonSpeculativeGreaterEqInner(a, b, {}, {}); |
+} |
+ |
+function nonSpeculativeEqualInner(a, b, o1, o2) |
+{ |
+ // The + operator on objects is a reliable way to avoid the speculative JIT path for now at least. |
+ o1 + o2; |
+ return a == b; |
+} |
+function nonSpeculativeEqual(a, b) |
+{ |
+ return nonSpeculativeEqualInner(a, b, {}, {}); |
+} |
+ |
+function nonSpeculativeNotEqualInner(a, b, o1, o2) |
+{ |
+ // The + operator on objects is a reliable way to avoid the speculative JIT path for now at least. |
+ o1 + o2; |
+ return a != b; |
+} |
+function nonSpeculativeNotEqual(a, b) |
+{ |
+ return nonSpeculativeNotEqualInner(a, b, {}, {}); |
+} |
+ |
+function nonSpeculativeStrictEqualInner(a, b, o1, o2) |
+{ |
+ // The + operator on objects is a reliable way to avoid the speculative JIT path for now at least. |
+ o1 + o2; |
+ return a === b; |
+} |
+function nonSpeculativeStrictEqual(a, b) |
+{ |
+ return nonSpeculativeStrictEqualInner(a, b, {}, {}); |
+} |
+ |
+function nonSpeculativeStrictNotEqualInner(a, b, o1, o2) |
+{ |
+ // The + operator on objects is a reliable way to avoid the speculative JIT path for now at least. |
+ o1 + o2; |
+ return a !== b; |
+} |
+function nonSpeculativeStrictNotEqual(a, b) |
+{ |
+ return nonSpeculativeStrictNotEqualInner(a, b, {}, {}); |
+} |
+ |
+// operator ! |
+shouldBeTrue("!undefined"); |
+shouldBeTrue("!null"); |
+shouldBeTrue("!!true"); |
+shouldBeTrue("!false"); |
+shouldBeTrue("!!1"); |
+shouldBeTrue("!0"); |
+shouldBeTrue("!!'a'"); |
+shouldBeTrue("!''"); |
+ |
+shouldBeTrue("nonSpeculativeNot(undefined)"); |
+shouldBeTrue("nonSpeculativeNot(null)"); |
+shouldBeTrue("nonSpeculativeNot(!true)"); |
+shouldBeTrue("nonSpeculativeNot(false)"); |
+shouldBeTrue("nonSpeculativeNot(!1)"); |
+shouldBeTrue("nonSpeculativeNot(0)"); |
+shouldBeTrue("nonSpeculativeNot(!'a')"); |
+shouldBeTrue("nonSpeculativeNot('')"); |
+ |
+// unary plus |
+shouldBe("+9", "9"); |
+shouldBe("var i = 10; +i", "10"); |
+ |
+// negation |
+shouldBe("-11", "-11"); |
+shouldBe("var i = 12; -i", "-12"); |
+ |
+// increment |
+shouldBe("var i = 0; ++i;", "1"); |
+shouldBe("var i = 0; ++i; i", "1"); |
+shouldBe("var i = 0; i++;", "0"); |
+shouldBe("var i = 0; i++; i", "1"); |
+shouldBe("var i = true; i++", "1"); |
+shouldBe("var i = true; i++; i", "2"); |
+ |
+// decrement |
+shouldBe("var i = 0; --i;", "-1"); |
+shouldBe("var i = 0; --i; i", "-1"); |
+shouldBe("var i = 0; i--;", "0"); |
+shouldBe("var i = 0; i--; i", "-1"); |
+shouldBe("var i = true; i--", "1"); |
+shouldBe("var i = true; i--; i", "0"); |
+ |
+// bitwise operators |
+shouldBe("~0", "-1"); |
+shouldBe("~1", "-2"); |
+shouldBe("~NaN", "-1"); |
+shouldBe("~Infinity", "-1"); |
+shouldBe("~Math.pow(2, 33)", "-1"); // 32 bit overflow |
+shouldBe("~(Math.pow(2, 32) + Math.pow(2, 31) + 2)", |
+ "2147483645"); // a signedness issue |
+shouldBe("~null", "-1"); |
+shouldBe("3 & 1", "1"); |
+shouldBe("2 | true", "3"); |
+shouldBe("'3' ^ 1", "2"); |
+shouldBe("3^4&5", "7"); |
+shouldBe("2|4^5", "3"); |
+ |
+shouldBe("1 << 2", "4"); |
+shouldBe("8 >> 1", "4"); |
+shouldBe("1 >> 2", "0"); |
+shouldBe("-8 >> 24", "-1"); |
+shouldBe("8 >>> 2", "2"); |
+shouldBe("-8 >>> 24", "255"); |
+shouldBe("(-2200000000 >> 1) << 1", "2094967296"); |
+shouldBe("Infinity >> 1", "0"); |
+shouldBe("Infinity << 1", "0"); |
+shouldBe("Infinity >>> 1", "0"); |
+shouldBe("NaN >> 1", "0"); |
+shouldBe("NaN << 1", "0"); |
+shouldBe("NaN >>> 1", "0"); |
+shouldBe("8.1 >> 1", "4"); |
+shouldBe("8.1 << 1", "16"); |
+shouldBe("8.1 >>> 1", "4"); |
+shouldBe("8.9 >> 1", "4"); |
+shouldBe("8.9 << 1", "16"); |
+shouldBe("8.9 >>> 1", "4"); |
+shouldBe("Math.pow(2, 32) >> 1", "0"); |
+shouldBe("Math.pow(2, 32) << 1", "0"); |
+shouldBe("Math.pow(2, 32) >>> 1", "0"); |
+ |
+// Try shifting by variables, to test non-constant-folded cases. |
+var one = 1; |
+var two = 2; |
+var twentyFour = 24; |
+ |
+shouldBe("1 << two", "4"); |
+shouldBe("8 >> one", "4"); |
+shouldBe("1 >> two", "0"); |
+shouldBe("-8 >> twentyFour", "-1"); |
+shouldBe("8 >>> two", "2"); |
+shouldBe("-8 >>> twentyFour", "255"); |
+shouldBe("(-2200000000 >> one) << one", "2094967296"); |
+shouldBe("Infinity >> one", "0"); |
+shouldBe("Infinity << one", "0"); |
+shouldBe("Infinity >>> one", "0"); |
+shouldBe("NaN >> one", "0"); |
+shouldBe("NaN << one", "0"); |
+shouldBe("NaN >>> one", "0"); |
+shouldBe("888.1 >> one", "444"); |
+shouldBe("888.1 << one", "1776"); |
+shouldBe("888.1 >>> one", "444"); |
+shouldBe("888.9 >> one", "444"); |
+shouldBe("888.9 << one", "1776"); |
+shouldBe("888.9 >>> one", "444"); |
+shouldBe("Math.pow(2, 32) >> one", "0"); |
+shouldBe("Math.pow(2, 32) << one", "0"); |
+shouldBe("Math.pow(2, 32) >>> one", "0"); |
+ |
+// addition |
+shouldBe("1+2", "3"); |
+shouldBe("'a'+'b'", "'ab'"); |
+shouldBe("'a'+2", "'a2'"); |
+shouldBe("'2'+'-1'", "'2-1'"); |
+shouldBe("true+'a'", "'truea'"); |
+shouldBe("'a' + null", "'anull'"); |
+shouldBe("true+1", "2"); |
+shouldBe("false+null", "0"); |
+ |
+// substraction |
+shouldBe("1-3", "-2"); |
+shouldBe("isNaN('a'-3)", "true"); |
+shouldBe("'3'-'-1'", "4"); |
+shouldBe("'4'-2", "2"); |
+shouldBe("true-false", "1"); |
+shouldBe("false-1", "-1"); |
+shouldBe("null-true", "-1"); |
+ |
+// multiplication |
+shouldBe("2 * 3", "6"); |
+shouldBe("true * 3", "3"); |
+shouldBe("2 * '3'", "6"); |
+ |
+// division |
+shouldBe("6 / 4", "1.5"); |
+//shouldBe("true / false", "Inf"); |
+shouldBe("'6' / '2'", "3"); |
+shouldBeTrue("isNaN('x' / 1)"); |
+shouldBeTrue("isNaN(1 / NaN)"); |
+shouldBeTrue("isNaN(Infinity / Infinity)"); |
+shouldBe("Infinity / 0", "Infinity"); |
+shouldBe("-Infinity / 0", "-Infinity"); |
+shouldBe("Infinity / 1", "Infinity"); |
+shouldBe("-Infinity / 1", "-Infinity"); |
+shouldBeTrue("1 / Infinity == +0"); |
+shouldBeTrue("1 / -Infinity == -0"); // how to check ? |
+shouldBeTrue("isNaN(0/0)"); |
+shouldBeTrue("0 / 1 === 0"); |
+shouldBeTrue("0 / -1 === -0"); // how to check ? |
+shouldBe("1 / 0", "Infinity"); |
+shouldBe("-1 / 0", "-Infinity"); |
+ |
+// modulo |
+shouldBe("6 % 4", "2"); |
+shouldBe("'-6' % 4", "-2"); |
+ |
+shouldBe("2==2", "true"); |
+shouldBe("1==2", "false"); |
+ |
+shouldBe("nonSpeculativeEqual(2,2)", "true"); |
+shouldBe("nonSpeculativeEqual(1,2)", "false"); |
+ |
+shouldBe("1<2", "true"); |
+shouldBe("1<=2", "true"); |
+shouldBe("2<1", "false"); |
+shouldBe("2<=1", "false"); |
+ |
+shouldBe("nonSpeculativeLess(1,2)", "true"); |
+shouldBe("nonSpeculativeLessEq(1,2)", "true"); |
+shouldBe("nonSpeculativeLess(2,1)", "false"); |
+shouldBe("nonSpeculativeLessEq(2,1)", "false"); |
+ |
+shouldBe("2>1", "true"); |
+shouldBe("2>=1", "true"); |
+shouldBe("1>=2", "false"); |
+shouldBe("1>2", "false"); |
+ |
+shouldBe("nonSpeculativeGreater(2,1)", "true"); |
+shouldBe("nonSpeculativeGreaterEq(2,1)", "true"); |
+shouldBe("nonSpeculativeGreaterEq(1,2)", "false"); |
+shouldBe("nonSpeculativeGreater(1,2)", "false"); |
+ |
+shouldBeTrue("'abc' == 'abc'"); |
+shouldBeTrue("'abc' != 'xyz'"); |
+shouldBeTrue("true == true"); |
+shouldBeTrue("false == false"); |
+shouldBeTrue("true != false"); |
+shouldBeTrue("'a' != null"); |
+shouldBeTrue("'a' != undefined"); |
+shouldBeTrue("null == null"); |
+shouldBeTrue("null == undefined"); |
+shouldBeTrue("undefined == undefined"); |
+shouldBeTrue("NaN != NaN"); |
+shouldBeTrue("true != undefined"); |
+shouldBeTrue("true != null"); |
+shouldBeTrue("false != undefined"); |
+shouldBeTrue("false != null"); |
+shouldBeTrue("'0' == 0"); |
+shouldBeTrue("1 == '1'"); |
+shouldBeTrue("NaN != NaN"); |
+shouldBeTrue("NaN != 0"); |
+shouldBeTrue("NaN != undefined"); |
+shouldBeTrue("true == 1"); |
+shouldBeTrue("true != 2"); |
+shouldBeTrue("1 == true"); |
+shouldBeTrue("false == 0"); |
+shouldBeTrue("0 == false"); |
+ |
+shouldBeTrue("nonSpeculativeEqual('abc', 'abc')"); |
+shouldBeTrue("nonSpeculativeNotEqual('abc', 'xyz')"); |
+shouldBeTrue("nonSpeculativeEqual(true, true)"); |
+shouldBeTrue("nonSpeculativeEqual(false, false)"); |
+shouldBeTrue("nonSpeculativeNotEqual(true, false)"); |
+shouldBeTrue("nonSpeculativeNotEqual('a', null)"); |
+shouldBeTrue("nonSpeculativeNotEqual('a', undefined)"); |
+shouldBeTrue("nonSpeculativeEqual(null, null)"); |
+shouldBeTrue("nonSpeculativeEqual(null, undefined)"); |
+shouldBeTrue("nonSpeculativeEqual(undefined, undefined)"); |
+shouldBeTrue("nonSpeculativeNotEqual(NaN, NaN)"); |
+shouldBeTrue("nonSpeculativeNotEqual(true, undefined)"); |
+shouldBeTrue("nonSpeculativeNotEqual(true, null)"); |
+shouldBeTrue("nonSpeculativeNotEqual(false, undefined)"); |
+shouldBeTrue("nonSpeculativeNotEqual(false, null)"); |
+shouldBeTrue("nonSpeculativeEqual('0', 0)"); |
+shouldBeTrue("nonSpeculativeEqual(1, '1')"); |
+shouldBeTrue("nonSpeculativeNotEqual(NaN, NaN)"); |
+shouldBeTrue("nonSpeculativeNotEqual(NaN, 0)"); |
+shouldBeTrue("nonSpeculativeNotEqual(NaN, undefined)"); |
+shouldBeTrue("nonSpeculativeEqual(true, 1)"); |
+shouldBeTrue("nonSpeculativeNotEqual(true, 2)"); |
+shouldBeTrue("nonSpeculativeEqual(1, true)"); |
+shouldBeTrue("nonSpeculativeEqual(false, 0)"); |
+shouldBeTrue("nonSpeculativeEqual(0, false)"); |
+ |
+shouldBe("'abc' < 'abx'", "true"); |
+shouldBe("'abc' < 'abcd'", "true"); |
+shouldBe("'abc' < 'abc'", "false"); |
+shouldBe("'abcd' < 'abcd'", "false"); |
+shouldBe("'abx' < 'abc'", "false"); |
+ |
+shouldBe("nonSpeculativeLess('abc', 'abx')", "true"); |
+shouldBe("nonSpeculativeLess('abc', 'abcd')", "true"); |
+shouldBe("nonSpeculativeLess('abc', 'abc')", "false"); |
+shouldBe("nonSpeculativeLess('abcd', 'abcd')", "false"); |
+shouldBe("nonSpeculativeLess('abx', 'abc')", "false"); |
+ |
+shouldBe("'abc' <= 'abc'", "true"); |
+shouldBe("'abc' <= 'abx'", "true"); |
+shouldBe("'abx' <= 'abc'", "false"); |
+shouldBe("'abcd' <= 'abc'", "false"); |
+shouldBe("'abc' <= 'abcd'", "true"); |
+ |
+shouldBe("nonSpeculativeLessEq('abc', 'abc')", "true"); |
+shouldBe("nonSpeculativeLessEq('abc', 'abx')", "true"); |
+shouldBe("nonSpeculativeLessEq('abx', 'abc')", "false"); |
+shouldBe("nonSpeculativeLessEq('abcd', 'abc')", "false"); |
+shouldBe("nonSpeculativeLessEq('abc', 'abcd')", "true"); |
+ |
+shouldBe("'abc' > 'abx'", "false"); |
+shouldBe("'abc' > 'abc'", "false"); |
+shouldBe("'abcd' > 'abc'", "true"); |
+shouldBe("'abx' > 'abc'", "true"); |
+shouldBe("'abc' > 'abcd'", "false"); |
+ |
+shouldBe("nonSpeculativeGreater('abc', 'abx')", "false"); |
+shouldBe("nonSpeculativeGreater('abc', 'abc')", "false"); |
+shouldBe("nonSpeculativeGreater('abcd', 'abc')", "true"); |
+shouldBe("nonSpeculativeGreater('abx', 'abc')", "true"); |
+shouldBe("nonSpeculativeGreater('abc', 'abcd')", "false"); |
+ |
+shouldBe("'abc' >= 'abc'", "true"); |
+shouldBe("'abcd' >= 'abc'", "true"); |
+shouldBe("'abx' >= 'abc'", "true"); |
+shouldBe("'abc' >= 'abx'", "false"); |
+shouldBe("'abc' >= 'abx'", "false"); |
+shouldBe("'abc' >= 'abcd'", "false"); |
+ |
+shouldBe("nonSpeculativeGreaterEq('abc', 'abc')", "true"); |
+shouldBe("nonSpeculativeGreaterEq('abcd', 'abc')", "true"); |
+shouldBe("nonSpeculativeGreaterEq('abx', 'abc')", "true"); |
+shouldBe("nonSpeculativeGreaterEq('abc', 'abx')", "false"); |
+shouldBe("nonSpeculativeGreaterEq('abc', 'abx')", "false"); |
+shouldBe("nonSpeculativeGreaterEq('abc', 'abcd')", "false"); |
+ |
+// mixed strings and numbers - results validated in NS+moz+IE5 |
+shouldBeFalse("'abc' <= 0"); // #35246 |
+shouldBeTrue("'' <= 0"); |
+shouldBeTrue("' ' <= 0"); |
+shouldBeTrue("null <= 0"); |
+shouldBeFalse("0 <= 'abc'"); |
+shouldBeTrue("0 <= ''"); |
+shouldBeTrue("0 <= null"); |
+shouldBeTrue("null <= null"); |
+shouldBeTrue("6 < '52'"); |
+shouldBeTrue("6 < '72'"); // #36087 |
+shouldBeFalse("NaN < 0"); |
+shouldBeFalse("NaN <= 0"); |
+shouldBeFalse("NaN > 0"); |
+shouldBeFalse("NaN >= 0"); |
+ |
+shouldBeFalse("nonSpeculativeLessEq('abc', 0)"); // #35246 |
+shouldBeTrue("nonSpeculativeLessEq('', 0)"); |
+shouldBeTrue("nonSpeculativeLessEq(' ', 0)"); |
+shouldBeTrue("nonSpeculativeLessEq(null, 0)"); |
+shouldBeFalse("nonSpeculativeLessEq(0, 'abc')"); |
+shouldBeTrue("nonSpeculativeLessEq(0, '')"); |
+shouldBeTrue("nonSpeculativeLessEq(0, null)"); |
+shouldBeTrue("nonSpeculativeLessEq(null, null)"); |
+shouldBeTrue("nonSpeculativeLess(6, '52')"); |
+shouldBeTrue("nonSpeculativeLess(6, '72')"); // #36087 |
+shouldBeFalse("nonSpeculativeLess(NaN, 0)"); |
+shouldBeFalse("nonSpeculativeLessEq(NaN, 0)"); |
+shouldBeFalse("nonSpeculativeGreater(NaN, 0)"); |
+shouldBeFalse("nonSpeculativeGreaterEq(NaN, 0)"); |
+ |
+// strict comparison === |
+shouldBeFalse("0 === false"); |
+//shouldBe("undefined === undefined", "true"); // aborts in IE5 (undefined is not defined ;) |
+shouldBeTrue("null === null"); |
+shouldBeFalse("NaN === NaN"); |
+shouldBeTrue("0.0 === 0"); |
+shouldBeTrue("'abc' === 'abc'"); |
+shouldBeFalse("'a' === 'x'"); |
+shouldBeFalse("1 === '1'"); |
+shouldBeFalse("'1' === 1"); |
+shouldBeTrue("true === true"); |
+shouldBeTrue("false === false"); |
+shouldBeFalse("true === false"); |
+shouldBeTrue("Math === Math"); |
+shouldBeFalse("Math === Boolean"); |
+shouldBeTrue("Infinity === Infinity"); |
+ |
+// strict comparison === |
+shouldBeFalse("nonSpeculativeStrictEqual(0, false)"); |
+//shouldBe("undefined === undefined", "true"); // aborts in IE5 (undefined is not defined ;) |
+shouldBeTrue("nonSpeculativeStrictEqual(null, null)"); |
+shouldBeFalse("nonSpeculativeStrictEqual(NaN, NaN)"); |
+shouldBeTrue("nonSpeculativeStrictEqual(0.0, 0)"); |
+shouldBeTrue("nonSpeculativeStrictEqual('abc', 'abc')"); |
+shouldBeFalse("nonSpeculativeStrictEqual('a', 'x')"); |
+shouldBeFalse("nonSpeculativeStrictEqual(1, '1')"); |
+shouldBeFalse("nonSpeculativeStrictEqual('1', 1)"); |
+shouldBeTrue("nonSpeculativeStrictEqual(true, true)"); |
+shouldBeTrue("nonSpeculativeStrictEqual(false, false)"); |
+shouldBeFalse("nonSpeculativeStrictEqual(true, false)"); |
+shouldBeTrue("nonSpeculativeStrictEqual(Math, Math)"); |
+shouldBeFalse("nonSpeculativeStrictEqual(Math, Boolean)"); |
+shouldBeTrue("nonSpeculativeStrictEqual(Infinity, Infinity)"); |
+ |
+// !== |
+shouldBe("0 !== 0", "false"); |
+shouldBe("0 !== 1", "true"); |
+ |
+// !== |
+shouldBe("nonSpeculativeStrictNotEqual(0, 0)", "false"); |
+shouldBe("nonSpeculativeStrictNotEqual(0, 1)", "true"); |
+ |
+shouldBe("typeof undefined", "'undefined'"); |
+shouldBe("typeof null", "'object'"); |
+shouldBe("typeof true", "'boolean'"); |
+shouldBe("typeof false", "'boolean'"); |
+shouldBe("typeof 1", "'number'"); |
+shouldBe("typeof 'a'", "'string'"); |
+shouldBe("typeof shouldBe", "'function'"); |
+shouldBe("typeof Number.NaN", "'number'"); |
+ |
+shouldBe("11 && 22", "22"); |
+shouldBe("null && true", "null"); |
+shouldBe("11 || 22", "11"); |
+shouldBe("null || 'a'", "'a'"); |
+ |
+shouldBeUndefined("void 1"); |
+ |
+shouldBeTrue("1 in [1, 2]"); |
+shouldBeFalse("3 in [1, 2]"); |
+shouldBeTrue("'a' in { a:1, b:2 }"); |
+ |
+// instanceof |
+// Those 2 lines don't parse in Netscape... |
+shouldBe("(new Boolean()) instanceof Boolean", "true"); |
+shouldBe("(new Boolean()) instanceof Number", "false"); |