diff --git a/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php b/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php index 3377549187..351ff941d5 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Form/Type/EntityTypeTest.php @@ -1543,4 +1543,43 @@ class EntityTypeTest extends BaseTypeTest $this->assertEquals(array(), $form->getNormData()); $this->assertSame(array(), $form->getViewData(), 'View data is always an array'); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = 'empty', $expectedData = null) + { + $emptyData = '1'; + $entity1 = new SingleIntIdEntity(1, 'Foo'); + $this->persist(array($entity1)); + + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + 'empty_data' => $emptyData, + )); + $form->submit(null); + + $this->assertSame($emptyData, $form->getViewData()); + $this->assertSame($entity1, $form->getNormData()); + $this->assertSame($entity1, $form->getData()); + } + + public function testSubmitNullMultipleUsesDefaultEmptyData() + { + $emptyData = array('1'); + $entity1 = new SingleIntIdEntity(1, 'Foo'); + $this->persist(array($entity1)); + + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'em' => 'default', + 'class' => self::SINGLE_IDENT_CLASS, + 'multiple' => true, + 'empty_data' => $emptyData, + )); + $form->submit(null); + + $collection = new ArrayCollection(array($entity1)); + + $this->assertSame($emptyData, $form->getViewData()); + $this->assertEquals($collection, $form->getNormData()); + $this->assertEquals($collection, $form->getData()); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php index facab97309..da3f48b486 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php @@ -145,6 +145,28 @@ abstract class BaseTypeTest extends TypeTestCase $this->assertSame($view, $form->getViewData()); } + public function testSubmitNullUsesDefaultEmptyData($emptyData = 'empty', $expectedData = null) + { + $builder = $this->factory->createBuilder($this->getTestedType()); + + if ($builder->getCompound()) { + $emptyData = array(); + foreach ($builder as $field) { + // empty children should map null (model data) in the compound view data + $emptyData[$field->getName()] = null; + } + } else { + // simple fields share the view and the model format, unless they use a transformer + $expectedData = $emptyData; + } + + $form = $builder->setEmptyData($emptyData)->getForm()->submit(null); + + $this->assertSame($emptyData, $form->getViewData()); + $this->assertSame($expectedData, $form->getNormData()); + $this->assertSame($expectedData, $form->getData()); + } + protected function getTestedType() { return static::TESTED_TYPE; diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php index 9f105272fe..dbef3ff9ed 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ButtonTypeTest.php @@ -32,4 +32,16 @@ class ButtonTypeTest extends BaseTypeTest { $this->assertInstanceOf('Symfony\Component\Form\Button', $this->factory->create(static::TESTED_TYPE)); } + + /** + * @expectedException \Symfony\Component\Form\Exception\BadMethodCallException + * @expectedExceptionMessage Buttons do not support empty data. + * + * @param string $emptyData + * @param null $expectedData + */ + public function testSubmitNullUsesDefaultEmptyData($emptyData = 'empty', $expectedData = null) + { + parent::testSubmitNullUsesDefaultEmptyData($emptyData, $expectedData); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php index 95f4ad201e..38dbd67db8 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CheckboxTypeTest.php @@ -187,4 +187,17 @@ class CheckboxTypeTest extends BaseTypeTest { parent::testSubmitNull(false, false, null); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = 'empty', $expectedData = true) + { + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'empty_data' => $emptyData, + )); + $form->submit(null); + + // view data is transformed to the string true value + $this->assertSame('1', $form->getViewData()); + $this->assertSame($expectedData, $form->getNormData()); + $this->assertSame($expectedData, $form->getData()); + } } 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 59dc05cb68..2ef745efa5 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ChoiceTypeTest.php @@ -684,19 +684,20 @@ class ChoiceTypeTest extends BaseTypeTest $this->assertTrue($form->isSynchronized()); } - public function testSubmitSingleChoiceWithEmptyData() + public function testSubmitNullUsesDefaultEmptyData($emptyData = 'empty', $expectedData = null) { $form = $this->factory->create(static::TESTED_TYPE, null, array( 'multiple' => false, 'expanded' => false, - 'choices' => array('test'), + // empty data must match string choice value + 'choices' => array($emptyData), 'choices_as_values' => true, - 'empty_data' => 'test', + 'empty_data' => $emptyData, )); $form->submit(null); - $this->assertSame('test', $form->getData()); + $this->assertSame($emptyData, $form->getData()); } public function testSubmitSingleChoiceWithEmptyDataAndInitialData() diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.php index 6fcc4dc6d3..bdeb4bd1a6 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.php @@ -410,4 +410,10 @@ class CollectionTypeTest extends BaseTypeTest { parent::testSubmitNull(array(), array(), array()); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = array(), $expectedData = array()) + { + // resize form listener always set an empty array + parent::testSubmitNullUsesDefaultEmptyData($emptyData, $expectedData); + } } 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 2db6daa258..e9cbc2afd2 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CountryTypeTest.php @@ -66,4 +66,9 @@ class CountryTypeTest extends BaseTypeTest { parent::testSubmitNull($expected, $norm, ''); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = 'FR', $expectedData = 'FR') + { + parent::testSubmitNullUsesDefaultEmptyData($emptyData, $expectedData); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php index 739cc408ba..ab2b389710 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CurrencyTypeTest.php @@ -49,4 +49,9 @@ class CurrencyTypeTest extends BaseTypeTest { parent::testSubmitNull($expected, $norm, ''); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = 'EUR', $expectedData = 'EUR') + { + parent::testSubmitNullUsesDefaultEmptyData($emptyData, $expectedData); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php index 27c6581f0b..2531332f05 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php @@ -615,4 +615,20 @@ class DateTimeTypeTest extends BaseTypeTest $this->assertNull($form->getNormData()); $this->assertSame('', $form->getViewData()); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = array(), $expectedData = null) + { + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'empty_data' => $emptyData, + )); + $form->submit(null); + + // view transformer writes back empty strings in the view data + $this->assertSame( + array('date' => array('year' => '', 'month' => '', 'day' => ''), 'time' => array('hour' => '', 'minute' => '')), + $form->getViewData() + ); + $this->assertSame($expectedData, $form->getNormData()); + $this->assertSame($expectedData, $form->getData()); + } } 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 1eb2e7887b..0f03b1851d 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php @@ -1003,4 +1003,33 @@ class DateTypeTest extends BaseTypeTest $this->assertNull($form->getNormData()); $this->assertSame('', $form->getViewData()); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = array(), $expectedData = null) + { + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'empty_data' => $emptyData, + )); + $form->submit(null); + + // view transformer write back empty strings in the view data + $this->assertSame(array('year' => '', 'month' => '', 'day' => ''), $form->getViewData()); + $this->assertSame($expectedData, $form->getNormData()); + $this->assertSame($expectedData, $form->getData()); + } + + public function testSingleTextSubmitNullUsesDefaultEmptyData() + { + $emptyData = '2018-11-11'; + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'widget' => 'single_text', + 'empty_data' => $emptyData, + )); + $form->submit(null); + + $date = new \DateTime($emptyData); + + $this->assertSame($emptyData, $form->getViewData()); + $this->assertEquals($date, $form->getNormData()); + $this->assertEquals($date, $form->getData()); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php index 7d75dce26d..52722b0420 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php @@ -227,6 +227,11 @@ class FormTypeTest extends BaseTypeTest )); } + public function testSubmitNullUsesDefaultEmptyData($emptyData = array(), $expectedData = array()) + { + parent::testSubmitNullUsesDefaultEmptyData($emptyData, $expectedData); + } + public function testSubmitWithEmptyDataCreatesObjectIfClassAvailable() { $form = $this->factory->createBuilder(static::TESTED_TYPE, null, array( diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php index 3059e79ce9..247f956a3b 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/IntegerTypeTest.php @@ -48,4 +48,16 @@ class IntegerTypeTest extends BaseTypeTest { parent::testSubmitNull($expected, $norm, ''); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = '10', $expectedData = 10) + { + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'empty_data' => $emptyData, + )); + $form->submit(null); + + $this->assertSame($emptyData, $form->getViewData()); + $this->assertSame($expectedData, $form->getNormData()); + $this->assertSame($expectedData, $form->getData()); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php index beffecdd7e..d8127aa6d7 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php @@ -59,4 +59,9 @@ class LanguageTypeTest extends BaseTypeTest { parent::testSubmitNull($expected, $norm, ''); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = 'en', $expectedData = 'en') + { + parent::testSubmitNullUsesDefaultEmptyData($emptyData, $expectedData); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php index 0439e7d2dd..ede22932f8 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/LocaleTypeTest.php @@ -49,4 +49,9 @@ class LocaleTypeTest extends BaseTypeTest { parent::testSubmitNull($expected, $norm, ''); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = 'en', $expectedData = 'en') + { + parent::testSubmitNullUsesDefaultEmptyData($emptyData, $expectedData); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php index a865a93c9c..0b02fffddf 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/MoneyTypeTest.php @@ -80,4 +80,16 @@ class MoneyTypeTest extends BaseTypeTest $this->assertSame('{{ widget }}', $view->vars['money_pattern']); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = '10.00', $expectedData = 10.0) + { + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'empty_data' => $emptyData, + )); + $form->submit(null); + + $this->assertSame($emptyData, $form->getViewData()); + $this->assertSame($expectedData, $form->getNormData()); + $this->assertSame($expectedData, $form->getData()); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php index 9d53297e8b..09c8f2dd28 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/NumberTypeTest.php @@ -73,4 +73,16 @@ class NumberTypeTest extends BaseTypeTest { parent::testSubmitNull($expected, $norm, ''); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = '10', $expectedData = 10.0) + { + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'empty_data' => $emptyData, + )); + $form->submit(null); + + $this->assertSame($emptyData, $form->getViewData()); + $this->assertSame($expectedData, $form->getNormData()); + $this->assertSame($expectedData, $form->getData()); + } } 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 611c6e42ac..98d4f902fa 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php @@ -797,4 +797,17 @@ class TimeTypeTest extends BaseTypeTest parent::testSubmitNull($expected, $norm, $view); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = array(), $expectedData = null) + { + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'empty_data' => $emptyData, + )); + $form->submit(null); + + // view transformer write back empty strings in the view data + $this->assertSame(array('hour' => '', 'minute' => ''), $form->getViewData()); + $this->assertSame($expectedData, $form->getNormData()); + $this->assertSame($expectedData, $form->getData()); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php index 507b740505..b6b61cb171 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimezoneTypeTest.php @@ -43,4 +43,16 @@ class TimezoneTypeTest extends BaseTypeTest { parent::testSubmitNull($expected, $norm, ''); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = 'Africa/Kinshasa', $expectedData = 'Africa/Kinshasa') + { + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'empty_data' => $emptyData, + )); + $form->submit(null); + + $this->assertSame($emptyData, $form->getViewData()); + $this->assertSame($expectedData, $form->getNormData()); + $this->assertSame($expectedData, $form->getData()); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php index a3336970dc..95be3775a4 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php @@ -100,4 +100,17 @@ class UrlTypeTest extends TextTypeTest $this->assertSame(array('domain.com', 'www.domain.com'), $form->getData()); } + + public function testSubmitNullUsesDefaultEmptyData($emptyData = 'empty', $expectedData = 'http://empty') + { + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'empty_data' => $emptyData, + )); + $form->submit(null); + + // listener normalizes data on submit + $this->assertSame($expectedData, $form->getViewData()); + $this->assertSame($expectedData, $form->getNormData()); + $this->assertSame($expectedData, $form->getData()); + } }