http://www.mediawiki.org/wiki/Special:Code/MediaWiki/88431

Revision: 88431
Author:   krinkle
Date:     2011-05-19 21:35:32 +0000 (Thu, 19 May 2011)
Log Message:
-----------
QUnit reorganization
* Moved QUnit directory from /resources/test/ to /tests/qunit/.
* Includes an .htaccess file in /tests/qunit/ to allow reading this from the 
browser (since /tests/.htaccess disallows this by default, as it should)
* Deleted "/unit/main.css" which wasn't used for anything (was an idea I had 
but redundant now)
* Renamed /qunit/unit/ to /qunit/suites/
* Re-organized structure within /suites/ to match that of MediaWiki's. (ie. 
/resources/jquery, /resources/mediawiki.util etc.)
This will make it easier to write a "check if all JS have a test suite" thingy.
* Added a few "Clean up" sections in the test suites to remove added elements 
(namely added portlet links)

Modified Paths:
--------------
    trunk/phase3/tests/qunit/index.html

Added Paths:
-----------
    trunk/phase3/tests/qunit/
    trunk/phase3/tests/qunit/.htaccess
    trunk/phase3/tests/qunit/suites/
    trunk/phase3/tests/qunit/suites/resources/
    trunk/phase3/tests/qunit/suites/resources/jquery/
    trunk/phase3/tests/qunit/suites/resources/jquery/jquery.autoEllipsis.js
    trunk/phase3/tests/qunit/suites/resources/jquery/jquery.colorUtil.js
    trunk/phase3/tests/qunit/suites/resources/jquery/jquery.mwPrototypes.js
    trunk/phase3/tests/qunit/suites/resources/mediawiki/
    trunk/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.js
    trunk/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.user.js
    trunk/phase3/tests/qunit/suites/resources/mediawiki.util/
    trunk/phase3/tests/qunit/suites/resources/mediawiki.util/mediawiki.util.js

Removed Paths:
-------------
    trunk/phase3/resources/test/
    trunk/phase3/tests/qunit/suites/jquery/
    trunk/phase3/tests/qunit/suites/main.css
    trunk/phase3/tests/qunit/suites/mediawiki/
    trunk/phase3/tests/qunit/suites/mediawiki.util/
    trunk/phase3/tests/qunit/unit/

Added: trunk/phase3/tests/qunit/.htaccess
===================================================================
--- trunk/phase3/tests/qunit/.htaccess                          (rev 0)
+++ trunk/phase3/tests/qunit/.htaccess  2011-05-19 21:35:32 UTC (rev 88431)
@@ -0,0 +1 @@
+Allow from all

Modified: trunk/phase3/tests/qunit/index.html
===================================================================
--- trunk/phase3/resources/test/index.html      2011-05-19 21:13:03 UTC (rev 
88429)
+++ trunk/phase3/tests/qunit/index.html 2011-05-19 21:35:32 UTC (rev 88431)
@@ -4,50 +4,53 @@
        <title>MediaWiki JavaScript Test Suite</title>
 
        <!-- MediaWiki Modules -->
+
+       <!-- MW: startup -->
        <script>
        function startUp(){
                mw.config = new mw.Map( false );
        }
        </script>
-       <script src="../jquery/jquery.js"></script>
-       <script src="../mediawiki/mediawiki.js"></script>
-       <script src="../mediawiki/mediawiki.user.js"></script>
 
-       <script src="../jquery/jquery.autoEllipsis.js"></script>
-       
+       <!-- MW: jquery|mediawiki -->
+       <script src="../../resources/jquery/jquery.js"></script>
+       <script src="../../resources/mediawiki/mediawiki.js"></script>
+
+       <!-- MW: mediawiki.user|mediawiki.util -->
+       <script src="../../resources/mediawiki/mediawiki.user.js"></script>
+               <script 
src="../../resources/jquery/jquery.checkboxShiftClick.js"></script>
+               <script src="../../resources/jquery/jquery.client.js"></script>
+               <script src="../../resources/jquery/jquery.cookie.js"></script>
+               <script 
src="../../resources/jquery/jquery.messageBox.js"></script>
+               <script 
src="../../resources/jquery/jquery.makeCollapsible.js"></script>
+               <script 
src="../../resources/jquery/jquery.mwPrototypes.js"></script>
+               <script 
src="../../resources/jquery/jquery.placeholder.js"></script>
+       <script src="../../resources/mediawiki.util/mediawiki.util.js"></script>
+
+       <!-- MW: user.options -->
        <script>
        mw.user.options.set({"skin": "vector"});
        </script>
 
