Added the Porter Stemmer module to improve searches. This doesn't deal with some...
[yaffs-website] / vendor / symfony / dom-crawler / Tests / Field / ChoiceFormFieldTest.php
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\DomCrawler\Tests\Field;
13
14 use Symfony\Component\DomCrawler\Field\ChoiceFormField;
15
16 class ChoiceFormFieldTest extends FormFieldTestCase
17 {
18     public function testInitialize()
19     {
20         $node = $this->createNode('textarea', '');
21         try {
22             $field = new ChoiceFormField($node);
23             $this->fail('->initialize() throws a \LogicException if the node is not an input or a select');
24         } catch (\LogicException $e) {
25             $this->assertTrue(true, '->initialize() throws a \LogicException if the node is not an input or a select');
26         }
27
28         $node = $this->createNode('input', '', array('type' => 'text'));
29         try {
30             $field = new ChoiceFormField($node);
31             $this->fail('->initialize() throws a \LogicException if the node is an input with a type different from checkbox or radio');
32         } catch (\LogicException $e) {
33             $this->assertTrue(true, '->initialize() throws a \LogicException if the node is an input with a type different from checkbox or radio');
34         }
35     }
36
37     public function testGetType()
38     {
39         $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo'));
40         $field = new ChoiceFormField($node);
41
42         $this->assertEquals('radio', $field->getType(), '->getType() returns radio for radio buttons');
43
44         $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'value' => 'foo'));
45         $field = new ChoiceFormField($node);
46
47         $this->assertEquals('checkbox', $field->getType(), '->getType() returns radio for a checkbox');
48
49         $node = $this->createNode('select', '');
50         $field = new ChoiceFormField($node);
51
52         $this->assertEquals('select', $field->getType(), '->getType() returns radio for a select');
53     }
54
55     public function testIsMultiple()
56     {
57         $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo'));
58         $field = new ChoiceFormField($node);
59
60         $this->assertFalse($field->isMultiple(), '->isMultiple() returns false for radio buttons');
61
62         $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'value' => 'foo'));
63         $field = new ChoiceFormField($node);
64
65         $this->assertFalse($field->isMultiple(), '->isMultiple() returns false for checkboxes');
66
67         $node = $this->createNode('select', '');
68         $field = new ChoiceFormField($node);
69
70         $this->assertFalse($field->isMultiple(), '->isMultiple() returns false for selects without the multiple attribute');
71
72         $node = $this->createNode('select', '', array('multiple' => 'multiple'));
73         $field = new ChoiceFormField($node);
74
75         $this->assertTrue($field->isMultiple(), '->isMultiple() returns true for selects with the multiple attribute');
76
77         $node = $this->createNode('select', '', array('multiple' => ''));
78         $field = new ChoiceFormField($node);
79
80         $this->assertTrue($field->isMultiple(), '->isMultiple() returns true for selects with an empty multiple attribute');
81     }
82
83     public function testSelects()
84     {
85         $node = $this->createSelectNode(array('foo' => false, 'bar' => false));
86         $field = new ChoiceFormField($node);
87
88         $this->assertTrue($field->hasValue(), '->hasValue() returns true for selects');
89         $this->assertEquals('foo', $field->getValue(), '->getValue() returns the first option if none are selected');
90         $this->assertFalse($field->isMultiple(), '->isMultiple() returns false when no multiple attribute is defined');
91
92         $node = $this->createSelectNode(array('foo' => false, 'bar' => true));
93         $field = new ChoiceFormField($node);
94
95         $this->assertEquals('bar', $field->getValue(), '->getValue() returns the selected option');
96
97         $field->setValue('foo');
98         $this->assertEquals('foo', $field->getValue(), '->setValue() changes the selected option');
99
100         try {
101             $field->setValue('foobar');
102             $this->fail('->setValue() throws an \InvalidArgumentException if the value is not one of the selected options');
103         } catch (\InvalidArgumentException $e) {
104             $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is not one of the selected options');
105         }
106
107         try {
108             $field->setValue(array('foobar'));
109             $this->fail('->setValue() throws an \InvalidArgumentException if the value is an array');
110         } catch (\InvalidArgumentException $e) {
111             $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is an array');
112         }
113     }
114
115     public function testSelectWithEmptyBooleanAttribute()
116     {
117         $node = $this->createSelectNode(array('foo' => false, 'bar' => true), array(), '');
118         $field = new ChoiceFormField($node);
119
120         $this->assertEquals('bar', $field->getValue());
121     }
122
123     public function testSelectIsDisabled()
124     {
125         $node = $this->createSelectNode(array('foo' => false, 'bar' => true), array('disabled' => 'disabled'));
126         $field = new ChoiceFormField($node);
127
128         $this->assertTrue($field->isDisabled(), '->isDisabled() returns true for selects with a disabled attribute');
129     }
130
131     public function testMultipleSelects()
132     {
133         $node = $this->createSelectNode(array('foo' => false, 'bar' => false), array('multiple' => 'multiple'));
134         $field = new ChoiceFormField($node);
135
136         $this->assertEquals(array(), $field->getValue(), '->setValue() returns an empty array if multiple is true and no option is selected');
137
138         $field->setValue('foo');
139         $this->assertEquals(array('foo'), $field->getValue(), '->setValue() returns an array of options if multiple is true');
140
141         $field->setValue('bar');
142         $this->assertEquals(array('bar'), $field->getValue(), '->setValue() returns an array of options if multiple is true');
143
144         $field->setValue(array('foo', 'bar'));
145         $this->assertEquals(array('foo', 'bar'), $field->getValue(), '->setValue() returns an array of options if multiple is true');
146
147         $node = $this->createSelectNode(array('foo' => true, 'bar' => true), array('multiple' => 'multiple'));
148         $field = new ChoiceFormField($node);
149
150         $this->assertEquals(array('foo', 'bar'), $field->getValue(), '->getValue() returns the selected options');
151
152         try {
153             $field->setValue(array('foobar'));
154             $this->fail('->setValue() throws an \InvalidArgumentException if the value is not one of the options');
155         } catch (\InvalidArgumentException $e) {
156             $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is not one of the options');
157         }
158     }
159
160     public function testRadioButtons()
161     {
162         $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo'));
163         $field = new ChoiceFormField($node);
164         $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'bar'));
165         $field->addChoice($node);
166
167         $this->assertFalse($field->hasValue(), '->hasValue() returns false when no radio button is selected');
168         $this->assertNull($field->getValue(), '->getValue() returns null if no radio button is selected');
169         $this->assertFalse($field->isMultiple(), '->isMultiple() returns false for radio buttons');
170
171         $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo'));
172         $field = new ChoiceFormField($node);
173         $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'bar', 'checked' => 'checked'));
174         $field->addChoice($node);
175
176         $this->assertTrue($field->hasValue(), '->hasValue() returns true when a radio button is selected');
177         $this->assertEquals('bar', $field->getValue(), '->getValue() returns the value attribute of the selected radio button');
178
179         $field->setValue('foo');
180         $this->assertEquals('foo', $field->getValue(), '->setValue() changes the selected radio button');
181
182         try {
183             $field->setValue('foobar');
184             $this->fail('->setValue() throws an \InvalidArgumentException if the value is not one of the radio button values');
185         } catch (\InvalidArgumentException $e) {
186             $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is not one of the radio button values');
187         }
188     }
189
190     public function testRadioButtonsWithEmptyBooleanAttribute()
191     {
192         $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo'));
193         $field = new ChoiceFormField($node);
194         $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'bar', 'checked' => ''));
195         $field->addChoice($node);
196
197         $this->assertTrue($field->hasValue(), '->hasValue() returns true when a radio button is selected');
198         $this->assertEquals('bar', $field->getValue(), '->getValue() returns the value attribute of the selected radio button');
199     }
200
201     public function testRadioButtonIsDisabled()
202     {
203         $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo', 'disabled' => 'disabled'));
204         $field = new ChoiceFormField($node);
205         $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'bar'));
206         $field->addChoice($node);
207         $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'baz', 'disabled' => ''));
208         $field->addChoice($node);
209
210         $field->select('foo');
211         $this->assertEquals('foo', $field->getValue(), '->getValue() returns the value attribute of the selected radio button');
212         $this->assertTrue($field->isDisabled());
213
214         $field->select('bar');
215         $this->assertEquals('bar', $field->getValue(), '->getValue() returns the value attribute of the selected radio button');
216         $this->assertFalse($field->isDisabled());
217
218         $field->select('baz');
219         $this->assertEquals('baz', $field->getValue(), '->getValue() returns the value attribute of the selected radio button');
220         $this->assertTrue($field->isDisabled());
221     }
222
223     public function testCheckboxes()
224     {
225         $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name'));
226         $field = new ChoiceFormField($node);
227
228         $this->assertFalse($field->hasValue(), '->hasValue() returns false when the checkbox is not checked');
229         $this->assertNull($field->getValue(), '->getValue() returns null if the checkbox is not checked');
230         $this->assertFalse($field->isMultiple(), '->hasValue() returns false for checkboxes');
231         try {
232             $field->addChoice(new \DOMElement('input'));
233             $this->fail('->addChoice() throws a \LogicException for checkboxes');
234         } catch (\LogicException $e) {
235             $this->assertTrue(true, '->initialize() throws a \LogicException for checkboxes');
236         }
237
238         $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked'));
239         $field = new ChoiceFormField($node);
240
241         $this->assertTrue($field->hasValue(), '->hasValue() returns true when the checkbox is checked');
242         $this->assertEquals('on', $field->getValue(), '->getValue() returns 1 if the checkbox is checked and has no value attribute');
243
244         $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked', 'value' => 'foo'));
245         $field = new ChoiceFormField($node);
246
247         $this->assertEquals('foo', $field->getValue(), '->getValue() returns the value attribute if the checkbox is checked');
248
249         $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked', 'value' => 'foo'));
250         $field = new ChoiceFormField($node);
251
252         $field->setValue(false);
253         $this->assertNull($field->getValue(), '->setValue() unchecks the checkbox is value is false');
254
255         $field->setValue(true);
256         $this->assertEquals('foo', $field->getValue(), '->setValue() checks the checkbox is value is true');
257
258         try {
259             $field->setValue('bar');
260             $this->fail('->setValue() throws an \InvalidArgumentException if the value is not one from the value attribute');
261         } catch (\InvalidArgumentException $e) {
262             $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is not one from the value attribute');
263         }
264     }
265
266     public function testCheckboxWithEmptyBooleanAttribute()
267     {
268         $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'value' => 'foo', 'checked' => ''));
269         $field = new ChoiceFormField($node);
270
271         $this->assertTrue($field->hasValue(), '->hasValue() returns true when the checkbox is checked');
272         $this->assertEquals('foo', $field->getValue());
273     }
274
275     public function testTick()
276     {
277         $node = $this->createSelectNode(array('foo' => false, 'bar' => false));
278         $field = new ChoiceFormField($node);
279
280         try {
281             $field->tick();
282             $this->fail('->tick() throws a \LogicException for select boxes');
283         } catch (\LogicException $e) {
284             $this->assertTrue(true, '->tick() throws a \LogicException for select boxes');
285         }
286
287         $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name'));
288         $field = new ChoiceFormField($node);
289         $field->tick();
290         $this->assertEquals('on', $field->getValue(), '->tick() ticks checkboxes');
291     }
292
293     public function testUntick()
294     {
295         $node = $this->createSelectNode(array('foo' => false, 'bar' => false));
296         $field = new ChoiceFormField($node);
297
298         try {
299             $field->untick();
300             $this->fail('->untick() throws a \LogicException for select boxes');
301         } catch (\LogicException $e) {
302             $this->assertTrue(true, '->untick() throws a \LogicException for select boxes');
303         }
304
305         $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked'));
306         $field = new ChoiceFormField($node);
307         $field->untick();
308         $this->assertNull($field->getValue(), '->untick() unticks checkboxes');
309     }
310
311     public function testSelect()
312     {
313         $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked'));
314         $field = new ChoiceFormField($node);
315         $field->select(true);
316         $this->assertEquals('on', $field->getValue(), '->select() changes the value of the field');
317         $field->select(false);
318         $this->assertNull($field->getValue(), '->select() changes the value of the field');
319
320         $node = $this->createSelectNode(array('foo' => false, 'bar' => false));
321         $field = new ChoiceFormField($node);
322         $field->select('foo');
323         $this->assertEquals('foo', $field->getValue(), '->select() changes the selected option');
324     }
325
326     public function testOptionWithNoValue()
327     {
328         $node = $this->createSelectNodeWithEmptyOption(array('foo' => false, 'bar' => false));
329         $field = new ChoiceFormField($node);
330         $this->assertEquals('foo', $field->getValue());
331
332         $node = $this->createSelectNodeWithEmptyOption(array('foo' => false, 'bar' => true));
333         $field = new ChoiceFormField($node);
334         $this->assertEquals('bar', $field->getValue());
335         $field->select('foo');
336         $this->assertEquals('foo', $field->getValue(), '->select() changes the selected option');
337     }
338
339     public function testDisableValidation()
340     {
341         $node = $this->createSelectNode(array('foo' => false, 'bar' => false));
342         $field = new ChoiceFormField($node);
343         $field->disableValidation();
344         $field->setValue('foobar');
345         $this->assertEquals('foobar', $field->getValue(), '->disableValidation() allows to set a value which is not in the selected options.');
346
347         $node = $this->createSelectNode(array('foo' => false, 'bar' => false), array('multiple' => 'multiple'));
348         $field = new ChoiceFormField($node);
349         $field->disableValidation();
350         $field->setValue(array('foobar'));
351         $this->assertEquals(array('foobar'), $field->getValue(), '->disableValidation() allows to set a value which is not in the selected options.');
352     }
353
354     public function testSelectWithEmptyValue()
355     {
356         $node = $this->createSelectNodeWithEmptyOption(array('' => true, 'Female' => false, 'Male' => false));
357         $field = new ChoiceFormField($node);
358
359         $this->assertSame('', $field->getValue());
360     }
361
362     protected function createSelectNode($options, $attributes = array(), $selectedAttrText = 'selected')
363     {
364         $document = new \DOMDocument();
365         $node = $document->createElement('select');
366
367         foreach ($attributes as $name => $value) {
368             $node->setAttribute($name, $value);
369         }
370         $node->setAttribute('name', 'name');
371
372         foreach ($options as $value => $selected) {
373             $option = $document->createElement('option', $value);
374             $option->setAttribute('value', $value);
375             if ($selected) {
376                 $option->setAttribute('selected', $selectedAttrText);
377             }
378             $node->appendChild($option);
379         }
380
381         return $node;
382     }
383
384     protected function createSelectNodeWithEmptyOption($options, $attributes = array())
385     {
386         $document = new \DOMDocument();
387         $node = $document->createElement('select');
388
389         foreach ($attributes as $name => $value) {
390             $node->setAttribute($name, $value);
391         }
392         $node->setAttribute('name', 'name');
393
394         foreach ($options as $value => $selected) {
395             $option = $document->createElement('option', $value);
396             if ($selected) {
397                 $option->setAttribute('selected', 'selected');
398             }
399             $node->appendChild($option);
400         }
401
402         return $node;
403     }
404 }