Title: [201680] trunk
Revision
201680
Author
commit-qu...@webkit.org
Date
2016-06-04 11:58:08 -0700 (Sat, 04 Jun 2016)

Log Message

Add better basic isNaN test coverage
https://bugs.webkit.org/show_bug.cgi?id=158379

Patch by Joseph Pecoraro <pecor...@apple.com> on 2016-06-04
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:

Modified Paths

Added Paths

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)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to