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 } );