ChoiceFieldTest.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  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. protected $numericChoices = array(
  26. 0 => 'Bernhard',
  27. 1 => 'Fabien',
  28. 2 => 'Kris',
  29. 3 => 'Jon',
  30. 4 => 'Roman',
  31. );
  32. public function testConfigureChoicesWithArrayObject()
  33. {
  34. $choices = new \ArrayObject($this->choices);
  35. $field = new ChoiceField('name', array(
  36. 'multiple' => false,
  37. 'expanded' => true,
  38. 'choices' => $choices,
  39. 'preferred_choices' => $this->preferredChoices,
  40. ));
  41. $this->assertEquals($this->choices, $choices->getArrayCopy());
  42. }
  43. public function testBindSingleNonExpanded()
  44. {
  45. $field = new ChoiceField('name', array(
  46. 'multiple' => false,
  47. 'expanded' => false,
  48. 'choices' => $this->choices,
  49. ));
  50. $field->bind('b');
  51. $this->assertEquals('b', $field->getData());
  52. $this->assertEquals('b', $field->getDisplayedData());
  53. }
  54. public function testRenderSingleNonExpanded()
  55. {
  56. $field = new ChoiceField('name', array(
  57. 'multiple' => false,
  58. 'expanded' => false,
  59. 'choices' => $this->choices,
  60. ));
  61. $field->setData('b');
  62. $html = <<<EOF
  63. <select id="name" name="name" class="foobar">
  64. <option value="a">Bernhard</option>
  65. <option value="b" selected="selected">Fabien</option>
  66. <option value="c">Kris</option>
  67. <option value="d">Jon</option>
  68. <option value="e">Roman</option>
  69. </select>
  70. EOF;
  71. $this->assertEquals($html, $field->render(array(
  72. 'class' => 'foobar',
  73. )));
  74. }
  75. public function testRenderSingleNonExpanded_translateChoices()
  76. {
  77. $translator = $this->getMock('Symfony\Component\I18N\TranslatorInterface');
  78. $translator->expects($this->any())
  79. ->method('translate')
  80. ->will($this->returnCallback(function($text) {
  81. return 'translated['.$text.']';
  82. }));
  83. $field = new ChoiceField('name', array(
  84. 'multiple' => false,
  85. 'expanded' => false,
  86. 'choices' => $this->choices,
  87. 'translate_choices' => true,
  88. ));
  89. $field->setTranslator($translator);
  90. $field->setData('b');
  91. $html = <<<EOF
  92. <select id="name" name="name" class="foobar">
  93. <option value="a">translated[Bernhard]</option>
  94. <option value="b" selected="selected">translated[Fabien]</option>
  95. <option value="c">translated[Kris]</option>
  96. <option value="d">translated[Jon]</option>
  97. <option value="e">translated[Roman]</option>
  98. </select>
  99. EOF;
  100. $this->assertEquals($html, $field->render(array(
  101. 'class' => 'foobar',
  102. )));
  103. }
  104. public function testRenderSingleNonExpanded_disabled()
  105. {
  106. $field = new ChoiceField('name', array(
  107. 'multiple' => false,
  108. 'expanded' => false,
  109. 'choices' => $this->choices,
  110. 'disabled' => true,
  111. ));
  112. $html = <<<EOF
  113. <select id="name" name="name" disabled="disabled">
  114. <option value="a">Bernhard</option>
  115. <option value="b">Fabien</option>
  116. <option value="c">Kris</option>
  117. <option value="d">Jon</option>
  118. <option value="e">Roman</option>
  119. </select>
  120. EOF;
  121. $this->assertEquals($html, $field->render());
  122. }
  123. public function testRenderSingleNonExpandedWithPreferred()
  124. {
  125. $field = new ChoiceField('name', array(
  126. 'multiple' => false,
  127. 'expanded' => false,
  128. 'choices' => $this->choices,
  129. 'preferred_choices' => $this->preferredChoices,
  130. 'separator' => '---',
  131. ));
  132. $field->setData('d');
  133. $html = <<<EOF
  134. <select id="name" name="name">
  135. <option value="d" selected="selected">Jon</option>
  136. <option value="e">Roman</option>
  137. <option disabled="disabled">---</option>
  138. <option value="a">Bernhard</option>
  139. <option value="b">Fabien</option>
  140. <option value="c">Kris</option>
  141. </select>
  142. EOF;
  143. $this->assertEquals($html, $field->render());
  144. }
  145. public function testRenderSingleNonExpandedWithGroups()
  146. {
  147. $field = new ChoiceField('name', array(
  148. 'multiple' => false,
  149. 'expanded' => false,
  150. 'choices' => $this->groupedChoices,
  151. ));
  152. $html = <<<EOF
  153. <select id="name" name="name">
  154. <optgroup label="Symfony">
  155. <option value="a">Bernhard</option>
  156. <option value="b">Fabien</option>
  157. <option value="c">Kris</option>
  158. </optgroup>
  159. <optgroup label="Doctrine">
  160. <option value="d">Jon</option>
  161. <option value="e">Roman</option>
  162. </optgroup>
  163. </select>
  164. EOF;
  165. $this->assertEquals($html, $field->render());
  166. }
  167. public function testRenderSingleNonExpandedNonRequired()
  168. {
  169. $field = new ChoiceField('name', array(
  170. 'multiple' => false,
  171. 'expanded' => false,
  172. 'choices' => $this->choices,
  173. 'empty_value' => 'empty',
  174. ));
  175. $field->setData(null);
  176. $field->setRequired(false);
  177. $html = <<<EOF
  178. <select id="name" name="name">
  179. <option value="" selected="selected">empty</option>
  180. <option value="a">Bernhard</option>
  181. <option value="b">Fabien</option>
  182. <option value="c">Kris</option>
  183. <option value="d">Jon</option>
  184. <option value="e">Roman</option>
  185. </select>
  186. EOF;
  187. $this->assertEquals($html, $field->render());
  188. }
  189. public function testBindMultipleNonExpanded()
  190. {
  191. $field = new ChoiceField('name', array(
  192. 'multiple' => true,
  193. 'expanded' => false,
  194. 'choices' => $this->choices,
  195. ));
  196. $field->bind(array('a', 'b'));
  197. $this->assertEquals(array('a', 'b'), $field->getData());
  198. $this->assertEquals(array('a', 'b'), $field->getDisplayedData());
  199. }
  200. public function testRenderMultipleNonExpanded()
  201. {
  202. $field = new ChoiceField('name', array(
  203. 'multiple' => true,
  204. 'expanded' => false,
  205. 'choices' => $this->choices,
  206. ));
  207. $field->setData(array('a', 'b'));
  208. $html = <<<EOF
  209. <select id="name" name="name[]" multiple="multiple">
  210. <option value="a" selected="selected">Bernhard</option>
  211. <option value="b" selected="selected">Fabien</option>
  212. <option value="c">Kris</option>
  213. <option value="d">Jon</option>
  214. <option value="e">Roman</option>
  215. </select>
  216. EOF;
  217. $this->assertEquals($html, $field->render());
  218. }
  219. public function testBindSingleExpanded()
  220. {
  221. $field = new ChoiceField('name', array(
  222. 'multiple' => false,
  223. 'expanded' => true,
  224. 'choices' => $this->choices,
  225. ));
  226. $field->bind('b');
  227. $this->assertSame('b', $field->getData());
  228. $this->assertSame(null, $field['a']->getData());
  229. $this->assertSame(true, $field['b']->getData());
  230. $this->assertSame(null, $field['c']->getData());
  231. $this->assertSame(null, $field['d']->getData());
  232. $this->assertSame(null, $field['e']->getData());
  233. $this->assertSame('', $field['a']->getDisplayedData());
  234. $this->assertSame('1', $field['b']->getDisplayedData());
  235. $this->assertSame('', $field['c']->getDisplayedData());
  236. $this->assertSame('', $field['d']->getDisplayedData());
  237. $this->assertSame('', $field['e']->getDisplayedData());
  238. $this->assertSame(array('a' => '', 'b' => '1', 'c' => '', 'd' => '', 'e' => ''), $field->getDisplayedData());
  239. }
  240. public function testBindSingleExpandedNumericChoices()
  241. {
  242. $field = new ChoiceField('name', array(
  243. 'multiple' => false,
  244. 'expanded' => true,
  245. 'choices' => $this->numericChoices,
  246. ));
  247. $field->bind('1');
  248. $this->assertSame(1, $field->getData());
  249. $this->assertSame(null, $field[0]->getData());
  250. $this->assertSame(true, $field[1]->getData());
  251. $this->assertSame(null, $field[2]->getData());
  252. $this->assertSame(null, $field[3]->getData());
  253. $this->assertSame(null, $field[4]->getData());
  254. $this->assertSame('', $field[0]->getDisplayedData());
  255. $this->assertSame('1', $field[1]->getDisplayedData());
  256. $this->assertSame('', $field[2]->getDisplayedData());
  257. $this->assertSame('', $field[3]->getDisplayedData());
  258. $this->assertSame('', $field[4]->getDisplayedData());
  259. $this->assertSame(array(0 => '', 1 => '1', 2 => '', 3 => '', 4 => ''), $field->getDisplayedData());
  260. }
  261. public function testRenderSingleExpanded()
  262. {
  263. $field = new ChoiceField('name', array(
  264. 'multiple' => false,
  265. 'expanded' => true,
  266. 'choices' => $this->choices,
  267. ));
  268. $field->setData('b');
  269. $html = <<<EOF
  270. <input id="name_a" name="name" value="a" type="radio" /> <label for="name_a">Bernhard</label>
  271. <input id="name_b" name="name" value="b" checked="checked" type="radio" /> <label for="name_b">Fabien</label>
  272. <input id="name_c" name="name" value="c" type="radio" /> <label for="name_c">Kris</label>
  273. <input id="name_d" name="name" value="d" type="radio" /> <label for="name_d">Jon</label>
  274. <input id="name_e" name="name" value="e" type="radio" /> <label for="name_e">Roman</label>
  275. EOF;
  276. $this->assertEquals($html, $field->render());
  277. }
  278. public function testRenderSingleExpanded_translateChoices()
  279. {
  280. $translator = $this->getMock('Symfony\Component\I18N\TranslatorInterface');
  281. $translator->expects($this->any())
  282. ->method('translate')
  283. ->will($this->returnCallback(function($text) {
  284. return 'translated['.$text.']';
  285. }));
  286. $field = new ChoiceField('name', array(
  287. 'multiple' => false,
  288. 'expanded' => true,
  289. 'choices' => $this->choices,
  290. 'translate_choices' => true,
  291. ));
  292. $field->setTranslator($translator);
  293. $field->setData('b');
  294. $html = <<<EOF
  295. <input id="name_a" name="name" value="a" type="radio" /> <label for="name_a">translated[Bernhard]</label>
  296. <input id="name_b" name="name" value="b" checked="checked" type="radio" /> <label for="name_b">translated[Fabien]</label>
  297. <input id="name_c" name="name" value="c" type="radio" /> <label for="name_c">translated[Kris]</label>
  298. <input id="name_d" name="name" value="d" type="radio" /> <label for="name_d">translated[Jon]</label>
  299. <input id="name_e" name="name" value="e" type="radio" /> <label for="name_e">translated[Roman]</label>
  300. EOF;
  301. $this->assertEquals($html, $field->render());
  302. }
  303. public function testRenderSingleExpandedWithPreferred()
  304. {
  305. $field = new ChoiceField('name', array(
  306. 'multiple' => false,
  307. 'expanded' => true,
  308. 'choices' => $this->choices,
  309. 'preferred_choices' => $this->preferredChoices,
  310. ));
  311. $html = <<<EOF
  312. <input id="name_d" name="name" value="d" type="radio" /> <label for="name_d">Jon</label>
  313. <input id="name_e" name="name" value="e" type="radio" /> <label for="name_e">Roman</label>
  314. <input id="name_a" name="name" value="a" type="radio" /> <label for="name_a">Bernhard</label>
  315. <input id="name_b" name="name" value="b" type="radio" /> <label for="name_b">Fabien</label>
  316. <input id="name_c" name="name" value="c" type="radio" /> <label for="name_c">Kris</label>
  317. EOF;
  318. $this->assertEquals($html, $field->render());
  319. }
  320. public function testBindMultipleExpanded()
  321. {
  322. $field = new ChoiceField('name', array(
  323. 'multiple' => true,
  324. 'expanded' => true,
  325. 'choices' => $this->choices,
  326. ));
  327. $field->bind(array('a' => 'a', 'b' => 'b'));
  328. $this->assertSame(array('a', 'b'), $field->getData());
  329. $this->assertSame(true, $field['a']->getData());
  330. $this->assertSame(true, $field['b']->getData());
  331. $this->assertSame(null, $field['c']->getData());
  332. $this->assertSame(null, $field['d']->getData());
  333. $this->assertSame(null, $field['e']->getData());
  334. $this->assertSame('1', $field['a']->getDisplayedData());
  335. $this->assertSame('1', $field['b']->getDisplayedData());
  336. $this->assertSame('', $field['c']->getDisplayedData());
  337. $this->assertSame('', $field['d']->getDisplayedData());
  338. $this->assertSame('', $field['e']->getDisplayedData());
  339. $this->assertSame(array('a' => '1', 'b' => '1', 'c' => '', 'd' => '', 'e' => ''), $field->getDisplayedData());
  340. }
  341. public function testBindMultipleExpandedNumericChoices()
  342. {
  343. $field = new ChoiceField('name', array(
  344. 'multiple' => true,
  345. 'expanded' => true,
  346. 'choices' => $this->numericChoices,
  347. ));
  348. $field->bind(array(1 => 1, 2 => 2));
  349. $this->assertSame(array(1, 2), $field->getData());
  350. $this->assertSame(null, $field[0]->getData());
  351. $this->assertSame(true, $field[1]->getData());
  352. $this->assertSame(true, $field[2]->getData());
  353. $this->assertSame(null, $field[3]->getData());
  354. $this->assertSame(null, $field[4]->getData());
  355. $this->assertSame('', $field[0]->getDisplayedData());
  356. $this->assertSame('1', $field[1]->getDisplayedData());
  357. $this->assertSame('1', $field[2]->getDisplayedData());
  358. $this->assertSame('', $field[3]->getDisplayedData());
  359. $this->assertSame('', $field[4]->getDisplayedData());
  360. $this->assertSame(array(0 => '', 1 => '1', 2 => '1', 3 => '', 4 => ''), $field->getDisplayedData());
  361. }
  362. public function testRenderMultipleExpanded()
  363. {
  364. $field = new ChoiceField('name', array(
  365. 'multiple' => true,
  366. 'expanded' => true,
  367. 'choices' => $this->choices,
  368. ));
  369. $field->setData(array('a', 'b'));
  370. $html = <<<EOF
  371. <input id="name_a" name="name[a]" value="a" checked="checked" type="checkbox" /> <label for="name_a">Bernhard</label>
  372. <input id="name_b" name="name[b]" value="b" checked="checked" type="checkbox" /> <label for="name_b">Fabien</label>
  373. <input id="name_c" name="name[c]" value="c" type="checkbox" /> <label for="name_c">Kris</label>
  374. <input id="name_d" name="name[d]" value="d" type="checkbox" /> <label for="name_d">Jon</label>
  375. <input id="name_e" name="name[e]" value="e" type="checkbox" /> <label for="name_e">Roman</label>
  376. EOF;
  377. $this->assertEquals($html, $field->render());
  378. }
  379. }