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 <b>awesome</b> 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\' />' ),
+ '<mw awesome="awesome" value='test' />',
'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&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