( function ( mw, $ ) { var loremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.'; QUnit.module( 'jquery.makeCollapsible', QUnit.newMwEnvironment( { setup: function () { this.clock = this.sandbox.useFakeTimers(); } } ) ); function prepareCollapsible( html, options ) { return $( $.parseHTML( html ) ) .appendTo( '#qunit-fixture' ) // options might be undefined here - this is okay .makeCollapsible( options ); } // This test is first because if it fails, then almost all of the latter tests are meaningless. QUnit.test( 'testing hooks/triggers', 4, function ( assert ) { var test = this, $collapsible = prepareCollapsible( '
' + loremIpsum + '
' ), $content = $collapsible.find( '.mw-collapsible-content' ), $toggle = $collapsible.find( '.mw-collapsible-toggle' ); // In one full collapse-expand cycle, each event will be fired once // On collapse... $collapsible.on( 'beforeCollapse.mw-collapsible', function () { assert.assertTrue( $content.is( ':visible' ), 'first beforeCollapseExpand: content is visible' ); } ); $collapsible.on( 'afterCollapse.mw-collapsible', function () { assert.assertTrue( $content.is( ':hidden' ), 'first afterCollapseExpand: content is hidden' ); // On expand... $collapsible.on( 'beforeExpand.mw-collapsible', function () { assert.assertTrue( $content.is( ':hidden' ), 'second beforeCollapseExpand: content is hidden' ); } ); $collapsible.on( 'afterExpand.mw-collapsible', function () { assert.assertTrue( $content.is( ':visible' ), 'second afterCollapseExpand: content is visible' ); } ); // ...expanding happens here $toggle.trigger( 'click' ); test.clock.tick( 500 ); } ); // ...collapsing happens here $toggle.trigger( 'click' ); test.clock.tick( 500 ); } ); QUnit.test( 'basic operation (
)', 5, function ( assert ) { var test = this, $collapsible = prepareCollapsible( '
' + loremIpsum + '
' ), $content = $collapsible.find( '.mw-collapsible-content' ), $toggle = $collapsible.find( '.mw-collapsible-toggle' ); assert.equal( $content.length, 1, 'content is present' ); assert.equal( $content.find( $toggle ).length, 0, 'toggle is not a descendant of content' ); assert.assertTrue( $content.is( ':visible' ), 'content is visible' ); $collapsible.on( 'afterCollapse.mw-collapsible', function () { assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' ); $collapsible.on( 'afterExpand.mw-collapsible', function () { assert.assertTrue( $content.is( ':visible' ), 'after expanding: content is visible' ); } ); $toggle.trigger( 'click' ); test.clock.tick( 500 ); } ); $toggle.trigger( 'click' ); test.clock.tick( 500 ); } ); QUnit.test( 'basic operation ()', 7, function ( assert ) { var test = this, $collapsible = prepareCollapsible( '
' + '' + '' + '' + '
' + loremIpsum + '' + loremIpsum + '
' + loremIpsum + '' + loremIpsum + '
' + loremIpsum + '' + loremIpsum + '
' ), $headerRow = $collapsible.find( 'tr:first' ), $contentRow = $collapsible.find( 'tr:last' ), $toggle = $headerRow.find( 'td:last .mw-collapsible-toggle' ); assert.equal( $toggle.length, 1, 'toggle is added to last cell of first row' ); assert.assertTrue( $headerRow.is( ':visible' ), 'headerRow is visible' ); assert.assertTrue( $contentRow.is( ':visible' ), 'contentRow is visible' ); $collapsible.on( 'afterCollapse.mw-collapsible', function () { assert.assertTrue( $headerRow.is( ':visible' ), 'after collapsing: headerRow is still visible' ); assert.assertTrue( $contentRow.is( ':hidden' ), 'after collapsing: contentRow is hidden' ); $collapsible.on( 'afterExpand.mw-collapsible', function () { assert.assertTrue( $headerRow.is( ':visible' ), 'after expanding: headerRow is still visible' ); assert.assertTrue( $contentRow.is( ':visible' ), 'after expanding: contentRow is visible' ); } ); $toggle.trigger( 'click' ); test.clock.tick( 500 ); } ); $toggle.trigger( 'click' ); test.clock.tick( 500 ); } ); function tableWithCaptionTest( $collapsible, test, assert ) { var $caption = $collapsible.find( 'caption' ), $headerRow = $collapsible.find( 'tr:first' ), $contentRow = $collapsible.find( 'tr:last' ), $toggle = $caption.find( '.mw-collapsible-toggle' ); assert.equal( $toggle.length, 1, 'toggle is added to the end of the caption' ); assert.assertTrue( $caption.is( ':visible' ), 'caption is visible' ); assert.assertTrue( $headerRow.is( ':visible' ), 'headerRow is visible' ); assert.assertTrue( $contentRow.is( ':visible' ), 'contentRow is visible' ); $collapsible.on( 'afterCollapse.mw-collapsible', function () { assert.assertTrue( $caption.is( ':visible' ), 'after collapsing: caption is still visible' ); assert.assertTrue( $headerRow.is( ':hidden' ), 'after collapsing: headerRow is hidden' ); assert.assertTrue( $contentRow.is( ':hidden' ), 'after collapsing: contentRow is hidden' ); $collapsible.on( 'afterExpand.mw-collapsible', function () { assert.assertTrue( $caption.is( ':visible' ), 'after expanding: caption is still visible' ); assert.assertTrue( $headerRow.is( ':visible' ), 'after expanding: headerRow is visible' ); assert.assertTrue( $contentRow.is( ':visible' ), 'after expanding: contentRow is visible' ); } ); $toggle.trigger( 'click' ); test.clock.tick( 500 ); } ); $toggle.trigger( 'click' ); test.clock.tick( 500 ); } QUnit.test( 'basic operation ( with caption)', 10, function ( assert ) { tableWithCaptionTest( prepareCollapsible( '
' + '' + '' + '' + '' + '
' + loremIpsum + '
' + loremIpsum + '' + loremIpsum + '
' + loremIpsum + '' + loremIpsum + '
' + loremIpsum + '' + loremIpsum + '
' ), this, assert ); } ); QUnit.test( 'basic operation ( with caption and )', 10, function ( assert ) { tableWithCaptionTest( prepareCollapsible( '
' + '' + '' + '' + '' + '
' + loremIpsum + '
' + loremIpsum + '' + loremIpsum + '
' + loremIpsum + '' + loremIpsum + '
' + loremIpsum + '' + loremIpsum + '
' ), this, assert ); } ); function listTest( listType, test, assert ) { var $collapsible = prepareCollapsible( '<' + listType + ' class="mw-collapsible">' + '
  • ' + loremIpsum + '
  • ' + '
  • ' + loremIpsum + '
  • ' + '' ), $toggleItem = $collapsible.find( 'li.mw-collapsible-toggle-li:first-child' ), $contentItem = $collapsible.find( 'li:last' ), $toggle = $toggleItem.find( '.mw-collapsible-toggle' ); assert.equal( $toggle.length, 1, 'toggle is present, added inside new zeroth list item' ); assert.assertTrue( $toggleItem.is( ':visible' ), 'toggleItem is visible' ); assert.assertTrue( $contentItem.is( ':visible' ), 'contentItem is visible' ); $collapsible.on( 'afterCollapse.mw-collapsible', function () { assert.assertTrue( $toggleItem.is( ':visible' ), 'after collapsing: toggleItem is still visible' ); assert.assertTrue( $contentItem.is( ':hidden' ), 'after collapsing: contentItem is hidden' ); $collapsible.on( 'afterExpand.mw-collapsible', function () { assert.assertTrue( $toggleItem.is( ':visible' ), 'after expanding: toggleItem is still visible' ); assert.assertTrue( $contentItem.is( ':visible' ), 'after expanding: contentItem is visible' ); } ); $toggle.trigger( 'click' ); test.clock.tick( 500 ); } ); $toggle.trigger( 'click' ); test.clock.tick( 500 ); } QUnit.test( 'basic operation (