• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2* The contents of this file are subject to the Netscape Public
3* License Version 1.1 (the "License"); you may not use this file
4* except in compliance with the License. You may obtain a copy of
5* the License at http://www.mozilla.org/NPL/
6*
7* Software distributed under the License is distributed on an "AS
8* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
9* implied. See the License for the specific language governing
10* rights and limitations under the License.
11*
12* The Original Code is mozilla.org code.
13*
14* The Initial Developer of the Original Code is Netscape
15* Communications Corporation.  Portions created by Netscape are
16* Copyright (C) 1998 Netscape Communications Corporation. All
17* Rights Reserved.
18*
19* Contributor(s):
20*/
21
22
23/*
24 * JavaScript shared functions file for running the tests in either
25 * stand-alone JavaScript engine.  To run a test, first load this file,
26 * then load the test script.
27 */
28
29var completed = false;
30var testcases;
31var tc = 0;
32
33SECTION = "";
34VERSION = "";
35BUGNUMBER="";
36
37var TZ_DIFF = getTimeZoneDiff();
38
39var DEBUG = false;
40
41var	GLOBAL = "[object global]";
42var PASSED = " PASSED!"
43var FAILED = " FAILED! expected: ";
44
45function test() {
46    for ( tc=0; tc < testcases.length; tc++ ) {
47        testcases[tc].passed = writeTestCaseResult(
48                            testcases[tc].expect,
49                            testcases[tc].actual,
50                            testcases[tc].description +" = "+
51                            testcases[tc].actual );
52
53        testcases[tc].reason += ( testcases[tc].passed ) ? "" : "wrong value ";
54    }
55    stopTest();
56    return ( testcases );
57}
58
59function TestCase( n, d, e, a ) {
60    this.name        = n;
61    this.description = d;
62    this.expect      = e;
63    this.actual      = a;
64    this.passed      = true;
65    this.reason      = "";
66    this.bugnumber   = BUGNUMBER;
67
68    this.passed = getTestCaseResult( this.expect, this.actual );
69    if ( DEBUG ) {
70        writeLineToLog( "added " + this.description );
71    }
72}
73function startTest() {
74    if ( version ) {
75        //  JavaScript 1.3 is supposed to be compliant ecma version 1.0
76        if ( VERSION == "ECMA_1" ) {
77            version ( 130 );
78        }
79        if ( VERSION == "JS_13" ) {
80            version ( 130 );
81        }
82        if ( VERSION == "JS_12" ) {
83            version ( 120 );
84        }
85        if ( VERSION  == "JS_11" ) {
86            version ( 110 );
87        }
88    }
89
90
91    // for ecma version 2.0, we will leave the javascript version to
92    // the default ( for now ).
93
94    writeHeaderToLog( SECTION + " "+ TITLE);
95    if ( BUGNUMBER ) {
96        writeLineToLog ("BUGNUMBER: " + BUGNUMBER );
97    }
98
99    testcases = new Array();
100    tc = 0;
101}
102
103function getTestCaseResult( expect, actual ) {
104    //  because ( NaN == NaN ) always returns false, need to do
105    //  a special compare to see if we got the right result.
106        if ( actual != actual ) {
107            if ( typeof actual == "object" ) {
108                actual = "NaN object";
109            } else {
110                actual = "NaN number";
111            }
112        }
113        if ( expect != expect ) {
114            if ( typeof expect == "object" ) {
115                expect = "NaN object";
116            } else {
117                expect = "NaN number";
118            }
119        }
120
121        var passed = ( expect == actual ) ? true : false;
122
123    //  if both objects are numbers
124    // need to replace w/ IEEE standard for rounding
125        if (    !passed
126                && typeof(actual) == "number"
127                && typeof(expect) == "number"
128            ) {
129                if ( Math.abs(actual-expect) < 0.0000001 ) {
130                    passed = true;
131                }
132        }
133
134    //  verify type is the same
135        if ( typeof(expect) != typeof(actual) ) {
136            passed = false;
137        }
138
139        return passed;
140}
141
142function writeTestCaseResult( expect, actual, string ) {
143        var passed = getTestCaseResult( expect, actual );
144        writeFormattedResult( expect, actual, string, passed );
145        return passed;
146}
147
148function writeFormattedResult( expect, actual, string, passed ) {
149        var s = string ;
150        s += ( passed ) ? PASSED : FAILED + expect;
151        writeLineToLog( s);
152        return passed;
153}
154
155function writeLineToLog( string ) {
156    print( string  );
157}
158function writeHeaderToLog( string ) {
159    print( string );
160}
161function stopTest() {
162    var gc;
163    if ( gc != undefined ) {
164        gc();
165    }
166}
167function getFailedCases() {
168  for ( var i = 0; i < testcases.length; i++ ) {
169     if ( ! testcases[i].passed ) {
170        print( testcases[i].description +" = " +testcases[i].actual +" expected: "+ testcases[i].expect );
171     }
172  }
173}
174function err( msg, page, line ) {
175    writeLineToLog( page + " failed with error: " + msg + " on line " + line );
176    testcases[tc].actual = "error";
177    testcases[tc].reason = msg;
178    writeTestCaseResult( testcases[tc].expect,
179                         testcases[tc].actual,
180                         testcases[tc].description +" = "+ testcases[tc].actual +
181                         ": " + testcases[tc].reason );
182    stopTest();
183    return true;
184}
185
186function Enumerate ( o ) {
187    var properties = new Array();
188    for ( p in o ) {
189       properties[ properties.length ] = new Array( p, o[p] );
190    }
191    return properties;
192}
193
194function getFailedCases() {
195  for (	var	i =	0; i < testcases.length; i++ ) {
196	 if	( !	testcases[i].passed	) {
197		writeLineToLog( testcases[i].description	+" = " +testcases[i].actual	+
198		    " expected: "+	testcases[i].expect	);
199	 }
200  }
201}
202function AddTestCase( description, expect, actual ) {
203    testcases[tc++] = new TestCase( SECTION, description, expect, actual );
204}
205
206
207/*
208 * Originally, the test suite used a hard-coded value TZ_DIFF = -8.
209 * But that was only valid for testers in the Pacific Standard Time Zone!
210 * We calculate the proper number dynamically for any tester. We just
211 * have to be careful to use a date not subject to Daylight Savings Time...
212*/
213function getTimeZoneDiff()
214{
215  return -((new Date(2000, 1, 1)).getTimezoneOffset())/60;
216}
217