XmlSelectTest.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <?php
  2. /**
  3. * @group Xml
  4. */
  5. class XmlSelectTest extends MediaWikiTestCase {
  6. /**
  7. * @var XmlSelect
  8. */
  9. protected $select;
  10. protected function setUp() {
  11. parent::setUp();
  12. $this->select = new XmlSelect();
  13. }
  14. protected function tearDown() {
  15. parent::tearDown();
  16. $this->select = null;
  17. }
  18. /**
  19. * @covers XmlSelect::__construct
  20. */
  21. public function testConstructWithoutParameters() {
  22. $this->assertEquals( '<select></select>', $this->select->getHTML() );
  23. }
  24. /**
  25. * Parameters are $name (false), $id (false), $default (false)
  26. * @dataProvider provideConstructionParameters
  27. * @covers XmlSelect::__construct
  28. */
  29. public function testConstructParameters( $name, $id, $default, $expected ) {
  30. $this->select = new XmlSelect( $name, $id, $default );
  31. $this->assertEquals( $expected, $this->select->getHTML() );
  32. }
  33. /**
  34. * Provide parameters for testConstructParameters() which use three
  35. * parameters:
  36. * - $name (default: false)
  37. * - $id (default: false)
  38. * - $default (default: false)
  39. * Provides a fourth parameters representing the expected HTML output
  40. */
  41. public static function provideConstructionParameters() {
  42. return [
  43. /**
  44. * Values are set following a 3-bit Gray code where two successive
  45. * values differ by only one value.
  46. * See https://en.wikipedia.org/wiki/Gray_code
  47. */
  48. # $name $id $default
  49. [ false, false, false, '<select></select>' ],
  50. [ false, false, 'foo', '<select></select>' ],
  51. [ false, 'id', 'foo', '<select id="id"></select>' ],
  52. [ false, 'id', false, '<select id="id"></select>' ],
  53. [ 'name', 'id', false, '<select name="name" id="id"></select>' ],
  54. [ 'name', 'id', 'foo', '<select name="name" id="id"></select>' ],
  55. [ 'name', false, 'foo', '<select name="name"></select>' ],
  56. [ 'name', false, false, '<select name="name"></select>' ],
  57. ];
  58. }
  59. /**
  60. * @covers XmlSelect::addOption
  61. */
  62. public function testAddOption() {
  63. $this->select->addOption( 'foo' );
  64. $this->assertEquals(
  65. '<select><option value="foo">foo</option></select>',
  66. $this->select->getHTML()
  67. );
  68. }
  69. /**
  70. * @covers XmlSelect::addOption
  71. */
  72. public function testAddOptionWithDefault() {
  73. $this->select->addOption( 'foo', true );
  74. $this->assertEquals(
  75. '<select><option value="1">foo</option></select>',
  76. $this->select->getHTML()
  77. );
  78. }
  79. /**
  80. * @covers XmlSelect::addOption
  81. */
  82. public function testAddOptionWithFalse() {
  83. $this->select->addOption( 'foo', false );
  84. $this->assertEquals(
  85. '<select><option value="foo">foo</option></select>',
  86. $this->select->getHTML()
  87. );
  88. }
  89. /**
  90. * @covers XmlSelect::addOption
  91. */
  92. public function testAddOptionWithValueZero() {
  93. $this->select->addOption( 'foo', 0 );
  94. $this->assertEquals(
  95. '<select><option value="0">foo</option></select>',
  96. $this->select->getHTML()
  97. );
  98. }
  99. /**
  100. * @covers XmlSelect::setDefault
  101. */
  102. public function testSetDefault() {
  103. $this->select->setDefault( 'bar1' );
  104. $this->select->addOption( 'foo1' );
  105. $this->select->addOption( 'bar1' );
  106. $this->select->addOption( 'foo2' );
  107. $this->assertEquals(
  108. '<select><option value="foo1">foo1</option>' . "\n" .
  109. '<option value="bar1" selected="">bar1</option>' . "\n" .
  110. '<option value="foo2">foo2</option></select>', $this->select->getHTML() );
  111. }
  112. /**
  113. * Adding default later on should set the correct selection or
  114. * raise an exception.
  115. * To handle this, we need to render the options in getHtml()
  116. * @covers XmlSelect::setDefault
  117. */
  118. public function testSetDefaultAfterAddingOptions() {
  119. $this->select->addOption( 'foo1' );
  120. $this->select->addOption( 'bar1' );
  121. $this->select->addOption( 'foo2' );
  122. $this->select->setDefault( 'bar1' ); # setting default after adding options
  123. $this->assertEquals(
  124. '<select><option value="foo1">foo1</option>' . "\n" .
  125. '<option value="bar1" selected="">bar1</option>' . "\n" .
  126. '<option value="foo2">foo2</option></select>', $this->select->getHTML() );
  127. }
  128. /**
  129. * @covers XmlSelect::setAttribute
  130. * @covers XmlSelect::getAttribute
  131. */
  132. public function testGetAttributes() {
  133. # create some attributes
  134. $this->select->setAttribute( 'dummy', 0x777 );
  135. $this->select->setAttribute( 'string', 'euro €' );
  136. $this->select->setAttribute( 1911, 'razor' );
  137. # verify we can retrieve them
  138. $this->assertEquals(
  139. $this->select->getAttribute( 'dummy' ),
  140. 0x777
  141. );
  142. $this->assertEquals(
  143. $this->select->getAttribute( 'string' ),
  144. 'euro €'
  145. );
  146. $this->assertEquals(
  147. $this->select->getAttribute( 1911 ),
  148. 'razor'
  149. );
  150. # inexistent keys should give us 'null'
  151. $this->assertEquals(
  152. $this->select->getAttribute( 'I DO NOT EXIT' ),
  153. null
  154. );
  155. # verify string / integer
  156. $this->assertEquals(
  157. $this->select->getAttribute( '1911' ),
  158. 'razor'
  159. );
  160. $this->assertEquals(
  161. $this->select->getAttribute( 'dummy' ),
  162. 0x777
  163. );
  164. }
  165. }