blob: 6d1c473d28242a7d2d5ef4972ba39e6db8a09150 [file] [log] [blame] [edit]
// 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]);
}