2 "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."
5 var dateFunctionNameRoots = [
24 var dateFunctionParameterNum = [
46 Number.POSITIVE_INFINITY,
47 Number.NEGATIVE_INFINITY
50 function testDateFunctionWithValueNoRecoverNaN(functionNameRoot, steps)
52 var date = new Date();
53 var setValue = date["get" + functionNameRoot]();
54 date.setMilliseconds(Number.NaN);
61 var setResult = (1 == steps) ? date["set" + functionNameRoot](setValue)
62 : ((2 == steps) ? date["set" + functionNameRoot](setValue, 0)
63 : ((3 == steps) ? date["set" + functionNameRoot](setValue, 0, 0)
64 : date["set" + functionNameRoot](setValue, 0, 0, 0)));
65 if (!isNaN(setResult)) {
66 testFailed("date(NaN).set" + functionNameRoot + "(" + setValue + params[steps - 1]
67 + ") was " + setResult + " instead of NaN");
70 var getResult = date["get" + functionNameRoot]();
71 if (!isNaN(getResult)) {
72 testFailed("date.get" + functionNameRoot + "() was " + getResult + " instead of NaN");
75 testPassed ("no recovering from NaN date using date.set" + functionNameRoot
76 + "(arg0" + params[steps - 1] + ")");
80 function testDateFunctionWithValueRecoverTime(functionNameRoot)
82 var date = new Date();
83 var setValue = date["get" + functionNameRoot]();
84 date.setMilliseconds(Number.NaN);
85 var setResult = date["set" + functionNameRoot](setValue);
86 if (setValue != setResult) {
87 testFailed("date(NaN).set" + functionNameRoot + "(" + setValue + ") was " + setResult + " instead of " + setValue);
90 var getResult = date["get" + functionNameRoot]();
91 if (getResult != setValue) {
92 testFailed("date.get" + functionNameRoot + "() was " + getResult + " instead of " + setValue);
95 testPassed ("recover from NaN date using date.set" + functionNameRoot + "()");
99 function testDateFunctionWithValueRecoverFullYear(functionNameRoot)
102 var date = new Date();
103 var setValue = date["get" + functionNameRoot]();
104 date.setMilliseconds(Number.NaN);
105 var setResult = date["set" + functionNameRoot](setValue);
106 var getResult = date["get" + functionNameRoot]();
107 if (getResult != setValue) {
108 testFailed("date.get" + functionNameRoot + "() was " + getResult + " instead of " + setValue);
111 getResult = date.getMilliseconds();
112 if (getResult != 0) {
113 testFailed("date.getMilliseconds() was " + getResult + " instead of 0");
116 getResult = date.getSeconds();
117 if (getResult != 0) {
118 testFailed("date.getSeconds() was " + getResult + " instead of 0");
121 getResult = date.getMinutes();
122 if (getResult != 0) {
123 testFailed("date.getMinutes() was " + getResult + " instead of 0");
126 getResult = date.getHours();
127 if (getResult != 0) {
128 testFailed("date.getHours() was " + getResult + " instead of 0");
131 getResult = date.getDate();
132 if (getResult != 1) {
133 testFailed("date.getDate() was " + getResult + " instead of 1");
136 getResult = date.getMonth();
137 if (getResult != 0) {
138 testFailed("date.getMonth() was " + getResult + " instead of 0");
142 testPassed ("recover from NaN date using date.setFullYear()");
144 testFailed ("recover from NaN date using date.setFullYear()");
148 function testDateFunctionWithValueRecoverUTCFullYear(functionNameRoot)
151 var date = new Date();
152 var setValue = date["get" + functionNameRoot]();
153 date.setMilliseconds(Number.NaN);
154 var setResult = date["set" + functionNameRoot](setValue);
155 var getResult = date["get" + functionNameRoot]();
156 if (getResult != setValue) {
157 testFailed("date.get" + functionNameRoot + "() was " + getResult + " instead of " + setValue);
160 getResult = date.getUTCMilliseconds();
161 if (getResult != 0) {
162 testFailed("date.getUTCMilliseconds() was " + getResult + " instead of 0");
165 getResult = date.getUTCSeconds();
166 if (getResult != 0) {
167 testFailed("date.getUTCSeconds() was " + getResult + " instead of 0");
170 getResult = date.getUTCMinutes();
171 if (getResult != 0) {
172 testFailed("date.getUTCMinutes() was " + getResult + " instead of 0");
175 getResult = date.getUTCHours();
176 if (getResult != 0) {
177 testFailed("date.getUTCHours() was " + getResult + " instead of 0");
180 getResult = date.getUTCDate();
181 if (getResult != 1) {
182 testFailed("date.getUTCDate() was " + getResult + " instead of 1");
185 getResult = date.getUTCMonth();
186 if (getResult != 0) {
187 testFailed("date.getUTCMonth() was " + getResult + " instead of 0");
191 testPassed ("recover from NaN date using date.setUTCFullYear()");
193 testFailed ("recover from NaN date using date.setUTCFullYear()");
197 function testDateFunctionWithValueRecoverYear(functionNameRoot)
200 var is13Compatible = true;
202 var date = new Date();
203 var setValue = date["get" + functionNameRoot]();
204 var fullYears = date.getFullYear() - 1900;
205 if (setValue != fullYears) {
206 testFailed("date.get" + functionNameRoot + "() was " + setValue + " instead of " + fullYears);
207 is13Compatible = false;
209 testPassed("date.getYear() is compatible to JavaScript 1.3 and later");
211 date.setMilliseconds(Number.NaN);
212 var setResult = date["set" + functionNameRoot](setValue + 1900);
213 var getResult = date["get" + functionNameRoot]();
214 if (getResult != setValue) {
215 testFailed("date.get" + functionNameRoot + "() was " + getResult + " instead of " + setValue);
218 getResult = date.getMilliseconds();
219 if (getResult != 0) {
220 testFailed("date.getMilliseconds() was " + getResult + " instead of 0");
223 getResult = date.getSeconds();
224 if (getResult != 0) {
225 testFailed("date.getSeconds() was " + getResult + " instead of 0");
228 getResult = date.getMinutes();
229 if (getResult != 0) {
230 testFailed("date.getMinutes() was " + getResult + " instead of 0");
233 getResult = date.getHours();
234 if (getResult != 0) {
235 testFailed("date.getHours() was " + getResult + " instead of 0");
238 getResult = date.getDate();
239 if (getResult != 1) {
240 testFailed("date.getDate() was " + getResult + " instead of 1");
243 getResult = date.getMonth();
244 if (getResult != 0) {
245 testFailed("date.getMonth() was " + getResult + " instead of 0");
249 testPassed ("recover from NaN date using date.setUTCFullYear()");
251 testFailed ("recover from NaN date using date.setUTCFullYear()");
252 return result && is13Compatible;
255 function makeIEHappy(functionNameRoot, value)
257 var date = new Date();
258 var setResult = date["set" + functionNameRoot](value);
259 if (!isNaN(setResult)) {
260 testFailed("date.set" + functionNameRoot
262 + setResult + " instead of NaN");
265 var getResult = date["get" + functionNameRoot]();
266 if (!isNaN(getResult)) {
267 testFailed("date.get" + functionNameRoot + "() was "
268 + getResult + " instead of NaN");
274 function testDateFunctionWithValueExpectingNaN1(functionNameRoot)
277 for (var idx0 in testValues)
279 var date = new Date();
280 var setResult = date["set" + functionNameRoot](testValues[idx0]);
281 if (!isNaN(setResult)) {
282 testFailed("date.set" + functionNameRoot + "("
283 + testValues[idx0] + ") was "
284 + setResult + " instead of NaN");
287 var getResult = date["get" + functionNameRoot]();
288 if (!isNaN(getResult)) {
289 testFailed("date.get" + functionNameRoot + "() was "
290 + getResult + " instead of NaN");
293 } else if (!makeIEHappy(functionNameRoot))
296 testPassed("date.set" + functionNameRoot + "(arg0)");
297 testPassed("date.set" + functionNameRoot + "()");
302 function testDateFunctionWithValueExpectingNaN2(functionNameRoot)
305 for (var idx0 in testValues)
306 for (var idx1 in testValues)
307 if (idx0 != 0 || idx1 != 0) {
308 var date = new Date();
309 var setResult = date["set" + functionNameRoot](testValues[idx0],
312 if (!isNaN(setResult)) {
313 testFailed("date.set" + functionNameRoot + "("
314 + testValues[idx0] + ", "
315 + testValues[idx1] + ") was "
316 + setResult + " instead of NaN");
319 var getResult = date["get" + functionNameRoot]();
320 if (!isNaN(getResult)) {
321 testFailed("date.get" + functionNameRoot + "() was "
322 + getResult + " instead of NaN");
328 testPassed("date.set" + functionNameRoot + "(arg0, arg1)");
332 function testDateFunctionWithValueExpectingNaN3(functionNameRoot)
335 for (var idx0 in testValues)
336 for (var idx1 in testValues)
337 for (var idx2 in testValues)
338 if (idx0 != 0 || idx1 != 0 || idx2 != 0) {
339 var date = new Date();
340 var setResult = date["set" + functionNameRoot](testValues[idx0],
343 if (!isNaN(setResult)) {
344 testFailed("date.set" + functionNameRoot + "("
345 + testValues[idx0] + ", "
346 + testValues[idx1] + ", "
347 + testValues[idx2] + ") was "
348 + setResult + " instead of NaN");
351 var getResult = date["get" + functionNameRoot]();
352 if (!isNaN(getResult)) {
353 testFailed("date.get" + functionNameRoot + "() was "
354 + getResult + " instead of NaN");
360 testPassed("date.set" + functionNameRoot + "(arg0, arg1, arg2)");
364 function testDateFunctionWithValueExpectingNaN4(functionNameRoot)
367 for (var idx0 in testValues)
368 for (var idx1 in testValues)
369 for (var idx2 in testValues)
370 for (var idx3 in testValues)
371 if (idx0 != 0 || idx1 != 0 || idx2 != 0 || idx3 != 0) {
372 var date = new Date();
373 var setResult = date["set" + functionNameRoot](testValues[idx0],
377 if (!isNaN(setResult)) {
378 testFailed("date.set" + functionNameRoot + "("
379 + testValues[idx0] + ", "
380 + testValues[idx1] + ", "
381 + testValues[idx2] + ", "
382 + testValues[idx3] + ") was "
383 + setResult + " instead of NaN");
386 var getResult = date["get" + functionNameRoot]();
387 if (!isNaN(getResult)) {
388 testFailed("date.get" + functionNameRoot + "() was "
389 + getResult + " instead of NaN");
394 testPassed("date.set" + functionNameRoot + "(arg0, arg1, arg2, arg3)");
400 function testDateFunction(functionNameRoot, functionParamNum)
404 switch (functionParamNum) {
406 success &= testDateFunctionWithValueExpectingNaN4(functionNameRoot);
407 if (functionNameRoot != "Time" &&
408 functionNameRoot != "FullYear" &&
409 functionNameRoot != "UTCFullYear" &&
410 functionNameRoot != "Year")
411 success &= testDateFunctionWithValueNoRecoverNaN(functionNameRoot, 4);
414 success &= testDateFunctionWithValueExpectingNaN3(functionNameRoot);
415 if (functionNameRoot != "Time" &&
416 functionNameRoot != "FullYear" &&
417 functionNameRoot != "UTCFullYear" &&
418 functionNameRoot != "Year")
419 success &= testDateFunctionWithValueNoRecoverNaN(functionNameRoot, 3);
422 success &= testDateFunctionWithValueExpectingNaN2(functionNameRoot);
423 if (functionNameRoot != "Time" &&
424 functionNameRoot != "FullYear" &&
425 functionNameRoot != "UTCFullYear" &&
426 functionNameRoot != "Year")
427 success &= testDateFunctionWithValueNoRecoverNaN(functionNameRoot, 2);
430 success &= testDateFunctionWithValueExpectingNaN1(functionNameRoot);
431 if (functionNameRoot == "Time")
432 success &= testDateFunctionWithValueRecoverTime(functionNameRoot);
433 else if (functionNameRoot == "FullYear")
434 success &= testDateFunctionWithValueRecoverFullYear(functionNameRoot);
435 else if (functionNameRoot == "UTCFullYear")
436 success &= testDateFunctionWithValueRecoverUTCFullYear(functionNameRoot);
437 else if (functionNameRoot == "Year")
438 success &= testDateFunctionWithValueRecoverYear(functionNameRoot);
440 success &= testDateFunctionWithValueNoRecoverNaN(functionNameRoot, 1);
444 testPassed("date.set" + functionNameRoot + " passed all tests");
447 for (var x in dateFunctionNameRoots)
449 testDateFunction(dateFunctionNameRoots[x], dateFunctionParameterNum[x]);
452 var successfullyParsed = true;