Mercurial > repos > saskia-hiltemann > ireport
comparison DataTables-1.9.4/media/unit_testing/unit_test.js @ 0:ac5f9272033b draft
first upload
author | saskia-hiltemann |
---|---|
date | Tue, 01 Jul 2014 11:42:23 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:ac5f9272033b |
---|---|
1 /* | |
2 * File: unit_test.js | |
3 * Version: 0.0.1 | |
4 * CVS: $Id$ | |
5 * Description: Unit test framework | |
6 * Author: Allan Jardine (www.sprymedia.co.uk) | |
7 * Created: Sun Mar 8 22:02:49 GMT 2009 | |
8 * Modified: $Date$ by $Author$ | |
9 * Language: Javascript | |
10 * License: GPL v2 or BSD 3 point style | |
11 * Project: DataTables | |
12 * Contact: allan.jardine@sprymedia.co.uk | |
13 * | |
14 * Copyright 2009 Allan Jardine, all rights reserved. | |
15 * | |
16 * Description: | |
17 * This is a javascript library suitable for use as a unit testing framework. Employing a queuing | |
18 * mechanisim to take account of async events in javascript, this library will communicates with | |
19 * a controller frame (to report individual test status). | |
20 * | |
21 */ | |
22 | |
23 | |
24 var oTest = { | |
25 /* Block further tests from occuring - might be end of tests or due to async wait */ | |
26 bBlock: false, | |
27 | |
28 /* Number of times to try retesting for a blocking test */ | |
29 iReTestLimit: 20, | |
30 | |
31 /* Amount of time to wait between trying for an async test */ | |
32 iReTestDelay: 150, | |
33 | |
34 /* End tests - external control */ | |
35 bEnd: false, | |
36 | |
37 /* Internal variables */ | |
38 _aoQueue: [], | |
39 _iReTest: 0, | |
40 _bFinished: false, | |
41 | |
42 | |
43 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | |
44 * Recommened public functions | |
45 */ | |
46 | |
47 /* | |
48 * Function: fnTest | |
49 * Purpose: Add a test to the queue | |
50 * Returns: - | |
51 * Inputs: string:sMessage - name of the test | |
52 * function:fnTest - function which will be evaludated to get the test result | |
53 */ | |
54 "fnTest": function ( sMessage, fnSetup, fnTest ) | |
55 { | |
56 this._aoQueue.push( { | |
57 "sMessage": sMessage, | |
58 "fnSetup": fnSetup, | |
59 "fnTest": fnTest, | |
60 "bPoll": false | |
61 } ); | |
62 this._fnNext(); | |
63 }, | |
64 | |
65 /* | |
66 * Function: fnWaitTest | |
67 * Purpose: Add a test to the queue which has a re-test cycle | |
68 * Returns: - | |
69 * Inputs: string:sMessage - name of the test | |
70 * function:fnTest - function which will be evaludated to get the test result | |
71 */ | |
72 "fnWaitTest": function ( sMessage, fnSetup, fnTest ) | |
73 { | |
74 this._aoQueue.push( { | |
75 "sMessage": sMessage, | |
76 "fnSetup": fnSetup, | |
77 "fnTest": fnTest, | |
78 "bPoll": true | |
79 } ); | |
80 this._fnNext(); | |
81 }, | |
82 | |
83 /* | |
84 * Function: fnStart | |
85 * Purpose: Indicate that this is a new unit and what it is testing (message to end user) | |
86 * Returns: - | |
87 * Inputs: string:sMessage - message to give to the user about this unit | |
88 */ | |
89 "fnStart": function ( sMessage ) | |
90 { | |
91 window.parent.controller.fnStartMessage( sMessage ); | |
92 }, | |
93 | |
94 /* | |
95 * Function: fnComplete | |
96 * Purpose: Tell the controller that we are all done here | |
97 * Returns: - | |
98 * Inputs: - | |
99 */ | |
100 "fnComplete": function () | |
101 { | |
102 this._bFinished = true; | |
103 this._fnNext(); | |
104 }, | |
105 | |
106 /* | |
107 * Function: fnCookieDestroy | |
108 * Purpose: Destroy a cookie of a given name | |
109 * Returns: - | |
110 * Inputs: - | |
111 */ | |
112 "fnCookieDestroy": function ( oTable ) | |
113 { | |
114 var sName = oTable.fnSettings().sCookiePrefix+oTable.fnSettings().sInstance; | |
115 var aParts = window.location.pathname.split('/'); | |
116 var sNameFile = sName + '_' + aParts.pop().replace(/[\/:]/g,"").toLowerCase(); | |
117 document.cookie = sNameFile+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+ | |
118 aParts.join('/') + "/"; | |
119 }, | |
120 | |
121 | |
122 | |
123 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | |
124 * Internal functions | |
125 */ | |
126 | |
127 | |
128 "_fnReTest": function ( oTestInfo ) | |
129 { | |
130 var bResult = oTestInfo.fnTest( ); | |
131 if ( bResult ) | |
132 { | |
133 /* Test passed on retry */ | |
134 this._fnResult( true ); | |
135 this._fnNext(); | |
136 } | |
137 else | |
138 { | |
139 if ( this._iReTest < this.iReTestLimit ) | |
140 { | |
141 this._iReTest++; | |
142 setTimeout( function() { | |
143 oTest._fnReTest( oTestInfo ); | |
144 }, this.iReTestDelay ); | |
145 } | |
146 else | |
147 { | |
148 this._fnResult( false ); | |
149 } | |
150 } | |
151 }, | |
152 | |
153 "_fnNext": function () | |
154 { | |
155 if ( this.bEnd ) | |
156 { | |
157 return; | |
158 } | |
159 | |
160 if ( !this.bBlock && this._aoQueue.length > 0 ) | |
161 { | |
162 var oNextTest = this._aoQueue.shift(); | |
163 window.parent.controller.fnTestStart( oNextTest.sMessage ); | |
164 this.bBlock = true; | |
165 | |
166 if ( typeof oNextTest.fnSetup == 'function' ) | |
167 { | |
168 oNextTest.fnSetup( ); | |
169 } | |
170 var bResult = oNextTest.fnTest( ); | |
171 //bResult = false; | |
172 | |
173 if ( oNextTest.bPoll ) | |
174 { | |
175 if ( bResult ) | |
176 { | |
177 this._fnResult( true ); | |
178 this._fnNext(); | |
179 } | |
180 else | |
181 { | |
182 _iReTest = 0; | |
183 setTimeout( function() { | |
184 oTest._fnReTest( oNextTest ); | |
185 }, this.iReTestDelay ); | |
186 } | |
187 } | |
188 else | |
189 { | |
190 this._fnResult( bResult ); | |
191 this._fnNext(); | |
192 } | |
193 } | |
194 else if ( !this.bBlock && this._aoQueue.length == 0 && this._bFinished ) | |
195 { | |
196 window.parent.controller.fnUnitComplete( ); | |
197 } | |
198 }, | |
199 | |
200 "_fnResult": function ( b ) | |
201 { | |
202 window.parent.controller.fnTestResult( b ); | |
203 this.bBlock = false; | |
204 if ( !b ) | |
205 { | |
206 this.bEnd = true; | |
207 } | |
208 } | |
209 }; | |
210 | |
211 | |
212 var oDispacher = { | |
213 "click": function ( nNode, oSpecial ) | |
214 { | |
215 var evt = this.fnCreateEvent( 'click', nNode, oSpecial ); | |
216 if ( nNode.dispatchEvent ) | |
217 nNode.dispatchEvent(evt); | |
218 else | |
219 nNode.fireEvent('onclick', evt); | |
220 }, | |
221 | |
222 "change": function ( nNode ) | |
223 { | |
224 var evt = this.fnCreateEvent( 'change', nNode ); | |
225 if ( nNode.dispatchEvent ) | |
226 nNode.dispatchEvent(evt); | |
227 else | |
228 nNode.fireEvent('onchange', evt); | |
229 }, | |
230 | |
231 | |
232 /* | |
233 * Function: fnCreateEvent | |
234 * Purpose: Create an event oject based on the type to trigger an event - x-platform | |
235 * Returns: event:evt | |
236 * Inputs: string:sType - type of event | |
237 * node:nTarget - target node of the event | |
238 */ | |
239 fnCreateEvent: function( sType, nTarget, oSpecial ) | |
240 { | |
241 var evt = null; | |
242 var oTargetPos = this._fnGetPos( nTarget ); | |
243 var sTypeGroup = this._fnEventTypeGroup( sType ); | |
244 if ( typeof oSpecial == 'undefined' ) | |
245 { | |
246 oSpecial = {}; | |
247 } | |
248 | |
249 var ctrlKey = false; | |
250 var altKey = false; | |
251 var shiftKey = (typeof oSpecial.shift != 'undefined') ? oSpecial.shift : false; | |
252 var metaKey = false; | |
253 var button = false; | |
254 | |
255 if ( document.createEvent ) | |
256 { | |
257 switch ( sTypeGroup ) | |
258 { | |
259 case 'mouse': | |
260 evt = document.createEvent( "MouseEvents" ); | |
261 evt.initMouseEvent( sType, true, true, window, 0, oTargetPos[0], oTargetPos[1], | |
262 oTargetPos[0], oTargetPos[1], ctrlKey, altKey, shiftKey, | |
263 metaKey, button, null ); | |
264 break; | |
265 | |
266 case 'html': | |
267 evt = document.createEvent( "HTMLEvents" ); | |
268 evt.initEvent( sType, true, true ); | |
269 break; | |
270 | |
271 case 'ui': | |
272 evt = document.createEvent( "UIEvents" ); | |
273 evt.initUIEvent( sType, true, true, window, 0 ); | |
274 break; | |
275 | |
276 default: | |
277 break; | |
278 } | |
279 } | |
280 else if ( document.createEventObject ) | |
281 { | |
282 switch ( sTypeGroup ) | |
283 { | |
284 case 'mouse': | |
285 evt = document.createEventObject(); | |
286 evt.screenX = oTargetPos[0]; | |
287 evt.screenX = oTargetPos[1]; | |
288 evt.clientX = oTargetPos[0]; | |
289 evt.clientY = oTargetPos[1]; | |
290 evt.ctrlKey = ctrlKey; | |
291 evt.altKey = altKey; | |
292 evt.shiftKey = shiftKey; | |
293 evt.metaKey = metaKey; | |
294 evt.button = button; | |
295 evt.relatedTarget = null; | |
296 break; | |
297 | |
298 case 'html': | |
299 /* fall through to basic event object */ | |
300 | |
301 case 'ui': | |
302 evt = document.createEventObject(); | |
303 break; | |
304 | |
305 default: | |
306 break; | |
307 } | |
308 } | |
309 | |
310 return evt; | |
311 }, | |
312 | |
313 /* | |
314 * Function: DesignCore.fnGetPos | |
315 * Purpose: Get the position of an element on the page | |
316 * Returns: array[ 0-int:left, 1-int:top ] | |
317 * Inputs: node:obj - node to analyse | |
318 */ | |
319 _fnGetPos: function ( obj ) | |
320 { | |
321 var curleft = 0; | |
322 var curtop = 0; | |
323 | |
324 if (obj.offsetParent) | |
325 { | |
326 curleft = obj.offsetLeft; | |
327 curtop = obj.offsetTop; | |
328 while (obj = obj.offsetParent ) | |
329 { | |
330 curleft += obj.offsetLeft; | |
331 curtop += obj.offsetTop; | |
332 } | |
333 } | |
334 return [curleft,curtop]; | |
335 }, | |
336 | |
337 | |
338 /* | |
339 * Function: _fnEventTypeGroup | |
340 * Purpose: Group the event types as per w3c groupings | |
341 * Returns: - | |
342 * Inputs: string:sType | |
343 */ | |
344 _fnEventTypeGroup: function ( sType ) | |
345 { | |
346 switch ( sType ) | |
347 { | |
348 case 'click': | |
349 case 'dblclick': | |
350 case 'mousedown': | |
351 case 'mousemove': | |
352 case 'mouseout': | |
353 case 'mouseover': | |
354 case 'mouseup': | |
355 return 'mouse'; | |
356 | |
357 case 'change': | |
358 case 'focus': | |
359 case 'blur': | |
360 case 'select': | |
361 case 'submit': | |
362 return 'html'; | |
363 | |
364 case 'keydown': | |
365 case 'keypress': | |
366 case 'keyup': | |
367 case 'load': | |
368 case 'unload': | |
369 return 'ui'; | |
370 | |
371 default: | |
372 return 'custom'; | |
373 } | |
374 } | |
375 } | |
376 | |
377 | |
378 var oSession = { | |
379 nTable: null, | |
380 | |
381 fnCache: function () | |
382 { | |
383 this.nTable = document.getElementById('demo').cloneNode(true); | |
384 }, | |
385 | |
386 fnRestore: function () | |
387 { | |
388 while( $.fn.dataTableSettings.length > 0 ) | |
389 { | |
390 try { | |
391 $.fn.dataTableSettings[0].oInstance.fnDestroy(); | |
392 } catch (e) { | |
393 $.fn.dataTableSettings.splice( 0, 1 ); | |
394 } | |
395 } | |
396 //$.fn.dataTableSettings.splice( 0, $.fn.dataTableSettings.length ); | |
397 var nDemo = document.getElementById('demo'); | |
398 nDemo.innerHTML = ""; | |
399 for ( var i=0, iLen=this.nTable.childNodes.length ; i<iLen ; i++ ) | |
400 { | |
401 nDemo.appendChild( this.nTable.childNodes[0] ); | |
402 } | |
403 this.fnCache(); | |
404 } | |
405 } | |
406 | |
407 $(document).ready( function () { | |
408 oSession.fnCache(); | |
409 } ); |