1/* The contents of this file are subject to the Netscape Public
2 * License Version 1.1 (the "License"); you may not use this file
3 * except in compliance with the License. You may obtain a copy of
4 * the License at http://www.mozilla.org/NPL/
5 *
6 * Software distributed under the License is distributed on an "AS
7 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
8 * implied. See the License for the specific language governing
9 * rights and limitations under the License.
10 *
11 * The Original Code is Mozilla Communicator client code, released March
12 * 31, 1998.
13 *
14 * The Initial Developer of the Original Code is Netscape Communications
15 * Corporation. Portions created by Netscape are
16 * Copyright (C) 1998 Netscape Communications Corporation. All
17 * Rights Reserved.
18 *
19 * Contributor(s):
20 *
21 */
22var	completed =	false;
23var	testcases;
24var tc = 0;
25
26SECTION	= "";
27VERSION	= "";
28BUGNUMBER =	"";
29EXCLUDE = "";
30
31/*
32 * constant strings
33 */
34var	GLOBAL = "[object global]";
35var PASSED = " PASSED!"
36var FAILED = " FAILED! expected: ";
37
38var	DEBUG =	false;
39
40version("120");
41/*
42 * change this for date tests if you're not in PST
43 */
44
45TZ_DIFF	= -8;
46/* wrapper for test cas constructor that doesn't require the SECTION
47 * argument.
48 */
49
50function AddTestCase( description, expect, actual ) {
51    testcases[tc++] = new TestCase( SECTION, description, expect, actual );
52}
53function TestCase( n, d, e, a ) {
54    this.name        = n;
55    this.description = d;
56    this.expect      = e;
57    this.actual      = a;
58    this.passed      = true;
59    this.reason      = "";
60    this.bugnumber   = BUGNUMBER;
61
62    this.passed = getTestCaseResult( this.expect, this.actual );
63}
64function startTest() {
65    version(120);
66
67    // for ecma version 2.0, we will leave the javascript version to
68    // the default ( for now ).
69    // print out bugnumber
70
71    if ( BUGNUMBER ) {
72            writeLineToLog ("BUGNUMBER: " + BUGNUMBER );
73    }
74
75    testcases = new Array();
76    tc = 0;
77
78}
79function test() {
80    for ( tc=0; tc < testcases.length; tc++ ) {
81        testcases[tc].passed = writeTestCaseResult(
82                            testcases[tc].expect,
83                            testcases[tc].actual,
84                            testcases[tc].description +" = "+
85                            testcases[tc].actual );
86
87        testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
88    }
89    stopTest();
90    return ( testcases );
91}
92function getTestCaseResult( expect, actual ) {
93    //  because ( NaN == NaN ) always returns false, need to do
94    //  a special compare to see if we got the right result.
95        if ( actual != actual ) {
96            if ( typeof actual == "object" ) {
97                actual = "NaN object";
98            } else {
99                actual = "NaN number";
100            }
101        }
102        if ( expect != expect ) {
103            if ( typeof expect == "object" ) {
104                expect = "NaN object";
105            } else {
106                expect = "NaN number";
107            }
108        }
109
110        var passed = ( expect == actual ) ? true : false;
111
112    //  if both objects are numbers, give a little leeway for rounding.
113        if (    !passed
114                && typeof(actual) == "number"
115                && typeof(expect) == "number"
116            ) {
117                if ( Math.abs(actual-expect) < 0.0000001 ) {
118                    passed = true;
119                }
120        }
121
122    //  verify type is the same
123        if ( typeof(expect) != typeof(actual) ) {
124            passed = false;
125        }
126
127        return passed;
128}
129/*
130 * Begin printing functions.  These functions use the shell's
131 * print function.  When running tests in the browser, these
132 * functions, override these functions with functions that use
133 * document.write.
134 */
135
136function writeTestCaseResult( expect, actual, string ) {
137		var	passed = getTestCaseResult(	expect,	actual );
138		writeFormattedResult( expect, actual, string, passed );
139		return passed;
140}
141function writeFormattedResult( expect, actual, string, passed ) {
142        var s = string ;
143        s += ( passed ) ? PASSED : FAILED + expect;
144        writeLineToLog( s);
145        return passed;
146}
147function writeLineToLog( string	) {
148	print( string );
149}
150function writeHeaderToLog( string )	{
151	print( string );
152}
153/* end of print functions */
154
155
156function stopTest() {
157    var sizeTag  = "<#TEST CASES SIZE>";
158    var doneTag  = "<#TEST CASES DONE>";
159    var beginTag = "<#TEST CASE ";
160    var endTag   = ">";
161
162    print(sizeTag);
163    print(testcases.length);
164    for (tc = 0; tc < testcases.length; tc++)
165    {
166        print(beginTag + 'PASSED'      + endTag);
167        print(testcases[tc].passed);
168        print(beginTag + 'NAME'        + endTag);
169        print(testcases[tc].name);
170        print(beginTag + 'EXPECTED'    + endTag);
171        print(testcases[tc].expect);
172        print(beginTag + 'ACTUAL'      + endTag);
173        print(testcases[tc].actual);
174        print(beginTag + 'DESCRIPTION' + endTag);
175        print(testcases[tc].description);
176        print(beginTag + 'REASON'      + endTag);
177        print(( testcases[tc].passed ) ? "" : "wrong value ");
178        print(beginTag + 'BUGNUMBER'   + endTag);
179        print( BUGNUMBER );
180    }
181    print(doneTag);
182    gc();
183}
184
185function getFailedCases() {
186  for ( var i = 0; i < testcases.length; i++ ) {
187     if ( ! testcases[i].passed ) {
188        print( testcases[i].description +" = " +testcases[i].actual +" expected: "+ testcases[i].expect );
189     }
190  }
191}
192function err( msg, page, line ) {
193    testcases[tc].actual = "error";
194    testcases[tc].reason = msg;
195    writeTestCaseResult( testcases[tc].expect,
196                         testcases[tc].actual,
197                         testcases[tc].description +" = "+ testcases[tc].actual +
198                         ": " + testcases[tc].reason );
199    stopTest();
200    return true;
201}
202function Enumerate ( o ) {
203    var p;
204    for ( p in o ) {
205        print( p +": " + o[p] );
206    }
207}
208function GetContext() {
209    return Packages.com.netscape.javascript.Context.getCurrentContext();
210}
211function OptLevel( i ) {
212    i = Number(i);
213    var cx = GetContext();
214    cx.setOptimizationLevel(i);
215}
216