]>
Commit | Line | Data |
---|---|---|
b37bf2e1 A |
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 | ||
29 | var completed = false; | |
30 | var testcases; | |
31 | var tc = 0; | |
32 | ||
33 | SECTION = ""; | |
34 | VERSION = ""; | |
35 | BUGNUMBER=""; | |
36 | ||
37 | var TZ_DIFF = getTimeZoneDiff(); | |
38 | ||
39 | var DEBUG = false; | |
40 | ||
41 | var GLOBAL = "[object global]"; | |
42 | var PASSED = " PASSED!" | |
43 | var FAILED = " FAILED! expected: "; | |
44 | ||
45 | function 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 | ||
59 | function 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 | } | |
73 | function 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 | ||
103 | function 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 | ||
142 | function writeTestCaseResult( expect, actual, string ) { | |
143 | var passed = getTestCaseResult( expect, actual ); | |
144 | writeFormattedResult( expect, actual, string, passed ); | |
145 | return passed; | |
146 | } | |
147 | ||
148 | function writeFormattedResult( expect, actual, string, passed ) { | |
149 | var s = string ; | |
150 | s += ( passed ) ? PASSED : FAILED + expect; | |
151 | writeLineToLog( s); | |
152 | return passed; | |
153 | } | |
154 | ||
155 | function writeLineToLog( string ) { | |
156 | print( string ); | |
157 | } | |
158 | function writeHeaderToLog( string ) { | |
159 | print( string ); | |
160 | } | |
161 | function stopTest() { | |
162 | var gc; | |
163 | if ( gc != undefined ) { | |
164 | gc(); | |
165 | } | |
166 | } | |
167 | function 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 | } | |
174 | function 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 | ||
186 | function 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 | ||
194 | function 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 | } | |
202 | function 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 | */ | |
213 | function getTimeZoneDiff() | |
214 | { | |
215 | return -((new Date(2000, 1, 1)).getTimezoneOffset())/60; | |
216 | } |