Diff
Modified: trunk/LayoutTests/ChangeLog (201679 => 201680)
--- trunk/LayoutTests/ChangeLog 2016-06-04 07:20:17 UTC (rev 201679)
+++ trunk/LayoutTests/ChangeLog 2016-06-04 18:58:08 UTC (rev 201680)
@@ -1,3 +1,31 @@
+2016-06-04 Joseph Pecoraro <pecor...@apple.com>
+
+ Add better basic isNaN test coverage
+ https://bugs.webkit.org/show_bug.cgi?id=158379
+
+ Reviewed by Benjamin Poulain.
+
+ * js/Number-isNaN-expected.txt: Added.
+ * js/Number-isNaN.html: Added.
+ * js/global-isNaN-expected.txt: Added.
+ * js/global-isNaN.html: Added.
+ * js/script-tests/Number-isNaN.js: Added.
+ (objectWithNumberValueOf.valueOf):
+ (objectWithNaNValueOf.valueOf):
+ (objectRecordConversionCalls.toString):
+ (objectRecordConversionCalls.valueOf):
+ * js/script-tests/global-isNaN.js: Added.
+ (objectConvertToString.toString):
+ (objectRecordToStringCall.toString):
+ (objectThrowOnToString.toString):
+ (objectWithValueOf.valueOf):
+ (objectThrowOnValueOf.valueOf):
+ (objectThrowOnValueOf.toString):
+ (objectRecordValueOfCall.valueOf):
+ (objectRecordConversionCalls.toString):
+ (objectRecordConversionCalls.valueOf):
+ * js/script-tests/math-clz32.js:
+
2016-06-04 Brent Fulgham <bfulg...@apple.com>
CSP: Content Security Policy directive, upgrade-insecure-requests (UIR)
Added: trunk/LayoutTests/js/Number-isNaN-expected.txt (0 => 201680)
--- trunk/LayoutTests/js/Number-isNaN-expected.txt (rev 0)
+++ trunk/LayoutTests/js/Number-isNaN-expected.txt 2016-06-04 18:58:08 UTC (rev 201680)
@@ -0,0 +1,56 @@
+Test the basic behaviors of Number.isNaN()
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS Number.hasOwnProperty("isNaN") is true
+PASS typeof Number.isNaN is "function"
+PASS Number.isNaN !== isNaN is true
+PASS Number.isNaN.length is 1
+PASS Number.isNaN.name is "isNaN"
+PASS Object.getOwnPropertyDescriptor(Number, "isNaN").configurable is true
+PASS Object.getOwnPropertyDescriptor(Number, "isNaN").enumerable is false
+PASS Object.getOwnPropertyDescriptor(Number, "isNaN").writable is true
+PASS Number.isNaN() is false
+PASS Number.isNaN(NaN) is true
+PASS Number.isNaN(undefined) is false
+PASS Number.isNaN(0) is false
+PASS Number.isNaN(-0) is false
+PASS Number.isNaN(1) is false
+PASS Number.isNaN(-1) is false
+PASS Number.isNaN(42) is false
+PASS Number.isNaN(123.5) is false
+PASS Number.isNaN(-123.5) is false
+PASS Number.isNaN(Number.MAX_VALUE) is false
+PASS Number.isNaN(Number.MIN_VALUE) is false
+PASS Number.isNaN(Number.MAX_SAFE_INTEGER) is false
+PASS Number.isNaN(Number.MIN_SAFE_INTEGER) is false
+PASS Number.isNaN(Math.PI) is false
+PASS Number.isNaN(Math.E) is false
+PASS Number.isNaN(Infinity) is false
+PASS Number.isNaN(-Infinity) is false
+PASS Number.isNaN(null) is false
+PASS Number.isNaN({}) is false
+PASS Number.isNaN({ webkit: "awesome" }) is false
+PASS Number.isNaN([]) is false
+PASS Number.isNaN([123]) is false
+PASS Number.isNaN([1,1]) is false
+PASS Number.isNaN([NaN]) is false
+PASS Number.isNaN("") is false
+PASS Number.isNaN("1") is false
+PASS Number.isNaN("x") is false
+PASS Number.isNaN("NaN") is false
+PASS Number.isNaN("Infinity") is false
+PASS Number.isNaN(true) is false
+PASS Number.isNaN(false) is false
+PASS Number.isNaN(function(){}) is false
+PASS Number.isNaN(isNaN) is false
+PASS Number.isNaN(Symbol()) is false
+PASS Number.isNaN(objectWithNumberValueOf) is false
+PASS Number.isNaN(objectWithNaNValueOf) is false
+PASS Number.isNaN(objectRecordConversionCalls) is false
+PASS objectRecordConversionCalls.callList.length is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/js/Number-isNaN.html (0 => 201680)
--- trunk/LayoutTests/js/Number-isNaN.html (rev 0)
+++ trunk/LayoutTests/js/Number-isNaN.html 2016-06-04 18:58:08 UTC (rev 201680)
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<meta charset="utf-8">
+<script src=""
+</head>
+<body>
+<script src=""
+<script src=""
+</body>
+</html>
Added: trunk/LayoutTests/js/global-isNaN-expected.txt (0 => 201680)
--- trunk/LayoutTests/js/global-isNaN-expected.txt (rev 0)
+++ trunk/LayoutTests/js/global-isNaN-expected.txt 2016-06-04 18:58:08 UTC (rev 201680)
@@ -0,0 +1,61 @@
+Test the basic behaviors of global isNaN()
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS globalObject.hasOwnProperty("isNaN") is true
+PASS typeof isNaN is "function"
+PASS isNaN.length is 1
+PASS isNaN.name is "isNaN"
+PASS Object.getOwnPropertyDescriptor(globalObject, "isNaN").configurable is true
+PASS Object.getOwnPropertyDescriptor(globalObject, "isNaN").enumerable is false
+PASS Object.getOwnPropertyDescriptor(globalObject, "isNaN").writable is true
+PASS isNaN() is true
+PASS isNaN(NaN) is true
+PASS isNaN(undefined) is true
+PASS isNaN(0) is false
+PASS isNaN(-0) is false
+PASS isNaN(1) is false
+PASS isNaN(-1) is false
+PASS isNaN(42) is false
+PASS isNaN(123.5) is false
+PASS isNaN(-123.5) is false
+PASS isNaN(Number.MAX_VALUE) is false
+PASS isNaN(Number.MIN_VALUE) is false
+PASS isNaN(Number.MAX_SAFE_INTEGER) is false
+PASS isNaN(Number.MIN_SAFE_INTEGER) is false
+PASS isNaN(Math.PI) is false
+PASS isNaN(Math.E) is false
+PASS isNaN(Infinity) is false
+PASS isNaN(-Infinity) is false
+PASS isNaN(null) is false
+PASS isNaN({}) is true
+PASS isNaN({ webkit: "awesome" }) is true
+PASS isNaN([]) is false
+PASS isNaN([123]) is false
+PASS isNaN([1,1]) is true
+PASS isNaN([NaN]) is true
+PASS isNaN("") is false
+PASS isNaN("1") is false
+PASS isNaN("x") is true
+PASS isNaN("NaN") is true
+PASS isNaN("Infinity") is false
+PASS isNaN(true) is false
+PASS isNaN(false) is false
+PASS isNaN(function(){}) is true
+PASS isNaN(isNaN) is true
+PASS isNaN(Symbol()) threw exception TypeError: Cannot convert a symbol to a number.
+PASS isNaN(objectConvertToString) is false
+PASS isNaN(objectRecordToStringCall) is false
+PASS objectRecordToStringCall.toStringCallCount is 1
+PASS isNaN(objectThrowOnToString) threw exception No!.
+PASS isNaN(objectWithValueOf) is false
+PASS isNaN(objectThrowOnValueOf) threw exception Nope!.
+PASS isNaN(objectRecordValueOfCall) is true
+PASS objectRecordValueOfCall.valueOfCallCount is 1
+PASS isNaN(objectRecordConversionCalls) is false
+PASS objectRecordConversionCalls.callList.toString() is "valueOf"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/js/global-isNaN.html (0 => 201680)
--- trunk/LayoutTests/js/global-isNaN.html (rev 0)
+++ trunk/LayoutTests/js/global-isNaN.html 2016-06-04 18:58:08 UTC (rev 201680)
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<meta charset="utf-8">
+<script src=""
+</head>
+<body>
+<script src=""
+<script src=""
+</body>
+</html>
Added: trunk/LayoutTests/js/script-tests/Number-isNaN.js (0 => 201680)
--- trunk/LayoutTests/js/script-tests/Number-isNaN.js (rev 0)
+++ trunk/LayoutTests/js/script-tests/Number-isNaN.js 2016-06-04 18:58:08 UTC (rev 201680)
@@ -0,0 +1,73 @@
+description("Test the basic behaviors of Number.isNaN()");
+
+shouldBeTrue('Number.hasOwnProperty("isNaN")');
+shouldBeEqualToString('typeof Number.isNaN', 'function');
+shouldBeTrue('Number.isNaN !== isNaN');
+
+// Function properties.
+shouldBe('Number.isNaN.length', '1');
+shouldBeEqualToString('Number.isNaN.name', 'isNaN');
+shouldBe('Object.getOwnPropertyDescriptor(Number, "isNaN").configurable', 'true');
+shouldBe('Object.getOwnPropertyDescriptor(Number, "isNaN").enumerable', 'false');
+shouldBe('Object.getOwnPropertyDescriptor(Number, "isNaN").writable', 'true');
+
+// Some simple cases.
+shouldBeFalse('Number.isNaN()');
+shouldBeTrue('Number.isNaN(NaN)');
+shouldBeFalse('Number.isNaN(undefined)');
+
+shouldBeFalse('Number.isNaN(0)');
+shouldBeFalse('Number.isNaN(-0)');
+shouldBeFalse('Number.isNaN(1)');
+shouldBeFalse('Number.isNaN(-1)');
+shouldBeFalse('Number.isNaN(42)');
+shouldBeFalse('Number.isNaN(123.5)');
+shouldBeFalse('Number.isNaN(-123.5)');
+
+shouldBeFalse('Number.isNaN(Number.MAX_VALUE)');
+shouldBeFalse('Number.isNaN(Number.MIN_VALUE)');
+shouldBeFalse('Number.isNaN(Number.MAX_SAFE_INTEGER)');
+shouldBeFalse('Number.isNaN(Number.MIN_SAFE_INTEGER)');
+shouldBeFalse('Number.isNaN(Math.PI)');
+shouldBeFalse('Number.isNaN(Math.E)');
+shouldBeFalse('Number.isNaN(Infinity)');
+shouldBeFalse('Number.isNaN(-Infinity)');
+shouldBeFalse('Number.isNaN(null)');
+
+// Non-numeric.
+shouldBeFalse('Number.isNaN({})');
+shouldBeFalse('Number.isNaN({ webkit: "awesome" })');
+shouldBeFalse('Number.isNaN([])');
+shouldBeFalse('Number.isNaN([123])');
+shouldBeFalse('Number.isNaN([1,1])');
+shouldBeFalse('Number.isNaN([NaN])');
+shouldBeFalse('Number.isNaN("")');
+shouldBeFalse('Number.isNaN("1")');
+shouldBeFalse('Number.isNaN("x")');
+shouldBeFalse('Number.isNaN("NaN")');
+shouldBeFalse('Number.isNaN("Infinity")');
+shouldBeFalse('Number.isNaN(true)');
+shouldBeFalse('Number.isNaN(false)');
+shouldBeFalse('Number.isNaN(function(){})');
+shouldBeFalse('Number.isNaN(isNaN)');
+shouldBeFalse('Number.isNaN(Symbol())');
+
+// Type conversion, doesn't happen.
+var objectWithNumberValueOf = { valueOf: function() { return 123; } };
+var objectWithNaNValueOf = { valueOf: function() { return NaN; } };
+shouldBeFalse('Number.isNaN(objectWithNumberValueOf)');
+shouldBeFalse('Number.isNaN(objectWithNaNValueOf)');
+
+var objectRecordConversionCalls = {
+ callList: [],
+ toString: function() {
+ this.callList.push("toString");
+ return "Bad";
+ },
+ valueOf: function() {
+ this.callList.push("valueOf");
+ return 12345;
+ }
+};
+shouldBeFalse('Number.isNaN(objectRecordConversionCalls)');
+shouldBe('objectRecordConversionCalls.callList.length', '0');
Added: trunk/LayoutTests/js/script-tests/global-isNaN.js (0 => 201680)
--- trunk/LayoutTests/js/script-tests/global-isNaN.js (rev 0)
+++ trunk/LayoutTests/js/script-tests/global-isNaN.js 2016-06-04 18:58:08 UTC (rev 201680)
@@ -0,0 +1,89 @@
+description("Test the basic behaviors of global isNaN()");
+
+var globalObject = (1,eval)("this");
+
+shouldBeTrue('globalObject.hasOwnProperty("isNaN")');
+shouldBeEqualToString('typeof isNaN', 'function');
+
+// Function properties.
+shouldBe('isNaN.length', '1');
+shouldBeEqualToString('isNaN.name', 'isNaN');
+shouldBe('Object.getOwnPropertyDescriptor(globalObject, "isNaN").configurable', 'true');
+shouldBe('Object.getOwnPropertyDescriptor(globalObject, "isNaN").enumerable', 'false');
+shouldBe('Object.getOwnPropertyDescriptor(globalObject, "isNaN").writable', 'true');
+
+// Some simple cases.
+shouldBeTrue('isNaN()');
+shouldBeTrue('isNaN(NaN)');
+shouldBeTrue('isNaN(undefined)');
+
+shouldBeFalse('isNaN(0)');
+shouldBeFalse('isNaN(-0)');
+shouldBeFalse('isNaN(1)');
+shouldBeFalse('isNaN(-1)');
+shouldBeFalse('isNaN(42)');
+shouldBeFalse('isNaN(123.5)');
+shouldBeFalse('isNaN(-123.5)');
+
+shouldBeFalse('isNaN(Number.MAX_VALUE)');
+shouldBeFalse('isNaN(Number.MIN_VALUE)');
+shouldBeFalse('isNaN(Number.MAX_SAFE_INTEGER)');
+shouldBeFalse('isNaN(Number.MIN_SAFE_INTEGER)');
+shouldBeFalse('isNaN(Math.PI)');
+shouldBeFalse('isNaN(Math.E)');
+shouldBeFalse('isNaN(Infinity)');
+shouldBeFalse('isNaN(-Infinity)');
+shouldBeFalse('isNaN(null)');
+
+// Non-numeric.
+shouldBeTrue('isNaN({})');
+shouldBeTrue('isNaN({ webkit: "awesome" })');
+shouldBeFalse('isNaN([])');
+shouldBeFalse('isNaN([123])');
+shouldBeTrue('isNaN([1,1])');
+shouldBeTrue('isNaN([NaN])');
+shouldBeFalse('isNaN("")');
+shouldBeFalse('isNaN("1")');
+shouldBeTrue('isNaN("x")');
+shouldBeTrue('isNaN("NaN")');
+shouldBeFalse('isNaN("Infinity")');
+shouldBeFalse('isNaN(true)');
+shouldBeFalse('isNaN(false)');
+shouldBeTrue('isNaN(function(){})');
+shouldBeTrue('isNaN(isNaN)');
+shouldThrow('isNaN(Symbol())');
+
+// Type conversion.
+var objectConvertToString = { toString: function() { return "42"; } };
+shouldBeFalse('isNaN(objectConvertToString)');
+
+var objectRecordToStringCall = { toStringCallCount: 0, toString: function() { this.toStringCallCount += 1; return "42"; } };
+shouldBeFalse('isNaN(objectRecordToStringCall)');
+shouldBe('objectRecordToStringCall.toStringCallCount', '1');
+
+var objectThrowOnToString = { toString: function() { throw "No!"; } };
+shouldThrow('isNaN(objectThrowOnToString)');
+
+var objectWithValueOf = { valueOf: function() { return 1.1; } };
+shouldBeFalse('isNaN(objectWithValueOf)');
+
+var objectThrowOnValueOf = { valueOf: function() { throw "Nope!" }, toString: function() { return 5; } };
+shouldThrow('isNaN(objectThrowOnValueOf)');
+
+var objectRecordValueOfCall = { valueOfCallCount: 0, valueOf: function() { ++this.valueOfCallCount; return NaN; } }
+shouldBeTrue('isNaN(objectRecordValueOfCall)');
+shouldBe('objectRecordValueOfCall.valueOfCallCount', '1');
+
+var objectRecordConversionCalls = {
+ callList: [],
+ toString: function() {
+ this.callList.push("toString");
+ return "Bad";
+ },
+ valueOf: function() {
+ this.callList.push("valueOf");
+ return 12345;
+ }
+};
+shouldBeFalse('isNaN(objectRecordConversionCalls)');
+shouldBe('objectRecordConversionCalls.callList.toString()', '"valueOf"');
Modified: trunk/LayoutTests/js/script-tests/math-clz32.js (201679 => 201680)
--- trunk/LayoutTests/js/script-tests/math-clz32.js 2016-06-04 07:20:17 UTC (rev 201679)
+++ trunk/LayoutTests/js/script-tests/math-clz32.js 2016-06-04 18:58:08 UTC (rev 201680)
@@ -6,7 +6,7 @@
// Function properties.
shouldBe('Math.clz32.length', '1');
-shouldBeEqualToString('Math.clz32.name', 'clz32')
+shouldBeEqualToString('Math.clz32.name', 'clz32');
shouldBe('Object.getOwnPropertyDescriptor(Math, "clz32").configurable', 'true');
shouldBe('Object.getOwnPropertyDescriptor(Math, "clz32").enumerable', 'false');
shouldBe('Object.getOwnPropertyDescriptor(Math, "clz32").writable', 'true');
Modified: trunk/Source/_javascript_Core/tests/stress/math-clz32-basics.js (201679 => 201680)
--- trunk/Source/_javascript_Core/tests/stress/math-clz32-basics.js 2016-06-04 07:20:17 UTC (rev 201679)
+++ trunk/Source/_javascript_Core/tests/stress/math-clz32-basics.js 2016-06-04 18:58:08 UTC (rev 201680)
@@ -56,7 +56,7 @@
var clzMinusZero = mathClz32OnInteger(-0);
if (clzMinusZero != 32)
- throw "mathClz32OnInteger(\"-0\") = " + clzMinusZero;
+ throw "mathClz32OnInteger(-0) = " + clzMinusZero;
}
noInline(verifyMathClz32OnIntegerWithOtherTypes);
@@ -70,9 +70,9 @@
{
return Math.clz32(value);
}
-noInline(mathClz32OnInteger);
+noInline(mathClz32OnDouble);
-// Test simple cases on integers.
+// Test simple cases on doubles.
function testMathClz32OnDoubles()
{
var value = mathClz32OnDouble(Math.PI);
@@ -89,7 +89,7 @@
var value = mathClz32OnDouble(-0);
if (value != 32)
- throw "mathClz32OnDouble(0) = " + value;
+ throw "mathClz32OnDouble(-0) = " + value;
var value = mathClz32OnDouble(NaN);
if (value != 32)