Added .hasClass() (Simply just passes through to .is()).
[jquery.git] / build / runtest / testrunner.js
1 function test(name, fn){
2         expected = -1;
3         numTests = 0;
4         reset();
5         
6         fn();
7         
8         if ( expected != -1 && expected != numTests )
9                 log( false, "Wrong number of tests run. " + numTests + " ran, expected " + expected );
10 }
11
12 var orig = document.getElementById('main').innerHTML;
13
14 /**
15  * Resets the test setup. Useful for tests that modify the DOM.
16  */
17 function reset() {
18         document.getElementById('main').innerHTML = orig;
19 }
20
21 var currentModule = "";
22
23 // call on start of module test to prepend name to all tests
24 function module(moduleName) {
25         currentModule = moduleName;
26 }
27
28 var expected = -1;
29
30 /**
31  * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.
32  */
33 function expect(asserts) {
34         expected = asserts;
35 }
36
37 /**
38  * Asserts true.
39  * @example ok( $("a").size() > 5, "There must be at least 5 anchors" );
40  */
41 function ok(a, msg) {
42         log( !!a, msg );
43 }
44
45 /**
46  * Asserts that two arrays are the same
47  */
48 function isSet(a, b, msg) {
49         var ret = true;
50         if ( a && b && a.length != undefined && a.length == b.length ) {
51                 for ( var i = 0; i < a.length; i++ ) {
52                         if ( a[i] != b[i] )
53                                 ret = false;
54                 }
55         } else
56                 ret = false;
57         if ( !ret )
58                 log( ret, msg + " expected: " + serialArray(b) + " result: " + serialArray(a) );
59         else 
60                 log( ret, msg );
61 }
62
63 /**
64  * Asserts that two objects are equivalent
65  */
66 function isObj(a, b, msg) {
67         var ret = true;
68         
69         if ( a && b ) {
70                 for ( var i in a )
71                         if ( a[i] != b[i] )
72                                 ret = false;
73
74                 for ( i in b )
75                         if ( a[i] != b[i] )
76                                 ret = false;
77         } else
78                 ret = false;
79
80     log( ret, msg );
81 }
82
83 function serialArray( a ) {
84         var r = [];
85         
86         if ( a && a.length )
87         for ( var i = 0; i < a.length; i++ ) {
88             var str = a[i] ? a[i].nodeName : "";
89             if ( str ) {
90                 str = str.toLowerCase();
91                 if ( a[i].id )
92                     str += "#" + a[i].id;
93             } else
94                 str = a[i];
95             r.push( str );
96         }
97
98         return "[ " + r.join(", ") + " ]"
99 }
100
101 /**
102  * Returns an array of elements with the given IDs, eg.
103  * @example q("main", "foo", "bar")
104  * @result [<div id="main">, <span id="foo">, <input id="bar">]
105  */
106 function q() {
107         var r = [];
108         for ( var i = 0; i < arguments.length; i++ )
109                 r.push( document.getElementById( arguments[i] ) );
110         return r;
111 }
112
113 /**
114  * Asserts that a select matches the given IDs
115  * @example t("Check for something", "//[a]", ["foo", "baar"]);
116  * @result returns true if "//[a]" return two elements with the IDs 'foo' and 'baar'
117  */
118 function t(a,b,c) {
119         var f = jQuery(b);
120         var s = "";
121         for ( var i = 0; i < f.length; i++ )
122                 s += (s && ",") + '"' + f[i].id + '"';
123         isSet(f, q.apply(q,c), a + " (" + b + ")");
124 }
125
126 /**
127  * Checks that the first two arguments are equal, with an optional message.
128  * Prints out both expected and actual values on failure.
129  *
130  * Prefered to ok( expected == actual, message )
131  *
132  * @example equals( "Expected 2 characters.", v.formatMessage("Expected {0} characters.", 2) );
133  *
134  * @param Object expected
135  * @param Object actual
136  * @param String message (optional)
137  */
138 function equals(expected, actual, message) {
139         var result = expected == actual;
140         message = message || (result ? "okay" : "failed");
141         log( result, result ? message + ": " + expected : message + " expected: " + expected + " actual: " + actual );
142 }
143
144 var numTests = 0, total = 0, pass = 0, fail = 0;
145
146 function log(state, msg){
147         print( (state ? "PASS" : "FAIL") + " (" + (++total) + ") " +
148                 (currentModule ? "[" + currentModule + "] " : "") + msg );
149                 
150         numTests++;
151
152         if ( state )
153                 pass++;
154         else
155                 fail++;
156 }
157
158 function results(){
159         print( pass + " Passed, " + fail + " Failed" );
160 }
161
162 function start(){}
163 function stop(){}
164
165 /**
166  * Trigger an event on an element.
167  *
168  * @example triggerEvent( document.body, "click" );
169  *
170  * @param DOMElement elem
171  * @param String type
172  */
173 function triggerEvent( elem, type, event ) {
174 /*
175         if ( jQuery.browser.mozilla || jQuery.browser.opera ) {
176                 event = document.createEvent("MouseEvents");
177                 event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
178                         0, 0, 0, 0, 0, false, false, false, false, 0, null);
179                 elem.dispatchEvent( event );
180         } else if ( jQuery.browser.msie ) {
181                 elem.fireEvent("on"+type);
182         }
183 */
184 }
185
186 /**
187  * Add random number to url to stop IE from caching
188  *
189  * @example url("data/test.html")
190  * @result "data/test.html?10538358428943"
191  *
192  * @example url("data/test.php?foo=bar")
193  * @result "data/test.php?foo=bar&10538358345554"
194  */
195 function url(value) {
196         return value + (/\?/.test(value) ? "&" : "?") + new Date().getTime() + "" + parseInt(Math.random()*100000);
197 }