Вход Регистрация
Файл: datatables/media/unit_testing/unit_test.js
Строк: 389
<?php
/*
 * File:        unit_test.js
 * Version:     0.0.1
 * CVS:         $Id$
 * Description: Unit test framework
 * Author:      Allan Jardine (www.sprymedia.co.uk)
 * Created:     Sun Mar  8 22:02:49 GMT 2009
 * Modified:    $Date$ by $Author$
 * Language:    Javascript
 * License:     GPL v2 or BSD 3 point style
 * Project:     DataTables
 * Contact:     allan.jardine@sprymedia.co.uk
 * 
 * Copyright 2009 Allan Jardine, all rights reserved.
 *
 * Description:
 * This is a javascript library suitable for use as a unit testing framework. Employing a queuing
 * mechanisim to take account of async events in javascript, this library will communicates with
 * a controller frame (to report individual test status).
 * 
 */


var oTest = {
    
/* Block further tests from occuring - might be end of tests or due to async wait */
    
bBlockfalse,
    
    
/* Number of times to try retesting for a blocking test */
    
iReTestLimit20,
    
    
/* Amount of time to wait between trying for an async test */
    
iReTestDelay150,
    
    
/* End tests - external control */
    
bEndfalse,
    
    
/* Internal variables */
    
_aoQueue: [],
    
_iReTest0,
    
_bFinishedfalse,
    
    
    
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     * Recommened public functions
     */
    
    /*
     * Function: fnTest
     * Purpose:  Add a test to the queue
     * Returns:  -
     * Inputs:   string:sMessage - name of the test
     *           function:fnTest - function which will be evaludated to get the test result
     */
    
"fnTest": function ( sMessagefnSetupfnTest )
    {
        
this._aoQueue.push( {
            
"sMessage"sMessage,
            
"fnSetup"fnSetup,
            
"fnTest"fnTest,
            
"bPoll"false
        
} );
        
this._fnNext();
    },
    
    
/*
     * Function: fnWaitTest
     * Purpose:  Add a test to the queue which has a re-test cycle
     * Returns:  -
     * Inputs:   string:sMessage - name of the test
     *           function:fnTest - function which will be evaludated to get the test result
     */
    
"fnWaitTest": function ( sMessagefnSetupfnTest )
    {
        
this._aoQueue.push( {
            
"sMessage"sMessage,
            
"fnSetup"fnSetup,
            
"fnTest"fnTest,
            
"bPoll"true
        
} );
        
this._fnNext();
    },
    
    
/*
     * Function: fnStart
     * Purpose:  Indicate that this is a new unit and what it is testing (message to end user)
     * Returns:  -
     * Inputs:   string:sMessage - message to give to the user about this unit
     */
    
"fnStart": function ( sMessage )
    {
        
window.parent.controller.fnStartMessagesMessage );
    },
    
    
/*
     * Function: fnComplete
     * Purpose:  Tell the controller that we are all done here
     * Returns:  -
     * Inputs:   -
     */
    
"fnComplete": function ()
    {
        
this._bFinished true;
        
this._fnNext();
    },
    
    
/*
     * Function: fnCookieDestroy
     * Purpose:  Destroy a cookie of a given name
     * Returns:  -
     * Inputs:   -
     */
    
"fnCookieDestroy": function ( oTable )
    {
        var 
sName oTable.fnSettings().sCookiePrefix+oTable.fnSettings().sInstance;
        var 
aParts window.location.pathname.split('/');
        var 
sNameFile sName '_' aParts.pop().replace(/[/:]/g,"").toLowerCase();
        
document.cookie sNameFile+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+
            
aParts.join('/') + "/";
    },
    
    
    
    
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     * Internal functions
     */
    
    
    
"_fnReTest": function ( oTestInfo )
    {
        var 
bResult oTestInfo.fnTest( );
        if ( 
bResult )
        {
            
/* Test passed on retry */
            
this._fnResulttrue );
            
this._fnNext();
        }
        else
        {
            if ( 
this._iReTest this.iReTestLimit )
            {
                
this._iReTest++;
                
setTimeout( function() {
                    
oTest._fnReTestoTestInfo );
                }, 
this.iReTestDelay );
            }
            else
            {
                
this._fnResultfalse );
            }
        }
    },
    
    
"_fnNext": function ()
    {
        if ( 
this.bEnd )
        {
            return;
        }
        
        if ( !
this.bBlock && this._aoQueue.length )
        {
            var 
oNextTest this._aoQueue.shift();
            
window.parent.controller.fnTestStartoNextTest.sMessage );
            
this.bBlock true;
            
            if ( 
typeof oNextTest.fnSetup == 'function' )
            {
                
oNextTest.fnSetup( );
            }
            var 
bResult oNextTest.fnTest( );
            
//bResult = false;
            
            
if ( oNextTest.bPoll )
            {
                if ( 
bResult )
                {
                    
this._fnResulttrue );
                    
this._fnNext();
                }
                else
                {
                    
_iReTest 0;
                    
setTimeout( function() {
                        
oTest._fnReTestoNextTest );
                    }, 
this.iReTestDelay );
                }
            }
            else
            {
                
this._fnResultbResult );
                
this._fnNext();
            }
        }
        else if ( !
this.bBlock && this._aoQueue.length == && this._bFinished )
        {
            
window.parent.controller.fnUnitComplete( );
        }
    },
    
    
"_fnResult": function ( )
    {
        
window.parent.controller.fnTestResult);
        
