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 Project
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar	GLOBAL = "[object global]";
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar PASSED = " PASSED!"
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FAILED = " FAILED! expected: ";
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction test() {
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( tc=0; tc < testcases.length; tc++ ) {
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        testcases[tc].passed = writeTestCaseResult(
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            testcases[tc].expect,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            testcases[tc].actual,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            testcases[tc].description +" = "+
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            testcases[tc].actual );
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    stopTest();
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ( testcases );
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* wrapper for test cas constructor that doesn't require the SECTION
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * argument.
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction AddTestCase( description, expect, actual ) {
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    testcases[tc++] = new TestCase( SECTION, description, expect, actual );
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TestCase( n, d, e, a ) {
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.name        = n;
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.description = d;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.expect      = e;
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.actual      = a;
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.passed      = true;
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.reason      = "";
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.passed = getTestCaseResult( this.expect, this.actual );
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction startTest() {
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //  JavaScript 1.3 is supposed to be compliant ecma version 1.0
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( VERSION == "ECMA_1" ) {
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        version ( 130 );
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( VERSION == "JS_1.3" ) {
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        version ( 130 );
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( VERSION == "JS_1.2" ) {
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        version ( 120 );
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( VERSION  == "JS_1.1" ) {
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        version ( 110 );
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // for ecma version 2.0, we will leave the javascript version to
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the default ( for now ).
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( BUGNUMBER ) {
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            writeLineToLog ("BUGNUMBER: " + BUGNUMBER );
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    testcases = new Array();
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    tc = 0;
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getTestCaseResult( expect, actual ) {
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //  because ( NaN == NaN ) always returns false, need to do
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //  a special compare to see if we got the right result.
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( actual != actual ) {
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ( typeof actual == "object" ) {
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                actual = "NaN object";
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                actual = "NaN number";
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( expect != expect ) {
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ( typeof expect == "object" ) {
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                expect = "NaN object";
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                expect = "NaN number";
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        var passed = ( expect == actual ) ? true : false;
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //  if both objects are numbers, give a little leeway for rounding.
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (    !passed
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                && typeof(actual) == "number"
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                && typeof(expect) == "number"
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ) {
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if ( Math.abs(actual-expect) < 0.0000001 ) {
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    passed = true;
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //  verify type is the same
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( typeof(expect) != typeof(actual) ) {
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            passed = false;
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return passed;
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Begin printing functions.  These functions use the shell's
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * print function.  When running tests in the browser, these
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * functions, override these functions with functions that use
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * document.write.
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeTestCaseResult( expect, actual, string ) {
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		var	passed = getTestCaseResult(	expect,	actual );
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		writeFormattedResult( expect, actual, string, passed );
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project		return passed;
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeFormattedResult( expect, actual, string, passed ) {
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        var s = string ;
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        s += ( passed ) ? PASSED : FAILED + expect;
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        writeLineToLog( s);
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return passed;
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeLineToLog( string	) {
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	print( string );
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeHeaderToLog( string )	{
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project	print( string );
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* end of print functions */
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction stopTest() {
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   var gc;
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   if ( gc != undefined ) {
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        gc();
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   }
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
139