/lib/tests/formslib_test.php

https://github.com/scriby/moodle · PHP · 220 lines · 157 code · 32 blank · 31 comment · 3 complexity · 5e562e3bbf303474db9c35bf857dd92d MD5 · raw file

  1. <?php
  2. // This file is part of Moodle - http://moodle.org/
  3. //
  4. // Moodle is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // Moodle is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
  16. /**
  17. * Unit tests for /lib/formslib.php.
  18. *
  19. * @package core_form
  20. * @category phpunit
  21. * @copyright 2011 Sam Hemelryk
  22. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23. */
  24. defined('MOODLE_INTERNAL') || die();
  25. global $CFG;
  26. require_once($CFG->libdir . '/formslib.php');
  27. require_once($CFG->libdir . '/form/radio.php');
  28. require_once($CFG->libdir . '/form/select.php');
  29. require_once($CFG->libdir . '/form/text.php');
  30. class formslib_testcase extends basic_testcase {
  31. public function test_require_rule() {
  32. global $CFG;
  33. $strictformsrequired = null;
  34. if (isset($CFG->strictformsrequired)) {
  35. $strictformsrequired = $CFG->strictformsrequired;
  36. }
  37. $rule = new MoodleQuickForm_Rule_Required();
  38. // First run the tests with strictformsrequired off
  39. $CFG->strictformsrequired = false;
  40. // Passes
  41. $this->assertTrue($rule->validate('Something'));
  42. $this->assertTrue($rule->validate("Something\nmore"));
  43. $this->assertTrue($rule->validate("\nmore"));
  44. $this->assertTrue($rule->validate(" more "));
  45. $this->assertTrue($rule->validate("0"));
  46. $this->assertTrue($rule->validate(0));
  47. $this->assertTrue($rule->validate(true));
  48. $this->assertTrue($rule->validate(' '));
  49. $this->assertTrue($rule->validate(' '));
  50. $this->assertTrue($rule->validate("\t"));
  51. $this->assertTrue($rule->validate("\n"));
  52. $this->assertTrue($rule->validate("\r"));
  53. $this->assertTrue($rule->validate("\r\n"));
  54. $this->assertTrue($rule->validate(" \t \n \r "));
  55. $this->assertTrue($rule->validate('<p></p>'));
  56. $this->assertTrue($rule->validate('<p> </p>'));
  57. $this->assertTrue($rule->validate('<p>x</p>'));
  58. $this->assertTrue($rule->validate('<img src="smile.jpg" alt="smile" />'));
  59. $this->assertTrue($rule->validate('<img src="smile.jpg" alt="smile"/>'));
  60. $this->assertTrue($rule->validate('<img src="smile.jpg" alt="smile"></img>'));
  61. $this->assertTrue($rule->validate('<hr />'));
  62. $this->assertTrue($rule->validate('<hr/>'));
  63. $this->assertTrue($rule->validate('<hr>'));
  64. $this->assertTrue($rule->validate('<hr></hr>'));
  65. $this->assertTrue($rule->validate('<br />'));
  66. $this->assertTrue($rule->validate('<br/>'));
  67. $this->assertTrue($rule->validate('<br>'));
  68. $this->assertTrue($rule->validate('&nbsp;'));
  69. // Fails
  70. $this->assertFalse($rule->validate(''));
  71. $this->assertFalse($rule->validate(false));
  72. $this->assertFalse($rule->validate(null));
  73. // Now run the same tests with it on to make sure things work as expected
  74. $CFG->strictformsrequired = true;
  75. // Passes
  76. $this->assertTrue($rule->validate('Something'));
  77. $this->assertTrue($rule->validate("Something\nmore"));
  78. $this->assertTrue($rule->validate("\nmore"));
  79. $this->assertTrue($rule->validate(" more "));
  80. $this->assertTrue($rule->validate("0"));
  81. $this->assertTrue($rule->validate(0));
  82. $this->assertTrue($rule->validate(true));
  83. $this->assertTrue($rule->validate('<p>x</p>'));
  84. $this->assertTrue($rule->validate('<img src="smile.jpg" alt="smile" />'));
  85. $this->assertTrue($rule->validate('<img src="smile.jpg" alt="smile"/>'));
  86. $this->assertTrue($rule->validate('<img src="smile.jpg" alt="smile"></img>'));
  87. $this->assertTrue($rule->validate('<hr />'));
  88. $this->assertTrue($rule->validate('<hr/>'));
  89. $this->assertTrue($rule->validate('<hr>'));
  90. $this->assertTrue($rule->validate('<hr></hr>'));
  91. // Fails
  92. $this->assertFalse($rule->validate(' '));
  93. $this->assertFalse($rule->validate(' '));
  94. $this->assertFalse($rule->validate("\t"));
  95. $this->assertFalse($rule->validate("\n"));
  96. $this->assertFalse($rule->validate("\r"));
  97. $this->assertFalse($rule->validate("\r\n"));
  98. $this->assertFalse($rule->validate(" \t \n \r "));
  99. $this->assertFalse($rule->validate('<p></p>'));
  100. $this->assertFalse($rule->validate('<p> </p>'));
  101. $this->assertFalse($rule->validate('<br />'));
  102. $this->assertFalse($rule->validate('<br/>'));
  103. $this->assertFalse($rule->validate('<br>'));
  104. $this->assertFalse($rule->validate('&nbsp;'));
  105. $this->assertFalse($rule->validate(''));
  106. $this->assertFalse($rule->validate(false));
  107. $this->assertFalse($rule->validate(null));
  108. if (isset($strictformsrequired)) {
  109. $CFG->strictformsrequired = $strictformsrequired;
  110. }
  111. }
  112. public function test_generate_id_select() {
  113. $el = new MoodleQuickForm_select('choose_one', 'Choose one',
  114. array(1 => 'One', '2' => 'Two'));
  115. $el->_generateId();
  116. $this->assertEquals('id_choose_one', $el->getAttribute('id'));
  117. }
  118. public function test_generate_id_like_repeat() {
  119. $el = new MoodleQuickForm_text('text[7]', 'Type something');
  120. $el->_generateId();
  121. $this->assertEquals('id_text_7', $el->getAttribute('id'));
  122. }
  123. public function test_can_manually_set_id() {
  124. $el = new MoodleQuickForm_text('elementname', 'Type something',
  125. array('id' => 'customelementid'));
  126. $el->_generateId();
  127. $this->assertEquals('customelementid', $el->getAttribute('id'));
  128. }
  129. public function test_generate_id_radio() {
  130. $el = new MoodleQuickForm_radio('radio', 'Label', 'Choice label', 'choice_value');
  131. $el->_generateId();
  132. $this->assertEquals('id_radio_choice_value', $el->getAttribute('id'));
  133. }
  134. public function test_radio_can_manually_set_id() {
  135. $el = new MoodleQuickForm_radio('radio2', 'Label', 'Choice label', 'choice_value',
  136. array('id' => 'customelementid2'));
  137. $el->_generateId();
  138. $this->assertEquals('customelementid2', $el->getAttribute('id'));
  139. }
  140. public function test_generate_id_radio_like_repeat() {
  141. $el = new MoodleQuickForm_radio('repeatradio[2]', 'Label', 'Choice label', 'val');
  142. $el->_generateId();
  143. $this->assertEquals('id_repeatradio_2_val', $el->getAttribute('id'));
  144. }
  145. public function test_rendering() {
  146. $form = new formslib_test_form();
  147. ob_start();
  148. $form->display();
  149. $html = ob_get_clean();
  150. $this->assertTag(array('tag'=>'select', 'id'=>'id_choose_one',
  151. 'attributes'=>array('name'=>'choose_one')), $html);
  152. $this->assertTag(array('tag'=>'input', 'id'=>'id_text_0',
  153. 'attributes'=>array('type'=>'text', 'name'=>'text[0]')), $html);
  154. $this->assertTag(array('tag'=>'input', 'id'=>'id_text_1',
  155. 'attributes'=>array('type'=>'text', 'name'=>'text[1]')), $html);
  156. $this->assertTag(array('tag'=>'input', 'id'=>'id_radio_choice_value',
  157. 'attributes'=>array('type'=>'radio', 'name'=>'radio', 'value'=>'choice_value')), $html);
  158. $this->assertTag(array('tag'=>'input', 'id'=>'customelementid2',
  159. 'attributes'=>array('type'=>'radio', 'name'=>'radio2')), $html);
  160. $this->assertTag(array('tag'=>'input', 'id'=>'id_repeatradio_0_2',
  161. 'attributes'=>array('type'=>'radio', 'name'=>'repeatradio[0]', 'value'=>'2')), $html);
  162. $this->assertTag(array('tag'=>'input', 'id'=>'id_repeatradio_2_1',
  163. 'attributes'=>array('type'=>'radio', 'name'=>'repeatradio[2]', 'value'=>'1')), $html);
  164. $this->assertTag(array('tag'=>'input', 'id'=>'id_repeatradio_2_2',
  165. 'attributes'=>array('type'=>'radio', 'name'=>'repeatradio[2]', 'value'=>'2')), $html);
  166. }
  167. }
  168. /**
  169. * Test form to be used by {@link formslib_test::test_rendering()}.
  170. */
  171. class formslib_test_form extends moodleform {
  172. public function definition() {
  173. $this->_form->addElement('select', 'choose_one', 'Choose one',
  174. array(1 => 'One', '2' => 'Two'));
  175. $repeatels = array(
  176. $this->_form->createElement('text', 'text', 'Type something')
  177. );
  178. $this->repeat_elements($repeatels, 2, array(), 'numtexts', 'addtexts');
  179. $this->_form->addElement('radio', 'radio', 'Label', 'Choice label', 'choice_value');
  180. $this->_form->addElement('radio', 'radio2', 'Label', 'Choice label', 'choice_value',
  181. array('id' => 'customelementid2'));
  182. $repeatels = array(
  183. $this->_form->createElement('radio', 'repeatradio', 'Choose {no}', 'One', 1),
  184. $this->_form->createElement('radio', 'repeatradio', 'Choose {no}', 'Two', 2),
  185. );
  186. $this->repeat_elements($repeatels, 3, array(), 'numradios', 'addradios');
  187. }
  188. }