1 /*
  2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
  3 For licensing, see LICENSE.html or http://ckeditor.com/license
  4 */
  5
  6 /**
  7  * @fileOverview Defines the {@link CKEDITOR.test} object, which contains
  8  *		functions used at our testing environment.
  9  */
 10
 11 /*jsl:import ../tests/yuitest.js*/
 12
 13 /**
 14  * Contains functions used at our testing environment. Currently,
 15  * our testing system is based on the
 16  * <a href="http://developer.yahoo.com/yui/yuitest/">YUI Test</a>.
 17  * @namespace
 18  * @example
 19  */
 20 CKEDITOR.test =
 21 {
 22 	/**
 23 	 * The assertion namespace, containing all assertion functions. Currently,
 24 	 * this is an alias for
 25 	 * <a href="http://developer.yahoo.com/yui/docs/YAHOO.util.Assert.html">YAHOO.util.Assert</a>.
 26 	 * @example
 27 	 * <b>CKEDITOR.test.assert</b>.areEqual( '10', 10 );        // "true"
 28 	 * <b>CKEDITOR.test.assert</b>.areSame( '10', 10 );         // "false"
 29 	 * <b>CKEDITOR.test.assert</b>.isUndefined( window.test );  // "true"
 30 	 */
 31 	assert : YAHOO.util.Assert,
 32
 33 	/**
 34 	 * Adds a test case to the test runner.
 35 	 * @param {Object} testCase The test case object. See other tests for
 36 	 *		examples.
 37 	 * @example
 38 	 * <b>CKEDITOR.test.addTestCase</b>((function()
 39 	 * {
 40 	 *     // Local reference to the "assert" object.
 41 	 *     var assert = CKEDITOR.test.assert;
 42 	 *
 43 	 *     return {
 44 	 *         test_example : function()
 45 	 *         {
 46 	 *             assert.areSame( '10', 10 );  // FAIL
 47 	 *         }
 48 	 *      };
 49 	 * })());
 50 	 */
 51 	addTestCase : function( testCase )
 52 	{
 53 		YAHOO.tool.TestRunner.add( new YAHOO.tool.TestCase( testCase ) );
 54 	},
 55
 56 	/**
 57 	 * Gets the inner HTML of an element, for testing purposes.
 58 	 */
 59 	getInnerHtml : function( elementOrId )
 60 	{
 61 		var html;
 62
 63 		if ( typeof elementOrId == 'string' )
 64 			html = document.getElementById( elementOrId ).innerHTML;
 65 		else if ( elementOrId.getHtml )
 66 			html = elementOrId.getHtml();
 67 		else
 68 			html = elementOrId.innerHTML || '';
 69
 70 		html = html.toLowerCase();
 71 		html = html.replace( /[\n\r]/g, '' );
 72
 73 		html = html.replace( /<\w[^>]*/g, function( match )
 74 			{
 75 				var attribs = [];
 76 				var hasClass;
 77
 78 				match = match.replace( /\s([^\s=]+)=((?:"[^"]*")|(?:'[^']*')|(?:[^\s]+))/g, function( match, attName, attValue )
 79 					{
 80 						if ( attName == 'style' )
 81 						{
 82 							// Safari adds some extra space to the end.
 83 							attValue = attValue.replace( /\s+/g, '' );
 84
 85 							// IE doesn't add the final ";"
 86 							attValue = attValue.replace( /([^"';\s])\s*(["']?)$/, '$1;$2' );
 87 						}
 88
 89 						// IE may have 'class' more than once.
 90 						if ( attName == 'class' )
 91 						{
 92 							if ( hasClass )
 93 								return '';
 94
 95 							hasClass = true;
 96 						}
 97
 98 						if ( attName != '_cke_expando' )
 99 							attribs.push( [ attName, attValue ] );
100
101 						return '';
102 					} );
103
104 				attribs.sort( function( a, b )
105 					{
106 						var nameA = a[ 0 ];
107 						var nameB = b[ 0 ];
108 						return nameA < nameB ? -1 : nameA > nameB ? 1 : 0;
109 					} );
110
111 				var ret = match.replace( /\s{2,}/g, ' ' );
112
113 				for ( var i = 0 ; i < attribs.length ; i++ )
114 				{
115 					ret += ' ' + attribs[i][0] + '=';
116 					ret += (/^["']/).test( attribs[i][1] ) ? attribs[i][1] : '"' + attribs[i][1] + '"';
117 				}
118
119 				return ret;
120 			} );
121
122 		return html;
123 	}
124 };
125