X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=tests%2Fphpunit%2Fincludes%2FHtmlTest.php;h=95a6cb0a04be7aec72b4eb184b7a9c631f6a5392;hb=2759e2a5efc1df364424caa4cc27f281a9a63662;hp=a18f7922f04c5b5cd1f4514b9f902d77246dfa66;hpb=6518ffba8de49e687a114d28aa919f49a3845af6;p=lhc%2Fweb%2Fwiklou.git diff --git a/tests/phpunit/includes/HtmlTest.php b/tests/phpunit/includes/HtmlTest.php index a18f7922f0..95a6cb0a04 100644 --- a/tests/phpunit/includes/HtmlTest.php +++ b/tests/phpunit/includes/HtmlTest.php @@ -2,29 +2,17 @@ /** tests for includes/Html.php */ class HtmlTest extends MediaWikiTestCase { - private static $oldLang; - private static $oldContLang; - private static $oldLanguageCode; - private static $oldNamespaces; - private static $oldHTML5; - public function setUp() { - global $wgLang, $wgContLang, $wgLanguageCode, $wgHTML5; + protected function setUp() { + parent::setUp(); - // Save globals - self::$oldLang = $wgLang; - self::$oldContLang = $wgContLang; - self::$oldNamespaces = $wgContLang->getNamespaces(); - self::$oldLanguageCode = $wgLanguageCode; - self::$oldHTML5 = $wgHTML5; - - $wgLanguageCode = 'en'; - $wgContLang = $wgLang = Language::factory( $wgLanguageCode ); + $langCode = 'en'; + $langObj = Language::factory( $langCode ); // Hardcode namespaces during test runs, // so that html output based on existing namespaces // can be properly evaluated. - $wgContLang->setNamespaces( array( + $langObj->setNamespaces( array( -2 => 'Media', -1 => 'Special', 0 => '', @@ -44,77 +32,102 @@ class HtmlTest extends MediaWikiTestCase { 100 => 'Custom', 101 => 'Custom_talk', ) ); + + $this->setMwGlobals( array( + 'wgLanguageCode' => $langCode, + 'wgContLang' => $langObj, + 'wgLang' => $langObj, + 'wgHtml5' => true, + 'wgWellFormedXml' => false, + ) ); } - public function tearDown() { - global $wgLang, $wgContLang, $wgLanguageCode, $wgHTML5; + public function testElementBasics() { + global $wgWellFormedXml; - // Restore globals - $wgContLang->setNamespaces( self::$oldNamespaces ); - $wgLang = self::$oldLang; - $wgContLang = self::$oldContLang; - $wgLanguageCode = self::$oldLanguageCode; - $wgHTML5 = self::$oldHTML5; - } + $this->assertEquals( + '', + Html::element( 'img', null, '' ), + 'No close tag for short-tag elements' + ); - /** - * Wrapper to easily set $wgHTML5 = true. - * Original value will be restored after test completion. - * @todo Move to MediaWikiTestCase - */ - public function enableHTML5() { - global $wgHTML5; - $wgHTML5 = true; - } - /** - * Wrapper to easily set $wgHTML5 = false - * Original value will be restored after test completion. - * @todo Move to MediaWikiTestCase - */ - public function disableHTML5() { - global $wgHTML5; - $wgHTML5 = false; + $this->assertEquals( + '', + Html::element( 'element', null, null ), + 'Close tag for empty element (null, null)' + ); + + $this->assertEquals( + '', + Html::element( 'element', array(), '' ), + 'Close tag for empty element (array, string)' + ); + + $wgWellFormedXml = true; + + $this->assertEquals( + '', + Html::element( 'img', null, '' ), + 'Self-closing tag for short-tag elements (wgWellFormedXml = true)' + ); } public function testExpandAttributesSkipsNullAndFalse() { ### EMPTY ######## - $this->AssertEmpty( + $this->assertEmpty( Html::expandAttributes( array( 'foo' => null ) ), 'skip keys with null value' ); - $this->AssertEmpty( + $this->assertEmpty( Html::expandAttributes( array( 'foo' => false ) ), 'skip keys with false value' ); - $this->AssertNotEmpty( + $this->assertNotEmpty( Html::expandAttributes( array( 'foo' => '' ) ), 'keep keys with an empty string' ); } public function testExpandAttributesForBooleans() { - global $wgHtml5; - $this->AssertEquals( + global $wgHtml5, $wgWellFormedXml; + + $this->assertEquals( '', Html::expandAttributes( array( 'selected' => false ) ), 'Boolean attributes do not generates output when value is false' ); - $this->AssertEquals( + $this->assertEquals( '', Html::expandAttributes( array( 'selected' => null ) ), 'Boolean attributes do not generates output when value is null' ); - $this->AssertEquals( - $wgHtml5 ? ' selected=""' : ' selected="selected"', + $this->assertEquals( + ' selected', Html::expandAttributes( array( 'selected' => true ) ), - 'Boolean attributes skip value output' + 'Boolean attributes have no value when value is true' ); - $this->AssertEquals( - $wgHtml5 ? ' selected=""' : ' selected="selected"', + $this->assertEquals( + ' selected', Html::expandAttributes( array( 'selected' ) ), - 'Boolean attributes (ex: selected) do not need a value' + 'Boolean attributes have no value when value is true (passed as numerical array)' + ); + + $wgWellFormedXml = true; + + $this->assertEquals( + ' selected=""', + Html::expandAttributes( array( 'selected' => true ) ), + 'Boolean attributes have empty string value when value is true (wgWellFormedXml)' + ); + + $wgHtml5 = false; + + $this->assertEquals( + ' selected="selected"', + Html::expandAttributes( array( 'selected' => true ) ), + 'Boolean attributes have their key as value when value is true (wgWellFormedXml, wgHTML5 = false)' ); } @@ -123,26 +136,51 @@ class HtmlTest extends MediaWikiTestCase { * Please note it output a string prefixed with a space! */ public function testExpandAttributesVariousExpansions() { + global $wgWellFormedXml; + ### NOT EMPTY #### - $this->AssertEquals( + $this->assertEquals( ' empty_string=""', Html::expandAttributes( array( 'empty_string' => '' ) ), - 'Value with an empty string' + 'Empty string is always quoted' + ); + $this->assertEquals( + ' key=value', + Html::expandAttributes( array( 'key' => 'value' ) ), + 'Simple string value needs no quotes' + ); + $this->assertEquals( + ' one=1', + Html::expandAttributes( array( 'one' => 1 ) ), + 'Number 1 value needs no quotes' ); - $this->AssertEquals( + $this->assertEquals( + ' zero=0', + Html::expandAttributes( array( 'zero' => 0 ) ), + 'Number 0 value needs no quotes' + ); + + $wgWellFormedXml = true; + + $this->assertEquals( + ' empty_string=""', + Html::expandAttributes( array( 'empty_string' => '' ) ), + 'Attribtue values are always quoted (wgWellFormedXml): Empty string' + ); + $this->assertEquals( ' key="value"', Html::expandAttributes( array( 'key' => 'value' ) ), - 'Value is a string' + 'Attribtue values are always quoted (wgWellFormedXml): Simple string' ); - $this->AssertEquals( + $this->assertEquals( ' one="1"', Html::expandAttributes( array( 'one' => 1 ) ), - 'Value is a numeric one' + 'Attribtue values are always quoted (wgWellFormedXml): Number 1' ); - $this->AssertEquals( + $this->assertEquals( ' zero="0"', Html::expandAttributes( array( 'zero' => 0 ) ), - 'Value is a numeric zero' + 'Attribtue values are always quoted (wgWellFormedXml): Number 0' ); } @@ -153,29 +191,29 @@ class HtmlTest extends MediaWikiTestCase { */ public function testExpandAttributesListValueAttributes() { ### STRING VALUES - $this->AssertEquals( + $this->assertEquals( ' class="redundant spaces here"', Html::expandAttributes( array( 'class' => ' redundant spaces here ' ) ), 'Normalization should strip redundant spaces' ); - $this->AssertEquals( + $this->assertEquals( ' class="foo bar"', Html::expandAttributes( array( 'class' => 'foo bar foo bar bar' ) ), 'Normalization should remove duplicates in string-lists' ); ### "EMPTY" ARRAY VALUES - $this->AssertEquals( + $this->assertEquals( ' class=""', Html::expandAttributes( array( 'class' => array() ) ), 'Value with an empty array' ); - $this->AssertEquals( + $this->assertEquals( ' class=""', Html::expandAttributes( array( 'class' => array( null, '', ' ', ' ' ) ) ), 'Array with null, empty string and spaces' ); ### NON-EMPTY ARRAY VALUES - $this->AssertEquals( + $this->assertEquals( ' class="foo bar"', Html::expandAttributes( array( 'class' => array( 'foo', @@ -186,7 +224,7 @@ class HtmlTest extends MediaWikiTestCase { ) ) ), 'Normalization should remove duplicates in the array' ); - $this->AssertEquals( + $this->assertEquals( ' class="foo bar"', Html::expandAttributes( array( 'class' => array( 'foo bar', @@ -239,48 +277,48 @@ class HtmlTest extends MediaWikiTestCase { function testNamespaceSelector() { $this->assertEquals( - '' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . '', Html::namespaceSelector(), 'Basic namespace selector without custom options' ); $this->assertEquals( - ' ' . -'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . '', Html::namespaceSelector( array( 'selected' => '2', 'all' => 'all', 'label' => 'Select a namespace:' ), @@ -290,24 +328,24 @@ class HtmlTest extends MediaWikiTestCase { ); $this->assertEquals( - ' ' . -'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . '', Html::namespaceSelector( array( 'label' => 'Select a namespace:' ) @@ -318,18 +356,18 @@ class HtmlTest extends MediaWikiTestCase { function testCanFilterOutNamespaces() { $this->assertEquals( -'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . '', Html::namespaceSelector( array( 'exclude' => array( 0, 1, 3, 100, 101 ) ) @@ -340,23 +378,23 @@ class HtmlTest extends MediaWikiTestCase { function testCanDisableANamespaces() { $this->assertEquals( -'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . +'' . "\n" . '', Html::namespaceSelector( array( 'disable' => array( 0, 1, 2, 3, 4 ) @@ -366,13 +404,12 @@ class HtmlTest extends MediaWikiTestCase { } /** - * @dataProvider providesHtml5InputTypes + * @dataProvider provideHtml5InputTypes */ function testHtmlElementAcceptsNewHtml5TypesInHtml5Mode( $HTML5InputType ) { - $this->enableHTML5(); $this->assertEquals( - '', - HTML::element( 'input', array( 'type' => $HTML5InputType ) ), + '', + Html::element( 'input', array( 'type' => $HTML5InputType ) ), 'In HTML5, HTML::element() should accept type="' . $HTML5InputType . '"' ); } @@ -381,7 +418,7 @@ class HtmlTest extends MediaWikiTestCase { * List of input element types values introduced by HTML5 * Full list at http://www.w3.org/TR/html-markup/input.html */ - function providesHtml5InputTypes() { + function provideHtml5InputTypes() { $types = array( 'datetime', 'datetime-local', @@ -409,19 +446,18 @@ class HtmlTest extends MediaWikiTestCase { * @cover Html::dropDefaults * @dataProvider provideElementsWithAttributesHavingDefaultValues */ - function testDropDefaults( $expected, $element, $message = '' ) { - $this->enableHTML5(); - $this->assertEquals( $expected, $element, $message ); + function testDropDefaults( $expected, $element, $attribs, $message = '' ) { + $this->assertEquals( $expected, Html::element( $element, $attribs ), $message ); } - function provideElementsWithAttributesHavingDefaultValues() { + public static function provideElementsWithAttributesHavingDefaultValues() { # Use cases in a concise format: # , , [, ] # Will be mapped to Html::element() $cases = array(); ### Generic cases, match $attribDefault static array - $cases[] = array( '', + $cases[] = array( '', 'area', array( 'shape' => 'rect' ) ); @@ -449,7 +485,7 @@ class HtmlTest extends MediaWikiTestCase { 'canvas', array( 'width' => 300 ) ); - $cases[] = array( '', + $cases[] = array( '', 'command', array( 'type' => 'command' ) ); @@ -463,18 +499,18 @@ class HtmlTest extends MediaWikiTestCase { 'form', array( 'enctype' => 'application/x-www-form-urlencoded' ) ); - $cases[] = array( '', + $cases[] = array( '', 'input', array( 'formaction' => 'GET' ) ); - $cases[] = array( '', + $cases[] = array( '', 'input', array( 'type' => 'text' ) ); - $cases[] = array( '', + $cases[] = array( '', 'keygen', array( 'keytype' => 'rsa' ) ); - $cases[] = array( '', + $cases[] = array( '', 'link', array( 'media' => 'all' ) ); @@ -499,37 +535,37 @@ class HtmlTest extends MediaWikiTestCase { ### SPECIFIC CASES - # - $cases[] = array( '', + # + $cases[] = array( '', 'link', array( 'type' => 'text/css' ) ); - # specific handling - $cases[] = array( '', + # specific handling + $cases[] = array( '', 'input', array( 'type' => 'checkbox', 'value' => 'on' ), 'Default value "on" is stripped of checkboxes', ); - $cases[] = array( '', + $cases[] = array( '', 'input', array( 'type' => 'radio', 'value' => 'on' ), 'Default value "on" is stripped of radio buttons', ); - $cases[] = array( '', + $cases[] = array( '', 'input', array( 'type' => 'submit', 'value' => 'Submit' ), 'Default value "Submit" is kept on submit buttons (for possible l10n issues)', ); - $cases[] = array( '', + $cases[] = array( '', 'input', array( 'type' => 'color', 'value' => '' ), ); - $cases[] = array( '', + $cases[] = array( '', 'input', array( 'type' => 'range', 'value' => '' ), ); - # ', + # ', 'select', array( 'size' => '4', 'multiple' => true ), ); # .. with numeric value - $cases[] = array( '', + $cases[] = array( '', 'select', array( 'size' => 4, 'multiple' => true ), ); $cases[] = array( '', @@ -553,13 +589,13 @@ class HtmlTest extends MediaWikiTestCase { "dropDefaults accepts values given as an array" ); - # Craft the Html elements $ret = array(); foreach( $cases as $case ) { $ret[] = array( $case[0], - Html::element( $case[1], $case[2] ) + $case[1], $case[2], + isset( $case[3] ) ? $case[3] : '' ); } return $ret;