diff options
Diffstat (limited to 'vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php')
-rw-r--r-- | vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php | 949 |
1 files changed, 949 insertions, 0 deletions
diff --git a/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php b/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php new file mode 100644 index 00000000..219e8181 --- /dev/null +++ b/vendor/symfony/form/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php | |||
@@ -0,0 +1,949 @@ | |||
1 | <?php | ||
2 | |||
3 | /* | ||
4 | * This file is part of the Symfony package. | ||
5 | * | ||
6 | * (c) Fabien Potencier <fabien@symfony.com> | ||
7 | * | ||
8 | * For the full copyright and license information, please view the LICENSE | ||
9 | * file that was distributed with this source code. | ||
10 | */ | ||
11 | |||
12 | namespace Symfony\Component\Form\Tests\Extension\Core\Type; | ||
13 | |||
14 | use Symfony\Component\Form\Extension\Core\ChoiceList\ObjectChoiceList; | ||
15 | use Symfony\Component\Form\Extension\Core\View\ChoiceView; | ||
16 | |||
17 | class ChoiceTypeTest extends \Symfony\Component\Form\Test\TypeTestCase | ||
18 | { | ||
19 | private $choices = array( | ||
20 | 'a' => 'Bernhard', | ||
21 | 'b' => 'Fabien', | ||
22 | 'c' => 'Kris', | ||
23 | 'd' => 'Jon', | ||
24 | 'e' => 'Roman', | ||
25 | ); | ||
26 | |||
27 | private $numericChoices = array( | ||
28 | 0 => 'Bernhard', | ||
29 | 1 => 'Fabien', | ||
30 | 2 => 'Kris', | ||
31 | 3 => 'Jon', | ||
32 | 4 => 'Roman', | ||
33 | ); | ||
34 | |||
35 | private $objectChoices; | ||
36 | |||
37 | protected $groupedChoices = array( | ||
38 | 'Symfony' => array( | ||
39 | 'a' => 'Bernhard', | ||
40 | 'b' => 'Fabien', | ||
41 | 'c' => 'Kris', | ||
42 | ), | ||
43 | 'Doctrine' => array( | ||
44 | 'd' => 'Jon', | ||
45 | 'e' => 'Roman', | ||
46 | ) | ||
47 | ); | ||
48 | |||
49 | protected function setUp() | ||
50 | { | ||
51 | parent::setUp(); | ||
52 | |||
53 | $this->objectChoices = array( | ||
54 | (object) array('id' => 1, 'name' => 'Bernhard'), | ||
55 | (object) array('id' => 2, 'name' => 'Fabien'), | ||
56 | (object) array('id' => 3, 'name' => 'Kris'), | ||
57 | (object) array('id' => 4, 'name' => 'Jon'), | ||
58 | (object) array('id' => 5, 'name' => 'Roman'), | ||
59 | ); | ||
60 | } | ||
61 | |||
62 | protected function tearDown() | ||
63 | { | ||
64 | parent::tearDown(); | ||
65 | |||
66 | $this->objectChoices = null; | ||
67 | } | ||
68 | |||
69 | /** | ||
70 | * @expectedException \PHPUnit_Framework_Error | ||
71 | */ | ||
72 | public function testChoicesOptionExpectsArray() | ||
73 | { | ||
74 | $this->factory->create('choice', null, array( | ||
75 | 'choices' => new \ArrayObject(), | ||
76 | )); | ||
77 | } | ||
78 | |||
79 | /** | ||
80 | * @expectedException \Symfony\Component\OptionsResolver\Exception\InvalidOptionsException | ||
81 | */ | ||
82 | public function testChoiceListOptionExpectsChoiceListInterface() | ||
83 | { | ||
84 | $this->factory->create('choice', null, array( | ||
85 | 'choice_list' => array('foo' => 'foo'), | ||
86 | )); | ||
87 | } | ||
88 | |||
89 | public function testChoiceListAndChoicesCanBeEmpty() | ||
90 | { | ||
91 | $this->factory->create('choice'); | ||
92 | } | ||
93 | |||
94 | public function testExpandedChoicesOptionsTurnIntoChildren() | ||
95 | { | ||
96 | $form = $this->factory->create('choice', null, array( | ||
97 | 'expanded' => true, | ||
98 | 'choices' => $this->choices, | ||
99 | )); | ||
100 | |||
101 | $this->assertCount(count($this->choices), $form, 'Each choice should become a new field'); | ||
102 | } | ||
103 | |||
104 | public function testPlaceholderPresentOnNonRequiredExpandedSingleChoice() | ||
105 | { | ||
106 | $form = $this->factory->create('choice', null, array( | ||
107 | 'multiple' => false, | ||
108 | 'expanded' => true, | ||
109 | 'required' => false, | ||
110 | 'choices' => $this->choices, | ||
111 | )); | ||
112 | |||
113 | $this->assertTrue(isset($form['placeholder'])); | ||
114 | $this->assertCount(count($this->choices) + 1, $form, 'Each choice should become a new field'); | ||
115 | } | ||
116 | |||
117 | public function testPlaceholderNotPresentIfRequired() | ||
118 | { | ||
119 | $form = $this->factory->create('choice', null, array( | ||
120 | 'multiple' => false, | ||
121 | 'expanded' => true, | ||
122 | 'required' => true, | ||
123 | 'choices' => $this->choices, | ||
124 | )); | ||
125 | |||
126 | $this->assertFalse(isset($form['placeholder'])); | ||
127 | $this->assertCount(count($this->choices), $form, 'Each choice should become a new field'); | ||
128 | } | ||
129 | |||
130 | public function testPlaceholderNotPresentIfMultiple() | ||
131 | { | ||
132 | $form = $this->factory->create('choice', null, array( | ||
133 | 'multiple' => true, | ||
134 | 'expanded' => true, | ||
135 | 'required' => false, | ||
136 | 'choices' => $this->choices, | ||
137 | )); | ||
138 | |||
139 | $this->assertFalse(isset($form['placeholder'])); | ||
140 | $this->assertCount(count($this->choices), $form, 'Each choice should become a new field'); | ||
141 | } | ||
142 | |||
143 | public function testPlaceholderNotPresentIfEmptyChoice() | ||
144 | { | ||
145 | $form = $this->factory->create('choice', null, array( | ||
146 | 'multiple' => false, | ||
147 | 'expanded' => true, | ||
148 | 'required' => false, | ||
149 | 'choices' => array( | ||
150 | '' => 'Empty', | ||
151 | 1 => 'Not empty', | ||
152 | ), | ||
153 | )); | ||
154 | |||
155 | $this->assertFalse(isset($form['placeholder'])); | ||
156 | $this->assertCount(2, $form, 'Each choice should become a new field'); | ||
157 | } | ||
158 | |||
159 | public function testExpandedChoicesOptionsAreFlattened() | ||
160 | { | ||
161 | $form = $this->factory->create('choice', null, array( | ||
162 | 'expanded' => true, | ||
163 | 'choices' => $this->groupedChoices, | ||
164 | )); | ||
165 | |||
166 | $flattened = array(); | ||
167 | foreach ($this->groupedChoices as $choices) { | ||
168 | $flattened = array_merge($flattened, array_keys($choices)); | ||
169 | } | ||
170 | |||
171 | $this->assertCount($form->count(), $flattened, 'Each nested choice should become a new field, not the groups'); | ||
172 | |||
173 | foreach ($flattened as $value => $choice) { | ||
174 | $this->assertTrue($form->has($value), 'Flattened choice is named after it\'s value'); | ||
175 | } | ||
176 | } | ||
177 | |||
178 | public function testExpandedCheckboxesAreNeverRequired() | ||
179 | { | ||
180 | $form = $this->factory->create('choice', null, array( | ||
181 | 'multiple' => true, | ||
182 | 'expanded' => true, | ||
183 | 'required' => true, | ||
184 | 'choices' => $this->choices, | ||
185 | )); | ||
186 | |||
187 | foreach ($form as $child) { | ||
188 | $this->assertFalse($child->isRequired()); | ||
189 | } | ||
190 | } | ||
191 | |||
192 | public function testExpandedRadiosAreRequiredIfChoiceChildIsRequired() | ||
193 | { | ||
194 | $form = $this->factory->create('choice', null, array( | ||
195 | 'multiple' => false, | ||
196 | 'expanded' => true, | ||
197 | 'required' => true, | ||
198 | 'choices' => $this->choices, | ||
199 | )); | ||
200 | |||
201 | foreach ($form as $child) { | ||
202 | $this->assertTrue($child->isRequired()); | ||
203 | } | ||
204 | } | ||
205 | |||
206 | public function testExpandedRadiosAreNotRequiredIfChoiceChildIsNotRequired() | ||
207 | { | ||
208 | $form = $this->factory->create('choice', null, array( | ||
209 | 'multiple' => false, | ||
210 | 'expanded' => true, | ||
211 | 'required' => false, | ||
212 | 'choices' => $this->choices, | ||
213 | )); | ||
214 | |||
215 | foreach ($form as $child) { | ||
216 | $this->assertFalse($child->isRequired()); | ||
217 | } | ||
218 | } | ||
219 | |||
220 | public function testSubmitSingleNonExpanded() | ||
221 | { | ||
222 | $form = $this->factory->create('choice', null, array( | ||
223 | 'multiple' => false, | ||
224 | 'expanded' => false, | ||
225 | 'choices' => $this->choices, | ||
226 | )); | ||
227 | |||
228 | $form->submit('b'); | ||
229 | |||
230 | $this->assertEquals('b', $form->getData()); | ||
231 | $this->assertEquals('b', $form->getViewData()); | ||
232 | } | ||
233 | |||
234 | public function testSubmitSingleNonExpandedObjectChoices() | ||
235 | { | ||
236 | $form = $this->factory->create('choice', null, array( | ||
237 | 'multiple' => false, | ||
238 | 'expanded' => false, | ||
239 | 'choice_list' => new ObjectChoiceList( | ||
240 | $this->objectChoices, | ||
241 | // label path | ||
242 | 'name', | ||
243 | array(), | ||
244 | null, | ||
245 | // value path | ||
246 | 'id' | ||
247 | ), | ||
248 | )); | ||
249 | |||
250 | // "id" value of the second entry | ||
251 | $form->submit('2'); | ||
252 | |||
253 | $this->assertEquals($this->objectChoices[1], $form->getData()); | ||
254 | $this->assertEquals('2', $form->getViewData()); | ||
255 | } | ||
256 | |||
257 | public function testSubmitMultipleNonExpanded() | ||
258 | { | ||
259 | $form = $this->factory->create('choice', null, array( | ||
260 | 'multiple' => true, | ||
261 | 'expanded' => false, | ||
262 | 'choices' => $this->choices, | ||
263 | )); | ||
264 | |||
265 | $form->submit(array('a', 'b')); | ||
266 | |||
267 | $this->assertEquals(array('a', 'b'), $form->getData()); | ||
268 | $this->assertEquals(array('a', 'b'), $form->getViewData()); | ||
269 | } | ||
270 | |||
271 | public function testSubmitMultipleNonExpandedObjectChoices() | ||
272 | { | ||
273 | $form = $this->factory->create('choice', null, array( | ||
274 | 'multiple' => true, | ||
275 | 'expanded' => false, | ||
276 | 'choice_list' => new ObjectChoiceList( | ||
277 | $this->objectChoices, | ||
278 | // label path | ||
279 | 'name', | ||
280 | array(), | ||
281 | null, | ||
282 | // value path | ||
283 | 'id' | ||
284 | ), | ||
285 | )); | ||
286 | |||
287 | $form->submit(array('2', '3')); | ||
288 | |||
289 | $this->assertEquals(array($this->objectChoices[1], $this->objectChoices[2]), $form->getData()); | ||
290 | $this->assertEquals(array('2', '3'), $form->getViewData()); | ||
291 | } | ||
292 | |||
293 | public function testSubmitSingleExpandedRequired() | ||
294 | { | ||
295 | $form = $this->factory->create('choice', null, array( | ||
296 | 'multiple' => false, | ||
297 | 'expanded' => true, | ||
298 | 'required' => true, | ||
299 | 'choices' => $this->choices, | ||
300 | )); | ||
301 | |||
302 | $form->submit('b'); | ||
303 | |||
304 | $this->assertSame('b', $form->getData()); | ||
305 | $this->assertSame(array( | ||
306 | 0 => false, | ||
307 | 1 => true, | ||
308 | 2 => false, | ||
309 | 3 => false, | ||
310 | 4 => false, | ||
311 | ), $form->getViewData()); | ||
312 | |||
313 | $this->assertFalse($form[0]->getData()); | ||
314 | $this->assertTrue($form[1]->getData()); | ||
315 | $this->assertFalse($form[2]->getData()); | ||
316 | $this->assertFalse($form[3]->getData()); | ||
317 | $this->assertFalse($form[4]->getData()); | ||
318 | $this->assertNull($form[0]->getViewData()); | ||
319 | $this->assertSame('b', $form[1]->getViewData()); | ||
320 | $this->assertNull($form[2]->getViewData()); | ||
321 | $this->assertNull($form[3]->getViewData()); | ||
322 | $this->assertNull($form[4]->getViewData()); | ||
323 | } | ||
324 | |||
325 | public function testSubmitSingleExpandedNonRequired() | ||
326 | { | ||
327 | $form = $this->factory->create('choice', null, array( | ||
328 | 'multiple' => false, | ||
329 | 'expanded' => true, | ||
330 | 'required' => false, | ||
331 | 'choices' => $this->choices, | ||
332 | )); | ||
333 | |||
334 | $form->submit('b'); | ||
335 | |||
336 | $this->assertSame('b', $form->getData()); | ||
337 | $this->assertSame(array( | ||
338 | 0 => false, | ||
339 | 1 => true, | ||
340 | 2 => false, | ||
341 | 3 => false, | ||
342 | 4 => false, | ||
343 | 'placeholder' => false, | ||
344 | ), $form->getViewData()); | ||
345 | |||
346 | $this->assertFalse($form['placeholder']->getData()); | ||
347 | $this->assertFalse($form[0]->getData()); | ||
348 | $this->assertTrue($form[1]->getData()); | ||
349 | $this->assertFalse($form[2]->getData()); | ||
350 | $this->assertFalse($form[3]->getData()); | ||
351 | $this->assertFalse($form[4]->getData()); | ||
352 | $this->assertNull($form['placeholder']->getViewData()); | ||
353 | $this->assertNull($form[0]->getViewData()); | ||
354 | $this->assertSame('b', $form[1]->getViewData()); | ||
355 | $this->assertNull($form[2]->getViewData()); | ||
356 | $this->assertNull($form[3]->getViewData()); | ||
357 | $this->assertNull($form[4]->getViewData()); | ||
358 | } | ||
359 | |||
360 | public function testSubmitSingleExpandedRequiredNothingChecked() | ||
361 | { | ||
362 | $form = $this->factory->create('choice', null, array( | ||
363 | 'multiple' => false, | ||
364 | 'expanded' => true, | ||
365 | 'required' => true, | ||
366 | 'choices' => $this->choices, | ||
367 | )); | ||
368 | |||
369 | $form->submit(null); | ||
370 | |||
371 | $this->assertNull($form->getData()); | ||
372 | $this->assertSame(array( | ||
373 | 0 => false, | ||
374 | 1 => false, | ||
375 | 2 => false, | ||
376 | 3 => false, | ||
377 | 4 => false, | ||
378 | ), $form->getViewData()); | ||
379 | |||
380 | $this->assertFalse($form[0]->getData()); | ||
381 | $this->assertFalse($form[1]->getData()); | ||
382 | $this->assertFalse($form[2]->getData()); | ||
383 | $this->assertFalse($form[3]->getData()); | ||
384 | $this->assertFalse($form[4]->getData()); | ||
385 | $this->assertNull($form[0]->getViewData()); | ||
386 | $this->assertNull($form[1]->getViewData()); | ||
387 | $this->assertNull($form[2]->getViewData()); | ||
388 | $this->assertNull($form[3]->getViewData()); | ||
389 | $this->assertNull($form[4]->getViewData()); | ||
390 | } | ||
391 | |||
392 | public function testSubmitSingleExpandedNonRequiredNothingChecked() | ||
393 | { | ||
394 | $form = $this->factory->create('choice', null, array( | ||
395 | 'multiple' => false, | ||
396 | 'expanded' => true, | ||
397 | 'required' => false, | ||
398 | 'choices' => $this->choices, | ||
399 | )); | ||
400 | |||
401 | $form->submit(null); | ||
402 | |||
403 | $this->assertNull($form->getData()); | ||
404 | $this->assertSame(array( | ||
405 | 0 => false, | ||
406 | 1 => false, | ||
407 | 2 => false, | ||
408 | 3 => false, | ||
409 | 4 => false, | ||
410 | 'placeholder' => true, | ||
411 | ), $form->getViewData()); | ||
412 | |||
413 | $this->assertTrue($form['placeholder']->getData()); | ||
414 | $this->assertFalse($form[0]->getData()); | ||
415 | $this->assertFalse($form[1]->getData()); | ||
416 | $this->assertFalse($form[2]->getData()); | ||
417 | $this->assertFalse($form[3]->getData()); | ||
418 | $this->assertFalse($form[4]->getData()); | ||
419 | $this->assertSame('', $form['placeholder']->getViewData()); | ||
420 | $this->assertNull($form[0]->getViewData()); | ||
421 | $this->assertNull($form[1]->getViewData()); | ||
422 | $this->assertNull($form[2]->getViewData()); | ||
423 | $this->assertNull($form[3]->getViewData()); | ||
424 | $this->assertNull($form[4]->getViewData()); | ||
425 | } | ||
426 | |||
427 | public function testSubmitFalseToSingleExpandedRequiredDoesNotProduceExtraChildrenError() | ||
428 | { | ||
429 | $form = $this->factory->create('choice', null, array( | ||
430 | 'multiple' => false, | ||
431 | 'expanded' => true, | ||
432 | 'required' => true, | ||
433 | 'choices' => $this->choices, | ||
434 | )); | ||
435 | |||
436 | $form->submit(false); | ||
437 | |||
438 | $this->assertEmpty($form->getExtraData()); | ||
439 | $this->assertNull($form->getData()); | ||
440 | } | ||
441 | |||
442 | public function testSubmitFalseToSingleExpandedNonRequiredDoesNotProduceExtraChildrenError() | ||
443 | { | ||
444 | $form = $this->factory->create('choice', null, array( | ||
445 | 'multiple' => false, | ||
446 | 'expanded' => true, | ||
447 | 'required' => false, | ||
448 | 'choices' => $this->choices, | ||
449 | )); | ||
450 | |||
451 | $form->submit(false); | ||
452 | |||
453 | $this->assertEmpty($form->getExtraData()); | ||
454 | $this->assertNull($form->getData()); | ||
455 | } | ||
456 | |||
457 | public function testSubmitSingleExpandedWithEmptyChild() | ||
458 | { | ||
459 | $form = $this->factory->create('choice', null, array( | ||
460 | 'multiple' => false, | ||
461 | 'expanded' => true, | ||
462 | 'choices' => array( | ||
463 | '' => 'Empty', | ||
464 | 1 => 'Not empty', | ||
465 | ), | ||
466 | )); | ||
467 | |||
468 | $form->submit(''); | ||
469 | |||
470 | $this->assertNull($form->getData()); | ||
471 | $this->assertTrue($form[0]->getData()); | ||
472 | $this->assertFalse($form[1]->getData()); | ||
473 | $this->assertSame('', $form[0]->getViewData()); | ||
474 | $this->assertNull($form[1]->getViewData()); | ||
475 | } | ||
476 | |||
477 | public function testSubmitSingleExpandedObjectChoices() | ||
478 | { | ||
479 | $form = $this->factory->create('choice', null, array( | ||
480 | 'multiple' => false, | ||
481 | 'expanded' => true, | ||
482 | 'choice_list' => new ObjectChoiceList( | ||
483 | $this->objectChoices, | ||
484 | // label path | ||
485 | 'name', | ||
486 | array(), | ||
487 | null, | ||
488 | // value path | ||
489 | 'id' | ||
490 | ), | ||
491 | )); | ||
492 | |||
493 | $form->submit('2'); | ||
494 | |||
495 | $this->assertSame($this->objectChoices[1], $form->getData()); | ||
496 | $this->assertFalse($form[0]->getData()); | ||
497 | $this->assertTrue($form[1]->getData()); | ||
498 | $this->assertFalse($form[2]->getData()); | ||
499 | $this->assertFalse($form[3]->getData()); | ||
500 | $this->assertFalse($form[4]->getData()); | ||
501 | $this->assertNull($form[0]->getViewData()); | ||
502 | $this->assertSame('2', $form[1]->getViewData()); | ||
503 | $this->assertNull($form[2]->getViewData()); | ||
504 | $this->assertNull($form[3]->getViewData()); | ||
505 | $this->assertNull($form[4]->getViewData()); | ||
506 | } | ||
507 | |||
508 | public function testSubmitSingleExpandedNumericChoices() | ||
509 | { | ||
510 | $form = $this->factory->create('choice', null, array( | ||
511 | 'multiple' => false, | ||
512 | 'expanded' => true, | ||
513 | 'choices' => $this->numericChoices, | ||
514 | )); | ||
515 | |||
516 | $form->submit('1'); | ||
517 | |||
518 | $this->assertSame(1, $form->getData()); | ||
519 | $this->assertFalse($form[0]->getData()); | ||
520 | $this->assertTrue($form[1]->getData()); | ||
521 | $this->assertFalse($form[2]->getData()); | ||
522 | $this->assertFalse($form[3]->getData()); | ||
523 | $this->assertFalse($form[4]->getData()); | ||
524 | $this->assertNull($form[0]->getViewData()); | ||
525 | $this->assertSame('1', $form[1]->getViewData()); | ||
526 | $this->assertNull($form[2]->getViewData()); | ||
527 | $this->assertNull($form[3]->getViewData()); | ||
528 | $this->assertNull($form[4]->getViewData()); | ||
529 | } | ||
530 | |||
531 | public function testSubmitMultipleExpanded() | ||
532 | { | ||
533 | $form = $this->factory->create('choice', null, array( | ||
534 | 'multiple' => true, | ||
535 | 'expanded' => true, | ||
536 | 'choices' => $this->choices, | ||
537 | )); | ||
538 | |||
539 | $form->submit(array('a', 'c')); | ||
540 | |||
541 | $this->assertSame(array('a', 'c'), $form->getData()); | ||
542 | $this->assertTrue($form[0]->getData()); | ||
543 | $this->assertFalse($form[1]->getData()); | ||
544 | $this->assertTrue($form[2]->getData()); | ||
545 | $this->assertFalse($form[3]->getData()); | ||
546 | $this->assertFalse($form[4]->getData()); | ||
547 | $this->assertSame('a', $form[0]->getViewData()); | ||
548 | $this->assertNull($form[1]->getViewData()); | ||
549 | $this->assertSame('c', $form[2]->getViewData()); | ||
550 | $this->assertNull($form[3]->getViewData()); | ||
551 | $this->assertNull($form[4]->getViewData()); | ||
552 | } | ||
553 | |||
554 | public function testSubmitMultipleExpandedEmpty() | ||
555 | { | ||
556 | $form = $this->factory->create('choice', null, array( | ||
557 | 'multiple' => true, | ||
558 | 'expanded' => true, | ||
559 | 'choices' => $this->choices, | ||
560 | )); | ||
561 | |||
562 | $form->submit(array()); | ||
563 | |||
564 | $this->assertSame(array(), $form->getData()); | ||
565 | $this->assertFalse($form[0]->getData()); | ||
566 | $this->assertFalse($form[1]->getData()); | ||
567 | $this->assertFalse($form[2]->getData()); | ||
568 | $this->assertFalse($form[3]->getData()); | ||
569 | $this->assertFalse($form[4]->getData()); | ||
570 | $this->assertNull($form[0]->getViewData()); | ||
571 | $this->assertNull($form[1]->getViewData()); | ||
572 | $this->assertNull($form[2]->getViewData()); | ||
573 | $this->assertNull($form[3]->getViewData()); | ||
574 | $this->assertNull($form[4]->getViewData()); | ||
575 | } | ||
576 | |||
577 | public function testSubmitMultipleExpandedWithEmptyChild() | ||
578 | { | ||
579 | $form = $this->factory->create('choice', null, array( | ||
580 | 'multiple' => true, | ||
581 | 'expanded' => true, | ||
582 | 'choices' => array( | ||
583 | '' => 'Empty', | ||
584 | 1 => 'Not Empty', | ||
585 | 2 => 'Not Empty 2', | ||
586 | ) | ||
587 | )); | ||
588 | |||
589 | $form->submit(array('', '2')); | ||
590 | |||
591 | $this->assertSame(array('', 2), $form->getData()); | ||
592 | $this->assertTrue($form[0]->getData()); | ||
593 | $this->assertFalse($form[1]->getData()); | ||
594 | $this->assertTrue($form[2]->getData()); | ||
595 | $this->assertSame('', $form[0]->getViewData()); | ||
596 | $this->assertNull($form[1]->getViewData()); | ||
597 | $this->assertSame('2', $form[2]->getViewData()); | ||
598 | } | ||
599 | |||
600 | public function testSubmitMultipleExpandedObjectChoices() | ||
601 | { | ||
602 | $form = $this->factory->create('choice', null, array( | ||
603 | 'multiple' => true, | ||
604 | 'expanded' => true, | ||
605 | 'choice_list' => new ObjectChoiceList( | ||
606 | $this->objectChoices, | ||
607 | // label path | ||
608 | 'name', | ||
609 | array(), | ||
610 | null, | ||
611 | // value path | ||
612 | 'id' | ||
613 | ), | ||
614 | )); | ||
615 | |||
616 | $form->submit(array('1', '2')); | ||
617 | |||
618 | $this->assertSame(array($this->objectChoices[0], $this->objectChoices[1]), $form->getData()); | ||
619 | $this->assertTrue($form[0]->getData()); | ||
620 | $this->assertTrue($form[1]->getData()); | ||
621 | $this->assertFalse($form[2]->getData()); | ||
622 | $this->assertFalse($form[3]->getData()); | ||
623 | $this->assertFalse($form[4]->getData()); | ||
624 | $this->assertSame('1', $form[0]->getViewData()); | ||
625 | $this->assertSame('2', $form[1]->getViewData()); | ||
626 | $this->assertNull($form[2]->getViewData()); | ||
627 | $this->assertNull($form[3]->getViewData()); | ||
628 | $this->assertNull($form[4]->getViewData()); | ||
629 | } | ||
630 | |||
631 | public function testSubmitMultipleExpandedNumericChoices() | ||
632 | { | ||
633 | $form = $this->factory->create('choice', null, array( | ||
634 | 'multiple' => true, | ||
635 | 'expanded' => true, | ||
636 | 'choices' => $this->numericChoices, | ||
637 | )); | ||
638 | |||
639 | $form->submit(array('1', '2')); | ||
640 | |||
641 | $this->assertSame(array(1, 2), $form->getData()); | ||
642 | $this->assertFalse($form[0]->getData()); | ||
643 | $this->assertTrue($form[1]->getData()); | ||
644 | $this->assertTrue($form[2]->getData()); | ||
645 | $this->assertFalse($form[3]->getData()); | ||
646 | $this->assertFalse($form[4]->getData()); | ||
647 | $this->assertNull($form[0]->getViewData()); | ||
648 | $this->assertSame('1', $form[1]->getViewData()); | ||
649 | $this->assertSame('2', $form[2]->getViewData()); | ||
650 | $this->assertNull($form[3]->getViewData()); | ||
651 | $this->assertNull($form[4]->getViewData()); | ||
652 | } | ||
653 | |||
654 | /* | ||
655 | * We need this functionality to create choice fields for Boolean types, | ||
656 | * e.g. false => 'No', true => 'Yes' | ||
657 | */ | ||
658 | public function testSetDataSingleNonExpandedAcceptsBoolean() | ||
659 | { | ||
660 | $form = $this->factory->create('choice', null, array( | ||
661 | 'multiple' => false, | ||
662 | 'expanded' => false, | ||
663 | 'choices' => $this->numericChoices, | ||
664 | )); | ||
665 | |||
666 | $form->setData(false); | ||
667 | |||
668 | $this->assertFalse($form->getData()); | ||
669 | $this->assertEquals('0', $form->getViewData()); | ||
670 | } | ||
671 | |||
672 | public function testSetDataMultipleNonExpandedAcceptsBoolean() | ||
673 | { | ||
674 | $form = $this->factory->create('choice', null, array( | ||
675 | 'multiple' => true, | ||
676 | 'expanded' => false, | ||
677 | 'choices' => $this->numericChoices, | ||
678 | )); | ||
679 | |||
680 | $form->setData(array(false, true)); | ||
681 | |||
682 | $this->assertEquals(array(false, true), $form->getData()); | ||
683 | $this->assertEquals(array('0', '1'), $form->getViewData()); | ||
684 | } | ||
685 | |||
686 | public function testPassRequiredToView() | ||
687 | { | ||
688 | $form = $this->factory->create('choice', null, array( | ||
689 | 'choices' => $this->choices, | ||
690 | )); | ||
691 | $view = $form->createView(); | ||
692 | |||
693 | $this->assertTrue($view->vars['required']); | ||
694 | } | ||
695 | |||
696 | public function testPassNonRequiredToView() | ||
697 | { | ||
698 | $form = $this->factory->create('choice', null, array( | ||
699 | 'required' => false, | ||
700 | 'choices' => $this->choices, | ||
701 | )); | ||
702 | $view = $form->createView(); | ||
703 | |||
704 | $this->assertFalse($view->vars['required']); | ||
705 | } | ||
706 | |||
707 | public function testPassMultipleToView() | ||
708 | { | ||
709 | $form = $this->factory->create('choice', null, array( | ||
710 | 'multiple' => true, | ||
711 | 'choices' => $this->choices, | ||
712 | )); | ||
713 | $view = $form->createView(); | ||
714 | |||
715 | $this->assertTrue($view->vars['multiple']); | ||
716 | } | ||
717 | |||
718 | public function testPassExpandedToView() | ||
719 | { | ||
720 | $form = $this->factory->create('choice', null, array( | ||
721 | 'expanded' => true, | ||
722 | 'choices' => $this->choices, | ||
723 | )); | ||
724 | $view = $form->createView(); | ||
725 | |||
726 | $this->assertTrue($view->vars['expanded']); | ||
727 | } | ||
728 | |||
729 | public function testEmptyValueIsNullByDefaultIfRequired() | ||
730 | { | ||
731 | $form = $this->factory->create('choice', null, array( | ||
732 | 'multiple' => false, | ||
733 | 'required' => true, | ||
734 | 'choices' => $this->choices, | ||
735 | )); | ||
736 | $view = $form->createView(); | ||
737 | |||
738 | $this->assertNull($view->vars['empty_value']); | ||
739 | } | ||
740 | |||
741 | public function testEmptyValueIsEmptyStringByDefaultIfNotRequired() | ||
742 | { | ||
743 | $form = $this->factory->create('choice', null, array( | ||
744 | 'multiple' => false, | ||
745 | 'required' => false, | ||
746 | 'choices' => $this->choices, | ||
747 | )); | ||
748 | $view = $form->createView(); | ||
749 | |||
750 | $this->assertSame('', $view->vars['empty_value']); | ||
751 | } | ||
752 | |||
753 | /** | ||
754 | * @dataProvider getOptionsWithEmptyValue | ||
755 | */ | ||
756 | public function testPassEmptyValueToView($multiple, $expanded, $required, $emptyValue, $viewValue) | ||
757 | { | ||
758 | $form = $this->factory->create('choice', null, array( | ||
759 | 'multiple' => $multiple, | ||
760 | 'expanded' => $expanded, | ||
761 | 'required' => $required, | ||
762 | 'empty_value' => $emptyValue, | ||
763 | 'choices' => $this->choices, | ||
764 | )); | ||
765 | $view = $form->createView(); | ||
766 | |||
767 | $this->assertEquals($viewValue, $view->vars['empty_value']); | ||
768 | } | ||
769 | |||
770 | /** | ||
771 | * @dataProvider getOptionsWithEmptyValue | ||
772 | */ | ||
773 | public function testDontPassEmptyValueIfContainedInChoices($multiple, $expanded, $required, $emptyValue, $viewValue) | ||
774 | { | ||
775 | $form = $this->factory->create('choice', null, array( | ||
776 | 'multiple' => $multiple, | ||
777 | 'expanded' => $expanded, | ||
778 | 'required' => $required, | ||
779 | 'empty_value' => $emptyValue, | ||
780 | 'choices' => array('a' => 'A', '' => 'Empty'), | ||
781 | )); | ||
782 | $view = $form->createView(); | ||
783 | |||
784 | $this->assertNull($view->vars['empty_value']); | ||
785 | } | ||
786 | |||
787 | public function getOptionsWithEmptyValue() | ||
788 | { | ||
789 | return array( | ||
790 | // single non-expanded | ||
791 | array(false, false, false, 'foobar', 'foobar'), | ||
792 | array(false, false, false, '', ''), | ||
793 | array(false, false, false, null, null), | ||
794 | array(false, false, false, false, null), | ||
795 | array(false, false, true, 'foobar', 'foobar'), | ||
796 | array(false, false, true, '', ''), | ||
797 | array(false, false, true, null, null), | ||
798 | array(false, false, true, false, null), | ||
799 | // single expanded | ||
800 | array(false, true, false, 'foobar', 'foobar'), | ||
801 | // radios should never have an empty label | ||
802 | array(false, true, false, '', 'None'), | ||
803 | array(false, true, false, null, null), | ||
804 | array(false, true, false, false, null), | ||
805 | array(false, true, true, 'foobar', 'foobar'), | ||
806 | // radios should never have an empty label | ||
807 | array(false, true, true, '', 'None'), | ||
808 | array(false, true, true, null, null), | ||
809 | array(false, true, true, false, null), | ||
810 | // multiple non-expanded | ||
811 | array(true, false, false, 'foobar', null), | ||
812 | array(true, false, false, '', null), | ||
813 | array(true, false, false, null, null), | ||
814 | array(true, false, false, false, null), | ||
815 | array(true, false, true, 'foobar', null), | ||
816 | array(true, false, true, '', null), | ||
817 | array(true, false, true, null, null), | ||
818 | array(true, false, true, false, null), | ||
819 | // multiple expanded | ||
820 | array(true, true, false, 'foobar', null), | ||
821 | array(true, true, false, '', null), | ||
822 | array(true, true, false, null, null), | ||
823 | array(true, true, false, false, null), | ||
824 | array(true, true, true, 'foobar', null), | ||
825 | array(true, true, true, '', null), | ||
826 | array(true, true, true, null, null), | ||
827 | array(true, true, true, false, null), | ||
828 | ); | ||
829 | } | ||
830 | |||
831 | public function testPassChoicesToView() | ||
832 | { | ||
833 | $choices = array('a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D'); | ||
834 | $form = $this->factory->create('choice', null, array( | ||
835 | 'choices' => $choices, | ||
836 | )); | ||
837 | $view = $form->createView(); | ||
838 | |||
839 | $this->assertEquals(array( | ||
840 | new ChoiceView('a', 'a', 'A'), | ||
841 | new ChoiceView('b', 'b', 'B'), | ||
842 | new ChoiceView('c', 'c', 'C'), | ||
843 | new ChoiceView('d', 'd', 'D'), | ||
844 | ), $view->vars['choices']); | ||
845 | } | ||
846 | |||
847 | public function testPassPreferredChoicesToView() | ||
848 | { | ||
849 | $choices = array('a' => 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D'); | ||
850 | $form = $this->factory->create('choice', null, array( | ||
851 | 'choices' => $choices, | ||
852 | 'preferred_choices' => array('b', 'd'), | ||
853 | )); | ||
854 | $view = $form->createView(); | ||
855 | |||
856 | $this->assertEquals(array( | ||
857 | 0 => new ChoiceView('a', 'a', 'A'), | ||
858 | 2 => new ChoiceView('c', 'c', 'C'), | ||
859 | ), $view->vars['choices']); | ||
860 | $this->assertEquals(array( | ||
861 | 1 => new ChoiceView('b', 'b', 'B'), | ||
862 | 3 => new ChoiceView('d', 'd', 'D'), | ||
863 | ), $view->vars['preferred_choices']); | ||
864 | } | ||
865 | |||
866 | public function testPassHierarchicalChoicesToView() | ||
867 | { | ||
868 | $form = $this->factory->create('choice', null, array( | ||
869 | 'choices' => $this->groupedChoices, | ||
870 | 'preferred_choices' => array('b', 'd'), | ||
871 | )); | ||
872 | $view = $form->createView(); | ||
873 | |||
874 | $this->assertEquals(array( | ||
875 | 'Symfony' => array( | ||
876 | 0 => new ChoiceView('a', 'a', 'Bernhard'), | ||
877 | 2 => new ChoiceView('c', 'c', 'Kris'), | ||
878 | ), | ||
879 | 'Doctrine' => array( | ||
880 | 4 => new ChoiceView('e', 'e', 'Roman'), | ||
881 | ), | ||
882 | ), $view->vars['choices']); | ||
883 | $this->assertEquals(array( | ||
884 | 'Symfony' => array( | ||
885 | 1 => new ChoiceView('b', 'b', 'Fabien'), | ||
886 | ), | ||
887 | 'Doctrine' => array( | ||
888 | 3 => new ChoiceView('d', 'd', 'Jon'), | ||
889 | ), | ||
890 | ), $view->vars['preferred_choices']); | ||
891 | } | ||
892 | |||
893 | public function testPassChoiceDataToView() | ||
894 | { | ||
895 | $obj1 = (object) array('value' => 'a', 'label' => 'A'); | ||
896 | $obj2 = (object) array('value' => 'b', 'label' => 'B'); | ||
897 | $obj3 = (object) array('value' => 'c', 'label' => 'C'); | ||
898 | $obj4 = (object) array('value' => 'd', 'label' => 'D'); | ||
899 | $form = $this->factory->create('choice', null, array( | ||
900 | 'choice_list' => new ObjectChoiceList(array($obj1, $obj2, $obj3, $obj4), 'label', array(), null, 'value'), | ||
901 | )); | ||
902 | $view = $form->createView(); | ||
903 | |||
904 | $this->assertEquals(array( | ||
905 | new ChoiceView($obj1, 'a', 'A'), | ||
906 | new ChoiceView($obj2, 'b', 'B'), | ||
907 | new ChoiceView($obj3, 'c', 'C'), | ||
908 | new ChoiceView($obj4, 'd', 'D'), | ||
909 | ), $view->vars['choices']); | ||
910 | } | ||
911 | |||
912 | public function testAdjustFullNameForMultipleNonExpanded() | ||
913 | { | ||
914 | $form = $this->factory->createNamed('name', 'choice', null, array( | ||
915 | 'multiple' => true, | ||
916 | 'expanded' => false, | ||
917 | 'choices' => $this->choices, | ||
918 | )); | ||
919 | $view = $form->createView(); | ||
920 | |||
921 | $this->assertSame('name[]', $view->vars['full_name']); | ||
922 | } | ||
923 | |||
924 | // https://github.com/symfony/symfony/issues/3298 | ||
925 | public function testInitializeWithEmptyChoices() | ||
926 | { | ||
927 | $this->factory->createNamed('name', 'choice', null, array( | ||
928 | 'choices' => array(), | ||
929 | )); | ||
930 | } | ||
931 | |||
932 | public function testInitializeWithDefaultObjectChoice() | ||
933 | { | ||
934 | $obj1 = (object) array('value' => 'a', 'label' => 'A'); | ||
935 | $obj2 = (object) array('value' => 'b', 'label' => 'B'); | ||
936 | $obj3 = (object) array('value' => 'c', 'label' => 'C'); | ||
937 | $obj4 = (object) array('value' => 'd', 'label' => 'D'); | ||
938 | |||
939 | $form = $this->factory->create('choice', null, array( | ||
940 | 'choice_list' => new ObjectChoiceList(array($obj1, $obj2, $obj3, $obj4), 'label', array(), null, 'value'), | ||
941 | // Used to break because "data_class" was inferred, which needs to | ||
942 | // remain null in every case (because it refers to the view format) | ||
943 | 'data' => $obj3, | ||
944 | )); | ||
945 | |||
946 | // Trigger data initialization | ||
947 | $form->getViewData(); | ||
948 | } | ||
949 | } | ||