18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar completed = false; 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar testcases; 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar tc = 0; 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSECTION = ""; 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectVERSION = ""; 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectBUGNUMBER = ""; 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectEXCLUDE = ""; 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectBUGNUMBER = ""; 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectTZ_DIFF = -8; 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TT = ""; 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TT_ = ""; 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar BR = ""; 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar NBSP = " "; 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar CR = "\n"; 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FONT = ""; 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FONT_ = ""; 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FONT_RED = ""; 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FONT_GREEN = ""; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar B = ""; 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar B_ = "" 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar H2 = ""; 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar H2_ = ""; 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar HR = ""; 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar DEBUG = false; 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar PASSED = " PASSED!" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FAILED = " FAILED! expected: "; 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction test() { 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( tc=0; tc < testcases.length; tc++ ) { 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].passed = writeTestCaseResult( 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].expect, 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].actual, 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].description +" = "+ 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].actual ); 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value "; 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stopTest(); 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( testcases ); 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TestCase( n, d, e, a ) { 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.name = n; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.description = d; 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.expect = e; 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.actual = a; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.passed = true; 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.reason = ""; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.bugnumber = BUGNUMBER; 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.passed = getTestCaseResult( this.expect, this.actual ); 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( DEBUG ) { 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project writeLineToLog( "added " + this.description ); 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction startTest() { 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // JavaScript 1.3 is supposed to be compliant ecma version 1.0 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( VERSION == "ECMA_1" ) { 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project version ( "130" ); 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( VERSION == "JS_13" ) { 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project version ( "130" ); 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( VERSION == "JS_12" ) { 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project version ( "120" ); 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( VERSION == "JS_11" ) { 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project version ( "110" ); 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // for ecma version 2.0, we will leave the javascript version to 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the default ( for now ). 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project writeHeaderToLog( SECTION + " "+ TITLE); 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases = new Array(); 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tc = 0; 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getTestCaseResult( expect, actual ) { 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // because ( NaN == NaN ) always returns false, need to do 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // a special compare to see if we got the right result. 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( actual != actual ) { 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( typeof actual == "object" ) { 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project actual = "NaN object"; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project actual = "NaN number"; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( expect != expect ) { 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( typeof expect == "object" ) { 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project expect = "NaN object"; 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project expect = "NaN number"; 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var passed = ( expect == actual ) ? true : false; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // if both objects are numbers 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // need to replace w/ IEEE standard for rounding 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( !passed 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && typeof(actual) == "number" 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && typeof(expect) == "number" 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ) { 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( Math.abs(actual-expect) < 0.0000001 ) { 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project passed = true; 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // verify type is the same 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( typeof(expect) != typeof(actual) ) { 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project passed = false; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return passed; 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeTestCaseResult( expect, actual, string ) { 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var passed = getTestCaseResult( expect, actual ); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project writeFormattedResult( expect, actual, string, passed ); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return passed; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeFormattedResult( expect, actual, string, passed ) { 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var s = TT + string ; 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( k = 0; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project k < (60 - string.length >= 0 ? 60 - string.length : 5) ; 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project k++ ) { 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s += B ; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s += ( passed ) ? FONT_GREEN + NBSP + PASSED : FONT_RED + NBSP + FAILED + expect + TT_ ; 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project writeLineToLog( s + FONT_ + B_ + TT_ ); 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return passed; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeLineToLog( string ) { 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print( string + BR + CR ); 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeHeaderToLog( string ) { 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print( H2 + string + H2_ ); 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction stopTest() 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var sizeTag = "<#TEST CASES SIZE>"; 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var doneTag = "<#TEST CASES DONE>"; 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var beginTag = "<#TEST CASE "; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var endTag = ">"; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(sizeTag); 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(testcases.length); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (tc = 0; tc < testcases.length; tc++) 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(beginTag + 'PASSED' + endTag); 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(testcases[tc].passed); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(beginTag + 'NAME' + endTag); 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(testcases[tc].name); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(beginTag + 'EXPECTED' + endTag); 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(testcases[tc].expect); 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(beginTag + 'ACTUAL' + endTag); 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(testcases[tc].actual); 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(beginTag + 'DESCRIPTION' + endTag); 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(testcases[tc].description); 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(beginTag + 'REASON' + endTag); 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(( testcases[tc].passed ) ? "" : "wrong value "); 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(beginTag + 'BUGNUMBER' + endTag); 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print( BUGNUMBER ); 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print(doneTag); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print( HR ); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gc(); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getFailedCases() { 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var i = 0; i < testcases.length; i++ ) { 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ! testcases[i].passed ) { 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print( testcases[i].description +" = " +testcases[i].actual +" expected: "+ testcases[i].expect ); 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction err( msg, page, line ) { 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].actual = "error"; 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].reason = msg; 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project writeTestCaseResult( testcases[tc].expect, 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].actual, 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].description +" = "+ testcases[tc].actual + 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ": " + testcases[tc].reason ); 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stopTest(); 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/** 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Type Conversion functions used by Type Conversion 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Date functions used by tests in Date suite 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar msPerDay = 86400000; 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar HoursPerDay = 24; 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar MinutesPerHour = 60; 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar SecondsPerMinute = 60; 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar msPerSecond = 1000; 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar msPerMinute = 60000; // msPerSecond * SecondsPerMinute 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar msPerHour = 3600000; // msPerMinute * MinutesPerHour 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TIME_1970 = 0; 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TIME_2000 = 946684800000; 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TIME_1900 = -2208988800000; 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction Day( t ) { 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( Math.floor(t/msPerDay ) ); 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DaysInYear( y ) { 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( y % 4 != 0 ) { 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 365; 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( (y % 4 == 0) && (y % 100 != 0) ) { 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 366; 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( (y % 100 == 0) && (y % 400 != 0) ) { 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 365; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( (y % 400 == 0) ){ 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 366; 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "ERROR: DaysInYear(" + y + ") case not covered"; 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeInYear( y ) { 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( DaysInYear(y) * msPerDay ); 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DayNumber( t ) { 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( Math.floor( t / msPerDay ) ); 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeWithinDay( t ) { 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( t < 0 ) { 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( (t % msPerDay) + msPerDay ); 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( t % msPerDay ); 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction YearNumber( t ) { 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeFromYear( y ) { 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( msPerDay * DayFromYear(y) ); 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DayFromYear( y ) { 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( 365*(y-1970) + 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Math.floor((y-1969)/4) - 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Math.floor((y-1901)/100) + 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Math.floor((y-1601)/400) ); 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction InLeapYear( t ) { 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( DaysInYear(YearFromTime(t)) == 365 ) { 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( DaysInYear(YearFromTime(t)) == 366 ) { 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 1; 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "ERROR: InLeapYear("+t+") case not covered"; 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction YearFromTime( t ) { 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t = Number( t ); 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var sign = ( t < 0 ) ? -1 : 1; 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var year = ( sign < 0 ) ? 1969 : 1970; 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var timeToTimeZero = t; ; ) { 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // subtract the current year's time from the time that's left. 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project timeToTimeZero -= sign * TimeInYear(year) 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // if there's less than the current year's worth of time left, then break. 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( sign < 0 ) { 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( sign * timeToTimeZero <= 0 ) { 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project year += sign; 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( sign * timeToTimeZero < 0 ) { 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project year += sign; 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( year ); 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MonthFromTime( t ) { 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // i know i could use switch but i'd rather not until it's part of ECMA 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var day = DayWithinYear( t ); 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var leap = InLeapYear(t); 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( (0 <= day) && (day < 31) ) { 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( (31 <= day) && (day < (59+leap)) ) { 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 1; 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((59+leap) <= day) && (day < (90+leap)) ) { 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 2; 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((90+leap) <= day) && (day < (120+leap)) ) { 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 3; 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((120+leap) <= day) && (day < (151+leap)) ) { 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 4; 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((151+leap) <= day) && (day < (181+leap)) ) { 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 5; 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((181+leap) <= day) && (day < (212+leap)) ) { 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 6; 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((212+leap) <= day) && (day < (243+leap)) ) { 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 7; 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((243+leap) <= day) && (day < (273+leap)) ) { 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 8; 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((273+leap) <= day) && (day < (304+leap)) ) { 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 9; 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((304+leap) <= day) && (day < (334+leap)) ) { 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 10; 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((334+leap) <= day) && (day < (365+leap)) ) { 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 11; 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "ERROR: MonthFromTime("+t+") not known"; 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DayWithinYear( t ) { 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return( Day(t) - DayFromYear(YearFromTime(t))); 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DateFromTime( t ) { 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var day = DayWithinYear(t); 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var month = MonthFromTime(t); 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 0 ) { 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day + 1 ); 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 1 ) { 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 30 ); 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 2 ) { 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 58 - InLeapYear(t) ); 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 3 ) { 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 89 - InLeapYear(t)); 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 4 ) { 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 119 - InLeapYear(t)); 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 5 ) { 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 150- InLeapYear(t)); 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 6 ) { 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 180- InLeapYear(t)); 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 7 ) { 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 211- InLeapYear(t)); 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 8 ) { 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 242- InLeapYear(t)); 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 9 ) { 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 272- InLeapYear(t)); 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 10 ) { 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 303- InLeapYear(t)); 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 11 ) { 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 333- InLeapYear(t)); 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ("ERROR: DateFromTime("+t+") not known" ); 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction WeekDay( t ) { 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var weekday = (Day(t)+4) % 7; 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return( weekday < 0 ? 7 + weekday : weekday ); 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// missing daylight savins time adjustment 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction HourFromTime( t ) { 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var h = Math.floor( t / msPerHour ) % HoursPerDay; 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( (h<0) ? HoursPerDay + h : h ); 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MinFromTime( t ) { 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var min = Math.floor( t / msPerMinute ) % MinutesPerHour; 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return( ( min < 0 ) ? MinutesPerHour + min : min ); 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction SecFromTime( t ) { 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var sec = Math.floor( t / msPerSecond ) % SecondsPerMinute; 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( (sec < 0 ) ? SecondsPerMinute + sec : sec ); 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction msFromTime( t ) { 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var ms = t % msPerSecond; 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( (ms < 0 ) ? msPerSecond + ms : ms ); 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction LocalTZA() { 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( TZ_DIFF * msPerHour ); 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction UTC( t ) { 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( t - LocalTZA() - DaylightSavingTA(t - LocalTZA()) ); 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DaylightSavingTA( t ) { 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t = t - LocalTZA(); 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var dst_start = GetSecondSundayInMarch(t) + 2*msPerHour; 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var dst_end = GetFirstSundayInNovember(t)+ 2*msPerHour; 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( t >= dst_start && t < dst_end ) { 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return msPerHour; 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Daylight Savings Time starts on the first Sunday in April at 2:00AM in 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // PST. Other time zones will need to override this function. 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print( new Date( UTC(dst_start + LocalTZA())) ); 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return UTC(dst_start + LocalTZA()); 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetFirstSundayInApril( t ) { 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var year = YearFromTime(t); 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var leap = InLeapYear(t); 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var april = TimeFromYear(year) + TimeInMonth(0, leap) + TimeInMonth(1,leap) + 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TimeInMonth(2,leap); 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var first_sunday = april; WeekDay(first_sunday) > 0; 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project first_sunday += msPerDay ) 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ; 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return first_sunday; 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetLastSundayInOctober( t ) { 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var year = YearFromTime(t); 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var leap = InLeapYear(t); 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var oct = TimeFromYear(year), m = 0; m < 9; m++ ) { 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oct += TimeInMonth(m, leap); 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var last_sunday = oct + 30*msPerDay; WeekDay(last_sunday) > 0; 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project last_sunday -= msPerDay ) 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ; 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return last_sunday; 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Added these two functions because DST rules changed for the US. 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetSecondSundayInMarch( t ) { 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var year = YearFromTime(t); 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var leap = InLeapYear(t); 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var march = TimeFromYear(year) + TimeInMonth(0, leap) + TimeInMonth(1,leap); 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var sundayCount = 0; 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var flag = true; 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var second_sunday = march; flag; second_sunday += msPerDay ) 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (WeekDay(second_sunday) == 0) { 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if(++sundayCount == 2) 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project flag = false; 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return second_sunday; 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetFirstSundayInNovember( t ) { 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var year = YearFromTime(t); 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var leap = InLeapYear(t); 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var nov = TimeFromYear(year), m = 0; m < 10; m++ ) { 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nov += TimeInMonth(m, leap); 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var first_sunday = nov; WeekDay(first_sunday) > 0; 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project first_sunday += msPerDay ) 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ; 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return first_sunday; 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction LocalTime( t ) { 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( t + LocalTZA() + DaylightSavingTA(t) ); 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MakeTime( hour, min, sec, ms ) { 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( isNaN( hour ) || isNaN( min ) || isNaN( sec ) || isNaN( ms ) ) { 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hour = ToInteger(hour); 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project min = ToInteger( min); 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sec = ToInteger( sec); 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ms = ToInteger( ms ); 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return( (hour*msPerHour) + (min*msPerMinute) + 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (sec*msPerSecond) + ms ); 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MakeDay( year, month, date ) { 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( isNaN(year) || isNaN(month) || isNaN(date) ) { 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project year = ToInteger(year); 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project month = ToInteger(month); 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project date = ToInteger(date ); 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var sign = ( year < 1970 ) ? -1 : 1; 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var t = ( year < 1970 ) ? 1 : 0; 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var y = ( year < 1970 ) ? 1969 : 1970; 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var result5 = year + Math.floor( month/12 ); 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var result6 = month % 12; 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( year < 1970 ) { 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( y = 1969; y >= year; y += sign ) { 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t += sign * TimeInYear(y); 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( y = 1970 ; y < year; y += sign ) { 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t += sign * TimeInYear(y); 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var leap = InLeapYear( t ); 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var m = 0; m < month; m++ ) { 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t += TimeInMonth( m, leap ); 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( YearFromTime(t) != result5 ) { 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( MonthFromTime(t) != result6 ) { 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( DateFromTime(t) != 1 ) { 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( (Day(t)) + date - 1 ); 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeInMonth( month, leap ) { 5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // september april june november 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // jan 0 feb 1 mar 2 apr 3 may 4 june 5 jul 6 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // aug 7 sep 8 oct 9 nov 10 dec 11 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 3 || month == 5 || month == 8 || month == 10 ) { 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( 30*msPerDay ); 5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // all the rest 5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 0 || month == 2 || month == 4 || month == 6 || 5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project month == 7 || month == 9 || month == 11 ) { 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( 31*msPerDay ); 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // save february 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( (leap == 0) ? 28*msPerDay : 29*msPerDay ); 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MakeDate( day, time ) { 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( day == Number.POSITIVE_INFINITY || 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project day == Number.NEGATIVE_INFINITY || 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project day == Number.NaN ) { 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( time == Number.POSITIVE_INFINITY || 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project time == Number.POSITIVE_INFINITY || 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project day == Number.NaN) { 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day * msPerDay ) + time; 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeClip( t ) { 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( isNaN( t ) ) { 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( Number.NaN ); 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( Math.abs( t ) > 8.64e15 ) { 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( Number.NaN ); 5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( ToInteger( t ) ); 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction ToInteger( t ) { 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t = Number( t ); 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( isNaN( t ) ){ 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( Number.NaN ); 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( t == 0 || t == -0 || 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t == Number.POSITIVE_INFINITY || t == Number.NEGATIVE_INFINITY ) { 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var sign = ( t < 0 ) ? -1 : 1; 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( sign * Math.floor( Math.abs( t ) ) ); 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction Enumerate ( o ) { 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var properties = new Array(); 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( p in o ) { 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project properties[ properties.length ] = new Array( p, o[p] ); 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return properties; 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction AddTestCase( description, expect, actual ) { 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc++] = new TestCase( SECTION, description, expect, actual ); 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getFailedCases() { 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var i = 0; i < testcases.length; i++ ) { 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ! testcases[i].passed ) { 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print( testcases[i].description +" = " +testcases[i].actual +" expected: "+ testcases[i].expect ); 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 630