diff --git a/UPGRADE-2.1.md b/UPGRADE-2.1.md index e4e8ce6886..a193ddcac3 100644 --- a/UPGRADE-2.1.md +++ b/UPGRADE-2.1.md @@ -158,14 +158,11 @@ UPGRADE FROM 2.0 to 2.1 `getChoices()` and `getChoicesByValues()`. For the latter two, no replacement exists. - * The strategy for generating the `id` and `name` HTML attributes for choices - in a choice field has changed. + * The strategy for generating the `id` and `name` HTML attributes for + checkboxes and radio buttons in a choice field has changed. Instead of appending the choice value, a generated integer is now appended - by default. Take care if your JavaScript relies on the old behavior. If you - can guarantee that your choice values only contain ASCII letters, digits, - colons and underscores, you can restore the old behavior by setting the - `index_strategy` choice field option to `ChoiceList::COPY_CHOICE`. + by default. Take care if your JavaScript relies on that. * In the choice field type's template, the structure of the `choices` variable has changed. diff --git a/src/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php b/src/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php index aa41d0a330..789423c88b 100644 --- a/src/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php +++ b/src/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php @@ -319,7 +319,7 @@ class EntityChoiceList extends ObjectChoiceList protected function createValue($entity) { if (count($this->identifier) === 1) { - return current($this->getIdentifierValues($entity)); + return (string) current($this->getIdentifierValues($entity)); } return parent::createValue($entity); diff --git a/src/Symfony/Bridge/Propel1/Form/ChoiceList/ModelChoiceList.php b/src/Symfony/Bridge/Propel1/Form/ChoiceList/ModelChoiceList.php index 585ab8913f..254de8385e 100644 --- a/src/Symfony/Bridge/Propel1/Form/ChoiceList/ModelChoiceList.php +++ b/src/Symfony/Bridge/Propel1/Form/ChoiceList/ModelChoiceList.php @@ -304,7 +304,7 @@ class ModelChoiceList extends ObjectChoiceList protected function createValue($model) { if (1 === count($this->identifier)) { - return current($this->getIdentifierValues($model)); + return (string) current($this->getIdentifierValues($model)); } return parent::createValue($model); diff --git a/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php b/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php index b9559074a2..cf226ff1e8 100644 --- a/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php +++ b/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php @@ -32,29 +32,6 @@ use Symfony\Component\Form\Extension\Core\View\ChoiceView; */ class ChoiceList implements ChoiceListInterface { - /** - * Strategy creating new indices/values by creating a copy of the choice. - * - * This strategy can only be used for index creation if choices are - * guaranteed to only contain ASCII letters, digits and underscores. - * - * It can be used for value creation if choices can safely be cast into - * a (unique) string. - * - * @var integer - */ - const COPY_CHOICE = 0; - - /** - * Strategy creating new indices/values by generating a new integer. - * - * This strategy can always be applied, but leads to loss of information - * in the HTML source code. - * - * @var integer - */ - const GENERATE = 1; - /** * The choices with their indices as keys. * @@ -85,24 +62,6 @@ class ChoiceList implements ChoiceListInterface */ private $remainingViews = array(); - /** - * The strategy used for creating choice indices. - * - * @var integer - * @see COPY_CHOICE - * @see GENERATE - */ - private $indexStrategy; - - /** - * The strategy used for creating choice values. - * - * @var integer - * @see COPY_CHOICE - * @see GENERATE - */ - private $valueStrategy; - /** * Creates a new choice list. * @@ -115,16 +74,9 @@ class ChoiceList implements ChoiceListInterface * should match the structure of $choices. * @param array $preferredChoices A flat array of choices that should be * presented to the user with priority. - * @param integer $valueStrategy The strategy used to create choice values. - * One of COPY_CHOICE and GENERATE. - * @param integer $indexStrategy The strategy used to create choice indices. - * One of COPY_CHOICE and GENERATE. */ - public function __construct($choices, array $labels, array $preferredChoices = array(), $valueStrategy = self::GENERATE, $indexStrategy = self::GENERATE) + public function __construct($choices, array $labels, array $preferredChoices = array()) { - $this->valueStrategy = $valueStrategy; - $this->indexStrategy = $indexStrategy; - $this->initialize($choices, $labels, $preferredChoices); } @@ -191,13 +143,6 @@ class ChoiceList implements ChoiceListInterface public function getChoicesForValues(array $values) { $values = $this->fixValues($values); - - // If the values are identical to the choices, we can just return them - // to improve performance a little bit - if (self::COPY_CHOICE === $this->valueStrategy) { - return $this->fixChoices(array_intersect($values, $this->values)); - } - $choices = array(); foreach ($values as $j => $givenValue) { @@ -222,13 +167,6 @@ class ChoiceList implements ChoiceListInterface public function getValuesForChoices(array $choices) { $choices = $this->fixChoices($choices); - - // If the values are identical to the choices, we can just return them - // to improve performance a little bit - if (self::COPY_CHOICE === $this->valueStrategy) { - return $this->fixValues(array_intersect($choices, $this->choices)); - } - $values = array(); foreach ($this->choices as $i => $choice) { @@ -398,17 +336,15 @@ class ChoiceList implements ChoiceListInterface $index = $this->createIndex($choice); if ('' === $index || null === $index || !Form::isValidName((string)$index)) { - throw new InvalidConfigurationException('The choice list index "' . $index . '" is invalid. Please set the choice field option "index_generation" to ChoiceList::GENERATE.'); + throw new InvalidConfigurationException('The index "' . $index . '" created by the choice list is invalid. It should be a valid, non-empty Form name.'); } $value = $this->createValue($choice); - if (!is_scalar($value)) { - throw new InvalidConfigurationException('The choice list value of type "' . gettype($value) . '" should be a scalar. Please set the choice field option "value_generation" to ChoiceList::GENERATE.'); + if (!is_string($value)) { + throw new InvalidConfigurationException('The value created by the choice list is of type "' . gettype($value) . '", but should be a string.'); } - // Always store values as strings to facilitate comparisons - $value = $this->fixValue($value); $view = new ChoiceView($value, $label); $this->choices[$index] = $this->fixChoice($choice); @@ -448,29 +384,23 @@ class ChoiceList implements ChoiceListInterface */ protected function createIndex($choice) { - if (self::COPY_CHOICE === $this->indexStrategy) { - return $choice; - } - return count($this->choices); } /** * Creates a new unique value for this choice. * - * Extension point to change the value strategy. + * By default, an integer is generated since it cannot be guaranteed that + * all values in the list are convertible to (unique) strings. Subclasses + * can override this behaviour if they can guarantee this property. * * @param mixed $choice The choice to create a value for * - * @return integer|string A unique value without character limitations. + * @return string A unique string. */ protected function createValue($choice) { - if (self::COPY_CHOICE === $this->valueStrategy) { - return $choice; - } - - return count($this->values); + return (string) count($this->values); } /** diff --git a/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceListInterface.php b/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceListInterface.php index 122b50e7e5..b4ce590d28 100644 --- a/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceListInterface.php +++ b/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceListInterface.php @@ -14,17 +14,12 @@ namespace Symfony\Component\Form\Extension\Core\ChoiceList; /** * Contains choices that can be selected in a form field. * - * Each choice has four different properties: + * Each choice has three different properties: * * - Choice: The choice that should be returned to the application by the * choice field. Can be any scalar value or an object, but no * array. * - Label: A text representing the choice that is displayed to the user. - * - Index: A uniquely identifying index that should only contain ASCII - * characters, digits and underscores. This index is used to - * identify the choice in the HTML "id" and "name" attributes. - * It is also used as index of the arrays returned by the various - * getters of this class. * - Value: A uniquely identifying value that can contain arbitrary * characters, but no arrays or objects. This value is displayed * in the HTML "value" attribute. diff --git a/src/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php b/src/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php index daf13efcd3..25038cbf82 100644 --- a/src/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php +++ b/src/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php @@ -19,8 +19,8 @@ use Symfony\Component\Form\Exception\InvalidPropertyException; /** * A choice list for object choices. * - * Supports generation of choice labels, choice groups, choice values and - * choice indices by calling getters of the object (or associated objects). + * Supports generation of choice labels, choice groups and choice values + * by calling getters of the object (or associated objects). * * * $choices = array($user1, $user2); @@ -54,13 +54,6 @@ class ObjectChoiceList extends ChoiceList */ private $valuePath; - /** - * The property path used to obtain the choice index. - * - * @var PropertyPath - */ - private $indexPath; - /** * Creates a new object choice list. * @@ -82,18 +75,14 @@ class ObjectChoiceList extends ChoiceList * @param string $valuePath A property path pointing to the property used * for the choice values. If not given, integers * are generated instead. - * @param string $indexPath A property path pointing to the property used - * for the choice indices. If not given, integers - * are generated instead. */ - public function __construct($choices, $labelPath = null, array $preferredChoices = array(), $groupPath = null, $valuePath = null, $indexPath = null) + public function __construct($choices, $labelPath = null, array $preferredChoices = array(), $groupPath = null, $valuePath = null) { $this->labelPath = $labelPath ? new PropertyPath($labelPath) : null; $this->groupPath = $groupPath ? new PropertyPath($groupPath) : null; $this->valuePath = $valuePath ? new PropertyPath($valuePath) : null; - $this->indexPath = $indexPath ? new PropertyPath($indexPath) : null; - parent::__construct($choices, array(), $preferredChoices, self::GENERATE, self::GENERATE); + parent::__construct($choices, array(), $preferredChoices); } /** @@ -148,27 +137,6 @@ class ObjectChoiceList extends ChoiceList parent::initialize($choices, $labels, $preferredChoices); } - /** - * Creates a new unique index for this choice. - * - * If a property path for the index was given at object creation, - * the getter behind that path is now called to obtain a new value. - * - * Otherwise a new integer is generated. - * - * @param mixed $choice The choice to create an index for - * @return integer|string A unique index containing only ASCII letters, - * digits and underscores. - */ - protected function createIndex($choice) - { - if ($this->indexPath) { - return $this->indexPath->getValue($choice); - } - - return parent::createIndex($choice); - } - /** * Creates a new unique value for this choice. * @@ -183,7 +151,7 @@ class ObjectChoiceList extends ChoiceList protected function createValue($choice) { if ($this->valuePath) { - return $this->valuePath->getValue($choice); + return (string) $this->valuePath->getValue($choice); } return parent::createValue($choice); diff --git a/src/Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php b/src/Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php index 27a7382c03..0ebdcc737b 100644 --- a/src/Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php +++ b/src/Symfony/Component/Form/Extension/Core/ChoiceList/SimpleChoiceList.php @@ -28,27 +28,6 @@ use Symfony\Component\Form\Exception\UnexpectedTypeException; * )); * * - * The default value generation strategy is `ChoiceList::COPY_CHOICE`, because - * choice values must be scalar, and the choices passed to this choice list - * are guaranteed to be scalar. - * - * The default index generation strategy is `ChoiceList::GENERATE`, so that - * your choices can also contain values that are illegal as indices. If your - * choices are guaranteed to start with a letter, digit or underscore and only - * contain letters, digits, underscores, hyphens and colons, you can set the - * strategy to `ChoiceList::COPY_CHOICE` instead. - * - * - * $choices = array( - * 'creditcard' => 'Credit card payment', - * 'cash' => 'Cash payment', - * ); - * - * // value generation: COPY_CHOICE (the default) - * // index generation: COPY_CHOICE (custom) - * $choiceList = new SimpleChoiceList($choices, array(), ChoiceList::COPY_CHOICE, ChoiceList::COPY_CHOICE); - * - * * @author Bernhard Schussek */ class SimpleChoiceList extends ChoiceList @@ -64,15 +43,35 @@ class SimpleChoiceList extends ChoiceList * key pointing to the nested array. * @param array $preferredChoices A flat array of choices that should be * presented to the user with priority. - * @param integer $valueStrategy The strategy used to create choice values. - * One of COPY_CHOICE and GENERATE. - * @param integer $indexStrategy The strategy used to create choice indices. - * One of COPY_CHOICE and GENERATE. */ - public function __construct(array $choices, array $preferredChoices = array(), $valueStrategy = self::COPY_CHOICE, $indexStrategy = self::GENERATE) + public function __construct(array $choices, array $preferredChoices = array()) { // Flip preferred choices to speed up lookup - parent::__construct($choices, $choices, array_flip($preferredChoices), $valueStrategy, $indexStrategy); + parent::__construct($choices, $choices, array_flip($preferredChoices)); + } + + /** + * {@inheritdoc} + */ + public function getChoicesForValues(array $values) + { + $values = $this->fixValues($values); + + // The values are identical to the choices, so we can just return them + // to improve performance a little bit + return $this->fixChoices(array_intersect($values, $this->getValues())); + } + + /** + * {@inheritdoc} + */ + public function getValuesForChoices(array $choices) + { + $choices = $this->fixChoices($choices); + + // The choices are identical to the values, so we can just return them + // to improve performance a little bit + return $this->fixValues(array_intersect($choices, $this->getValues())); } /** @@ -147,16 +146,21 @@ class SimpleChoiceList extends ChoiceList return $this->fixIndex($choice); } - /** - * Converts the choices to valid PHP array keys. - * - * @param array $choices The choices. - * - * @return array Valid PHP array keys. + * {@inheritdoc} */ protected function fixChoices(array $choices) { return $this->fixIndices($choices); } + + /** + * {@inheritdoc} + */ + protected function createValue($choice) + { + // Choices are guaranteed to be unique and scalar, so we can simply + // convert them to strings + return (string) $choice; + } } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php index 74372f704c..f3309e930e 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php @@ -45,9 +45,7 @@ class ChoiceType extends AbstractType if (!$options['choice_list']) { $options['choice_list'] = new SimpleChoiceList( $options['choices'], - $options['preferred_choices'], - $options['value_strategy'], - $options['index_strategy'] + $options['preferred_choices'] ); } @@ -159,8 +157,6 @@ class ChoiceType extends AbstractType 'choice_list' => null, 'choices' => null, 'preferred_choices' => array(), - 'value_strategy' => ChoiceList::COPY_CHOICE, - 'index_strategy' => ChoiceList::GENERATE, 'empty_data' => $multiple || $expanded ? array() : '', 'empty_value' => $multiple || $expanded || !isset($options['empty_value']) ? null : '', 'error_bubbling' => false, diff --git a/src/Symfony/Component/Form/Extension/Core/Type/CountryType.php b/src/Symfony/Component/Form/Extension/Core/Type/CountryType.php index f800678d87..b3e1e43d29 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/CountryType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/CountryType.php @@ -24,8 +24,6 @@ class CountryType extends AbstractType { return array( 'choices' => Locale::getDisplayCountries(\Locale::getDefault()), - 'value_strategy' => ChoiceList::COPY_CHOICE, - 'index_strategy' => ChoiceList::COPY_CHOICE, ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php index e686b362dc..b634e5f72a 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php @@ -89,20 +89,14 @@ class DateType extends AbstractType // Only pass a subset of the options to children $yearOptions = array( 'choices' => $years, - 'value_strategy' => ChoiceList::COPY_CHOICE, - 'index_strategy' => ChoiceList::COPY_CHOICE, 'empty_value' => $options['empty_value']['year'], ); $monthOptions = array( 'choices' => $this->formatMonths($formatter, $months), - 'value_strategy' => ChoiceList::COPY_CHOICE, - 'index_strategy' => ChoiceList::COPY_CHOICE, 'empty_value' => $options['empty_value']['month'], ); $dayOptions = array( 'choices' => $days, - 'value_strategy' => ChoiceList::COPY_CHOICE, - 'index_strategy' => ChoiceList::COPY_CHOICE, 'empty_value' => $options['empty_value']['day'], ); diff --git a/src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php b/src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php index da2e315c13..7d722a13e5 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php @@ -24,7 +24,6 @@ class LanguageType extends AbstractType { return array( 'choices' => Locale::getDisplayLanguages(\Locale::getDefault()), - 'value_strategy' => ChoiceList::COPY_CHOICE, ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/LocaleType.php b/src/Symfony/Component/Form/Extension/Core/Type/LocaleType.php index c4841e3184..66e5da9ed2 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/LocaleType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/LocaleType.php @@ -24,7 +24,6 @@ class LocaleType extends AbstractType { return array( 'choices' => Locale::getDisplayLocales(\Locale::getDefault()), - 'value_strategy' => ChoiceList::COPY_CHOICE, ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php index 9ec85cd24e..1197eddd75 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php @@ -59,14 +59,10 @@ class TimeType extends AbstractType // Only pass a subset of the options to children $hourOptions = array( 'choices' => $hours, - 'value_strategy' => ChoiceList::COPY_CHOICE, - 'index_strategy' => ChoiceList::COPY_CHOICE, 'empty_value' => $options['empty_value']['hour'], ); $minuteOptions = array( 'choices' => $minutes, - 'value_strategy' => ChoiceList::COPY_CHOICE, - 'index_strategy' => ChoiceList::COPY_CHOICE, 'empty_value' => $options['empty_value']['minute'], ); @@ -79,8 +75,6 @@ class TimeType extends AbstractType $secondOptions = array( 'choices' => $seconds, - 'value_strategy' => ChoiceList::COPY_CHOICE, - 'index_strategy' => ChoiceList::COPY_CHOICE, 'empty_value' => $options['empty_value']['second'], ); } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php index 8d1f74b3eb..c143562a44 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TimezoneType.php @@ -27,9 +27,7 @@ class TimezoneType extends AbstractType */ public function getDefaultOptions(array $options) { - $defaultOptions = array( - 'value_strategy' => ChoiceList::COPY_CHOICE, - ); + $defaultOptions = array(); if (empty($options['choice_list']) && empty($options['choices'])) { $defaultOptions['choices'] = self::getTimezones(); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ChoiceListTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ChoiceListTest.php index d176b9f6f1..8dc382881c 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ChoiceListTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ChoiceListTest.php @@ -87,34 +87,6 @@ class ChoiceListTest extends \PHPUnit_Framework_TestCase ), $this->list->getRemainingViews()); } - /** - * @expectedException Symfony\Component\Form\Exception\InvalidConfigurationException - */ - public function testInitIndexCopyChoiceWithInvalidIndex() - { - new ChoiceList( - array('a.'), - array('A'), - array(), - ChoiceList::GENERATE, - ChoiceList::COPY_CHOICE - ); - } - - /** - * @expectedException Symfony\Component\Form\Exception\InvalidConfigurationException - */ - public function testInitValueCopyChoiceWithInvalidValue() - { - new ChoiceList( - array($this->obj1), - array('A'), - array(), - ChoiceList::COPY_CHOICE, - ChoiceList::GENERATE - ); - } - public function testGetIndicesForChoices() { $choices = array($this->obj2, $this->obj3); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ObjectChoiceListTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ObjectChoiceListTest.php index 0834578ac8..44c1c8f868 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ObjectChoiceListTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/ObjectChoiceListTest.php @@ -176,28 +176,6 @@ class ObjectChoiceListTest extends \PHPUnit_Framework_TestCase $this->assertEquals(array(0 => new ChoiceView('10', 'A'), 3 => new ChoiceView('40', 'D')), $this->list->getRemainingViews()); } - public function testInitArrayWithIndexPath() - { - $this->obj1 = (object) array('name' => 'A', 'id' => 10); - $this->obj2 = (object) array('name' => 'B', 'id' => 20); - $this->obj3 = (object) array('name' => 'C', 'id' => 30); - $this->obj4 = (object) array('name' => 'D', 'id' => 40); - - $this->list = new ObjectChoiceList( - array($this->obj1, $this->obj2, $this->obj3, $this->obj4), - 'name', - array($this->obj2, $this->obj3), - null, - null, - 'id' - ); - - $this->assertSame(array(10 => $this->obj1, 20 => $this->obj2, 30 => $this->obj3, 40 => $this->obj4), $this->list->getChoices()); - $this->assertSame(array(10 => '0', 20 => '1', 30 => '2', 40 => '3'), $this->list->getValues()); - $this->assertEquals(array(20 => new ChoiceView('1', 'B'), 30 => new ChoiceView('2', 'C')), $this->list->getPreferredViews()); - $this->assertEquals(array(10 => new ChoiceView('0', 'A'), 40 => new ChoiceView('3', 'D')), $this->list->getRemainingViews()); - } - public function testInitArrayUsesToString() { $this->obj1 = new ObjectChoiceListTest_EntityWithToString('A'); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleChoiceListTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleChoiceListTest.php index 02a3b614a8..485923c9ee 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleChoiceListTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/ChoiceList/SimpleChoiceListTest.php @@ -34,10 +34,10 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase 'Group 2' => array(2 => 'C', 3 => 'D'), ); - $this->list = new SimpleChoiceList($choices, array('b', 'c'), ChoiceList::GENERATE, ChoiceList::GENERATE); + $this->list = new SimpleChoiceList($choices, array('b', 'c')); // Use COPY_CHOICE strategy to test for the various associated problems - $this->numericList = new SimpleChoiceList($numericChoices, array(1, 2), ChoiceList::COPY_CHOICE, ChoiceList::GENERATE); + $this->numericList = new SimpleChoiceList($numericChoices, array(1, 2)); } protected function tearDown() @@ -51,18 +51,7 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase public function testInitArray() { $choices = array('a' => 'A', 'b' => 'B', 'c' => 'C'); - $this->list = new SimpleChoiceList($choices, array('b'), ChoiceList::GENERATE, ChoiceList::GENERATE); - - $this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c'), $this->list->getChoices()); - $this->assertSame(array(0 => '0', 1 => '1', 2 => '2'), $this->list->getValues()); - $this->assertEquals(array(1 => new ChoiceView('1', 'B')), $this->list->getPreferredViews()); - $this->assertEquals(array(0 => new ChoiceView('0', 'A'), 2 => new ChoiceView('2', 'C')), $this->list->getRemainingViews()); - } - - public function testInitArrayValueCopyChoice() - { - $choices = array('a' => 'A', 'b' => 'B', 'c' => 'C'); - $this->list = new SimpleChoiceList($choices, array('b'), ChoiceList::COPY_CHOICE, ChoiceList::GENERATE); + $this->list = new SimpleChoiceList($choices, array('b')); $this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c'), $this->list->getChoices()); $this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c'), $this->list->getValues()); @@ -70,28 +59,17 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase $this->assertEquals(array(0 => new ChoiceView('a', 'A'), 2 => new ChoiceView('c', 'C')), $this->list->getRemainingViews()); } - public function testInitArrayIndexCopyChoice() - { - $choices = array('a' => 'A', 'b' => 'B', 'c' => 'C'); - $this->list = new SimpleChoiceList($choices, array('b'), ChoiceList::GENERATE, ChoiceList::COPY_CHOICE); - - $this->assertSame(array('a' => 'a', 'b' => 'b', 'c' => 'c'), $this->list->getChoices()); - $this->assertSame(array('a' => '0', 'b' => '1', 'c' => '2'), $this->list->getValues()); - $this->assertEquals(array('b' => new ChoiceView('1', 'B')), $this->list->getPreferredViews()); - $this->assertEquals(array('a' => new ChoiceView('0', 'A'), 'c' => new ChoiceView('2', 'C')), $this->list->getRemainingViews()); - } - public function testInitNestedArray() { $this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd'), $this->list->getChoices()); - $this->assertSame(array(0 => '0', 1 => '1', 2 => '2', 3 => '3'), $this->list->getValues()); + $this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd'), $this->list->getValues()); $this->assertEquals(array( - 'Group 1' => array(1 => new ChoiceView('1', 'B')), - 'Group 2' => array(2 => new ChoiceView('2', 'C')) + 'Group 1' => array(1 => new ChoiceView('b', 'B')), + 'Group 2' => array(2 => new ChoiceView('c', 'C')) ), $this->list->getPreferredViews()); $this->assertEquals(array( - 'Group 1' => array(0 => new ChoiceView('0', 'A')), - 'Group 2' => array(3 => new ChoiceView('3', 'D')) + 'Group 1' => array(0 => new ChoiceView('a', 'A')), + 'Group 2' => array(3 => new ChoiceView('d', 'D')) ), $this->list->getRemainingViews()); } @@ -116,13 +94,13 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase public function testGetIndicesForValues() { - $values = array('1', '2'); + $values = array('b', 'c'); $this->assertSame(array(1, 2), $this->list->getIndicesForValues($values)); } public function testGetIndicesForValuesIgnoresNonExistingValues() { - $values = array('1', '2', '100'); + $values = array('b', 'c', '100'); $this->assertSame(array(1, 2), $this->list->getIndicesForValues($values)); } @@ -135,13 +113,13 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase public function testGetChoicesForValues() { - $values = array('1', '2'); + $values = array('b', 'c'); $this->assertSame(array('b', 'c'), $this->list->getChoicesForValues($values)); } public function testGetChoicesForValuesIgnoresNonExistingValues() { - $values = array('1', '2', '100'); + $values = array('b', 'c', '100'); $this->assertSame(array('b', 'c'), $this->list->getChoicesForValues($values)); } @@ -155,13 +133,13 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase public function testGetValuesForChoices() { $choices = array('b', 'c'); - $this->assertSame(array('1', '2'), $this->list->getValuesForChoices($choices)); + $this->assertSame(array('b', 'c'), $this->list->getValuesForChoices($choices)); } public function testGetValuesForChoicesIgnoresNonExistingValues() { $choices = array('b', 'c', 'foobar'); - $this->assertSame(array('1', '2'), $this->list->getValuesForChoices($choices)); + $this->assertSame(array('b', 'c'), $this->list->getValuesForChoices($choices)); } public function testGetValuesForChoicesDealsWithNumericValues() @@ -187,7 +165,7 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase ); // use COPY_CHOICE strategy to test the problems - $this->list = new SimpleChoiceList($choices, array(), ChoiceList::COPY_CHOICE, ChoiceList::GENERATE); + $this->list = new SimpleChoiceList($choices, array()); $this->assertSame(array($value), $this->list->getValuesForChoices(array($choice))); } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php index 227857fd1f..f02e559803 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php @@ -408,8 +408,7 @@ class ChoiceTypeTest extends TypeTestCase '' => 'Empty', 1 => 'Not Empty', 2 => 'Not Empty 2', - ), - 'value_strategy' => ChoiceList::COPY_CHOICE, + ) )); $form->bind(array('', '2')); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php index fdcb88fa8d..a61f48e7af 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php @@ -23,11 +23,12 @@ class CountryTypeTest extends LocalizedTestCase $view = $form->createView(); $choices = $view->get('choices'); - $this->assertEquals(new ChoiceView('DE', 'Deutschland'), $choices['DE']); - $this->assertEquals(new ChoiceView('GB', 'Vereinigtes Königreich'), $choices['GB']); - $this->assertEquals(new ChoiceView('US', 'Vereinigte Staaten'), $choices['US']); - $this->assertEquals(new ChoiceView('FR', 'Frankreich'), $choices['FR']); - $this->assertEquals(new ChoiceView('MY', 'Malaysia'), $choices['MY']); + // Don't check objects for identity + $this->assertContains(new ChoiceView('DE', 'Deutschland'), $choices, '', false, false); + $this->assertContains(new ChoiceView('GB', 'Vereinigtes Königreich'), $choices, '', false, false); + $this->assertContains(new ChoiceView('US', 'Vereinigte Staaten'), $choices, '', false, false); + $this->assertContains(new ChoiceView('FR', 'Frankreich'), $choices, '', false, false); + $this->assertContains(new ChoiceView('MY', 'Malaysia'), $choices, '', false, false); } public function testUnknownCountryIsNotIncluded() @@ -36,6 +37,10 @@ class CountryTypeTest extends LocalizedTestCase $view = $form->createView(); $choices = $view->get('choices'); - $this->assertArrayNotHasKey('ZZ', $choices); + foreach ($choices as $choice) { + if ('ZZ' === $choice->getValue()) { + $this->fail('Should not contain choice "ZZ"'); + } + } } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php index ab168ed43b..e59f4d1124 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php @@ -325,8 +325,8 @@ class DateTypeTest extends LocalizedTestCase $view = $form->createView(); $this->assertEquals(array( - 2010 => new ChoiceView('2010', '2010'), - 2011 => new ChoiceView('2011', '2011'), + new ChoiceView('2010', '2010'), + new ChoiceView('2011', '2011'), ), $view->getChild('year')->get('choices')); } @@ -339,8 +339,8 @@ class DateTypeTest extends LocalizedTestCase $view = $form->createView(); $this->assertEquals(array( - 6 => new ChoiceView('6', '06'), - 7 => new ChoiceView('7', '07'), + new ChoiceView('6', '06'), + new ChoiceView('7', '07'), ), $view->getChild('month')->get('choices')); } @@ -354,8 +354,8 @@ class DateTypeTest extends LocalizedTestCase $view = $form->createView(); $this->assertEquals(array( - 6 => new ChoiceView('6', '06'), - 7 => new ChoiceView('7', '07'), + new ChoiceView('6', '06'), + new ChoiceView('7', '07'), ), $view->getChild('month')->get('choices')); } @@ -369,8 +369,8 @@ class DateTypeTest extends LocalizedTestCase $view = $form->createView(); $this->assertEquals(array( - 1 => new ChoiceView('1', 'Jän'), - 4 => new ChoiceView('4', 'Apr') + new ChoiceView('1', 'Jän'), + new ChoiceView('4', 'Apr') ), $view->getChild('month')->get('choices')); } @@ -384,8 +384,8 @@ class DateTypeTest extends LocalizedTestCase $view = $form->createView(); $this->assertEquals(array( - 1 => new ChoiceView('1', 'Jänner'), - 4 => new ChoiceView('4', 'April'), + new ChoiceView('1', 'Jänner'), + new ChoiceView('4', 'April'), ), $view->getChild('month')->get('choices')); } @@ -399,8 +399,8 @@ class DateTypeTest extends LocalizedTestCase $view = $form->createView(); $this->assertEquals(array( - 1 => new ChoiceView('1', 'Jänner'), - 4 => new ChoiceView('4', 'April'), + new ChoiceView('1', 'Jänner'), + new ChoiceView('4', 'April'), ), $view->getChild('month')->get('choices')); } @@ -413,8 +413,8 @@ class DateTypeTest extends LocalizedTestCase $view = $form->createView(); $this->assertEquals(array( - 6 => new ChoiceView('6', '06'), - 7 => new ChoiceView('7', '07'), + new ChoiceView('6', '06'), + new ChoiceView('7', '07'), ), $view->getChild('day')->get('choices')); } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php index 166bb02596..45fd12cb6e 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php @@ -243,8 +243,8 @@ class TimeTypeTest extends LocalizedTestCase $view = $form->createView(); $this->assertEquals(array( - 6 => new ChoiceView('6', '06'), - 7 => new ChoiceView('7', '07'), + new ChoiceView('6', '06'), + new ChoiceView('7', '07'), ), $view->getChild('hour')->get('choices')); } @@ -257,8 +257,8 @@ class TimeTypeTest extends LocalizedTestCase $view = $form->createView(); $this->assertEquals(array( - 6 => new ChoiceView('6', '06'), - 7 => new ChoiceView('7', '07'), + new ChoiceView('6', '06'), + new ChoiceView('7', '07'), ), $view->getChild('minute')->get('choices')); } @@ -272,8 +272,8 @@ class TimeTypeTest extends LocalizedTestCase $view = $form->createView(); $this->assertEquals(array( - 6 => new ChoiceView('6', '06'), - 7 => new ChoiceView('7', '07'), + new ChoiceView('6', '06'), + new ChoiceView('7', '07'), ), $view->getChild('second')->get('choices')); }