diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/lib/helper.js | 59 | ||||
-rw-r--r-- | tests/lib/qunit.js | 23 | ||||
-rw-r--r-- | tests/lib/testIframe.js | 7 | ||||
-rw-r--r-- | tests/unit/spinner/core.js | 56 | ||||
-rw-r--r-- | tests/unit/spinner/mousewheel-wheel.html | 72 | ||||
-rw-r--r-- | tests/unit/tabs/core.js | 77 | ||||
-rw-r--r-- | tests/unit/tabs/tabs.html | 29 |
7 files changed, 314 insertions, 9 deletions
diff --git a/tests/lib/helper.js b/tests/lib/helper.js index 2315c5e19..2be4c48de 100644 --- a/tests/lib/helper.js +++ b/tests/lib/helper.js @@ -51,6 +51,65 @@ exports.moduleAfterEach = function( assert ) { } }; +exports.testIframe = function( title, fileName, func, wrapper, iframeStyles ) { + if ( !wrapper ) { + wrapper = QUnit.test; + } + wrapper.call( QUnit, title, function( assert ) { + var done = assert.async(), + $iframe = jQuery( "<iframe></iframe>" ) + .css( { + position: "absolute", + top: "0", + left: "-600px", + width: "500px", + zIndex: 1, + background: "white" + } ) + .attr( { id: "qunit-fixture-iframe", src: fileName } ); + + // Add other iframe styles + if ( iframeStyles ) { + $iframe.css( iframeStyles ); + } + + // Test iframes are expected to invoke this via startIframeTest + // (cf. iframeTest.js) + window.iframeCallback = function() { + var args = Array.prototype.slice.call( arguments ); + + args.unshift( assert ); + + setTimeout( function() { + var result; + + this.iframeCallback = undefined; + + result = func.apply( this, args ); + + function finish() { + func = function() {}; + $iframe.remove(); + done(); + } + + // Wait for promises returned by `func`. + if ( result && result.then ) { + result.then( finish ); + } else { + finish(); + } + } ); + }; + + // Attach iframe to the body for visibility-dependent code. + // It will be removed by either the above code, or the testDone + // callback in qunit.js. + $iframe.prependTo( document.body ); + } ); +}; +window.iframeCallback = undefined; + return exports; } ); diff --git a/tests/lib/qunit.js b/tests/lib/qunit.js index 6441019bd..c4c96ef58 100644 --- a/tests/lib/qunit.js +++ b/tests/lib/qunit.js @@ -7,6 +7,8 @@ define( [ ], function( QUnit, $ ) { "use strict"; +var ajaxSettings = $.ajaxSettings; + QUnit.config.autostart = false; QUnit.config.requireExpects = true; @@ -34,16 +36,21 @@ QUnit.config.urlConfig.push( { label: "Enable jquery-migrate" } ); -QUnit.reset = ( function( reset ) { - return function() { +QUnit.testDone( function() { + + // Ensure jQuery events and data on the fixture are properly removed + $( "#qunit-fixture" ).empty(); - // Ensure jQuery events and data on the fixture are properly removed - $( "#qunit-fixture" ).empty(); + // Remove the iframe fixture + $( "#qunit-fixture-iframe" ).remove(); - // Let QUnit reset the fixture - reset.apply( this, arguments ); - }; -} )( QUnit.reset ); + // Reset internal $ state + if ( ajaxSettings ) { + $.ajaxSettings = $.extend( true, {}, ajaxSettings ); + } else { + delete $.ajaxSettings; + } +} ); return QUnit; diff --git a/tests/lib/testIframe.js b/tests/lib/testIframe.js new file mode 100644 index 000000000..4db56833c --- /dev/null +++ b/tests/lib/testIframe.js @@ -0,0 +1,7 @@ +window.startIframeTest = function() { + var args = Array.prototype.slice.call( arguments ); + + // Note: jQuery may be undefined if page did not load it + args.unshift( window.jQuery, window, document ); + window.parent.iframeCallback.apply( null, args ); +}; diff --git a/tests/unit/spinner/core.js b/tests/unit/spinner/core.js index e9f7bc3d2..42bcc7bb5 100644 --- a/tests/unit/spinner/core.js +++ b/tests/unit/spinner/core.js @@ -163,7 +163,47 @@ QUnit.test( "mouse click on up button, increases value not greater than max", fu assert.equal( element.val(), 0 ); } ); -QUnit.test( "mousewheel on input", function( assert ) { +QUnit.test( "wheel on input", function( assert ) { + var ready = assert.async(); + assert.expect( 5 ); + + var element = $( "#spin" ).val( 0 ).spinner( { + step: 2 + } ); + + element.simulate( "focus" ); + setTimeout( step1 ); + + function getWheelEvent( deltaY ) { + return jQuery.Event( new WheelEvent( "wheel", { deltaY: deltaY } ) ); + } + + function step1() { + element.trigger( getWheelEvent() ); + assert.equal( element.val(), 0, "wheel event without delta does not change value" ); + + element.trigger( getWheelEvent( -1 ) ); + assert.equal( element.val(), 2, "delta -1" ); + + element.trigger( getWheelEvent( 0.2 ) ); + assert.equal( element.val(), 0, "delta 0.2" ); + + element.trigger( getWheelEvent( 15 ) ); + assert.equal( element.val(), -2, "delta 15" ); + + element.simulate( "blur" ); + setTimeout( step2 ); + } + + function step2() { + element.trigger( "wheel", -1 ); + assert.equal( element.val(), -2, "wheel when not focused" ); + + ready(); + } +} ); + +QUnit.test( "mousewheel on input (DEPRECATED)", function( assert ) { var ready = assert.async(); assert.expect( 5 ); @@ -199,6 +239,20 @@ QUnit.test( "mousewheel on input", function( assert ) { } } ); +helper.testIframe( + "wheel & mousewheel conflicts", + "mousewheel-wheel.html", + function( assert, jQuery, window, document, values ) { + assert.expect( 5 ); + + assert.equal( values[ 0 ], 0, "wheel event without delta does not change value" ); + assert.equal( values[ 1 ], 2, "delta -1" ); + assert.equal( values[ 2 ], 0, "delta 0.2" ); + assert.equal( values[ 3 ], -2, "delta 15" ); + assert.equal( values[ 4 ], -2, "wheel when not focused" ); + } +); + QUnit.test( "reading HTML5 attributes", function( assert ) { assert.expect( 6 ); var markup = "<input type='number' min='-100' max='100' value='5' step='2'>", diff --git a/tests/unit/spinner/mousewheel-wheel.html b/tests/unit/spinner/mousewheel-wheel.html new file mode 100644 index 000000000..e512a36cc --- /dev/null +++ b/tests/unit/spinner/mousewheel-wheel.html @@ -0,0 +1,72 @@ +<!doctype html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>jQuery UI Spinner Test Suite</title> + + <script src="../../../external/requirejs/require.js"></script> + <script src="../../../external/jquery/jquery.js"></script> + <script src="../../lib/css.js" data-modules="core button spinner theme"></script> + <script src="../../lib/testIframe.js"></script> +</head> +<body> + +<input id="spin" class="foo"> + +<script> + function runTest() { + var values = [], + element = $( "#spin" ).val( 0 ).spinner( { + step: 2 + } ); + + element.focus(); + setTimeout( step1 ); + + function dispatchWheelEvent( elem, deltaY ) { + elem[ 0 ].dispatchEvent( new WheelEvent( "wheel", { + deltaY: deltaY + } ) ); + } + + function step1() { + dispatchWheelEvent( element ); + values.push( element.val() ); + + dispatchWheelEvent( element, -1 ); + values.push( element.val() ); + + dispatchWheelEvent( element, 0.2 ); + values.push( element.val() ); + + dispatchWheelEvent( element, 15 ); + values.push( element.val() ); + + element.blur(); + setTimeout( step2 ); + } + + function step2() { + dispatchWheelEvent( element, -1 ); + values.push( element.val() ); + + startIframeTest( values ); + } + } + + requirejs.config( { + paths: { + "jquery-mousewheel": "../../../external/jquery-mousewheel/jquery.mousewheel", + "ui": "../../../ui" + }, + } ); + + require( [ + "jquery-mousewheel", + "ui/widgets/spinner" + ], function() { + runTest(); + } ); +</script> +</body> +</html> diff --git a/tests/unit/tabs/core.js b/tests/unit/tabs/core.js index c2fd89048..1eac3c268 100644 --- a/tests/unit/tabs/core.js +++ b/tests/unit/tabs/core.js @@ -747,4 +747,81 @@ QUnit.test( "extra listeners created when tabs are added/removed (trac-15136)", "No extra listeners after removing all the extra tabs" ); } ); +QUnit.test( "URL-based auth with local tabs (gh-2213)", function( assert ) { + assert.expect( 1 ); + + var origAjax = $.ajax, + element = $( "#tabs1" ), + anchor = element.find( "a[href='#fragment-3']" ), + url = new URL( anchor.prop( "href" ) ); + + try { + $.ajax = function() { + throw new Error( "Unexpected AJAX call; all tabs are local!" ); + }; + + anchor.attr( "href", url.protocol + "//username:password@" + url.host + + url.pathname + url.search + url.hash ); + + element.tabs(); + anchor.trigger( "click" ); + + assert.strictEqual( element.tabs( "option", "active" ), 2, + "should set the active option" ); + } finally { + $.ajax = origAjax; + } +} ); + +( function() { + function getVerifyTab( assert, element ) { + return function verifyTab( index ) { + assert.strictEqual( + element.tabs( "option", "active" ), + index, + "should set the active option to " + index ); + assert.strictEqual( + element.find( "[role='tabpanel']:visible" ).text().trim(), + "Tab " + ( index + 1 ), + "should set the panel to 'Tab " + ( index + 1 ) + "'" ); + }; + } + + QUnit.test( "href encoding/decoding (gh-2344)", function( assert ) { + assert.expect( 12 ); + + location.hash = "#tabs-2"; + + var i, + element = $( "#tabs10" ).tabs(), + tabLinks = element.find( "> ul a" ), + verifyTab = getVerifyTab( assert, element ); + + for ( i = 0; i < tabLinks.length; i++ ) { + tabLinks.eq( i ).trigger( "click" ); + verifyTab( i ); + } + + location.hash = ""; + } ); + + QUnit.test( "href encoding/decoding on init (gh-2344)", function( assert ) { + assert.expect( 12 ); + + var i, + element = $( "#tabs10" ), + tabLinks = element.find( "> ul a" ), + verifyTab = getVerifyTab( assert, element ); + + for ( i = 0; i < tabLinks.length; i++ ) { + location.hash = tabLinks.eq( i ).attr( "href" ); + element.tabs(); + verifyTab( i ); + element.tabs( "destroy" ); + } + + location.hash = ""; + } ); +} )(); + } ); diff --git a/tests/unit/tabs/tabs.html b/tests/unit/tabs/tabs.html index cb4e5389f..3f18fa015 100644 --- a/tests/unit/tabs/tabs.html +++ b/tests/unit/tabs/tabs.html @@ -125,6 +125,35 @@ <div id="tabs9-1"></div> </div> +<div id="tabs10"> + <ul> + <li><a href="#tabs-1">1</a></li> + <li><a href="#tabs-2">2</a></li> + <li><a href="#%EF%B8%8F">3</a></li> + <li><a href="#🤗">4</a></li> + <li><a href="#😅">5</a></li> + <li><a href="#%25F0%259F%25A4%25AD">6</a></li> + </ul> + <div id="tabs-1"> + <p>Tab 1</p> + </div> + <div id="tabs-2"> + <p>Tab 2</p> + </div> + <div id="%EF%B8%8F"> + <p>Tab 3</p> + </div> + <div id="🤗"> + <p>Tab 4</p> + </div> + <div id="%F0%9F%98%85"> + <p>Tab 5</p> + </div> + <div id="%F0%9F%A4%AD"> + <p>Tab 6</p> + </div> +</div> + </div> </body> </html> |