| Index: test/webkit/date-set-to-nan.js
|
| diff --git a/test/webkit/date-set-to-nan.js b/test/webkit/date-set-to-nan.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6d1c473d28242a7d2d5ef4972ba39e6db8a09150
|
| --- /dev/null
|
| +++ b/test/webkit/date-set-to-nan.js
|
| @@ -0,0 +1,473 @@
|
| +// 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(
|
| +"This tests if the Date setters handle invalid parameters correctly resulting in a NaN date and if a recovery from such a NaN date is only possible by using the date.setTime() and date.set[[UTC]Full]Year() functions."
|
| +);
|
| +
|
| +var dateFunctionNameRoots = [
|
| + "Time",
|
| + "Milliseconds",
|
| + "UTCMilliseconds",
|
| + "Seconds",
|
| + "UTCSeconds",
|
| + "Minutes",
|
| + "UTCMinutes",
|
| + "Hours",
|
| + "UTCHours",
|
| + "Date",
|
| + "UTCDate",
|
| + "Month",
|
| + "UTCMonth",
|
| + "FullYear",
|
| + "UTCFullYear",
|
| + "Year"
|
| +];
|
| +
|
| +var dateFunctionParameterNum = [
|
| + 1,
|
| + 1,
|
| + 1,
|
| + 2,
|
| + 2,
|
| + 3,
|
| + 3,
|
| + 4,
|
| + 4,
|
| + 1,
|
| + 1,
|
| + 2,
|
| + 2,
|
| + 3,
|
| + 3,
|
| + 1
|
| +];
|
| +
|
| +var testValues = [
|
| + 0,
|
| + Number.NaN,
|
| + Number.POSITIVE_INFINITY,
|
| + Number.NEGATIVE_INFINITY
|
| +];
|
| +
|
| +function testDateFunctionWithValueNoRecoverNaN(functionNameRoot, steps)
|
| +{
|
| + var date = new Date();
|
| + var setValue = date["get" + functionNameRoot]();
|
| + date.setMilliseconds(Number.NaN);
|
| + var params = [
|
| + "",
|
| + ", 0",
|
| + ", 0, 0",
|
| + ", 0, 0, 0"
|
| + ];
|
| + var setResult = (1 == steps) ? date["set" + functionNameRoot](setValue)
|
| + : ((2 == steps) ? date["set" + functionNameRoot](setValue, 0)
|
| + : ((3 == steps) ? date["set" + functionNameRoot](setValue, 0, 0)
|
| + : date["set" + functionNameRoot](setValue, 0, 0, 0)));
|
| + if (!isNaN(setResult)) {
|
| + testFailed("date(NaN).set" + functionNameRoot + "(" + setValue + params[steps - 1]
|
| + + ") was " + setResult + " instead of NaN");
|
| + return false;
|
| + }
|
| + var getResult = date["get" + functionNameRoot]();
|
| + if (!isNaN(getResult)) {
|
| + testFailed("date.get" + functionNameRoot + "() was " + getResult + " instead of NaN");
|
| + return false;
|
| + }
|
| + testPassed ("no recovering from NaN date using date.set" + functionNameRoot
|
| + + "(arg0" + params[steps - 1] + ")");
|
| + return true;
|
| +}
|
| +
|
| +function testDateFunctionWithValueRecoverTime(functionNameRoot)
|
| +{
|
| + var date = new Date();
|
| + var setValue = date["get" + functionNameRoot]();
|
| + date.setMilliseconds(Number.NaN);
|
| + var setResult = date["set" + functionNameRoot](setValue);
|
| + if (setValue != setResult) {
|
| + testFailed("date(NaN).set" + functionNameRoot + "(" + setValue + ") was " + setResult + " instead of " + setValue);
|
| + return false;
|
| + }
|
| + var getResult = date["get" + functionNameRoot]();
|
| + if (getResult != setValue) {
|
| + testFailed("date.get" + functionNameRoot + "() was " + getResult + " instead of " + setValue);
|
| + return false;
|
| + }
|
| + testPassed ("recover from NaN date using date.set" + functionNameRoot + "()");
|
| + return true;
|
| +}
|
| +
|
| +function testDateFunctionWithValueRecoverFullYear(functionNameRoot)
|
| +{
|
| + var result = true;
|
| + var date = new Date();
|
| + var setValue = date["get" + functionNameRoot]();
|
| + date.setMilliseconds(Number.NaN);
|
| + var setResult = date["set" + functionNameRoot](setValue);
|
| + var getResult = date["get" + functionNameRoot]();
|
| + if (getResult != setValue) {
|
| + testFailed("date.get" + functionNameRoot + "() was " + getResult + " instead of " + setValue);
|
| + result = false;
|
| + }
|
| + getResult = date.getMilliseconds();
|
| + if (getResult != 0) {
|
| + testFailed("date.getMilliseconds() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + getResult = date.getSeconds();
|
| + if (getResult != 0) {
|
| + testFailed("date.getSeconds() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + getResult = date.getMinutes();
|
| + if (getResult != 0) {
|
| + testFailed("date.getMinutes() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + getResult = date.getHours();
|
| + if (getResult != 0) {
|
| + testFailed("date.getHours() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + getResult = date.getDate();
|
| + if (getResult != 1) {
|
| + testFailed("date.getDate() was " + getResult + " instead of 1");
|
| + result = false;
|
| + }
|
| + getResult = date.getMonth();
|
| + if (getResult != 0) {
|
| + testFailed("date.getMonth() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + if (result)
|
| + testPassed ("recover from NaN date using date.setFullYear()");
|
| + else
|
| + testFailed ("recover from NaN date using date.setFullYear()");
|
| + return result;
|
| +}
|
| +
|
| +function testDateFunctionWithValueRecoverUTCFullYear(functionNameRoot)
|
| +{
|
| + var result = true;
|
| + var date = new Date();
|
| + var setValue = date["get" + functionNameRoot]();
|
| + date.setMilliseconds(Number.NaN);
|
| + var setResult = date["set" + functionNameRoot](setValue);
|
| + var getResult = date["get" + functionNameRoot]();
|
| + if (getResult != setValue) {
|
| + testFailed("date.get" + functionNameRoot + "() was " + getResult + " instead of " + setValue);
|
| + result = false;
|
| + }
|
| + getResult = date.getUTCMilliseconds();
|
| + if (getResult != 0) {
|
| + testFailed("date.getUTCMilliseconds() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + getResult = date.getUTCSeconds();
|
| + if (getResult != 0) {
|
| + testFailed("date.getUTCSeconds() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + getResult = date.getUTCMinutes();
|
| + if (getResult != 0) {
|
| + testFailed("date.getUTCMinutes() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + getResult = date.getUTCHours();
|
| + if (getResult != 0) {
|
| + testFailed("date.getUTCHours() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + getResult = date.getUTCDate();
|
| + if (getResult != 1) {
|
| + testFailed("date.getUTCDate() was " + getResult + " instead of 1");
|
| + result = false;
|
| + }
|
| + getResult = date.getUTCMonth();
|
| + if (getResult != 0) {
|
| + testFailed("date.getUTCMonth() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + if (result)
|
| + testPassed ("recover from NaN date using date.setUTCFullYear()");
|
| + else
|
| + testFailed ("recover from NaN date using date.setUTCFullYear()");
|
| + return result;
|
| +}
|
| +
|
| +function testDateFunctionWithValueRecoverYear(functionNameRoot)
|
| +{
|
| + var result = true;
|
| + var is13Compatible = true;
|
| +
|
| + var date = new Date();
|
| + var setValue = date["get" + functionNameRoot]();
|
| + var fullYears = date.getFullYear() - 1900;
|
| + if (setValue != fullYears) {
|
| + testFailed("date.get" + functionNameRoot + "() was " + setValue + " instead of " + fullYears);
|
| + is13Compatible = false;
|
| + } else
|
| + testPassed("date.getYear() is compatible to JavaScript 1.3 and later");
|
| +
|
| + date.setMilliseconds(Number.NaN);
|
| + var setResult = date["set" + functionNameRoot](setValue + 1900);
|
| + var getResult = date["get" + functionNameRoot]();
|
| + if (getResult != setValue) {
|
| + testFailed("date.get" + functionNameRoot + "() was " + getResult + " instead of " + setValue);
|
| + result = false;
|
| + }
|
| + getResult = date.getMilliseconds();
|
| + if (getResult != 0) {
|
| + testFailed("date.getMilliseconds() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + getResult = date.getSeconds();
|
| + if (getResult != 0) {
|
| + testFailed("date.getSeconds() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + getResult = date.getMinutes();
|
| + if (getResult != 0) {
|
| + testFailed("date.getMinutes() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + getResult = date.getHours();
|
| + if (getResult != 0) {
|
| + testFailed("date.getHours() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + getResult = date.getDate();
|
| + if (getResult != 1) {
|
| + testFailed("date.getDate() was " + getResult + " instead of 1");
|
| + result = false;
|
| + }
|
| + getResult = date.getMonth();
|
| + if (getResult != 0) {
|
| + testFailed("date.getMonth() was " + getResult + " instead of 0");
|
| + result = false;
|
| + }
|
| + if (result)
|
| + testPassed ("recover from NaN date using date.setUTCFullYear()");
|
| + else
|
| + testFailed ("recover from NaN date using date.setUTCFullYear()");
|
| + return result && is13Compatible;
|
| +}
|
| +
|
| +function makeIEHappy(functionNameRoot, value)
|
| +{
|
| + var date = new Date();
|
| + var setResult = date["set" + functionNameRoot](value);
|
| + if (!isNaN(setResult)) {
|
| + testFailed("date.set" + functionNameRoot
|
| + + "() was "
|
| + + setResult + " instead of NaN");
|
| + return false;
|
| + }
|
| + var getResult = date["get" + functionNameRoot]();
|
| + if (!isNaN(getResult)) {
|
| + testFailed("date.get" + functionNameRoot + "() was "
|
| + + getResult + " instead of NaN");
|
| + return false;
|
| + }
|
| + return true
|
| +}
|
| +
|
| +function testDateFunctionWithValueExpectingNaN1(functionNameRoot)
|
| +{
|
| + var result = true;
|
| + for (var idx0 in testValues)
|
| + if (idx0 != 0) {
|
| + var date = new Date();
|
| + var setResult = date["set" + functionNameRoot](testValues[idx0]);
|
| + if (!isNaN(setResult)) {
|
| + testFailed("date.set" + functionNameRoot + "("
|
| + + testValues[idx0] + ") was "
|
| + + setResult + " instead of NaN");
|
| + result = false;
|
| + }
|
| + var getResult = date["get" + functionNameRoot]();
|
| + if (!isNaN(getResult)) {
|
| + testFailed("date.get" + functionNameRoot + "() was "
|
| + + getResult + " instead of NaN");
|
| + result = false;
|
| + }
|
| + } else if (!makeIEHappy(functionNameRoot))
|
| + result = false;
|
| + if (result) {
|
| + testPassed("date.set" + functionNameRoot + "(arg0)");
|
| + testPassed("date.set" + functionNameRoot + "()");
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +function testDateFunctionWithValueExpectingNaN2(functionNameRoot)
|
| +{
|
| + var result = true;
|
| + for (var idx0 in testValues)
|
| + for (var idx1 in testValues)
|
| + if (idx0 != 0 || idx1 != 0) {
|
| + var date = new Date();
|
| + var setResult = date["set" + functionNameRoot](testValues[idx0],
|
| + testValues[idx1]);
|
| +
|
| + if (!isNaN(setResult)) {
|
| + testFailed("date.set" + functionNameRoot + "("
|
| + + testValues[idx0] + ", "
|
| + + testValues[idx1] + ") was "
|
| + + setResult + " instead of NaN");
|
| + result = false;
|
| + }
|
| + var getResult = date["get" + functionNameRoot]();
|
| + if (!isNaN(getResult)) {
|
| + testFailed("date.get" + functionNameRoot + "() was "
|
| + + getResult + " instead of NaN");
|
| + result = false;
|
| + }
|
| + }
|
| +
|
| + if (result)
|
| + testPassed("date.set" + functionNameRoot + "(arg0, arg1)");
|
| + return result;
|
| +}
|
| +
|
| +function testDateFunctionWithValueExpectingNaN3(functionNameRoot)
|
| +{
|
| + var result = true;
|
| + for (var idx0 in testValues)
|
| + for (var idx1 in testValues)
|
| + for (var idx2 in testValues)
|
| + if (idx0 != 0 || idx1 != 0 || idx2 != 0) {
|
| + var date = new Date();
|
| + var setResult = date["set" + functionNameRoot](testValues[idx0],
|
| + testValues[idx1],
|
| + testValues[idx2]);
|
| + if (!isNaN(setResult)) {
|
| + testFailed("date.set" + functionNameRoot + "("
|
| + + testValues[idx0] + ", "
|
| + + testValues[idx1] + ", "
|
| + + testValues[idx2] + ") was "
|
| + + setResult + " instead of NaN");
|
| + result = false;
|
| + }
|
| + var getResult = date["get" + functionNameRoot]();
|
| + if (!isNaN(getResult)) {
|
| + testFailed("date.get" + functionNameRoot + "() was "
|
| + + getResult + " instead of NaN");
|
| + result = false;
|
| + }
|
| + }
|
| +
|
| + if (result)
|
| + testPassed("date.set" + functionNameRoot + "(arg0, arg1, arg2)");
|
| + return result;
|
| +}
|
| +
|
| +function testDateFunctionWithValueExpectingNaN4(functionNameRoot)
|
| +{
|
| + var result = true;
|
| + for (var idx0 in testValues)
|
| + for (var idx1 in testValues)
|
| + for (var idx2 in testValues)
|
| + for (var idx3 in testValues)
|
| + if (idx0 != 0 || idx1 != 0 || idx2 != 0 || idx3 != 0) {
|
| + var date = new Date();
|
| + var setResult = date["set" + functionNameRoot](testValues[idx0],
|
| + testValues[idx1],
|
| + testValues[idx2],
|
| + testValues[idx3]);
|
| + if (!isNaN(setResult)) {
|
| + testFailed("date.set" + functionNameRoot + "("
|
| + + testValues[idx0] + ", "
|
| + + testValues[idx1] + ", "
|
| + + testValues[idx2] + ", "
|
| + + testValues[idx3] + ") was "
|
| + + setResult + " instead of NaN");
|
| + result = false;
|
| + }
|
| + var getResult = date["get" + functionNameRoot]();
|
| + if (!isNaN(getResult)) {
|
| + testFailed("date.get" + functionNameRoot + "() was "
|
| + + getResult + " instead of NaN");
|
| + result = false;
|
| + }
|
| + }
|
| + if (result)
|
| + testPassed("date.set" + functionNameRoot + "(arg0, arg1, arg2, arg3)");
|
| + return result;
|
| +}
|
| +
|
| +
|
| +
|
| +function testDateFunction(functionNameRoot, functionParamNum)
|
| +{
|
| + var success = true;
|
| +
|
| + switch (functionParamNum) {
|
| + case 4:
|
| + success &= testDateFunctionWithValueExpectingNaN4(functionNameRoot);
|
| + if (functionNameRoot != "Time" &&
|
| + functionNameRoot != "FullYear" &&
|
| + functionNameRoot != "UTCFullYear" &&
|
| + functionNameRoot != "Year")
|
| + success &= testDateFunctionWithValueNoRecoverNaN(functionNameRoot, 4);
|
| +
|
| + case 3:
|
| + success &= testDateFunctionWithValueExpectingNaN3(functionNameRoot);
|
| + if (functionNameRoot != "Time" &&
|
| + functionNameRoot != "FullYear" &&
|
| + functionNameRoot != "UTCFullYear" &&
|
| + functionNameRoot != "Year")
|
| + success &= testDateFunctionWithValueNoRecoverNaN(functionNameRoot, 3);
|
| +
|
| + case 2:
|
| + success &= testDateFunctionWithValueExpectingNaN2(functionNameRoot);
|
| + if (functionNameRoot != "Time" &&
|
| + functionNameRoot != "FullYear" &&
|
| + functionNameRoot != "UTCFullYear" &&
|
| + functionNameRoot != "Year")
|
| + success &= testDateFunctionWithValueNoRecoverNaN(functionNameRoot, 2);
|
| +
|
| + case 1:
|
| + success &= testDateFunctionWithValueExpectingNaN1(functionNameRoot);
|
| + if (functionNameRoot == "Time")
|
| + success &= testDateFunctionWithValueRecoverTime(functionNameRoot);
|
| + else if (functionNameRoot == "FullYear")
|
| + success &= testDateFunctionWithValueRecoverFullYear(functionNameRoot);
|
| + else if (functionNameRoot == "UTCFullYear")
|
| + success &= testDateFunctionWithValueRecoverUTCFullYear(functionNameRoot);
|
| + else if (functionNameRoot == "Year")
|
| + success &= testDateFunctionWithValueRecoverYear(functionNameRoot);
|
| + else
|
| + success &= testDateFunctionWithValueNoRecoverNaN(functionNameRoot, 1);
|
| + }
|
| +
|
| + if (success)
|
| + testPassed("date.set" + functionNameRoot + " passed all tests");
|
| +}
|
| +
|
| +for (var x in dateFunctionNameRoots)
|
| +{
|
| + testDateFunction(dateFunctionNameRoots[x], dateFunctionParameterNum[x]);
|
| +}
|
|
|