18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar completed = false;
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar testcases;
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar BUGNUMBER="";
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar EXCLUDE = "";
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TT = "";
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar TT_ = "";
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar BR = "";
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar NBSP = " ";
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar CR = "\n";
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FONT = "";
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FONT_ = "";
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FONT_RED = "";
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FONT_GREEN = "";
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar B = "";
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar B_ = ""
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar H2 = "";
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar H2_ = "";
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar HR = "";
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar PASSED = " PASSED!"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar FAILED = " FAILED! expected: ";
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectversion( 140 );
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction test() {
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for ( tc=0; tc < testcases.length; tc++ ) {
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        testcases[tc].passed = writeTestCaseResult(
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            testcases[tc].expect,
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            testcases[tc].actual,
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            testcases[tc].description +" = "+
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                            testcases[tc].actual );
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    stopTest();
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return ( testcases );
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction TestCase( n, d, e, a ) {
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.name        = n;
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.description = d;
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.expect      = e;
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.actual      = a;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.passed      = true;
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.reason      = "";
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.bugnumber   = BUGNUMBER;
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    this.passed = getTestCaseResult( this.expect, this.actual );
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction startTest() {
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //  JavaScript 1.3 is supposed to be compliant ecma version 1.0
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( VERSION == "ECMA_1" ) {
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        version ( "130" );
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( VERSION == "JS_1.3" ) {
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        version ( "130" );
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( VERSION == "JS_1.2" ) {
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        version ( "120" );
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ( VERSION  == "JS_1.1" ) {
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        version ( "110" );
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // for ecma version 2.0, we will leave the javascript version to
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the default ( for now ).
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getTestCaseResult( expect, actual ) {
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //  because ( NaN == NaN ) always returns false, need to do
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //  a special compare to see if we got the right result.
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( actual != actual ) {
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ( typeof actual == "object" ) {
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                actual = "NaN object";
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                actual = "NaN number";
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( expect != expect ) {
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ( typeof expect == "object" ) {
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                expect = "NaN object";
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else {
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                expect = "NaN number";
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        var passed = ( expect == actual ) ? true : false;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //  if both objects are numbers, give a little leeway for rounding.
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (    !passed
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                && typeof(actual) == "number"
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                && typeof(expect) == "number"
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ) {
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if ( Math.abs(actual-expect) < 0.0000001 ) {
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    passed = true;
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //  verify type is the same
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ( typeof(expect) != typeof(actual) ) {
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            passed = false;
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return passed;
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeTestCaseResult( expect, actual, string ) {
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        var passed = getTestCaseResult( expect, actual );
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        writeFormattedResult( expect, actual, string, passed );
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return passed;
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeFormattedResult( expect, actual, string, passed ) {
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        var s = TT + string ;
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for ( k = 0;
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project              k <  (60 - string.length >= 0 ? 60 - string.length : 5) ;
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project              k++ ) {
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//              s += NBSP;
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        s += B ;
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        s += ( passed ) ? FONT_GREEN + NBSP + PASSED : FONT_RED + NBSP + FAILED + expect + TT_ ;
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        writeLineToLog( s + FONT_ + B_ + TT_ );
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return passed;
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeLineToLog( string ) {
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print( string + BR + CR );
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction writeHeaderToLog( string ) {
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print( H2 + string + H2_ );
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction stopTest() {
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    var sizeTag  = "<#TEST CASES SIZE>";
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    var doneTag  = "<#TEST CASES DONE>";
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    var beginTag = "<#TEST CASE ";
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    var endTag   = ">";
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print(sizeTag);
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print(testcases.length);
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (tc = 0; tc < testcases.length; tc++)
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(beginTag + 'PASSED'      + endTag);
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(testcases[tc].passed);
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(beginTag + 'NAME'        + endTag);
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(testcases[tc].name);
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(beginTag + 'EXPECTED'    + endTag);
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(testcases[tc].expect);
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(beginTag + 'ACTUAL'      + endTag);
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(testcases[tc].actual);
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(beginTag + 'DESCRIPTION' + endTag);
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(testcases[tc].description);
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(beginTag + 'REASON'      + endTag);
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(( testcases[tc].passed ) ? "" : "wrong value ");
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print(beginTag + 'BUGNUMBER'   + endTag);
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print( BUGNUMBER );
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    print(doneTag);
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    gc();
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction getFailedCases() {
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  for ( var i = 0; i < testcases.length; i++ ) {
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     if ( ! testcases[i].passed ) {
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        print( testcases[i].description +" = " +testcases[i].actual +" expected: "+ testcases[i].expect );
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     }
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project  }
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
170