-       <script src="../jquery/jquery.checkboxShiftClick.js"></script>
-       <script src="../jquery/jquery.client.js"></script>
-       <script src="../jquery/jquery.cookie.js"></script>
-       <script src="../jquery/jquery.messageBox.js"></script>
-       <script src="../jquery/jquery.makeCollapsible.js"></script>
-       <script src="../jquery/jquery.mwPrototypes.js"></script>
-       <script src="../jquery/jquery.placeholder.js"></script>
-       <script src="../mediawiki.util/mediawiki.util.js"></script>
+       <!-- MW: Non-default modules -->
+       <script src="../../resources/jquery/jquery.colorUtil.js"></script>
+       <script src="../../resources/jquery/jquery.autoEllipsis.js"></script>
 
-       <script src="../jquery/jquery.colorUtil.js"></script>
+       <!-- QUnit: Load framework -->
+       <link rel="stylesheet" href="../../resources/jquery/jquery.qunit.css" />
+       <script src="../../resources/jquery/jquery.qunit.js"></script>
 
-       <meta name="ResourceLoaderDynamicStyles" content="" /> 
+       <!-- QUnit: Load test suites (maintain the same order as above please) 
-->
+       <script src="suites/resources/mediawiki/mediawiki.js"></script>
+       <script src="suites/resources/mediawiki/mediawiki.user.js"></script>
+       <script src="suites/resources/jquery/jquery.mwPrototypes.js"></script>
+       <script 
src="suites/resources/mediawiki.util/mediawiki.util.js"></script>
+       <script src="suites/resources/jquery/jquery.colorUtil.js"></script>
+       <script src="suites/resources/jquery/jquery.autoEllipsis.js"></script>
 
-       <!-- QUnit -->
-       <link rel="stylesheet" href="../jquery/jquery.qunit.css" />
-       <script src="../jquery/jquery.qunit.js"></script>
-
-       <!-- Custom CSS used for tests -->
-       <link rel="stylesheet" href="unit/main.css" />
-
-       <!-- Load test suitss -->
-       <script src="unit/mediawiki/mediawiki.js"></script>
-       <script src="unit/mediawiki/mediawiki.user.js"></script>
-       <script src="unit/jquery/jquery.mwPrototypes.js"></script>
-       <script src="unit/mediawiki.util/mediawiki.util.js"></script>
-       <script src="unit/jquery/jquery.colorUtil.js"></script>
-       <script src="unit/jquery/jquery.autoEllipsis.js"></script>
-
-       <!-- TestSwarm -->
+       <!-- TestSwarm: If a test swarm is running this,
+            the following script will allow it to extract the results.
+            Harmless otherwise. -->
        <script src="testswarm.inject.js"></script>
 </head>
 <body>
@@ -57,12 +60,13 @@
        <h2 id="qunit-userAgent"></h2>
        <ol id="qunit-tests"></ol>
 
+<!-- Rough page structure for scripts needing it (Vector based). -->
+<!-- Scripts inserting stuff here shall remove it themselfs! -->
 <div id="mw-content">
        <div id="bodyContent"></div>
        <div id="mw-panel">
                <div id="p-tb" class="portal">
                        <ul class="body">
-                               <li id="t-specialpages"><a href="#">Special 
pages</a></li>
                        </ul>
                </div>
        </div>

Deleted: trunk/phase3/tests/qunit/suites/main.css
===================================================================
--- trunk/phase3/resources/test/unit/main.css   2011-05-19 21:13:03 UTC (rev 
88429)
+++ trunk/phase3/tests/qunit/suites/main.css    2011-05-19 21:35:32 UTC (rev 
88431)
@@ -1,5 +0,0 @@
-/* Hide mediawiki elements */
-div#mw-js-message,
-#mw-content {
-       display: none !important;
-}
\ No newline at end of file

Added: trunk/phase3/tests/qunit/suites/resources/jquery/jquery.autoEllipsis.js
===================================================================
--- trunk/phase3/tests/qunit/suites/resources/jquery/jquery.autoEllipsis.js     
                        (rev 0)