this.bBlock false;
        if ( !
)
        {
            
this.bEnd true;
        }
    }
};


var 
oDispacher = {
    
"click": function ( nNodeoSpecial )
    {
        var 
evt this.fnCreateEvent'click'nNodeoSpecial );
        if ( 
nNode.dispatchEvent )
            
nNode.dispatchEvent(evt);
        else
            
nNode.fireEvent('onclick'evt);
    },
    
    
"change": function ( nNode )
    {
        var 
evt this.fnCreateEvent'change'nNode );
        if ( 
nNode.dispatchEvent )
        
nNode.dispatchEvent(evt);
        else
            
nNode.fireEvent('onchange'evt);
    },
    
    
    
/*
     * Function: fnCreateEvent
     * Purpose:  Create an event oject based on the type to trigger an event - x-platform
     * Returns:  event:evt
     * Inputs:   string:sType - type of event
     *           node:nTarget - target node of the event
     */
    
fnCreateEvent: function( sTypenTargetoSpecial )
    {
        var 
evt null;
        var 
oTargetPos this._fnGetPosnTarget );
        var 
sTypeGroup this._fnEventTypeGroupsType );
        if ( 
typeof oSpecial == 'undefined' )
        {
            
oSpecial = {};
        }
        
        var 
ctrlKey false;
        var 
altKey false;
        var 
shiftKey = (typeof oSpecial.shift != 'undefined') ? oSpecial.shift false;
        var 
metaKey false;
        var 
button false;
        
        if ( 
document.createEvent )
        {
            switch ( 
sTypeGroup )
            {
                case 
'mouse':
                    
evt document.createEvent"MouseEvents" );
                    
evt.initMouseEventsTypetruetruewindow0oTargetPos[0], oTargetPos[1], 
                        
oTargetPos[0], oTargetPos[1], ctrlKeyaltKeyshiftKey
                        
metaKeybuttonnull );
                    break;
                
                case 
'html':
                    
evt document.createEvent"HTMLEvents" );
                    
evt.initEventsTypetruetrue );
                    break;
                    
                case 
'ui':
                    
evt document.createEvent"UIEvents" );
                    
evt.initUIEventsTypetruetruewindow);
                    break;
                
                default:
                    break;
            }
        }
        else if ( 
document.createEventObject )
        {
            switch ( 
sTypeGroup )
            {
                case 
'mouse':
                    
evt document.createEventObject();
                    
evt.screenX oTargetPos[0];
                    
evt.screenX oTargetPos[1];
                    
evt.clientX oTargetPos[0];
                    
evt.clientY oTargetPos[1];
                    
evt.ctrlKey ctrlKey;
                    
evt.altKey altKey;
                    
evt.shiftKey shiftKey;
                    
evt.metaKey metaKey;
                    
evt.button button;
                    
evt.relatedTarget null;
                    break;
                
                case 
'html':
                    
/* fall through to basic event object */
                    
                
case 'ui':
                    
evt document.createEventObject();
                    break;
                
                default:
                    break;
            }
        }
        
        return 
evt;
    },
    
    
/* 
     * Function: DesignCore.fnGetPos
     * Purpose:  Get the position of an element on the page
     * Returns:  array[ 0-int:left, 1-int:top ]
     * Inputs:   node:obj - node to analyse
     */
    
_fnGetPos: function ( obj 
    {
        var 
curleft 0;
        var 
curtop 0;
        
        if (
obj.offsetParent
        {
            
curleft obj.offsetLeft;
            
curtop obj.offsetTop;
            while (
obj obj.offsetParent 
            {
                
curleft += obj.offsetLeft;
                
curtop += obj.offsetTop;
            }
        }
        return [
curleft,curtop];
    },
    
    
    
/*
     * Function: _fnEventTypeGroup
     * Purpose:  Group the event types as per w3c groupings
     * Returns:  -
     * Inputs:   string:sType
     */
    
_fnEventTypeGroup: function ( sType )
    {
        switch ( 
sType )
        {
            case 
'click':
            case 
'dblclick':
            case 
'mousedown':
            case 
'mousemove':
            case 
'mouseout':
            case 
'mouseover':
            case 
'mouseup':
                return 
'mouse';
            
            case 
'change':
            case 
'focus':
            case 
'blur':
            case 
'select':
            case 
'submit':
                return 
'html';
                
            case 
'keydown':
            case 
'keypress':
            case 
'keyup':
            case 
'load':
            case 
'unload':
                return 
'ui';
            
            default:
                return 
'custom';
        }
    }
}


var 
oSession = {
    
nTablenull,
    
    
fnCache: function ()
    {
        
this.nTable document.getElementById('demo').cloneNode(true);
    },
    
    
fnRestore: function ()
    {
        while( $.fn.
dataTableSettings.length )
        {
            try {
                $.fn.
dataTableSettings[0].oInstance.fnDestroy();
            } catch (
e) {
                $.fn.
dataTableSettings.splice0);
            }
        }
        
//$.fn.dataTableSettings.splice( 0, $.fn.dataTableSettings.length );
        
var nDemo document.getElementById('demo');
        
nDemo.innerHTML "";
        for ( var 
i=0iLen=this.nTable.childNodes.length i<iLen i++ )
        {
            
nDemo.appendChildthis.nTable.childNodes[0] );
        }
        
this.fnCache();
    }
}

$(
document).ready( function () {
    
oSession.fnCache();
} );
?>
Онлайн: 1
Реклама