ChoiceFieldTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. <?php
  2. namespace Symfony\Tests\Component\Form;
  3. use Symfony\Component\Form\ChoiceField;
  4. class ChoiceFieldTest extends \PHPUnit_Framework_TestCase
  5. {
  6. protected $choices = array(
  7. 'a' => 'Bernhard',
  8. 'b' => 'Fabien',
  9. 'c' => 'Kris',
  10. 'd' => 'Jon',
  11. 'e' => 'Roman',
  12. );
  13. protected $preferredChoices = array('d', 'e');
  14. protected $groupedChoices = array(
  15. 'Symfony' => array(
  16. 'a' => 'Bernhard',
  17. 'b' => 'Fabien',
  18. 'c' => 'Kris',
  19. ),
  20. 'Doctrine' => array(
  21. 'd' => 'Jon',
  22. 'e' => 'Roman',
  23. )
  24. );
  25. public function testBindSingleNonExpanded()
  26. {
  27. $field = new ChoiceField('name', array(
  28. 'multiple' => false,
  29. 'expanded' => false,
  30. 'choices' => $this->choices,
  31. ));
  32. $field->bind('b');
  33. $this->assertEquals('b', $field->getData());
  34. $this->assertEquals('b', $field->getDisplayedData());
  35. }
  36. public function testRenderSingleNonExpanded()
  37. {
  38. $field = new ChoiceField('name', array(
  39. 'multiple' => false,
  40. 'expanded' => false,
  41. 'choices' => $this->choices,
  42. ));
  43. $field->setData('b');
  44. $html = <<<EOF
  45. <select id="name" name="name" class="foobar">
  46. <option value="a">Bernhard</option>
  47. <option value="b" selected="selected">Fabien</option>
  48. <option value="c">Kris</option>
  49. <option value="d">Jon</option>
  50. <option value="e">Roman</option>
  51. </select>
  52. EOF;
  53. $this->assertEquals($html, $field->render(array(
  54. 'class' => 'foobar',
  55. )));
  56. }
  57. public function testRenderSingleNonExpanded_translateChoices()
  58. {
  59. $translator = $this->getMock('Symfony\Component\I18N\TranslatorInterface');
  60. $translator->expects($this->any())
  61. ->method('translate')
  62. ->will($this->returnCallback(function($text) {
  63. return 'translated['.$text.']';
  64. }));
  65. $field = new ChoiceField('name', array(
  66. 'multiple' => false,
  67. 'expanded' => false,
  68. 'choices' => $this->choices,
  69. 'translate_choices' => true,
  70. ));
  71. $field->setTranslator($translator);
  72. $field->setData('b');
  73. $html = <<<EOF
  74. <select id="name" name="name" class="foobar">
  75. <option value="a">translated[Bernhard]</option>
  76. <option value="b" selected="selected">translated[Fabien]</option>
  77. <option value="c">translated[Kris]</option>
  78. <option value="d">translated[Jon]</option>
  79. <option value="e">translated[Roman]</option>
  80. </select>
  81. EOF;
  82. $this->assertEquals($html, $field->render(array(
  83. 'class' => 'foobar',
  84. )));
  85. }
  86. public function testRenderSingleNonExpanded_disabled()
  87. {
  88. $field = new ChoiceField('name', array(
  89. 'multiple' => false,
  90. 'expanded' => false,
  91. 'choices' => $this->choices,
  92. 'disabled' => true,
  93. ));
  94. $html = <<<EOF
  95. <select id="name" name="name" disabled="disabled">
  96. <option value="a">Bernhard</option>
  97. <option value="b">Fabien</option>
  98. <option value="c">Kris</option>
  99. <option value="d">Jon</option>
  100. <option value="e">Roman</option>
  101. </select>
  102. EOF;
  103. $this->assertEquals($html, $field->render());
  104. }
  105. public function testRenderSingleNonExpandedWithPreferred()
  106. {
  107. $field = new ChoiceField('name', array(
  108. 'multiple' => false,
  109. 'expanded' => false,
  110. 'choices' => $this->choices,
  111. 'preferred_choices' => $this->preferredChoices,
  112. 'separator' => '---',
  113. ));
  114. $field->setData('d');
  115. $html = <<<EOF
  116. <select id="name" name="name">
  117. <option value="d" selected="selected">Jon</option>
  118. <option value="e">Roman</option>
  119. <option disabled="disabled">---</option>
  120. <option value="a">Bernhard</option>
  121. <option value="b">Fabien</option>
  122. <option value="c">Kris</option>
  123. </select>
  124. EOF;
  125. $this->assertEquals($html, $field->render());
  126. }
  127. public function testRenderSingleNonExpandedWithGroups()
  128. {
  129. $field = new ChoiceField('name', array(
  130. 'multiple' => false,
  131. 'expanded' => false,
  132. 'choices' => $this->groupedChoices,
  133. ));
  134. $html = <<<EOF
  135. <select id="name" name="name">
  136. <optgroup label="Symfony">
  137. <option value="a">Bernhard</option>
  138. <option value="b">Fabien</option>
  139. <option value="c">Kris</option>
  140. </optgroup>
  141. <optgroup label="Doctrine">
  142. <option value="d">Jon</option>
  143. <option value="e">Roman</option>
  144. </optgroup>
  145. </select>
  146. EOF;
  147. $this->assertEquals($html, $field->render());
  148. }
  149. public function testRenderSingleNonExpandedNonRequired()
  150. {
  151. $field = new ChoiceField('name', array(
  152. 'multiple' => false,
  153. 'expanded' => false,
  154. 'choices' => $this->choices,
  155. 'empty_value' => 'empty',
  156. ));
  157. $field->setData(null);
  158. $field->setRequired(false);
  159. $html = <<<EOF
  160. <select id="name" name="name">
  161. <option value="" selected="selected">empty</option>
  162. <option value="a">Bernhard</option>
  163. <option value="b">Fabien</option>
  164. <option value="c">Kris</option>
  165. <option value="d">Jon</option>
  166. <option value="e">Roman</option>
  167. </select>
  168. EOF;
  169. $this->assertEquals($html, $field->render());
  170. }
  171. public function testBindMultipleNonExpanded()
  172. {
  173. $field = new ChoiceField('name', array(
  174. 'multiple' => true,
  175. 'expanded' => false,
  176. 'choices' => $this->choices,
  177. ));
  178. $field->bind(array('a', 'b'));
  179. $this->assertEquals(array('a', 'b'), $field->getData());
  180. $this->assertEquals(array('a', 'b'), $field->getDisplayedData());
  181. }
  182. public function testRenderMultipleNonExpanded()
  183. {
  184. $field = new ChoiceField('name', array(
  185. 'multiple' => true,
  186. 'expanded' => false,
  187. 'choices' => $this->choices,
  188. ));
  189. $field->setData(array('a', 'b'));
  190. $html = <<<EOF
  191. <select id="name" name="name[]" multiple="multiple">
  192. <option value="a" selected="selected">Bernhard</option>
  193. <option value="b" selected="selected">Fabien</option>
  194. <option value="c">Kris</option>
  195. <option value="d">Jon</option>
  196. <option value="e">Roman</option>
  197. </select>
  198. EOF;
  199. $this->assertEquals($html, $field->render());
  200. }
  201. public function testBindSingleExpanded()
  202. {
  203. $field = new ChoiceField('name', array(
  204. 'multiple' => true,
  205. 'expanded' => false,
  206. 'choices' => $this->choices,
  207. ));
  208. $field->bind('b');
  209. $this->assertEquals('b', $field->getData());
  210. $this->assertEquals('b', $field->getDisplayedData());
  211. }
  212. public function testRenderSingleExpanded()
  213. {
  214. $field = new ChoiceField('name', array(
  215. 'multiple' => false,
  216. 'expanded' => true,
  217. 'choices' => $this->choices,
  218. ));
  219. $field->setData('b');
  220. $html = <<<EOF
  221. <input id="name_a" name="name" value="a" type="radio" /> <label for="name_a">Bernhard</label>
  222. <input id="name_b" name="name" value="b" checked="checked" type="radio" /> <label for="name_b">Fabien</label>
  223. <input id="name_c" name="name" value="c" type="radio" /> <label for="name_c">Kris</label>
  224. <input id="name_d" name="name" value="d" type="radio" /> <label for="name_d">Jon</label>
  225. <input id="name_e" name="name" value="e" type="radio" /> <label for="name_e">Roman</label>
  226. EOF;
  227. $this->assertEquals($html, $field->render());
  228. }
  229. public function testRenderSingleExpanded_translateChoices()
  230. {
  231. $translator = $this->getMock('Symfony\Component\I18N\TranslatorInterface');
  232. $translator->expects($this->any())
  233. ->method('translate')
  234. ->will($this->returnCallback(function($text) {
  235. return 'translated['.$text.']';
  236. }));
  237. $field = new ChoiceField('name', array(
  238. 'multiple' => false,
  239. 'expanded' => true,
  240. 'choices' => $this->choices,
  241. 'translate_choices' => true,
  242. ));
  243. $field->setTranslator($translator);
  244. $field->setData('b');
  245. $html = <<<EOF
  246. <input id="name_a" name="name" value="a" type="radio" /> <label for="name_a">translated[Bernhard]</label>
  247. <input id="name_b" name="name" value="b" checked="checked" type="radio" /> <label for="name_b">translated[Fabien]</label>
  248. <input id="name_c" name="name" value="c" type="radio" /> <label for="name_c">translated[Kris]</label>
  249. <input id="name_d" name="name" value="d" type="radio" /> <label for="name_d">translated[Jon]</label>
  250. <input id="name_e" name="name" value="e" type="radio" /> <label for="name_e">translated[Roman]</label>
  251. EOF;
  252. $this->assertEquals($html, $field->render());
  253. }
  254. public function testRenderSingleExpandedWithPreferred()
  255. {
  256. $field = new ChoiceField('name', array(
  257. 'multiple' => false,
  258. 'expanded' => true,
  259. 'choices' => $this->choices,
  260. 'preferred_choices' => $this->preferredChoices,
  261. ));
  262. $html = <<<EOF
  263. <input id="name_d" name="name" value="d" type="radio" /> <label for="name_d">Jon</label>
  264. <input id="name_e" name="name" value="e" type="radio" /> <label for="name_e">Roman</label>
  265. <input id="name_a" name="name" value="a" type="radio" /> <label for="name_a">Bernhard</label>
  266. <input id="name_b" name="name" value="b" type="radio" /> <label for="name_b">Fabien</label>
  267. <input id="name_c" name="name" value="c" type="radio" /> <label for="name_c">Kris</label>
  268. EOF;
  269. $this->assertEquals($html, $field->render());
  270. }
  271. public function testBindMultipleExpanded()
  272. {
  273. $field = new ChoiceField('name', array(
  274. 'multiple' => true,
  275. 'expanded' => true,
  276. 'choices' => $this->choices,
  277. ));
  278. $field->bind(array('a' => 'a', 'b' => 'b'));
  279. $this->assertSame(array('a', 'b'), $field->getData());
  280. $this->assertSame(true, $field['a']->getData());
  281. $this->assertSame(true, $field['b']->getData());
  282. $this->assertSame(null, $field['c']->getData());
  283. $this->assertSame(null, $field['d']->getData());
  284. $this->assertSame(null, $field['e']->getData());
  285. $this->assertSame('1', $field['a']->getDisplayedData());
  286. $this->assertSame('1', $field['b']->getDisplayedData());
  287. $this->assertSame('', $field['c']->getDisplayedData());
  288. $this->assertSame('', $field['d']->getDisplayedData());
  289. $this->assertSame('', $field['e']->getDisplayedData());
  290. $this->assertSame(array('a' => '1', 'b' => '1', 'c' => '', 'd' => '', 'e' => ''), $field->getDisplayedData());
  291. }
  292. public function testRenderMultipleExpanded()
  293. {
  294. $field = new ChoiceField('name', array(
  295. 'multiple' => true,
  296. 'expanded' => true,
  297. 'choices' => $this->choices,
  298. ));
  299. $field->setData(array('a', 'b'));
  300. $html = <<<EOF
  301. <input id="name_a" name="name[a]" value="a" checked="checked" type="checkbox" /> <label for="name_a">Bernhard</label>
  302. <input id="name_b" name="name[b]" value="b" checked="checked" type="checkbox" /> <label for="name_b">Fabien</label>
  303. <input id="name_c" name="name[c]" value="c" type="checkbox" /> <label for="name_c">Kris</label>
  304. <input id="name_d" name="name[d]" value="d" type="checkbox" /> <label for="name_d">Jon</label>
  305. <input id="name_e" name="name[e]" value="e" type="checkbox" /> <label for="name_e">Roman</label>
  306. EOF;
  307. $this->assertEquals($html, $field->render());
  308. }
  309. }