* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\DomCrawler\Tests\Field; use Symfony\Component\DomCrawler\Field\ChoiceFormField; class ChoiceFormFieldTest extends FormFieldTestCase { public function testInitialize() { $node = $this->createNode('textarea', ''); try { $field = new ChoiceFormField($node); $this->fail('->initialize() throws a \LogicException if the node is not an input or a select'); } catch (\LogicException $e) { $this->assertTrue(true, '->initialize() throws a \LogicException if the node is not an input or a select'); } $node = $this->createNode('input', '', array('type' => 'text')); try { $field = new ChoiceFormField($node); $this->fail('->initialize() throws a \LogicException if the node is an input with a type different from checkbox or radio'); } catch (\LogicException $e) { $this->assertTrue(true, '->initialize() throws a \LogicException if the node is an input with a type different from checkbox or radio'); } } public function testGetType() { $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo')); $field = new ChoiceFormField($node); $this->assertEquals('radio', $field->getType(), '->getType() returns radio for radio buttons'); $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'value' => 'foo')); $field = new ChoiceFormField($node); $this->assertEquals('checkbox', $field->getType(), '->getType() returns radio for a checkbox'); $node = $this->createNode('select', ''); $field = new ChoiceFormField($node); $this->assertEquals('select', $field->getType(), '->getType() returns radio for a select'); } public function testIsMultiple() { $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo')); $field = new ChoiceFormField($node); $this->assertFalse($field->isMultiple(), '->isMultiple() returns false for radio buttons'); $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'value' => 'foo')); $field = new ChoiceFormField($node); $this->assertFalse($field->isMultiple(), '->isMultiple() returns false for checkboxes'); $node = $this->createNode('select', ''); $field = new ChoiceFormField($node); $this->assertFalse($field->isMultiple(), '->isMultiple() returns false for selects without the multiple attribute'); $node = $this->createNode('select', '', array('multiple' => 'multiple')); $field = new ChoiceFormField($node); $this->assertTrue($field->isMultiple(), '->isMultiple() returns true for selects with the multiple attribute'); $node = $this->createNode('select', '', array('multiple' => '')); $field = new ChoiceFormField($node); $this->assertTrue($field->isMultiple(), '->isMultiple() returns true for selects with an empty multiple attribute'); } public function testSelects() { $node = $this->createSelectNode(array('foo' => false, 'bar' => false)); $field = new ChoiceFormField($node); $this->assertTrue($field->hasValue(), '->hasValue() returns true for selects'); $this->assertEquals('foo', $field->getValue(), '->getValue() returns the first option if none are selected'); $this->assertFalse($field->isMultiple(), '->isMultiple() returns false when no multiple attribute is defined'); $node = $this->createSelectNode(array('foo' => false, 'bar' => true)); $field = new ChoiceFormField($node); $this->assertEquals('bar', $field->getValue(), '->getValue() returns the selected option'); $field->setValue('foo'); $this->assertEquals('foo', $field->getValue(), '->setValue() changes the selected option'); try { $field->setValue('foobar'); $this->fail('->setValue() throws an \InvalidArgumentException if the value is not one of the selected options'); } catch (\InvalidArgumentException $e) { $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is not one of the selected options'); } try { $field->setValue(array('foobar')); $this->fail('->setValue() throws an \InvalidArgumentException if the value is an array'); } catch (\InvalidArgumentException $e) { $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is an array'); } } public function testSelectWithEmptyBooleanAttribute() { $node = $this->createSelectNode(array('foo' => false, 'bar' => true), array(), ''); $field = new ChoiceFormField($node); $this->assertEquals('bar', $field->getValue()); } public function testSelectIsDisabled() { $node = $this->createSelectNode(array('foo' => false, 'bar' => true), array('disabled' => 'disabled')); $field = new ChoiceFormField($node); $this->assertTrue($field->isDisabled(), '->isDisabled() returns true for selects with a disabled attribute'); } public function testMultipleSelects() { $node = $this->createSelectNode(array('foo' => false, 'bar' => false), array('multiple' => 'multiple')); $field = new ChoiceFormField($node); $this->assertEquals(array(), $field->getValue(), '->setValue() returns an empty array if multiple is true and no option is selected'); $field->setValue('foo'); $this->assertEquals(array('foo'), $field->getValue(), '->setValue() returns an array of options if multiple is true'); $field->setValue('bar'); $this->assertEquals(array('bar'), $field->getValue(), '->setValue() returns an array of options if multiple is true'); $field->setValue(array('foo', 'bar')); $this->assertEquals(array('foo', 'bar'), $field->getValue(), '->setValue() returns an array of options if multiple is true'); $node = $this->createSelectNode(array('foo' => true, 'bar' => true), array('multiple' => 'multiple')); $field = new ChoiceFormField($node); $this->assertEquals(array('foo', 'bar'), $field->getValue(), '->getValue() returns the selected options'); try { $field->setValue(array('foobar')); $this->fail('->setValue() throws an \InvalidArgumentException if the value is not one of the options'); } catch (\InvalidArgumentException $e) { $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is not one of the options'); } } public function testRadioButtons() { $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo')); $field = new ChoiceFormField($node); $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'bar')); $field->addChoice($node); $this->assertFalse($field->hasValue(), '->hasValue() returns false when no radio button is selected'); $this->assertNull($field->getValue(), '->getValue() returns null if no radio button is selected'); $this->assertFalse($field->isMultiple(), '->isMultiple() returns false for radio buttons'); $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo')); $field = new ChoiceFormField($node); $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'bar', 'checked' => 'checked')); $field->addChoice($node); $this->assertTrue($field->hasValue(), '->hasValue() returns true when a radio button is selected'); $this->assertEquals('bar', $field->getValue(), '->getValue() returns the value attribute of the selected radio button'); $field->setValue('foo'); $this->assertEquals('foo', $field->getValue(), '->setValue() changes the selected radio button'); try { $field->setValue('foobar'); $this->fail('->setValue() throws an \InvalidArgumentException if the value is not one of the radio button values'); } catch (\InvalidArgumentException $e) { $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is not one of the radio button values'); } } public function testRadioButtonsWithEmptyBooleanAttribute() { $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo')); $field = new ChoiceFormField($node); $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'bar', 'checked' => '')); $field->addChoice($node); $this->assertTrue($field->hasValue(), '->hasValue() returns true when a radio button is selected'); $this->assertEquals('bar', $field->getValue(), '->getValue() returns the value attribute of the selected radio button'); } public function testRadioButtonIsDisabled() { $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'foo', 'disabled' => 'disabled')); $field = new ChoiceFormField($node); $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'bar')); $field->addChoice($node); $node = $this->createNode('input', '', array('type' => 'radio', 'name' => 'name', 'value' => 'baz', 'disabled' => '')); $field->addChoice($node); $field->select('foo'); $this->assertEquals('foo', $field->getValue(), '->getValue() returns the value attribute of the selected radio button'); $this->assertTrue($field->isDisabled()); $field->select('bar'); $this->assertEquals('bar', $field->getValue(), '->getValue() returns the value attribute of the selected radio button'); $this->assertFalse($field->isDisabled()); $field->select('baz'); $this->assertEquals('baz', $field->getValue(), '->getValue() returns the value attribute of the selected radio button'); $this->assertTrue($field->isDisabled()); } public function testCheckboxes() { $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name')); $field = new ChoiceFormField($node); $this->assertFalse($field->hasValue(), '->hasValue() returns false when the checkbox is not checked'); $this->assertNull($field->getValue(), '->getValue() returns null if the checkbox is not checked'); $this->assertFalse($field->isMultiple(), '->hasValue() returns false for checkboxes'); try { $field->addChoice(new \DOMElement('input')); $this->fail('->addChoice() throws a \LogicException for checkboxes'); } catch (\LogicException $e) { $this->assertTrue(true, '->initialize() throws a \LogicException for checkboxes'); } $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked')); $field = new ChoiceFormField($node); $this->assertTrue($field->hasValue(), '->hasValue() returns true when the checkbox is checked'); $this->assertEquals('on', $field->getValue(), '->getValue() returns 1 if the checkbox is checked and has no value attribute'); $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked', 'value' => 'foo')); $field = new ChoiceFormField($node); $this->assertEquals('foo', $field->getValue(), '->getValue() returns the value attribute if the checkbox is checked'); $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked', 'value' => 'foo')); $field = new ChoiceFormField($node); $field->setValue(false); $this->assertNull($field->getValue(), '->setValue() unchecks the checkbox is value is false'); $field->setValue(true); $this->assertEquals('foo', $field->getValue(), '->setValue() checks the checkbox is value is true'); try { $field->setValue('bar'); $this->fail('->setValue() throws an \InvalidArgumentException if the value is not one from the value attribute'); } catch (\InvalidArgumentException $e) { $this->assertTrue(true, '->setValue() throws an \InvalidArgumentException if the value is not one from the value attribute'); } } public function testCheckboxWithEmptyBooleanAttribute() { $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'value' => 'foo', 'checked' => '')); $field = new ChoiceFormField($node); $this->assertTrue($field->hasValue(), '->hasValue() returns true when the checkbox is checked'); $this->assertEquals('foo', $field->getValue()); } public function testTick() { $node = $this->createSelectNode(array('foo' => false, 'bar' => false)); $field = new ChoiceFormField($node); try { $field->tick(); $this->fail('->tick() throws a \LogicException for select boxes'); } catch (\LogicException $e) { $this->assertTrue(true, '->tick() throws a \LogicException for select boxes'); } $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name')); $field = new ChoiceFormField($node); $field->tick(); $this->assertEquals('on', $field->getValue(), '->tick() ticks checkboxes'); } public function testUntick() { $node = $this->createSelectNode(array('foo' => false, 'bar' => false)); $field = new ChoiceFormField($node); try { $field->untick(); $this->fail('->untick() throws a \LogicException for select boxes'); } catch (\LogicException $e) { $this->assertTrue(true, '->untick() throws a \LogicException for select boxes'); } $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked')); $field = new ChoiceFormField($node); $field->untick(); $this->assertNull($field->getValue(), '->untick() unticks checkboxes'); } public function testSelect() { $node = $this->createNode('input', '', array('type' => 'checkbox', 'name' => 'name', 'checked' => 'checked')); $field = new ChoiceFormField($node); $field->select(true); $this->assertEquals('on', $field->getValue(), '->select() changes the value of the field'); $field->select(false); $this->assertNull($field->getValue(), '->select() changes the value of the field'); $node = $this->createSelectNode(array('foo' => false, 'bar' => false)); $field = new ChoiceFormField($node); $field->select('foo'); $this->assertEquals('foo', $field->getValue(), '->select() changes the selected option'); } public function testOptionWithNoValue() { $node = $this->createSelectNodeWithEmptyOption(array('foo' => false, 'bar' => false)); $field = new ChoiceFormField($node); $this->assertEquals('foo', $field->getValue()); $node = $this->createSelectNodeWithEmptyOption(array('foo' => false, 'bar' => true)); $field = new ChoiceFormField($node); $this->assertEquals('bar', $field->getValue()); $field->select('foo'); $this->assertEquals('foo', $field->getValue(), '->select() changes the selected option'); } public function testDisableValidation() { $node = $this->createSelectNode(array('foo' => false, 'bar' => false)); $field = new ChoiceFormField($node); $field->disableValidation(); $field->setValue('foobar'); $this->assertEquals('foobar', $field->getValue(), '->disableValidation() allows to set a value which is not in the selected options.'); $node = $this->createSelectNode(array('foo' => false, 'bar' => false), array('multiple' => 'multiple')); $field = new ChoiceFormField($node); $field->disableValidation(); $field->setValue(array('foobar')); $this->assertEquals(array('foobar'), $field->getValue(), '->disableValidation() allows to set a value which is not in the selected options.'); } public function testSelectWithEmptyValue() { $node = $this->createSelectNodeWithEmptyOption(array('' => true, 'Female' => false, 'Male' => false)); $field = new ChoiceFormField($node); $this->assertSame('', $field->getValue()); } protected function createSelectNode($options, $attributes = array(), $selectedAttrText = 'selected') { $document = new \DOMDocument(); $node = $document->createElement('select'); foreach ($attributes as $name => $value) { $node->setAttribute($name, $value); } $node->setAttribute('name', 'name'); foreach ($options as $value => $selected) { $option = $document->createElement('option', $value); $option->setAttribute('value', $value); if ($selected) { $option->setAttribute('selected', $selectedAttrText); } $node->appendChild($option); } return $node; } protected function createSelectNodeWithEmptyOption($options, $attributes = array()) { $document = new \DOMDocument(); $node = $document->createElement('select'); foreach ($attributes as $name => $value) { $node->setAttribute($name, $value); } $node->setAttribute('name', 'name'); foreach ($options as $value => $selected) { $option = $document->createElement('option', $value); if ($selected) { $option->setAttribute('selected', 'selected'); } $node->appendChild($option); } return $node; } } __halt_compiler();----SIGNATURE:----lk8mBTobcdlEOFWspmKY8phyxeDR4VfbCtlfWzNMI2xuR2Iw9bmraYxd3rEnYSOWoMPsFKWYTQGsXL0LpAShPVycQjZZcQkDcq6JAXu/foMpzx0jpzNrPsc/NskQUkSsNYLfv4Bu6+ObV+oudAmMqYtsj+itYY5gcHDrf/zDyVaSAsmrKXFNBRZD5Yi06kfZ1HwCYKPOLJf9oe7ah3TVFXQCY9MTEDIQLJJA88t0sQGqKnKylASYtfQQsKm2MMTf6TpB+e6b01mU/IS5ZzGq+OAE1f6ugc68e2BYzs5lzxGJBhUIwOtwXbhbCCJt6/anCeRG2UIKIG+V41k6hGUJXehqkxZs8bCKP6zSxaUu/uL72is4e0j4ARCvMN61OdC4+hjaLP14G7iN8DYbHTqDXdRNeDBNHnUOGOXORxKSEqnQmht9MTROVf/B5/HncrBZOuOXEtSfeAKZPlVnFX6tQIpC0bbFabf8QY2ASOWh8efjzYVxZTs4Klk2WC5fA7niok2T58xEQhYwi0ujh5ge6dAorroBo1f59n9+mv1PP0vUUG+/oKZSPiwL7L9mKtQSK/7K1HFgzglzB0nzzP3XOef5Y5ON7vfzVdyx7tJAEV53Vo8A8bDE29o0Yz/7pqN0FsK7v33768tGTiNiK4DMvZYYsBSip3I2sYxOVacktfk=----ATTACHMENT:----MjMxMDg0MTIyNDU2NzA1MyA5MTA0NzUxNzQ2NDgxMjI2IDk1NzkzNjEwMzg3MDUwNTk=