+++ trunk/phase3/tests/qunit/suites/resources/jquery/jquery.autoEllipsis.js     
2011-05-19 21:35:32 UTC (rev 88431)
@@ -0,0 +1,49 @@
+module( 'jquery.autoEllipsis.js' );
+
+test( '-- Initial check', function(){
+
+       ok( jQuery.fn.autoEllipsis, 'jQuery.fn.autoEllipsis defined' );
+});
+
+function createWrappedDiv( text ) {
+       var $wrapper = $( '<div />' ).css( 'width', '100px' );
+       var $div = $( '<div />' ).text( text );
+       $wrapper.append( $div );
+       return $wrapper;
+}
+
+function findDivergenceIndex( a, b ) {
+       var i = 0;
+       while ( i < a.length && i < b.length && a[i] == b[i] ) {
+               i++;
+       }
+       return i;
+}
+
+test( 'Position right', function() {
+       // We need this thing to be visible, so append it to the DOM
+       var origText = 'This is a really long random string and there is no way 
it fits in 100 pixels.';
+       var $wrapper = createWrappedDiv( origText );
+       $( 'body' ).append( $wrapper );
+       $wrapper.autoEllipsis( { position: 'right' } );
+
+       // Verify that, and only one, span element was created
+       var $span = $wrapper.find( '> span' );
+       deepEqual( $span.length, 1, 'autoEllipsis wrapped the contents in a 
span element' );
+
+       // Check that the text fits by turning on word wrapping
+       $span.css( 'whiteSpace', 'nowrap' );
+       ok( $span.width() <= $span.parent().width(), "Text fits (span's width 
is no larger than its parent's width)" );
+
+       // Add one character using scary black magic
+       var spanText = $span.text();
+       var d = findDivergenceIndex( origText, spanText );
+       spanText = spanText.substr( 0, d ) + origText[d] + '...';
+
+       // Put this text in the span and verify it doesn't fit
+       $span.text( spanText );
+       ok( $span.width() > $span.parent().width(), 'Fit is maximal (adding one 
character makes it not fit any more)' );
+
+       // Clean up
+       $wrapper.remove();
+});


Property changes on: 
trunk/phase3/tests/qunit/suites/resources/jquery/jquery.autoEllipsis.js
___________________________________________________________________
Added: svn:eol-style
   + native

Added: trunk/phase3/tests/qunit/suites/resources/jquery/jquery.colorUtil.js
===================================================================
--- trunk/phase3/tests/qunit/suites/resources/jquery/jquery.colorUtil.js        
                        (rev 0)
+++ trunk/phase3/tests/qunit/suites/resources/jquery/jquery.colorUtil.js        
2011-05-19 21:35:32 UTC (rev 88431)
@@ -0,0 +1,67 @@
+module( 'jquery.colorUtil.js' );
+
+test( '-- Initial check', function(){
+
+       ok( jQuery.colorUtil, 'jQuery.colorUtil defined' );
+});
+
+test( 'getRGB', function(){
+
+       equal( typeof jQuery.colorUtil.getRGB(), 'undefined', 'No arguments' );
+       equal( typeof jQuery.colorUtil.getRGB( '' ), 'undefined', 'Empty 
string' );
+       deepEqual( jQuery.colorUtil.getRGB( [0, 100, 255] ), [0, 100, 255], 
'Array' );
+       deepEqual( jQuery.colorUtil.getRGB( 'rgb(0,100,255)' ), [0, 100, 255], 
'Parse simple string' );
+       deepEqual( jQuery.colorUtil.getRGB( 'rgb(0, 100, 255)' ), [0, 100, 
255], 'Parse simple string (whitespace)' );
+       deepEqual( jQuery.colorUtil.getRGB( 'rgb(0%,20%,40%)' ), [0, 51, 102], 
'Parse percentages string' );
+       deepEqual( jQuery.colorUtil.getRGB( 'rgb(0%, 20%, 40%)' ), [0, 51, 
102], 'Parse percentages string (whitespace)' );
+       deepEqual( jQuery.colorUtil.getRGB( '#f2ddee' ), [242, 221, 238], 'Hex 
string: 6 char lowercase' );
+       deepEqual( jQuery.colorUtil.getRGB( '#f2DDEE' ), [242, 221, 238], 'Hex 
string: 6 char uppercase' );
+       deepEqual( jQuery.colorUtil.getRGB( '#f2DdEe' ), [242, 221, 238], 'Hex 
string: 6 char mixed' );
+       deepEqual( jQuery.colorUtil.getRGB( '#eee' ), [238, 238, 238], 'Hex 
string: 3 char lowercase' );
+       deepEqual( jQuery.colorUtil.getRGB( '#EEE' ), [238, 238, 238], 'Hex 
string: 3 char uppercase' );
+       deepEqual( jQuery.colorUtil.getRGB( '#eEe' ), [238, 238, 238], 'Hex 
string: 3 char mixed' );
+       deepEqual( jQuery.colorUtil.getRGB( 'rgba(0, 0, 0, 0)' ), [255, 255, 
255], 'Zero rgba for Safari 3; Transparent (whitespace)' );
+       // Perhaps this is a bug in colorUtil, but it is the current behaviour 
so, let's keep track
+       // would that ever change
+       equal( typeof jQuery.colorUtil.getRGB( 'rgba(0,0,0,0)' ), 'undefined', 
'Zero rgba without whitespace' );
+       
+       deepEqual( jQuery.colorUtil.getRGB( 'lightGreen' ), [144, 238, 144], 
'Color names (lightGreen)' );
+       deepEqual( jQuery.colorUtil.getRGB( 'lightGreen' ), [144, 238, 144], 
'Color names (transparent)' );
+       equal( typeof jQuery.colorUtil.getRGB( 'mediaWiki' ), 'undefined', 
'Inexisting color name' );
+
+});
+
+test( 'rgbToHsl', function(){
+       var hsl = jQuery.colorUtil.rgbToHsl( 144, 238, 144 );
+       var dualDecimals = function(a,b){
+               return Math.round(a*100)/100;
+       };
+
+       ok( hsl, 'Basic return evaluation' );
+       deepEqual( dualDecimals(hsl[0]) , 0.33, 'rgb(144, 238, 144): H 0.33' );
+       deepEqual( dualDecimals(hsl[1]) , 0.73, 'rgb(144, 238, 144): S 0.73' );
+       deepEqual( dualDecimals(hsl[2]) , 0.75, 'rgb(144, 238, 144): L 0.75' );
+
+});
+
+test( 'hslToRgb', function(){
+       var rgb = jQuery.colorUtil.hslToRgb( 0.3, 0.7, 0.8 );
+
+       ok( rgb, 'Basic return evaluation' );
+       deepEqual( Math.round(rgb[0]) , 183, 'hsl(0.3, 0.7, 0.8): R 183' );
+       deepEqual( Math.round(rgb[1]) , 240, 'hsl(0.3, 0.7, 0.8): G 240' );
+       deepEqual( Math.round(rgb[2]) , 168, 'hsl(0.3, 0.7, 0.8): B 168' );
+
+});
+
+test( 'getColorBrightness', function(){
+
+       var a = jQuery.colorUtil.getColorBrightness( 'red', +0.1 );
+
+       equal( a, 'rgb(255,50,50)', 'Start with named color, brighten 10%' );
+       
+       var b = jQuery.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
+       
+       equal( b, 'rgb(118,29,29)', 'Start with rgb string, darken 10%' );
+
+});


Property changes on: 
trunk/phase3/tests/qunit/suites/resources/jquery/jquery.colorUtil.js
___________________________________________________________________
Added: svn:eol-style
   + native

Added: trunk/phase3/tests/qunit/suites/resources/jquery/jquery.mwPrototypes.js
===================================================================
--- trunk/phase3/tests/qunit/suites/resources/jquery/jquery.mwPrototypes.js     
                        (rev 0)
+++ trunk/phase3/tests/qunit/suites/resources/jquery/jquery.mwPrototypes.js     
2011-05-19 21:35:32 UTC (rev 88431)
@@ -0,0 +1,58 @@
+module( 'jquery.mwPrototypes.js' );
+
+test( 'String functions', function(){
+
+       equal( $j.trimLeft( '  foo bar  ' ), 'foo bar  ', 'trimLeft' );
+       equal( $j.trimRight( '  foo bar  ' ), '  foo bar', 'trimRight' );
+       equal( $j.ucFirst( 'foo'), 'Foo', 'ucFirst' );
+
+       equal( $j.escapeRE( '<!-- ([{+mW+}]) $^|?>' ),
+        '<!\\-\\- \\(\\[\\{\\+mW\\+\\}\\]\\) \\$\\^\\|\\?>', 'escapeRE - 
Escape specials' );
+       equal( $j.escapeRE( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ),
+        'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'escapeRE - Leave uppercase alone' );
+       equal( $j.escapeRE( 'abcdefghijklmnopqrstuvwxyz' ),
+        'abcdefghijklmnopqrstuvwxyz', 'escapeRE - Leave lowercase alone' );
+       equal( $j.escapeRE( '0123456789' ), '0123456789', 'escapeRE - Leave 
numbers alone' );
+
+});
+
+test( 'Is functions', function(){
+
+       deepEqual( $j.isDomElement( document.getElementById( 'qunit-header' ) 
), true,
+        'isDomElement: #qunit-header Node' );
+       deepEqual( $j.isDomElement( document.getElementById( 'random-name' ) ), 
false,
+        'isDomElement: #random-name (null)' );
+       deepEqual( $j.isDomElement( document.getElementsByTagName( 'div' ) ), 
false,
+        'isDomElement: getElementsByTagName Array' );
+       deepEqual( $j.isDomElement( document.getElementsByTagName( 'div' )[0] 
), true,
+        'isDomElement: getElementsByTagName(..)[0] Node' );
+       deepEqual( $j.isDomElement( $j( 'div' ) ), false,
+        'isDomElement: jQuery object' );
+       deepEqual( $j.isDomElement( $j( 'div' ).get(0) ), true,
+        'isDomElement: jQuery object > Get node' );
+       deepEqual( $j.isDomElement( document.createElement( 'div' ) ), true,
+        'isDomElement: createElement' );
+       deepEqual( $j.isDomElement( { foo: 1 } ), false,
+        'isDomElement: Object' );
+
+       equal( $j.isEmpty( 'string' ), false, 'isEmptry: "string"' );
+       equal( $j.isEmpty( '0' ), true, 'isEmptry: "0"' );
+       equal( $j.isEmpty( [] ), true, 'isEmptry: []' );
+       equal( $j.isEmpty( {} ), true, 'isEmptry: {}' );
+       // Documented behaviour
+       equal( $j.isEmpty( { length: 0 } ), true, 'isEmptry: { length: 0 }' );
+
+});
+
+test( 'Comparison functions', function(){
+
+       ok( $j.compareArray( [0, 'a', [], [2, 'b'] ], [0, "a", [], [2, "b"] ] ),
+        'compareArray: Two deep arrays that are excactly the same' );
+       ok( !$j.compareArray( [1], [2] ), 'compareArray: Two different arrays 
(false)' );
+
+       ok( $j.compareObject( {}, {} ), 'compareObject: Two empty objects' );
+       ok( $j.compareObject( { foo: 1 }, { foo: 1 } ), 'compareObject: Two the 
same objects' );
+       ok( !$j.compareObject( { bar: true }, { baz: false } ),
+        'compareObject: Two different objects (false)' );
+       
+});
\ No newline at end of file


Property changes on: 
trunk/phase3/tests/qunit/suites/resources/jquery/jquery.mwPrototypes.js
___________________________________________________________________
Added: svn:eol-style
   + native

Added: trunk/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.js
===================================================================
--- trunk/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.js            
                (rev 0)
+++ trunk/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.js    
2011-05-19 21:35:32 UTC (rev 88431)
@@ -0,0 +1,107 @@
+module( 'mediawiki.js' );
+
+test( '-- Initial check', function(){
+
+       ok( window.jQuery, 'jQuery defined' );
+       ok( window.$j, '$j defined' );
+       equal( window.$j, window.jQuery, '$j alias to jQuery' );
+
+       ok( window.mediaWiki, 'mediaWiki defined' );
+       ok( window.mw, 'mw defined' );
+       equal( window.mw, window.mediaWiki, 'mw alias to mediaWiki' );
+
+});
+
+test( 'mw.Map / mw.config', function(){
+
+       ok( mw.config instanceof mw.Map, 'mw.config instance of mw.Map' );
+       ok( mw.config.get, 'get' );
+       ok( mw.config.set, 'set' );
+       ok( mw.config.exists, 'exists' );
+
+       ok( !mw.config.exists( 'lipsum' ), 'exists: lipsum (inexistant)' );
+       ok( mw.config.set( 'lipsum', 'Lorem ipsum' ), 'set: lipsum' );
+       ok( mw.config.exists( 'lipsum' ), 'exists: lipsum (existant)' );
+
+       equal( mw.config.get( 'lipsum' ), 'Lorem ipsum', 'get: lipsum' );
+       equal( mw.config.get( ['lipsum'] ).lipsum, 'Lorem ipsum', 'get: lipsum 
(multiple)' );
+
+});
+
+test( 'mw.message / mw.msg / mw.messages', function(){
+       ok( mw.message, 'mw.message defined' );
+       ok( mw.msg, 'mw.msg defined' );
+       ok( mw.messages, 'messages defined' );
+       ok( mw.messages instanceof mw.Map, 'mw.messages instance of mw.Map' );
+       ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 
'mw.messages.set: Register' );
+
+       var hello = mw.message( 'hello' );
+       ok( hello, 'hello: Instance of Message' );
+
+       equal( hello.format, 'parse', 'Message property "format" (default 
value)' );
+       equal( hello.key, 'hello', 'Message property "key" (currect key)' );
+       deepEqual( hello.parameters, [], 'Message property "parameters" 
(default value)' );
+
+
+       ok( hello.params, 'Message prototype "params"');
+       ok( hello.toString, 'Message prototype "toString"');
+       ok( hello.parse, 'Message prototype "parse"');
+       ok( hello.plain, 'Message prototype "plain"');
+       ok( hello.escaped, 'Message prototype "escaped"');
+       ok( hello.exists, 'Message prototype "exists"');
+
+       equal( hello.toString(), 'Hello <b>awesome</b> world', 
'Message.toString() test');
+       equal( hello.escaped(), 'Hello &lt;b&gt;awesome&lt;/b&gt; world', 
'Message.escaped() test');
+       deepEqual( hello.exists(), true, 'Message.exists() test');
+
+       equal( mw.msg( 'random' ), '<random>', 'square brackets around 
inexistant messages' );
+       equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'get message 
with default options' );
+       
+// params, toString, parse, plain, escaped, exists
+});
+
+test( 'mw.loader', function(){
+       expect(2);
+       
+       ok( location.href.match(/[^#\?]*/) && 
location.href.match(/[^#\?]*/)[0], true, 'Extracting file path from location' );
+
+       stop();
+       
+       mw.loader.implement( 'is.awesome', [location.href.match(/[^#\?]*/)[0] + 
'sample/awesome.js'], {}, {} );
+       mw.loader.using( 'is.awesome', function(){
+               start();
+               deepEqual( window.awesome, true, 'Implementing a module, is the 
callback timed properly ?');
+
+               // Clean up
+               delete window.awesome;
+
+       }, function(){
+               start();
+               deepEqual( 'mw.loader.using error callback fired', true, 
'Implementing a module, is the callback timed properly ?');
+       });
+
+});
+
+test( 'mw.html', function(){
+
+       equal( mw.html.escape( '<mw awesome="awesome" value=\'test\' />' ),
+        '&lt;mw awesome=&quot;awesome&quot; value=&#039;test&#039; /&gt;', 
'html.escape()' );
+
+       equal( mw.html.element( 'div' ), '<div/>', 'mw.html.element() DIV 
(simple)' );
+
+       equal( mw.html.element( 'div',
+        { id: 'foobar' } ),
+        '<div id="foobar"/>',
+        'mw.html.element() DIV (attribs)' );
+
+       equal( mw.html.element( 'div',
+        null, 'a' ),
+        '<div>a</div>',
+        'mw.html.element() DIV (content)' );
+
+       equal( mw.html.element( 'a',
+         { href: 'http://mediawiki.org/w/index.php?title=RL&action=history' }, 
'a' ),
+         '<a 
href="http://mediawiki.org/w/index.php?title=RL&amp;action=history";>a</a>',
+         'mw.html.element() DIV (attribs + content)' );
+
+});


Property changes on: 
trunk/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.js
___________________________________________________________________
Added: svn:eol-style
   + native

Added: trunk/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.user.js
===================================================================
--- trunk/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.user.js       
                        (rev 0)
+++ trunk/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.user.js       
2011-05-19 21:35:32 UTC (rev 88431)
@@ -0,0 +1,30 @@
+module( 'mediawiki.user.js' );
+
+test( '-- Initial check', function(){
+
+       ok( mw.user, 'mw.user defined' );
+
+});
+
+
+test( 'options', function(){
+
+       ok( mw.user.options instanceof mw.Map, 'options instance of mw.Map' );
+
+});
+
+test( 'User login status', function(){
+
+       deepEqual( mw.user.name(), null, 'user.name() When anonymous' );
+       ok( mw.user.anonymous(), 'user.anonymous() When anonymous' );
+
+       // Not part of startUp module
+       mw.config.set( 'wgUserName', 'John' );
+
+       equal( mw.user.name(), 'John', 'user.name() When logged-in as John' );
+       ok( !mw.user.anonymous(), 'user.anonymous() When logged-in' );
+
+       equal( mw.user.id(), 'John', 'user.id() When logged-in as John' );
+
+
+});
\ No newline at end of file


Property changes on: 
trunk/phase3/tests/qunit/suites/resources/mediawiki/mediawiki.user.js
___________________________________________________________________
Added: svn:eol-style
   + native

Added: 
trunk/phase3/tests/qunit/suites/resources/mediawiki.util/mediawiki.util.js
===================================================================
--- trunk/phase3/tests/qunit/suites/resources/mediawiki.util/mediawiki.util.js  
                        (rev 0)
+++ trunk/phase3/tests/qunit/suites/resources/mediawiki.util/mediawiki.util.js  
2011-05-19 21:35:32 UTC (rev 88431)
@@ -0,0 +1,216 @@
+module( 'mediawiki.util.js' );
+
+test( '-- Initial check', function(){
+
+       ok( mw.util, 'mw.util defined' );
+
+});
+
+test( 'rawurlencode', function(){
+
+       equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 
'Test%3AA%20%26%20B%2FHere' );
+
+});
+
+test( 'wikiUrlencode', function(){
+
+       equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' 
);
+
+});
+
+test( 'addCSS', function(){
+
+       var a = mw.util.addCSS( '#bodyContent { visibility: hidden; }' );
+       ok(  a, 'function works' );
+       deepEqual( a.disabled, false, 'property "disabled" is available and set 
to false' );
+
+       var $b = $('#bodyContent');
+       equal( $b.css('visibility'), 'hidden', 'Added style properties are in 
effect.' );
+
+
+});
+
+test( 'toggleToc', function(){
+
+       ok( mw.util.toggleToc );
+
+});
+
+test( 'wikiGetlink', function(){
+
+       // Not part of startUp module
+       mw.config.set( 'wgArticlePath', '/wiki/$1' );
+
+       var hrefA = mw.util.wikiGetlink( 'Sandbox' );
+
+       equal( hrefA, '/wiki/Sandbox', 'Simple title; Get link for "Sandbox"' );
+
+       var hrefB = mw.util.wikiGetlink( 'Foo:Sandbox ? 5+5=10 ! 
(test)/subpage' );
+
+       equal( hrefB, 
'/wiki/Foo:Sandbox_%3F_5%2B5%3D10_%21_%28test%29/subpage', 'Advanced title; Get 
link for "Foo:Sandbox ? 5+5=10 ! (test)/subpage"' );
+
+});
+
+test( 'getParamValue', function(){
+
+       var url = 'http://mediawiki.org/?foo=wrong&foo=right#&foo=bad';
+
+       equal( mw.util.getParamValue( 'foo', url ), 'right', 'Use latest one, 
ignore hash' );
+       deepEqual( mw.util.getParamValue( 'bar', url ), null, 'Return null when 
not found' );
+
+});
+
+test( 'getActionFrom', function(){
+
+       // Example urls
+       var     urlA = 'http://mediawiki.org/wiki/Article',
+               urlB = 
'http://mediawiki.org/w/index.php?title=Article&action=edit',
+               urlC = 'http://mediawiki.org/edit/Article',
+               urlD = 'http://mediawiki.org/w/index.php/Article';
+
+       // Common settings
+       mw.config.set( {
+               'wgActionPaths': [],
+               'wgArticlePath': '/wiki/$1'
+       });
+
+       equal( mw.util.getActionFrom( urlA ), 'view', 'wgArticlePath (/wiki/$1) 
support' );
+       equal( mw.util.getActionFrom( urlB ), 'edit', 'action-parameter 
support' );
+
+       // Custom settings
+       mw.config.set( 'wgActionPaths', {
+               'view': '/view/$1',
+               'edit': '/edit/$1'
+       });
+
+       equal( mw.util.getActionFrom( urlC ), 'edit', 'wgActionPaths support' );
+
+       // Default settings
+       mw.config.set( {
+               'wgActionPaths': [],
+               'wgArticlePath': '/w/index.php/$1'
+       });
+       equal( mw.util.getActionFrom( urlD ), 'view', 'wgArticlePath 
(/index.php/$1) support' );
+
+});
+
+test( 'getTitleFrom', function(){
+
+       // Example urls
+       var     urlA = 'http://mediawiki.org/wiki/Article',
+               urlB = 
'http://mediawiki.org/w/index.php?title=Article&action=edit',
+               urlC = 'http://mediawiki.org/edit/Article',
+               urlD = 'http://mediawiki.org/w/index.php/Article';
+
+       // Common settings
+       mw.config.set( {
+               'wgActionPaths': [],
+               'wgArticlePath': '/wiki/$1'
+       });
+
+       equal( mw.util.getTitleFrom( urlA ), 'Article', 'wgArticlePath 
(/wiki/$1) support' );
+       equal( mw.util.getTitleFrom( urlB ), 'Article', 'action-parameter 
support' );
+
+       // Custom settings
+       mw.config.set( 'wgActionPaths', {
+               'view': '/view/$1',
+               'edit': '/edit/$1'
+       });
+
+       equal( mw.util.getTitleFrom( urlC ), 'Article', 'wgActionPaths support' 
);
+
+       // Default settings
+       mw.config.set( {
+               'wgActionPaths': [],
+               'wgArticlePath': '/w/index.php/$1'
+       });
+
+       equal( mw.util.getTitleFrom( urlD ), 'Article', 'wgArticlePath 
(/index.php/$1) support' );
+
+});
+
+test( 'tooltipAccessKey', function(){
+
+       equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 
'mw.util.tooltipAccessKeyPrefix must be a string' );
+       ok( mw.util.tooltipAccessKeyRegexp instanceof RegExp, 
'mw.util.tooltipAccessKeyRegexp instance of RegExp' );
+       ok( mw.util.updateTooltipAccessKeys, 'mw.util.updateTooltipAccessKeys' 
);
+
+});
+
+test( '$content', function(){
+
+       ok( mw.util.$content instanceof jQuery, 'mw.util.$content instance of 
jQuery' );
+       deepEqual( mw.util.$content.length, 1, 'mw.util.$content must have 
length of 1' );
+
+});
+
+test( 'addPortletLink', function(){
+
+       var A = mw.util.addPortletLink( 'p-tb', 
'http://mediawiki.org/wiki/ResourceLoader',
+               'ResourceLoader', 't-rl', 'More info about ResourceLoader on 
MediaWiki.org ', 'l', '#t-specialpages' );
+
+       ok( $.isDomElement( A ), 'addPortletLink returns a valid DOM Element 
according to $.isDomElement' );
+
+       var B = mw.util.addPortletLink( "p-tb", "http://mediawiki.org/";,
+               "MediaWiki.org", "t-mworg", "Go to MediaWiki.org ", "m", A );
+
+       equal( $( B ).attr( 'id' ), 't-mworg', 'Link has correct ID set' );
+       equal( $( B ).closest( '.portal' ).attr( 'id' ), 'p-tb', 'Link was 
inserted within correct portlet' );
+       equal( $( B ).next().attr( 'id' ), 't-rl', 'Link is in the correct 
position (by passing nextnode)' );
+
+       var C = mw.util.addPortletLink( "p-tb", 
"http://mediawiki.org/wiki/RL/DM";,
+               "Default modules", "t-rldm", "List of all default modules ", 
"d", "#t-rl" );
+
+       equal( $( C ).next().attr( 'id' ), 't-rl', 'Link is in the correct 
position (by passing CSS selector)' );
+
+       // Clean up
+       $( [A, B, C] ).remove();
+
+});
+
+test( 'jsMessage', function(){
+
+       var a = mw.util.jsMessage( "MediaWiki is <b>Awesome</b>." );
+
+       ok( a, 'Basic checking of return value' );
+
+       // Clean up
+       $( '#mw-js-message' ).remove();
+
+});
+
+test( 'validateEmail', function(){
+
+       deepEqual( mw.util.validateEmail( "" ), null, 'Empty string should 
return null' );
+       deepEqual( mw.util.validateEmail( "user@localhost" ), true );
+
+       // testEmailWithCommasAreInvalids
+       deepEqual( mw.util.validateEmail( "user,[email protected]" ), false, 
'Comma' );
+       deepEqual( mw.util.validateEmail( "userfoo@ex,ample.org" ), false, 
'Comma' );
+
+       // testEmailWithHyphens
+       deepEqual( mw.util.validateEmail( "[email protected]" ), true, 
'Hyphen' );
+       deepEqual( mw.util.validateEmail( "[email protected]" ), true, 
'Hyphen' );
+
+});
+
+test( 'isIPv6Address', function(){
+
+       // Based on IPTest.php > IPv6
+       deepEqual( mw.util.isIPv6Address( "" ), false, 'Empty string is not an 
IP' );
+       deepEqual( mw.util.isIPv6Address( ":fc:100::" ), false, 'IPv6 starting 
with lone ":"' );
+       deepEqual( mw.util.isIPv6Address( "fc:100::" ), true );
+       deepEqual( mw.util.isIPv6Address( "fc:100:a:d:1:e:ac::" ), true );
+       deepEqual( mw.util.isIPv6Address( ":::" ), false );
+       deepEqual( mw.util.isIPv6Address( "::0:" ), false );
+
+});
+
+test( 'isIPv4Address', function(){
+
+       // Based on IPTest.php > IPv4
+       deepEqual( mw.util.isIPv4Address( "" ), false, 'Empty string is not an 
IP' );
+       deepEqual( mw.util.isIPv4Address( "...." ), false );
+       deepEqual( mw.util.isIPv4Address( "1.24.52.13" ), true );
+
+});


Property changes on: 
trunk/phase3/tests/qunit/suites/resources/mediawiki.util/mediawiki.util.js
___________________________________________________________________
Added: svn:eol-style
   + native


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to