18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* The contents of this file are subject to the Netscape Public 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License Version 1.1 (the "License"); you may not use this file 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * except in compliance with the License. You may obtain a copy of 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the License at http://www.mozilla.org/NPL/ 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Software distributed under the License is distributed on an "AS 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * implied. See the License for the specific language governing 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * rights and limitations under the License. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The Original Code is Mozilla Communicator client code, released March 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 31, 1998. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The Initial Developer of the Original Code is Netscape Communications 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Corporation. Portions created by Netscape are 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1998 Netscape Communications Corporation. All 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Rights Reserved. 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Contributor(s): 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * JavaScript shared functions file for running the tests in either 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * stand-alone JavaScript engine. To run a test, first load this file, 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * then load the test script. 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar completed = false; 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar testcases; 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar tc = 0; 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSECTION = ""; 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectVERSION = ""; 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectBUGNUMBER = ""; 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * constant strings 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar GLOBAL = "[object global]"; 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar PASSED = " PASSED!" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FAILED = " FAILED! expected: "; 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar DEBUG = false; 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* wrapper for test cas constructor that doesn't require the SECTION 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * argument. 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction AddTestCase( description, expect, actual ) { 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc++] = new TestCase( SECTION, description, expect, actual ); 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * TestCase constructor 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TestCase( n, d, e, a ) { 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.name = n; 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.description = d; 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.expect = e; 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.actual = a; 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.passed = true; 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.reason = ""; 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.bugnumber = BUGNUMBER; 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project this.passed = getTestCaseResult( this.expect, this.actual ); 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( DEBUG ) { 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project writeLineToLog( "added " + this.description ); 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Set up test environment. 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction startTest() { 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( version ) { 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // JavaScript 1.3 is supposed to be compliant ecma version 1.0 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( VERSION == "ECMA_1" ) { 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project version ( "130" ); 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( VERSION == "JS_1.3" ) { 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project version ( "130" ); 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( VERSION == "JS_1.2" ) { 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project version ( "120" ); 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( VERSION == "JS_1.1" ) { 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project version ( "110" ); 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // for ecma version 2.0, we will leave the javascript version to 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // the default ( for now ). 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // print out bugnumber 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( BUGNUMBER ) { 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project writeLineToLog ("BUGNUMBER: " + BUGNUMBER ); 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases = new Array(); 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tc = 0; 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction test() { 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( tc=0; tc < testcases.length; tc++ ) { 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].passed = writeTestCaseResult( 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].expect, 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].actual, 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].description +" = "+ testcases[tc].actual ); 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value "; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project stopTest(); 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( testcases ); 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Compare expected result to the actual result and figure out whether 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the test case passed. 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getTestCaseResult( expect, actual ) { 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // because ( NaN == NaN ) always returns false, need to do 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // a special compare to see if we got the right result. 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( actual != actual ) { 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( typeof actual == "object" ) { 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project actual = "NaN object"; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project actual = "NaN number"; 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( expect != expect ) { 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( typeof expect == "object" ) { 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project expect = "NaN object"; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project expect = "NaN number"; 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var passed = ( expect == actual ) ? true : false; 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // if both objects are numbers 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // need to replace w/ IEEE standard for rounding 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( !passed 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && typeof(actual) == "number" 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && typeof(expect) == "number" 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ) { 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( Math.abs(actual-expect) < 0.0000001 ) { 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project passed = true; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // verify type is the same 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( typeof(expect) != typeof(actual) ) { 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project passed = false; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return passed; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Begin printing functions. These functions use the shell's 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * print function. When running tests in the browser, these 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * functions, override these functions with functions that use 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * document.write. 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeTestCaseResult( expect, actual, string ) { 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var passed = getTestCaseResult( expect, actual ); 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project writeFormattedResult( expect, actual, string, passed ); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return passed; 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeFormattedResult( expect, actual, string, passed ) { 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var s = string ; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project s += ( passed ) ? PASSED : FAILED + expect; 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project writeLineToLog( s); 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return passed; 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeLineToLog( string ) { 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print( string ); 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeHeaderToLog( string ) { 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print( string ); 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* end of print functions */ 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * When running in the shell, run the garbage collector after the 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * test has completed. 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction stopTest() { 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var gc; 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( gc != undefined ) { 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project gc(); 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Convenience function for displaying failed test cases. Useful 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * when running tests manually. 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getFailedCases() { 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var i = 0; i < testcases.length; i++ ) { 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ! testcases[i].passed ) { 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print( testcases[i].description +" = " +testcases[i].actual +" expected: "+ testcases[i].expect ); 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Date functions used by tests in Date suite 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar msPerDay = 86400000; 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar HoursPerDay = 24; 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar MinutesPerHour = 60; 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar SecondsPerMinute = 60; 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar msPerSecond = 1000; 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar msPerMinute = 60000; // msPerSecond * SecondsPerMinute 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar msPerHour = 3600000; // msPerMinute * MinutesPerHour 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TZ_DIFF = getTimeZoneDiff(); // offset of tester's timezone from UTC 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TZ_PST = -8; // offset of Pacific Standard Time from UTC 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar PST_DIFF = TZ_DIFF - TZ_PST; // offset of tester's timezone from PST 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TIME_1970 = 0; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TIME_2000 = 946684800000; 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TIME_1900 = -2208988800000; 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TIME_YEAR_0 = -62167219200000; 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Originally, the test suite used a hard-coded value TZ_DIFF = -8. 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * But that was only valid for testers in the Pacific Standard Time Zone! 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * We calculate the proper number dynamically for any tester. We just 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * have to be careful not to use a date subject to Daylight Savings Time... 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getTimeZoneDiff() 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return -((new Date(2000, 1, 1)).getTimezoneOffset())/60; 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Date test "ResultArrays" are hard-coded for Pacific Standard Time. 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * We must adjust them for the tester's own timezone - 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction adjustResultArray(ResultArray, msMode) 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the tester's system clock is in PST, no need to continue - 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!PST_DIFF) {return;} 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* The date testcases instantiate Date objects in two different ways: 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * millisecond mode: e.g. dt = new Date(10000000); 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * year-month-day mode: dt = new Date(2000, 5, 1, ...); 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * In the first case, the date is measured from Time 0 in Greenwich (i.e. UTC). 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * In the second case, it is measured with reference to the tester's local timezone. 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * In the first case we must correct those values expected for local measurements, 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * like dt.getHours() etc. No correction is necessary for dt.getUTCHours() etc. 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * In the second case, it is exactly the other way around - 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (msMode) 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The hard-coded UTC milliseconds from Time 0 derives from a UTC date. 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Shift to the right by the offset between UTC and the tester. 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var t = ResultArray[TIME] + TZ_DIFF*msPerHour; 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Use our date arithmetic functions to determine the local hour, day, etc. 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResultArray[HOURS] = HourFromTime(t); 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResultArray[DAY] = WeekDay(t); 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResultArray[DATE] = DateFromTime(t); 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResultArray[MONTH] = MonthFromTime(t); 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResultArray[YEAR] = YearFromTime(t); 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // The hard-coded UTC milliseconds from Time 0 derives from a PST date. 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Shift to the left by the offset between PST and the tester. 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var t = ResultArray[TIME] - PST_DIFF*msPerHour; 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Use our date arithmetic functions to determine the UTC hour, day, etc. 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResultArray[TIME] = t; 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResultArray[UTC_HOURS] = HourFromTime(t); 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResultArray[UTC_DAY] = WeekDay(t); 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResultArray[UTC_DATE] = DateFromTime(t); 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResultArray[UTC_MONTH] = MonthFromTime(t); 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ResultArray[UTC_YEAR] = YearFromTime(t); 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction Day( t ) { 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( Math.floor(t/msPerDay ) ); 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DaysInYear( y ) { 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( y % 4 != 0 ) { 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 365; 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( (y % 4 == 0) && (y % 100 != 0) ) { 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 366; 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( (y % 100 == 0) && (y % 400 != 0) ) { 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 365; 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( (y % 400 == 0) ){ 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 366; 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "ERROR: DaysInYear(" + y + ") case not covered"; 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeInYear( y ) { 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( DaysInYear(y) * msPerDay ); 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DayNumber( t ) { 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( Math.floor( t / msPerDay ) ); 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeWithinDay( t ) { 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( t < 0 ) { 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( (t % msPerDay) + msPerDay ); 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( t % msPerDay ); 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction YearNumber( t ) { 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeFromYear( y ) { 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( msPerDay * DayFromYear(y) ); 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DayFromYear( y ) { 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( 365*(y-1970) + 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Math.floor((y-1969)/4) - 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Math.floor((y-1901)/100) + 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Math.floor((y-1601)/400) ); 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction InLeapYear( t ) { 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( DaysInYear(YearFromTime(t)) == 365 ) { 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( DaysInYear(YearFromTime(t)) == 366 ) { 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 1; 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "ERROR: InLeapYear("+ t + ") case not covered"; 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction YearFromTime( t ) { 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t = Number( t ); 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var sign = ( t < 0 ) ? -1 : 1; 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var year = ( sign < 0 ) ? 1969 : 1970; 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var timeToTimeZero = t; ; ) { 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // subtract the current year's time from the time that's left. 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project timeToTimeZero -= sign * TimeInYear(year) 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // if there's less than the current year's worth of time left, then break. 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( sign < 0 ) { 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( sign * timeToTimeZero <= 0 ) { 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project year += sign; 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( sign * timeToTimeZero < 0 ) { 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project year += sign; 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( year ); 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MonthFromTime( t ) { 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // i know i could use switch but i'd rather not until it's part of ECMA 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var day = DayWithinYear( t ); 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var leap = InLeapYear(t); 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( (0 <= day) && (day < 31) ) { 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( (31 <= day) && (day < (59+leap)) ) { 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 1; 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((59+leap) <= day) && (day < (90+leap)) ) { 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 2; 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((90+leap) <= day) && (day < (120+leap)) ) { 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 3; 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((120+leap) <= day) && (day < (151+leap)) ) { 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 4; 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((151+leap) <= day) && (day < (181+leap)) ) { 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 5; 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((181+leap) <= day) && (day < (212+leap)) ) { 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 6; 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((212+leap) <= day) && (day < (243+leap)) ) { 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 7; 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((243+leap) <= day) && (day < (273+leap)) ) { 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 8; 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((273+leap) <= day) && (day < (304+leap)) ) { 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 9; 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((304+leap) <= day) && (day < (334+leap)) ) { 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 10; 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ((334+leap) <= day) && (day < (365+leap)) ) { 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 11; 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "ERROR: MonthFromTime("+t+") not known"; 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DayWithinYear( t ) { 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return( Day(t) - DayFromYear(YearFromTime(t))); 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DateFromTime( t ) { 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var day = DayWithinYear(t); 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var month = MonthFromTime(t); 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 0 ) { 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day + 1 ); 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 1 ) { 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 30 ); 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 2 ) { 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 58 - InLeapYear(t) ); 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 3 ) { 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 89 - InLeapYear(t)); 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 4 ) { 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 119 - InLeapYear(t)); 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 5 ) { 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 150- InLeapYear(t)); 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 6 ) { 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 180- InLeapYear(t)); 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 7 ) { 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 211- InLeapYear(t)); 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 8 ) { 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 242- InLeapYear(t)); 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 9 ) { 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 272- InLeapYear(t)); 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 10 ) { 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 303- InLeapYear(t)); 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 11 ) { 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day - 333- InLeapYear(t)); 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ("ERROR: DateFromTime("+t+") not known" ); 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction WeekDay( t ) { 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var weekday = (Day(t)+4) % 7; 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return( weekday < 0 ? 7 + weekday : weekday ); 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// missing daylight savins time adjustment 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction HourFromTime( t ) { 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var h = Math.floor( t / msPerHour ) % HoursPerDay; 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( (h<0) ? HoursPerDay + h : h ); 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MinFromTime( t ) { 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var min = Math.floor( t / msPerMinute ) % MinutesPerHour; 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return( ( min < 0 ) ? MinutesPerHour + min : min ); 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction SecFromTime( t ) { 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var sec = Math.floor( t / msPerSecond ) % SecondsPerMinute; 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( (sec < 0 ) ? SecondsPerMinute + sec : sec ); 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction msFromTime( t ) { 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var ms = t % msPerSecond; 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( (ms < 0 ) ? msPerSecond + ms : ms ); 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction LocalTZA() { 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( TZ_DIFF * msPerHour ); 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction UTC( t ) { 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( t - LocalTZA() - DaylightSavingTA(t - LocalTZA()) ); 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction DaylightSavingTA( t ) { 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t = t - LocalTZA(); 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var dst_start = GetSecondSundayInMarch(t) + 2*msPerHour; 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var dst_end = GetFirstSundayInNovember(t)+ 2*msPerHour; 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( t >= dst_start && t < dst_end ) { 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return msPerHour; 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Daylight Savings Time starts on the first Sunday in April at 2:00AM in 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // PST. Other time zones will need to override this function. 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print( new Date( UTC(dst_start + LocalTZA())) ); 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return UTC(dst_start + LocalTZA()); 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetFirstSundayInApril( t ) { 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var year = YearFromTime(t); 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var leap = InLeapYear(t); 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var april = TimeFromYear(year) + TimeInMonth(0, leap) + TimeInMonth(1,leap) + 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TimeInMonth(2,leap); 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var first_sunday = april; WeekDay(first_sunday) > 0; 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project first_sunday += msPerDay ) 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ; 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return first_sunday; 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetLastSundayInOctober( t ) { 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var year = YearFromTime(t); 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var leap = InLeapYear(t); 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var oct = TimeFromYear(year), m = 0; m < 9; m++ ) { 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project oct += TimeInMonth(m, leap); 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var last_sunday = oct + 30*msPerDay; WeekDay(last_sunday) > 0; 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project last_sunday -= msPerDay ) 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ; 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return last_sunday; 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Added these two functions because DST rules changed for the US. 5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetSecondSundayInMarch( t ) { 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var year = YearFromTime(t); 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var leap = InLeapYear(t); 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var march = TimeFromYear(year) + TimeInMonth(0, leap) + TimeInMonth(1,leap); 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var sundayCount = 0; 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var flag = true; 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var second_sunday = march; flag; second_sunday += msPerDay ) 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (WeekDay(second_sunday) == 0) { 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if(++sundayCount == 2) 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project flag = false; 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return second_sunday; 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetFirstSundayInNovember( t ) { 5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var year = YearFromTime(t); 5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var leap = InLeapYear(t); 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var nov = TimeFromYear(year), m = 0; m < 10; m++ ) { 5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nov += TimeInMonth(m, leap); 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var first_sunday = nov; WeekDay(first_sunday) > 0; 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project first_sunday += msPerDay ) 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ; 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return first_sunday; 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction LocalTime( t ) { 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( t + LocalTZA() + DaylightSavingTA(t) ); 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MakeTime( hour, min, sec, ms ) { 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( isNaN( hour ) || isNaN( min ) || isNaN( sec ) || isNaN( ms ) ) { 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project hour = ToInteger(hour); 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project min = ToInteger( min); 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sec = ToInteger( sec); 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ms = ToInteger( ms ); 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return( (hour*msPerHour) + (min*msPerMinute) + 5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (sec*msPerSecond) + ms ); 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MakeDay( year, month, date ) { 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( isNaN(year) || isNaN(month) || isNaN(date) ) { 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project year = ToInteger(year); 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project month = ToInteger(month); 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project date = ToInteger(date ); 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var sign = ( year < 1970 ) ? -1 : 1; 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var t = ( year < 1970 ) ? 1 : 0; 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var y = ( year < 1970 ) ? 1969 : 1970; 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var result5 = year + Math.floor( month/12 ); 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var result6 = month % 12; 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( year < 1970 ) { 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( y = 1969; y >= year; y += sign ) { 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t += sign * TimeInYear(y); 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( y = 1970 ; y < year; y += sign ) { 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t += sign * TimeInYear(y); 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var leap = InLeapYear( t ); 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( var m = 0; m < month; m++ ) { 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t += TimeInMonth( m, leap ); 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( YearFromTime(t) != result5 ) { 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( MonthFromTime(t) != result6 ) { 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( DateFromTime(t) != 1 ) { 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( (Day(t)) + date - 1 ); 6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeInMonth( month, leap ) { 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // september april june november 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // jan 0 feb 1 mar 2 apr 3 may 4 june 5 jul 6 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // aug 7 sep 8 oct 9 nov 10 dec 11 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 3 || month == 5 || month == 8 || month == 10 ) { 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( 30*msPerDay ); 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // all the rest 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( month == 0 || month == 2 || month == 4 || month == 6 || 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project month == 7 || month == 9 || month == 11 ) { 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( 31*msPerDay ); 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // save february 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( (leap == 0) ? 28*msPerDay : 29*msPerDay ); 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction MakeDate( day, time ) { 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( day == Number.POSITIVE_INFINITY || 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project day == Number.NEGATIVE_INFINITY || 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project day == Number.NaN ) { 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( time == Number.POSITIVE_INFINITY || 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project time == Number.POSITIVE_INFINITY || 6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project day == Number.NaN) { 6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Number.NaN; 6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( day * msPerDay ) + time; 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TimeClip( t ) { 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( isNaN( t ) ) { 6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( Number.NaN ); 6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( Math.abs( t ) > 8.64e15 ) { 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( Number.NaN ); 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( ToInteger( t ) ); 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction ToInteger( t ) { 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t = Number( t ); 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( isNaN( t ) ){ 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( Number.NaN ); 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( t == 0 || t == -0 || 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project t == Number.POSITIVE_INFINITY || t == Number.NEGATIVE_INFINITY ) { 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var sign = ( t < 0 ) ? -1 : 1; 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ( sign * Math.floor( Math.abs( t ) ) ); 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction Enumerate ( o ) { 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var p; 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( p in o ) { 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project print( p +": " + o[p] ); 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* these functions are useful for running tests manually in Rhino */ 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction GetContext() { 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Packages.com.netscape.javascript.Context.getCurrentContext(); 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction OptLevel( i ) { 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project i = Number(i); 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project var cx = GetContext(); 7108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project cx.setOptimizationLevel(i); 7118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* end of Rhino functions */ 713