diff --git a/UPGRADE-6.0.md b/UPGRADE-6.0.md index 718b729e55a2c..8cb6aeab791ea 100644 --- a/UPGRADE-6.0.md +++ b/UPGRADE-6.0.md @@ -88,6 +88,7 @@ Form * Changed `$checkboxes` parameter type of the `CheckboxListMapper::mapFormsToData()` method from `iterable` to `\Traversable`. * Changed `$radios` parameter type of the `RadioListMapper::mapDataToForms()` method from `iterable` to `\Traversable`. * Changed `$radios` parameter type of the `RadioListMapper::mapFormsToData()` method from `iterable` to `\Traversable`. + * The default value of the `empty_data` option of the `TextType` has been changed to empty string. FrameworkBundle --------------- diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap3HorizontalLayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap3HorizontalLayoutTest.php index c4874c3407092..8afa33c004608 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap3HorizontalLayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap3HorizontalLayoutTest.php @@ -30,7 +30,9 @@ public function testLabelOnForm() public function testLabelDoesNotRenderFieldAttributes() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'attr' => [ 'class' => 'my&class', @@ -47,7 +49,9 @@ public function testLabelDoesNotRenderFieldAttributes() public function testLabelWithCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'label_attr' => [ 'class' => 'my&class', @@ -64,7 +68,9 @@ public function testLabelWithCustomAttributesPassedDirectly() public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), 'Custom label', [ 'label_attr' => [ 'class' => 'my&class', @@ -83,6 +89,7 @@ public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Custom label', ]); $html = $this->renderLabel($form->createView(), null, [ @@ -103,6 +110,7 @@ public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly public function testLabelHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Bolded label', ]); @@ -119,6 +127,7 @@ public function testLabelHtmlDefaultIsFalse() public function testLabelHtmlIsTrue() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Bolded label', 'label_html' => true, ]); diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap3LayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap3LayoutTest.php index 808352300adf4..aa98b08bde686 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap3LayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap3LayoutTest.php @@ -34,7 +34,9 @@ public function testLabelOnForm() public function testLabelDoesNotRenderFieldAttributes() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'attr' => [ 'class' => 'my&class', @@ -51,7 +53,9 @@ public function testLabelDoesNotRenderFieldAttributes() public function testLabelWithCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'label_attr' => [ 'class' => 'my&class', @@ -68,7 +72,9 @@ public function testLabelWithCustomAttributesPassedDirectly() public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), 'Custom label', [ 'label_attr' => [ 'class' => 'my&class', @@ -87,6 +93,7 @@ public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Custom label', ]); $html = $this->renderLabel($form->createView(), null, [ @@ -107,6 +114,7 @@ public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly public function testLabelHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Bolded label', ]); @@ -123,6 +131,7 @@ public function testLabelHtmlDefaultIsFalse() public function testLabelHtmlIsTrue() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Bolded label', 'label_html' => true, ]); @@ -140,6 +149,7 @@ public function testLabelHtmlIsTrue() public function testHelp() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', ]); $view = $form->createView(); @@ -157,6 +167,7 @@ public function testHelp() public function testHelpAttr() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_attr' => [ 'class' => 'class-test', @@ -177,6 +188,7 @@ public function testHelpAttr() public function testHelpHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', ]); @@ -204,6 +216,7 @@ public function testHelpHtmlDefaultIsFalse() public function testHelpHtmlIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_html' => false, ]); @@ -232,6 +245,7 @@ public function testHelpHtmlIsFalse() public function testHelpHtmlIsTrue() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_html' => true, ]); @@ -259,7 +273,9 @@ public function testHelpHtmlIsTrue() public function testErrors() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error 1[/trans]')); $form->addError(new FormError('[trans]Error 2[/trans]')); $view = $form->createView(); @@ -292,7 +308,9 @@ public function testErrors() public function testOverrideWidgetBlock() { // see custom_widgets.html.twig - $form = $this->factory->createNamed('text_id', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('text_id', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderWidget($form->createView()); $this->assertMatchesXpath($html, @@ -1970,7 +1988,9 @@ public function testBirthDayWithPlaceholder() public function testEmail() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType', 'foo&bar'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType', 'foo&bar', [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input @@ -1986,6 +2006,7 @@ public function testEmail() public function testEmailWithMaxLength() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType', 'foo&bar', [ + 'empty_data' => null, 'attr' => ['maxlength' => 123], ]); @@ -2017,6 +2038,7 @@ public function testHidden() public function testDisabled() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'disabled' => true, ]); @@ -2163,7 +2185,9 @@ public function testRenderNumberWithHtml5NumberType() public function testPassword() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\PasswordType', 'foo&bar'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\PasswordType', 'foo&bar', [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input @@ -2177,6 +2201,7 @@ public function testPassword() public function testPasswordSubmittedWithNotAlwaysEmpty() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\PasswordType', null, [ + 'empty_data' => null, 'always_empty' => false, ]); $form->submit('foo&bar'); @@ -2194,6 +2219,7 @@ public function testPasswordSubmittedWithNotAlwaysEmpty() public function testPasswordWithMaxLength() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\PasswordType', 'foo&bar', [ + 'empty_data' => null, 'attr' => ['maxlength' => 123], ]); @@ -2353,7 +2379,10 @@ public function testRadioRowWithHelp() public function testRange() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RangeType', 42, ['attr' => ['min' => 5]]); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RangeType', 42, [ + 'empty_data' => null, + 'attr' => ['min' => 5], + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input @@ -2368,7 +2397,10 @@ public function testRange() public function testRangeWithMinMaxValues() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RangeType', 42, ['attr' => ['min' => 5, 'max' => 57]]); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RangeType', 42, [ + 'empty_data' => null, + 'attr' => ['min' => 5, 'max' => 57], + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input @@ -2385,6 +2417,7 @@ public function testRangeWithMinMaxValues() public function testTextarea() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextareaType', 'foo&bar', [ + 'empty_data' => null, 'attr' => ['pattern' => 'foo'], ]); @@ -2400,7 +2433,9 @@ public function testTextarea() public function testText() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', 'foo&bar'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', 'foo&bar', [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input @@ -2416,6 +2451,7 @@ public function testText() public function testTextWithMaxLength() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', 'foo&bar', [ + 'empty_data' => null, 'attr' => ['maxlength' => 123], ]); @@ -2432,7 +2468,9 @@ public function testTextWithMaxLength() public function testSearch() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\SearchType', 'foo&bar'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\SearchType', 'foo&bar', [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input @@ -2646,7 +2684,10 @@ public function testTimezoneWithPlaceholder() public function testUrlWithDefaultProtocol() { $url = 'http://www.example.com?foo1=bar1&foo2=bar2'; - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\UrlType', $url, ['default_protocol' => 'http']); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\UrlType', $url, [ + 'empty_data' => null, + 'default_protocol' => 'http', + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input @@ -2662,7 +2703,10 @@ public function testUrlWithDefaultProtocol() public function testUrlWithoutDefaultProtocol() { $url = 'http://www.example.com?foo1=bar1&foo2=bar2'; - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\UrlType', $url, ['default_protocol' => null]); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\UrlType', $url, [ + 'empty_data' => null, + 'default_protocol' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input @@ -2740,6 +2784,7 @@ public function testReset() public function testWidgetAttributes() { $form = $this->factory->createNamed('text', 'Symfony\Component\Form\Extension\Core\Type\TextType', 'value', [ + 'empty_data' => null, 'required' => true, 'disabled' => true, 'attr' => ['readonly' => true, 'maxlength' => 10, 'pattern' => '\d+', 'class' => 'foobar', 'data-foo' => 'bar'], @@ -2754,6 +2799,7 @@ public function testWidgetAttributes() public function testWidgetAttributeNameRepeatedIfTrue() { $form = $this->factory->createNamed('text', 'Symfony\Component\Form\Extension\Core\Type\TextType', 'value', [ + 'empty_data' => null, 'attr' => ['foo' => true], ]); @@ -2791,7 +2837,9 @@ public function testButtonAttributeNameRepeatedIfTrue() public function testTel() { $tel = '0102030405'; - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TelType', $tel); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TelType', $tel, [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input @@ -2806,7 +2854,9 @@ public function testTel() public function testColor() { $color = '#0000ff'; - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ColorType', $color); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ColorType', $color, [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap4HorizontalLayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap4HorizontalLayoutTest.php index 1ef14ecf4dc0f..df244ff14318e 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap4HorizontalLayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap4HorizontalLayoutTest.php @@ -22,7 +22,9 @@ abstract class AbstractBootstrap4HorizontalLayoutTest extends AbstractBootstrap4 { public function testRow() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error![/trans]')); $view = $form->createView(); $html = $this->renderRow($view); @@ -62,7 +64,9 @@ public function testLabelOnForm() public function testLabelDoesNotRenderFieldAttributes() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'attr' => [ 'class' => 'my&class', @@ -79,7 +83,9 @@ public function testLabelDoesNotRenderFieldAttributes() public function testLabelWithCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'label_attr' => [ 'class' => 'my&class', @@ -96,7 +102,9 @@ public function testLabelWithCustomAttributesPassedDirectly() public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), 'Custom label', [ 'label_attr' => [ 'class' => 'my&class', @@ -115,6 +123,7 @@ public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Custom label', ]); $html = $this->renderLabel($form->createView(), null, [ @@ -135,6 +144,7 @@ public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly public function testLabelHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Bolded label', ]); @@ -151,6 +161,7 @@ public function testLabelHtmlDefaultIsFalse() public function testLabelHtmlIsTrue() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Bolded label', 'label_html' => true, ]); diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap4LayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap4LayoutTest.php index 36f8a50d00f13..e24c0821533d9 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap4LayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap4LayoutTest.php @@ -32,7 +32,9 @@ abstract class AbstractBootstrap4LayoutTest extends AbstractBootstrap3LayoutTest { public function testRow() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error![/trans]')); $view = $form->createView(); $html = $this->renderRow($view); @@ -72,7 +74,9 @@ public function testLabelOnForm() public function testLabelDoesNotRenderFieldAttributes() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'attr' => [ 'class' => 'my&class', @@ -89,7 +93,9 @@ public function testLabelDoesNotRenderFieldAttributes() public function testLabelWithCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'label_attr' => [ 'class' => 'my&class', @@ -106,7 +112,9 @@ public function testLabelWithCustomAttributesPassedDirectly() public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), 'Custom label', [ 'label_attr' => [ 'class' => 'my&class', @@ -125,6 +133,7 @@ public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'label' => 'Custom label', ]); $html = $this->renderLabel($form->createView(), null, [ @@ -145,6 +154,7 @@ public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly public function testLabelHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Bolded label', ]); @@ -161,6 +171,7 @@ public function testLabelHtmlDefaultIsFalse() public function testLabelHtmlIsTrue() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Bolded label', 'label_html' => true, ]); @@ -197,6 +208,7 @@ public function testLegendOnExpandedType() public function testHelp() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'help' => 'Help text test!', ]); $view = $form->createView(); @@ -214,6 +226,7 @@ public function testHelp() public function testHelpAttr() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_attr' => [ 'class' => 'class-test', @@ -234,6 +247,7 @@ public function testHelpAttr() public function testHelpHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', ]); @@ -261,6 +275,7 @@ public function testHelpHtmlDefaultIsFalse() public function testHelpHtmlIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_html' => false, ]); @@ -289,6 +304,7 @@ public function testHelpHtmlIsFalse() public function testHelpHtmlIsTrue() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_html' => true, ]); @@ -316,7 +332,9 @@ public function testHelpHtmlIsTrue() public function testErrors() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error 1[/trans]')); $form->addError(new FormError('[trans]Error 2[/trans]')); $view = $form->createView(); @@ -341,7 +359,9 @@ public function testErrors() public function testErrorWithNoLabel() { - $form = $this->factory->createNamed('name', TextType::class, ['label' => false]); + $form = $this->factory->createNamed('name', TextType::class, ['label' => false], [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error 1[/trans]')); $view = $form->createView(); $html = $this->renderLabel($view); @@ -1252,7 +1272,10 @@ public function testPercentCustomSymbol() public function testRange() { - $form = $this->factory->createNamed('name', RangeType::class, 42, ['attr' => ['min' => 5]]); + $form = $this->factory->createNamed('name', RangeType::class, 42, [ + 'empty_data' => null, + 'attr' => ['min' => 5], + ]); $this->assertWidgetMatchesXpath( $form->createView(), @@ -1269,7 +1292,10 @@ public function testRange() public function testRangeWithMinMaxValues() { - $form = $this->factory->createNamed('name', RangeType::class, 42, ['attr' => ['min' => 5, 'max' => 57]]); + $form = $this->factory->createNamed('name', RangeType::class, 42, [ + 'empty_data' => null, + 'attr' => ['min' => 5, 'max' => 57], + ]); $this->assertWidgetMatchesXpath( $form->createView(), diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap5HorizontalLayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap5HorizontalLayoutTest.php index e6a8846c4b127..effceaafbb3fe 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap5HorizontalLayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap5HorizontalLayoutTest.php @@ -28,7 +28,9 @@ abstract class AbstractBootstrap5HorizontalLayoutTest extends AbstractBootstrap5 { public function testRow() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error![/trans]')); $html = $this->renderRow($form->createView()); @@ -55,7 +57,9 @@ public function testRow() public function testRowWithCustomClass() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error![/trans]')); $html = $this->renderRow($form->createView(), [ 'row_attr' => [ @@ -101,7 +105,9 @@ public function testLabelOnForm() public function testLabelDoesNotRenderFieldAttributes() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'attr' => [ 'class' => 'my&class', @@ -118,7 +124,9 @@ public function testLabelDoesNotRenderFieldAttributes() public function testLabelWithCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'label_attr' => [ 'class' => 'my&class', @@ -135,7 +143,9 @@ public function testLabelWithCustomAttributesPassedDirectly() public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), 'Custom label', [ 'label_attr' => [ 'class' => 'my&class', @@ -154,6 +164,7 @@ public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'label' => 'Custom label', ]); $html = $this->renderLabel($form->createView(), null, [ @@ -174,6 +185,7 @@ public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly public function testLabelHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'label' => 'Bolded label', ]); @@ -190,6 +202,7 @@ public function testLabelHtmlDefaultIsFalse() public function testLabelHtmlIsTrue() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'label' => 'Bolded label', 'label_html' => true, ]); @@ -317,6 +330,7 @@ public function testFileWithGroup() public function testFloatingLabel() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'attr' => [ 'placeholder' => 'name', ], diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap5LayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap5LayoutTest.php index 7ac695ec927c3..4a7458d04526d 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap5LayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/AbstractBootstrap5LayoutTest.php @@ -40,7 +40,9 @@ abstract class AbstractBootstrap5LayoutTest extends AbstractBootstrap4LayoutTest { public function testRow() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error![/trans]')); $html = $this->renderRow($form->createView()); @@ -61,7 +63,9 @@ public function testRow() public function testRowWithCustomClass() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error![/trans]')); $html = $this->renderRow($form->createView(), [ 'row_attr' => [ @@ -86,7 +90,9 @@ public function testRowWithCustomClass() public function testLabelDoesNotRenderFieldAttributes() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'attr' => [ 'class' => 'my&class', @@ -103,7 +109,9 @@ public function testLabelDoesNotRenderFieldAttributes() public function testLabelWithCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'label_attr' => [ 'class' => 'my&class', @@ -120,7 +128,9 @@ public function testLabelWithCustomAttributesPassedDirectly() public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), 'Custom label', [ 'label_attr' => [ 'class' => 'my&class', @@ -139,6 +149,7 @@ public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'label' => 'Custom label', ]); $html = $this->renderLabel($form->createView(), null, [ @@ -159,6 +170,7 @@ public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly public function testLabelHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'label' => 'Bolded label', ]); @@ -175,6 +187,7 @@ public function testLabelHtmlDefaultIsFalse() public function testLabelHtmlIsTrue() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'label' => 'Bolded label', 'label_html' => true, ]); @@ -192,6 +205,7 @@ public function testLabelHtmlIsTrue() public function testHelp() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'help' => 'Help text test!', ]); $view = $form->createView(); @@ -209,6 +223,7 @@ public function testHelp() public function testHelpAttr() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_attr' => [ 'class' => 'class-test', @@ -229,6 +244,7 @@ public function testHelpAttr() public function testHelpHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'help' => 'Help text test!', ]); @@ -256,6 +272,7 @@ public function testHelpHtmlDefaultIsFalse() public function testHelpHtmlIsFalse() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_html' => false, ]); @@ -284,6 +301,7 @@ public function testHelpHtmlIsFalse() public function testHelpHtmlIsTrue() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_html' => true, ]); @@ -309,7 +327,9 @@ public function testHelpHtmlIsTrue() public function testErrors() { - $form = $this->factory->createNamed('name', TextType::class); + $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error 1[/trans]')); $form->addError(new FormError('[trans]Error 2[/trans]')); $html = $this->renderErrors($form->createView()); @@ -1526,7 +1546,10 @@ public function testPercentCustomSymbol() public function testRange() { - $form = $this->factory->createNamed('name', RangeType::class, 42, ['attr' => ['min' => 5]]); + $form = $this->factory->createNamed('name', RangeType::class, 42, [ + 'empty_data' => null, + 'attr' => ['min' => 5], + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input @@ -1541,7 +1564,10 @@ public function testRange() public function testRangeWithMinMaxValues() { - $form = $this->factory->createNamed('name', RangeType::class, 42, ['attr' => ['min' => 5, 'max' => 57]]); + $form = $this->factory->createNamed('name', RangeType::class, 42, [ + 'empty_data' => null, + 'attr' => ['min' => 5, 'max' => 57], + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input @@ -1558,7 +1584,9 @@ public function testRangeWithMinMaxValues() public function testColor() { $color = '#0000ff'; - $form = $this->factory->createNamed('name', ColorType::class, $color); + $form = $this->factory->createNamed('name', ColorType::class, $color, [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), ['attr' => ['class' => 'my&class']], '/input @@ -1813,6 +1841,7 @@ public function testWeekChoices() public function testFloatingLabel() { $form = $this->factory->createNamed('name', TextType::class, null, [ + 'empty_data' => null, 'attr' => [ 'placeholder' => 'name', ], diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php index cae1a1c6e6b4d..b7cefc06b877d 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionDivLayoutTest.php @@ -59,7 +59,9 @@ protected function setUp(): void public function testThemeBlockInheritanceUsingUse() { $view = $this->factory - ->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType') + ->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType', null, [ + 'empty_data' => null, + ]) ->createView() ; @@ -74,7 +76,9 @@ public function testThemeBlockInheritanceUsingUse() public function testThemeBlockInheritanceUsingExtend() { $view = $this->factory - ->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType') + ->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType', null, [ + 'empty_data' => null, + ]) ->createView() ; @@ -89,7 +93,9 @@ public function testThemeBlockInheritanceUsingExtend() public function testThemeBlockInheritanceUsingDynamicExtend() { $view = $this->factory - ->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType') + ->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType', null, [ + 'empty_data' => null, + ]) ->createView() ; @@ -194,6 +200,7 @@ public function testMoneyWidgetInIso() public function testHelpAttr() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_attr' => [ 'class' => 'class-test', @@ -214,6 +221,7 @@ public function testHelpAttr() public function testHelpHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', ]); @@ -241,6 +249,7 @@ public function testHelpHtmlDefaultIsFalse() public function testHelpHtmlIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_html' => false, ]); @@ -269,6 +278,7 @@ public function testHelpHtmlIsFalse() public function testHelpHtmlIsTrue() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_html' => true, ]); @@ -297,6 +307,7 @@ public function testHelpHtmlIsTrue() public function testLabelHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Bolded label', ]); @@ -313,6 +324,7 @@ public function testLabelHtmlDefaultIsFalse() public function testLabelHtmlIsTrue() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Bolded label', 'label_html' => true, ]); diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionFieldHelpersTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionFieldHelpersTest.php index ce3ee926e11b8..72eefadef6268 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionFieldHelpersTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionFieldHelpersTest.php @@ -56,6 +56,7 @@ protected function setUp(): void $form = $this->factory->createNamedBuilder('register', FormType::class, $data) ->add('username', TextType::class, [ + 'empty_data' => null, 'label' => 'base.username', 'label_translation_parameters' => ['%label_brand%' => 'Symfony'], 'help' => 'base.username_help', diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php index 7b75be234da3a..d94911626d982 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/FormExtensionTableLayoutTest.php @@ -80,6 +80,7 @@ public function testStartTagHasActionAttributeWhenActionIsZero() public function testHelpAttr() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_attr' => [ 'class' => 'class-test', @@ -100,6 +101,7 @@ public function testHelpAttr() public function testHelpHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', ]); @@ -127,6 +129,7 @@ public function testHelpHtmlDefaultIsFalse() public function testHelpHtmlIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_html' => false, ]); @@ -155,6 +158,7 @@ public function testHelpHtmlIsFalse() public function testHelpHtmlIsTrue() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', 'help_html' => true, ]); @@ -183,6 +187,7 @@ public function testHelpHtmlIsTrue() public function testLabelHtmlDefaultIsFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Bolded label', ]); @@ -199,6 +204,7 @@ public function testLabelHtmlDefaultIsFalse() public function testLabelHtmlIsTrue() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Bolded label', 'label_html' => true, ]); diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/CsrfFormLoginBundle/Form/UserLoginType.php b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/CsrfFormLoginBundle/Form/UserLoginType.php index 0f89b3c1b4fc8..562375e7852ea 100644 --- a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/CsrfFormLoginBundle/Form/UserLoginType.php +++ b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/Bundle/CsrfFormLoginBundle/Form/UserLoginType.php @@ -39,8 +39,12 @@ public function __construct(RequestStack $requestStack) public function buildForm(FormBuilderInterface $builder, array $options) { $builder - ->add('username', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('password', 'Symfony\Component\Form\Extension\Core\Type\PasswordType') + ->add('username', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('password', 'Symfony\Component\Form\Extension\Core\Type\PasswordType', [ + 'empty_data' => null, + ]) ->add('_target_path', 'Symfony\Component\Form\Extension\Core\Type\HiddenType') ; diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TextType.php b/src/Symfony/Component/Form/Extension/Core/Type/TextType.php index dd019192bc441..d7e80c894f6a7 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TextType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TextType.php @@ -27,6 +27,13 @@ public function buildForm(FormBuilderInterface $builder, array $options) // See https://github.com/symfony/symfony/issues/5906#issuecomment-203189375 if ('' === $options['empty_data']) { $builder->addViewTransformer($this); + } elseif ($options['empty_data'] instanceof \Closure) { + $scope = (new \ReflectionFunction($options['empty_data']))->getClosureScopeClass(); + + if (null !== $scope && FormType::class === $scope->getName()) { + // "empty_data" option is the default value from FormType::configureOptions() + trigger_deprecation('symfony/form', '6.1', 'The default value of "empty_data" option in "%s" will be changed to empty string. Declare "NULL" as value for "empty_data" if you still want use "NULL" as data.', __CLASS__); + } } } diff --git a/src/Symfony/Component/Form/Tests/AbstractDivLayoutTest.php b/src/Symfony/Component/Form/Tests/AbstractDivLayoutTest.php index 6a38a77017dba..a4bb577805ee7 100644 --- a/src/Symfony/Component/Form/Tests/AbstractDivLayoutTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractDivLayoutTest.php @@ -18,7 +18,9 @@ abstract class AbstractDivLayoutTest extends AbstractLayoutTest { public function testRow() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error![/trans]')); $view = $form->createView(); $html = $this->renderRow($view); @@ -38,7 +40,9 @@ public function testRow() public function testRowOverrideVariables() { - $view = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType')->createView(); + $view = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ])->createView(); $html = $this->renderRow($view, [ 'attr' => ['class' => 'my&class'], 'label' => 'foo&bar', @@ -57,7 +61,14 @@ public function testRowOverrideVariables() public function testRepeatedRow() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType', null, [ + 'first_options' => [ + 'empty_data' => null, + ], + 'second_options' => [ + 'empty_data' => null, + ], + ]); $form->addError(new FormError('[trans]Error![/trans]')); $view = $form->createView(); $html = $this->renderRow($view); @@ -101,10 +112,23 @@ public function testButtonRow() public function testRest() { $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType') - ->add('field3', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('field4', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType', [ + 'first_options' => [ + 'empty_data' => null, + ], + 'second_options' => [ + 'empty_data' => null, + ], + ]) + ->add('field3', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('field4', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm() ->createView(); @@ -142,12 +166,20 @@ public function testRest() public function testRestWithChildrenForms() { $child1 = $this->factory->createNamedBuilder('child1', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $child2 = $this->factory->createNamedBuilder('child2', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $view = $this->factory->createNamedBuilder('parent', 'Symfony\Component\Form\Extension\Core\Type\FormType') ->add($child1) @@ -200,8 +232,17 @@ public function testRestWithChildrenForms() public function testRestAndRepeatedWithRow() { $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('first', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('password', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType') + ->add('first', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('password', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType', [ + 'first_options' => [ + 'empty_data' => null, + ], + 'second_options' => [ + 'empty_data' => null, + ], + ]) ->getForm() ->createView(); @@ -226,8 +267,17 @@ public function testRestAndRepeatedWithRow() public function testRestAndRepeatedWithRowPerChild() { $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('first', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('password', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType') + ->add('first', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('password', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType', [ + 'first_options' => [ + 'empty_data' => null, + ], + 'second_options' => [ + 'empty_data' => null, + ], + ]) ->getForm() ->createView(); @@ -254,8 +304,17 @@ public function testRestAndRepeatedWithRowPerChild() public function testRestAndRepeatedWithWidgetPerChild() { $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('first', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('password', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType') + ->add('first', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('password', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType', [ + 'first_options' => [ + 'empty_data' => null, + ], + 'second_options' => [ + 'empty_data' => null, + ], + ]) ->getForm() ->createView(); @@ -285,6 +344,9 @@ public function testCollection() { $form = $this->factory->createNamed('names', 'Symfony\Component\Form\Extension\Core\Type\CollectionType', ['a', 'b'], [ 'entry_type' => 'Symfony\Component\Form\Extension\Core\Type\TextType', + 'entry_options' => [ + 'empty_data' => null, + ], ]); $this->assertWidgetMatchesXpath($form->createView(), [], @@ -325,6 +387,9 @@ public function testEmptyCollection() { $form = $this->factory->createNamed('names', 'Symfony\Component\Form\Extension\Core\Type\CollectionType', [], [ 'entry_type' => 'Symfony\Component\Form\Extension\Core\Type\TextType', + 'entry_options' => [ + 'empty_data' => null, + ], ]); $this->assertWidgetMatchesXpath($form->createView(), [], @@ -341,7 +406,12 @@ public function testCollectionRow() 'collection', 'Symfony\Component\Form\Extension\Core\Type\CollectionType', ['a', 'b'], - ['entry_type' => 'Symfony\Component\Form\Extension\Core\Type\TextType'] + [ + 'entry_type' => 'Symfony\Component\Form\Extension\Core\Type\TextType', + 'entry_options' => [ + 'empty_data' => null, + ], + ] ); $form = $this->factory->createNamedBuilder('form', 'Symfony\Component\Form\Extension\Core\Type\FormType') @@ -380,8 +450,12 @@ public function testForm() $form = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') ->setMethod('PUT') ->setAction('http://example.com') - ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm(); // include ampersands everywhere to validate escaping @@ -422,8 +496,12 @@ public function testForm() public function testFormWidget() { $form = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm(); $this->assertWidgetMatchesXpath($form->createView(), [], @@ -479,7 +557,9 @@ public function testCsrf() ->add($this->factory // No CSRF protection on nested forms ->createNamedBuilder('child', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add($this->factory->createNamedBuilder('grandchild', 'Symfony\Component\Form\Extension\Core\Type\TextType')) + ->add($this->factory->createNamedBuilder('grandchild', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ])) ) ->getForm(); @@ -498,6 +578,12 @@ public function testRepeated() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType', 'foobar', [ 'type' => 'Symfony\Component\Form\Extension\Core\Type\TextType', + 'first_options' => [ + 'empty_data' => null, + ], + 'second_options' => [ + 'empty_data' => null, + ], ]); $this->assertWidgetMatchesXpath($form->createView(), [], @@ -524,8 +610,15 @@ public function testRepeatedWithCustomOptions() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType', null, [ // the global required value cannot be overridden - 'first_options' => ['label' => 'Test', 'required' => false], - 'second_options' => ['label' => 'Test2'], + 'first_options' => [ + 'label' => 'Test', + 'required' => false, + 'empty_data' => null, + ], + 'second_options' => [ + 'label' => 'Test2', + 'empty_data' => null, + ], ]); $this->assertWidgetMatchesXpath($form->createView(), [], @@ -551,7 +644,9 @@ public function testRepeatedWithCustomOptions() public function testSearchInputName() { $form = $this->factory->createNamedBuilder('full', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('name', 'Symfony\Component\Form\Extension\Core\Type\SearchType') + ->add('name', 'Symfony\Component\Form\Extension\Core\Type\SearchType', [ + 'empty_data' => null, + ]) ->getForm(); $this->assertWidgetMatchesXpath($form->createView(), [], @@ -571,7 +666,9 @@ public function testSearchInputName() public function testLabelHasNoId() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderRow($form->createView()); $this->assertMatchesXpath($html, @@ -587,6 +684,7 @@ public function testLabelHasNoId() public function testLabelIsNotRenderedWhenSetToFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => false, ]); $html = $this->renderRow($form->createView()); @@ -607,7 +705,9 @@ public function testLabelIsNotRenderedWhenSetToFalse() public function testThemeBlockInheritance($theme) { $view = $this->factory - ->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType') + ->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType', null, [ + 'empty_data' => null, + ]) ->createView() ; @@ -625,10 +725,14 @@ public function testThemeBlockInheritance($theme) public function testThemeInheritance($parentTheme, $childTheme) { $child = $this->factory->createNamedBuilder('child', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('field', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + ->add('field', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $view = $this->factory->createNamedBuilder('parent', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('field', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('field', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->add($child) ->getForm() ->createView() @@ -670,8 +774,11 @@ public function testThemeInheritance($parentTheme, $childTheme) public function testCollectionRowWithCustomBlock() { $collection = ['one', 'two', 'three']; - $form = $this->factory->createNamedBuilder('names', 'Symfony\Component\Form\Extension\Core\Type\CollectionType', $collection) - ->getForm(); + $form = $this->factory->createNamedBuilder('names', 'Symfony\Component\Form\Extension\Core\Type\CollectionType', $collection, [ + 'entry_options' => [ + 'empty_data' => null, + ], + ])->getForm(); $this->assertWidgetMatchesXpath($form->createView(), [], '/div @@ -863,8 +970,12 @@ public function testMultipleChoiceExpandedWithLabelsSetFalseByCallable() public function testFormEndWithRest() { $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm() ->createView(); @@ -893,8 +1004,12 @@ public function testFormEndWithRest() public function testFormEndWithoutRest() { $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm() ->createView(); @@ -912,7 +1027,9 @@ public function testWidgetContainerAttributes() 'attr' => ['class' => 'foobar', 'data-foo' => 'bar'], ]); - $form->add('text', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form->add('text', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $html = $this->renderWidget($form->createView()); diff --git a/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php b/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php index 58e853e111e5a..e5c3842ca4e92 100644 --- a/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractLayoutTest.php @@ -146,7 +146,9 @@ abstract protected function setTheme(FormView $view, array $themes, $useDefaultT public function testLabel() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $view = $form->createView(); $this->renderWidget($view, ['label' => 'foo']); $html = $this->renderLabel($view); @@ -162,6 +164,7 @@ public function testLabel() public function testLabelWithoutTranslation() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'translation_domain' => false, ]); @@ -191,6 +194,7 @@ public function testLabelOnForm() public function testLabelWithCustomTextPassedAsOption() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Custom label', ]); $html = $this->renderLabel($form->createView()); @@ -205,7 +209,9 @@ public function testLabelWithCustomTextPassedAsOption() public function testLabelWithCustomTextPassedDirectly() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), 'Custom label'); $this->assertMatchesXpath($html, @@ -219,6 +225,7 @@ public function testLabelWithCustomTextPassedDirectly() public function testLabelWithCustomTextPassedAsOptionAndDirectly() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Custom label', ]); $html = $this->renderLabel($form->createView(), 'Overridden label'); @@ -233,7 +240,9 @@ public function testLabelWithCustomTextPassedAsOptionAndDirectly() public function testLabelDoesNotRenderFieldAttributes() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'attr' => [ 'class' => 'my&class', @@ -250,7 +259,9 @@ public function testLabelDoesNotRenderFieldAttributes() public function testLabelWithCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), null, [ 'label_attr' => [ 'class' => 'my&class', @@ -267,7 +278,9 @@ public function testLabelWithCustomAttributesPassedDirectly() public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), 'Custom label', [ 'label_attr' => [ 'class' => 'my&class', @@ -287,6 +300,7 @@ public function testLabelWithCustomTextAndCustomAttributesPassedDirectly() public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => 'Custom label', ]); $html = $this->renderLabel($form->createView(), null, [ @@ -307,7 +321,9 @@ public function testLabelWithCustomTextAsOptionAndCustomAttributesPassedDirectly public function testLabelFormatName() { $form = $this->factory->createNamedBuilder('myform') - ->add('myfield', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('myfield', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm(); $view = $form->get('myfield')->createView(); $html = $this->renderLabel($view, null, ['label_format' => 'form.%name%']); @@ -323,7 +339,9 @@ public function testLabelFormatName() public function testLabelFormatId() { $form = $this->factory->createNamedBuilder('myform') - ->add('myfield', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('myfield', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm(); $view = $form->get('myfield')->createView(); $html = $this->renderLabel($view, null, ['label_format' => 'form.%id%']); @@ -341,7 +359,9 @@ public function testLabelFormatAsFormOption() $options = ['label_format' => 'form.%name%']; $form = $this->factory->createNamedBuilder('myform', 'Symfony\Component\Form\Extension\Core\Type\FormType', null, $options) - ->add('myfield', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('myfield', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm(); $view = $form->get('myfield')->createView(); $html = $this->renderLabel($view); @@ -359,7 +379,10 @@ public function testLabelFormatOverriddenOption() $options = ['label_format' => 'form.%name%']; $form = $this->factory->createNamedBuilder('myform', 'Symfony\Component\Form\Extension\Core\Type\FormType', null, $options) - ->add('myfield', 'Symfony\Component\Form\Extension\Core\Type\TextType', ['label_format' => 'field.%name%']) + ->add('myfield', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + 'label_format' => 'field.%name%', + ]) ->getForm(); $view = $form->get('myfield')->createView(); $html = $this->renderLabel($view); @@ -428,6 +451,7 @@ public function testLabelFormatOnButtonId() public function testHelp() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', ]); $view = $form->createView(); @@ -444,7 +468,9 @@ public function testHelp() public function testHelpNotSet() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $view = $form->createView(); $html = $this->renderHelp($view); @@ -454,6 +480,7 @@ public function testHelpNotSet() public function testHelpSetLinkFromWidget() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'Help text test!', ]); $view = $form->createView(); @@ -471,7 +498,9 @@ public function testHelpSetLinkFromWidget() public function testHelpNotSetNotLinkedFromWidget() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $view = $form->createView(); $html = $this->renderRow($view); @@ -487,7 +516,9 @@ public function testHelpNotSetNotLinkedFromWidget() public function testErrors() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error 1[/trans]')); $form->addError(new FormError('[trans]Error 2[/trans]')); $view = $form->createView(); @@ -507,7 +538,9 @@ public function testErrors() public function testOverrideWidgetBlock() { // see custom_widgets.html.twig - $form = $this->factory->createNamed('text_id', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('text_id', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderWidget($form->createView()); $this->assertMatchesXpath($html, @@ -1718,7 +1751,9 @@ public function testBirthDayWithPlaceholder() public function testEmail() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType', 'foo&bar'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType', 'foo&bar', [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), [], '/input @@ -1733,6 +1768,7 @@ public function testEmail() public function testEmailWithMaxLength() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\EmailType', 'foo&bar', [ + 'empty_data' => null, 'attr' => ['maxlength' => 123], ]); @@ -1773,6 +1809,7 @@ public function testHidden() public function testDisabled() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'disabled' => true, ]); @@ -1887,7 +1924,9 @@ public function testRenderNumberWithHtml5NumberType() public function testPassword() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\PasswordType', 'foo&bar'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\PasswordType', 'foo&bar', [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), [], '/input @@ -1900,6 +1939,7 @@ public function testPassword() public function testPasswordSubmittedWithNotAlwaysEmpty() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\PasswordType', null, [ + 'empty_data' => null, 'always_empty' => false, ]); $form->submit('foo&bar'); @@ -1916,6 +1956,7 @@ public function testPasswordSubmittedWithNotAlwaysEmpty() public function testPasswordWithMaxLength() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\PasswordType', 'foo&bar', [ + 'empty_data' => null, 'attr' => ['maxlength' => 123], ]); @@ -2016,7 +2057,10 @@ public function testRadioWithValue() public function testRange() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RangeType', 42, ['attr' => ['min' => 5]]); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RangeType', 42, [ + 'empty_data' => null, + 'attr' => ['min' => 5], + ]); $this->assertWidgetMatchesXpath($form->createView(), [], '/input @@ -2030,7 +2074,10 @@ public function testRange() public function testRangeWithMinMaxValues() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RangeType', 42, ['attr' => ['min' => 5, 'max' => 57]]); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RangeType', 42, [ + 'empty_data' => null, + 'attr' => ['min' => 5, 'max' => 57], + ]); $this->assertWidgetMatchesXpath($form->createView(), [], '/input @@ -2046,6 +2093,7 @@ public function testRangeWithMinMaxValues() public function testTextarea() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextareaType', 'foo&bar', [ + 'empty_data' => null, 'attr' => ['pattern' => 'foo'], ]); @@ -2060,7 +2108,9 @@ public function testTextarea() public function testText() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', 'foo&bar'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', 'foo&bar', [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), [], '/input @@ -2075,6 +2125,7 @@ public function testText() public function testTextWithMaxLength() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', 'foo&bar', [ + 'empty_data' => null, 'attr' => ['maxlength' => 123], ]); @@ -2090,7 +2141,9 @@ public function testTextWithMaxLength() public function testSearch() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\SearchType', 'foo&bar'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\SearchType', 'foo&bar', [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), [], '/input @@ -2298,7 +2351,10 @@ public function testTimezoneWithPlaceholder() public function testUrlWithDefaultProtocol() { $url = 'http://www.example.com?foo1=bar1&foo2=bar2'; - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\UrlType', $url, ['default_protocol' => 'http']); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\UrlType', $url, [ + 'empty_data' => null, + 'default_protocol' => 'http', + ]); $this->assertWidgetMatchesXpath($form->createView(), [], '/input @@ -2313,7 +2369,10 @@ public function testUrlWithDefaultProtocol() public function testUrlWithoutDefaultProtocol() { $url = 'http://www.example.com?foo1=bar1&foo2=bar2'; - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\UrlType', $url, ['default_protocol' => null]); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\UrlType', $url, [ + 'empty_data' => null, + 'default_protocol' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), [], '/input @@ -2327,7 +2386,12 @@ public function testUrlWithoutDefaultProtocol() public function testCollectionPrototype() { $form = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType', ['items' => ['one', 'two', 'three']]) - ->add('items', 'Symfony\Component\Form\Extension\Core\Type\CollectionType', ['allow_add' => true]) + ->add('items', 'Symfony\Component\Form\Extension\Core\Type\CollectionType', [ + 'entry_options' => [ + 'empty_data' => null, + ], + 'allow_add' => true, + ]) ->getForm() ->createView(); @@ -2343,7 +2407,9 @@ public function testCollectionPrototype() public function testEmptyRootFormName() { $form = $this->factory->createNamedBuilder('', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('child', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('child', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm(); $this->assertMatchesXpath($this->renderWidget($form->createView()), @@ -2472,6 +2538,7 @@ public function testStartTagWithExtraAttributes() public function testWidgetAttributes() { $form = $this->factory->createNamed('text', 'Symfony\Component\Form\Extension\Core\Type\TextType', 'value', [ + 'empty_data' => null, 'required' => true, 'disabled' => true, 'attr' => ['readonly' => true, 'maxlength' => 10, 'pattern' => '\d+', 'class' => 'foobar', 'data-foo' => 'bar'], @@ -2486,6 +2553,7 @@ public function testWidgetAttributes() public function testWidgetAttributeNameRepeatedIfTrue() { $form = $this->factory->createNamed('text', 'Symfony\Component\Form\Extension\Core\Type\TextType', 'value', [ + 'empty_data' => null, 'attr' => ['foo' => true], ]); @@ -2498,6 +2566,7 @@ public function testWidgetAttributeNameRepeatedIfTrue() public function testWidgetAttributeHiddenIfFalse() { $form = $this->factory->createNamed('text', 'Symfony\Component\Form\Extension\Core\Type\TextType', 'value', [ + 'empty_data' => null, 'attr' => ['foo' => false], ]); @@ -2544,7 +2613,9 @@ public function testButtonAttributeHiddenIfFalse() public function testTextareaWithWhitespaceOnlyContentRetainsValue() { - $form = $this->factory->createNamed('textarea', 'Symfony\Component\Form\Extension\Core\Type\TextareaType', ' '); + $form = $this->factory->createNamed('textarea', 'Symfony\Component\Form\Extension\Core\Type\TextareaType', ' ', [ + 'empty_data' => null, + ]); $html = $this->renderWidget($form->createView()); @@ -2554,7 +2625,9 @@ public function testTextareaWithWhitespaceOnlyContentRetainsValue() public function testTextareaWithWhitespaceOnlyContentRetainsValueWhenRenderingForm() { $form = $this->factory->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType', ['textarea' => ' ']) - ->add('textarea', 'Symfony\Component\Form\Extension\Core\Type\TextareaType') + ->add('textarea', 'Symfony\Component\Form\Extension\Core\Type\TextareaType', [ + 'empty_data' => null, + ]) ->getForm(); $html = $this->renderForm($form->createView()); @@ -2577,8 +2650,14 @@ public function testWidgetContainerAttributeHiddenIfFalse() public function testTranslatedAttributes() { $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType', ['attr' => ['title' => 'Foo']]) - ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType', ['attr' => ['placeholder' => 'Bar']]) + ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + 'attr' => ['title' => 'Foo'], + ]) + ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + 'attr' => ['placeholder' => 'Bar'], + ]) ->getForm() ->createView(); @@ -2593,8 +2672,14 @@ public function testAttributesNotTranslatedWhenTranslationDomainIsFalse() $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType', null, [ 'translation_domain' => false, ]) - ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType', ['attr' => ['title' => 'Foo']]) - ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType', ['attr' => ['placeholder' => 'Bar']]) + ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + 'attr' => ['title' => 'Foo'], + ]) + ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + 'attr' => ['placeholder' => 'Bar'], + ]) ->getForm() ->createView(); @@ -2607,7 +2692,9 @@ public function testAttributesNotTranslatedWhenTranslationDomainIsFalse() public function testTel() { $tel = '0102030405'; - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TelType', $tel); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TelType', $tel, [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), [], '/input @@ -2621,7 +2708,9 @@ public function testTel() public function testColor() { $color = '#0000ff'; - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ColorType', $color); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\ColorType', $color, [ + 'empty_data' => null, + ]); $this->assertWidgetMatchesXpath($form->createView(), [], '/input @@ -2636,7 +2725,9 @@ public function testLabelWithTranslationParameters() { $this->requiresFeatureSet(403); - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $html = $this->renderLabel($form->createView(), 'Address is %address%', [ 'label_translation_parameters' => [ '%address%' => 'Paris, rue de la Paix', @@ -2656,6 +2747,7 @@ public function testHelpWithTranslationParameters() $this->requiresFeatureSet(403); $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => 'for company %company%', 'help_translation_parameters' => [ '%company%' => 'ACME Ltd.', @@ -2674,6 +2766,7 @@ public function testHelpWithTranslationParameters() public function testLabelWithTranslatableMessage() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => new TranslatableMessage('foo'), ]); $html = $this->renderLabel($form->createView()); @@ -2689,6 +2782,7 @@ public function testLabelWithTranslatableMessage() public function testHelpWithTranslatableMessage() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => new TranslatableMessage('foo'), ]); $html = $this->renderHelp($form->createView()); @@ -2711,6 +2805,7 @@ public function trans(TranslatorInterface $translator, string $locale = null): s }; $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'help' => $message, ]); $html = $this->renderHelp($form->createView()); @@ -2728,6 +2823,7 @@ public function testAttributesWithTranslationParameters() $this->requiresFeatureSet(403); $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'attr' => [ 'title' => 'Message to %company%', 'placeholder' => 'Enter a message to %company%', diff --git a/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php b/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php index 61b8dc379148a..be142219f1d6c 100644 --- a/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php @@ -330,7 +330,10 @@ public function testAddFormErrorIfPostMaxSizeExceeded(?int $contentLength, strin $this->serverParams->contentLength = $contentLength; $this->serverParams->postMaxSize = $iniMax; - $options = ['post_max_size_message' => 'Max {{ max }}!']; + $options = [ + 'empty_data' => null, + 'post_max_size_message' => 'Max {{ max }}!', + ]; $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, $options); $this->setRequestData('POST', [], []); diff --git a/src/Symfony/Component/Form/Tests/AbstractTableLayoutTest.php b/src/Symfony/Component/Form/Tests/AbstractTableLayoutTest.php index 5ce77a7f8aec4..eb516fbda3833 100644 --- a/src/Symfony/Component/Form/Tests/AbstractTableLayoutTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractTableLayoutTest.php @@ -18,7 +18,9 @@ abstract class AbstractTableLayoutTest extends AbstractLayoutTest { public function testRow() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ]); $form->addError(new FormError('[trans]Error![/trans]')); $view = $form->createView(); $html = $this->renderRow($view); @@ -43,6 +45,7 @@ public function testRow() public function testLabelIsNotRenderedWhenSetToFalse() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, 'label' => false, ]); $html = $this->renderRow($form->createView()); @@ -61,7 +64,14 @@ public function testLabelIsNotRenderedWhenSetToFalse() public function testRepeatedRow() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType', null, [ + 'first_options' => [ + 'empty_data' => null, + ], + 'second_options' => [ + 'empty_data' => null, + ], + ]); $html = $this->renderRow($form->createView()); $this->assertMatchesXpath($html, @@ -91,7 +101,14 @@ public function testRepeatedRow() public function testRepeatedRowWithErrors() { - $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType'); + $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType', null, [ + 'first_options' => [ + 'empty_data' => null, + ], + 'second_options' => [ + 'empty_data' => null, + ], + ]); $form->addError(new FormError('[trans]Error![/trans]')); $view = $form->createView(); $html = $this->renderRow($view); @@ -148,10 +165,23 @@ public function testButtonRow() public function testRest() { $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType') - ->add('field3', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('field4', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType', [ + 'first_options' => [ + 'empty_data' => null, + ], + 'second_options' => [ + 'empty_data' => null, + ], + ]) + ->add('field3', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('field4', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm() ->createView(); @@ -196,6 +226,9 @@ public function testCollection() { $form = $this->factory->createNamed('names', 'Symfony\Component\Form\Extension\Core\Type\CollectionType', ['a', 'b'], [ 'entry_type' => 'Symfony\Component\Form\Extension\Core\Type\TextType', + 'entry_options' => [ + 'empty_data' => null, + ], ]); $this->assertWidgetMatchesXpath($form->createView(), [], @@ -214,6 +247,9 @@ public function testEmptyCollection() { $form = $this->factory->createNamed('names', 'Symfony\Component\Form\Extension\Core\Type\CollectionType', [], [ 'entry_type' => 'Symfony\Component\Form\Extension\Core\Type\TextType', + 'entry_options' => [ + 'empty_data' => null, + ], ]); $this->assertWidgetMatchesXpath($form->createView(), [], @@ -229,8 +265,12 @@ public function testForm() $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') ->setMethod('PUT') ->setAction('http://example.com') - ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm() ->createView(); @@ -279,8 +319,12 @@ public function testForm() public function testFormWidget() { $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm() ->createView(); @@ -345,7 +389,9 @@ public function testCsrf() ->add($this->factory // No CSRF protection on nested forms ->createNamedBuilder('child', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add($this->factory->createNamedBuilder('grandchild', 'Symfony\Component\Form\Extension\Core\Type\TextType')) + ->add($this->factory->createNamedBuilder('grandchild', 'Symfony\Component\Form\Extension\Core\Type\TextType', null, [ + 'empty_data' => null, + ])) ) ->getForm(); @@ -367,6 +413,12 @@ public function testRepeated() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType', 'foobar', [ 'type' => 'Symfony\Component\Form\Extension\Core\Type\TextType', + 'first_options' => [ + 'empty_data' => null, + ], + 'second_options' => [ + 'empty_data' => null, + ], ]); $this->assertWidgetMatchesXpath($form->createView(), [], @@ -401,8 +453,15 @@ public function testRepeatedWithCustomOptions() { $form = $this->factory->createNamed('name', 'Symfony\Component\Form\Extension\Core\Type\RepeatedType', 'foobar', [ 'type' => 'Symfony\Component\Form\Extension\Core\Type\PasswordType', - 'first_options' => ['label' => 'Test', 'required' => false], - 'second_options' => ['label' => 'Test2'], + 'first_options' => [ + 'empty_data' => null, + 'label' => 'Test', + 'required' => false, + ], + 'second_options' => [ + 'empty_data' => null, + 'label' => 'Test2', + ], ]); $this->assertWidgetMatchesXpath($form->createView(), [], @@ -440,8 +499,11 @@ public function testRepeatedWithCustomOptions() public function testCollectionRowWithCustomBlock() { $collection = ['one', 'two', 'three']; - $form = $this->factory->createNamedBuilder('names', 'Symfony\Component\Form\Extension\Core\Type\CollectionType', $collection) - ->getForm(); + $form = $this->factory->createNamedBuilder('names', 'Symfony\Component\Form\Extension\Core\Type\CollectionType', $collection, [ + 'entry_options' => [ + 'empty_data' => null, + ], + ])->getForm(); $this->assertWidgetMatchesXpath($form->createView(), [], '/table @@ -457,8 +519,12 @@ public function testCollectionRowWithCustomBlock() public function testFormEndWithRest() { $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm() ->createView(); @@ -495,8 +561,12 @@ public function testFormEndWithRest() public function testFormEndWithoutRest() { $view = $this->factory->createNamedBuilder('name', 'Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('field1', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('field2', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm() ->createView(); @@ -514,7 +584,9 @@ public function testWidgetContainerAttributes() 'attr' => ['class' => 'foobar', 'data-foo' => 'bar'], ]); - $form->add('text', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $form->add('text', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $html = $this->renderWidget($form->createView()); diff --git a/src/Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php b/src/Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php index b9c81f1d1ef51..1b4634c6243c1 100644 --- a/src/Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php +++ b/src/Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php @@ -29,8 +29,12 @@ public function testArrayBasedForm() for ($i = 0; $i < 40; ++$i) { $form = $this->factory->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType') - ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType') - ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) + ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->add('color', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [ 'choices' => ['red' => 'Red', 'blue' => 'Blue'], 'required' => false, diff --git a/src/Symfony/Component/Form/Tests/CompoundFormTest.php b/src/Symfony/Component/Form/Tests/CompoundFormTest.php index 833dcc7616ad2..03bcac4c702cb 100644 --- a/src/Symfony/Component/Form/Tests/CompoundFormTest.php +++ b/src/Symfony/Component/Form/Tests/CompoundFormTest.php @@ -205,7 +205,9 @@ public function testAdd() public function testAddUsingNameAndType() { - $this->form->add('foo', TextType::class); + $this->form->add('foo', TextType::class, [ + 'empty_data' => null, + ]); $this->assertTrue($this->form->has('foo')); @@ -218,7 +220,9 @@ public function testAddUsingNameAndType() public function testAddUsingIntegerNameAndType() { // in order to make casting unnecessary - $this->form->add(0, TextType::class); + $this->form->add(0, TextType::class, [ + 'empty_data' => null, + ]); $this->assertTrue($this->form->has(0)); @@ -230,7 +234,9 @@ public function testAddUsingIntegerNameAndType() public function testAddWithoutType() { - $this->form->add('foo'); + $this->form->add('foo', null, [ + 'empty_data' => null, + ]); $this->assertTrue($this->form->has('foo')); @@ -247,7 +253,9 @@ public function testAddUsingNameButNoType() ->setDataMapper(new DataMapper()) ->getForm(); - $this->form->add('foo'); + $this->form->add('foo', null, [ + 'empty_data' => null, + ]); $this->assertTrue($this->form->has('foo')); @@ -264,7 +272,9 @@ public function testAddUsingNameButNoTypeAndOptions() ->setDataMapper(new DataMapper()) ->getForm(); - $this->form->add('foo'); + $this->form->add('foo', null, [ + 'empty_data' => null, + ]); $this->assertTrue($this->form->has('foo')); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php index 9bcb22efe0473..632fe1799ea2a 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/ResizeFormListenerTest.php @@ -59,7 +59,10 @@ public function testPreSetDataResizesForm() $data = [1 => 'string', 2 => 'string']; $event = new FormEvent($this->form, $data); - $listener = new ResizeFormListener(TextType::class, ['attr' => ['maxlength' => 10]], false, false); + $listener = new ResizeFormListener(TextType::class, [ + 'empty_data' => null, + 'attr' => ['maxlength' => 10], + ], false, false); $listener->preSetData($event); $this->assertFalse($this->form->has('0')); @@ -80,7 +83,9 @@ public function testPreSetDataDealsWithNullData() { $data = null; $event = new FormEvent($this->form, $data); - $listener = new ResizeFormListener(TextType::class, [], false, false); + $listener = new ResizeFormListener(TextType::class, [ + 'empty_data' => null, + ], false, false); $listener->preSetData($event); $this->assertSame(0, $this->form->count()); @@ -92,7 +97,10 @@ public function testPreSubmitResizesUpIfAllowAdd() $data = [0 => 'string', 1 => 'string']; $event = new FormEvent($this->form, $data); - $listener = new ResizeFormListener(TextType::class, ['attr' => ['maxlength' => 10]], true, false); + $listener = new ResizeFormListener(TextType::class, [ + 'empty_data' => null, + 'attr' => ['maxlength' => 10], + ], true, false); $listener->preSubmit($event); $this->assertTrue($this->form->has('0')); 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 3303e6a5c78ce..63dd1a369a1c5 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/BaseTypeTest.php @@ -22,17 +22,20 @@ abstract class BaseTypeTest extends TypeTestCase use VersionAwareTest; public const TESTED_TYPE = ''; + public const TESTED_TYPE_OPTIONS = []; public function testPassDisabledAsOption() { - $form = $this->factory->create($this->getTestedType(), null, array_merge($this->getTestOptions(), ['disabled' => true])); + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ + 'disabled' => true, + ]); $this->assertTrue($form->isDisabled()); } public function testPassIdAndNameToView() { - $view = $this->factory->createNamed('name', $this->getTestedType(), null, $this->getTestOptions()) + $view = $this->factory->createNamed('name', $this->getTestedType(), null, $this->getTestedTypeOptions()) ->createView(); $this->assertEquals('name', $view->vars['id']); @@ -42,7 +45,7 @@ public function testPassIdAndNameToView() public function testStripLeadingUnderscoresAndDigitsFromId() { - $view = $this->factory->createNamed('_09name', $this->getTestedType(), null, $this->getTestOptions()) + $view = $this->factory->createNamed('_09name', $this->getTestedType(), null, $this->getTestedTypeOptions()) ->createView(); $this->assertEquals('name', $view->vars['id']); @@ -53,7 +56,7 @@ public function testStripLeadingUnderscoresAndDigitsFromId() public function testPassIdAndNameToViewWithParent() { $view = $this->factory->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE) - ->add('child', $this->getTestedType(), $this->getTestOptions()) + ->add('child', $this->getTestedType(), $this->getTestedTypeOptions()) ->getForm() ->createView(); @@ -66,7 +69,7 @@ public function testPassIdAndNameToViewWithGrandParent() { $builder = $this->factory->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE) ->add('child', FormTypeTest::TESTED_TYPE); - $builder->get('child')->add('grand_child', $this->getTestedType(), $this->getTestOptions()); + $builder->get('child')->add('grand_child', $this->getTestedType(), $this->getTestedTypeOptions()); $view = $builder->getForm()->createView(); $this->assertEquals('parent_child_grand_child', $view['child']['grand_child']->vars['id']); @@ -76,10 +79,9 @@ public function testPassIdAndNameToViewWithGrandParent() public function testPassTranslationDomainToView() { - $view = $this->factory->create($this->getTestedType(), null, array_merge($this->getTestOptions(), [ + $view = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'translation_domain' => 'domain', - ])) - ->createView(); + ])->createView(); $this->assertSame('domain', $view->vars['translation_domain']); } @@ -90,7 +92,7 @@ public function testInheritTranslationDomainFromParent() ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ 'translation_domain' => 'domain', ]) - ->add('child', $this->getTestedType(), $this->getTestOptions()) + ->add('child', $this->getTestedType(), $this->getTestedTypeOptions()) ->getForm() ->createView(); @@ -103,9 +105,9 @@ public function testPreferOwnTranslationDomain() ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ 'translation_domain' => 'parent_domain', ]) - ->add('child', $this->getTestedType(), array_merge($this->getTestOptions(), [ + ->add('child', $this->getTestedType(), $this->getTestedTypeOptions() + [ 'translation_domain' => 'domain', - ])) + ]) ->getForm() ->createView(); @@ -115,7 +117,7 @@ public function testPreferOwnTranslationDomain() public function testDefaultTranslationDomain() { $view = $this->factory->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE) - ->add('child', $this->getTestedType(), $this->getTestOptions()) + ->add('child', $this->getTestedType(), $this->getTestedTypeOptions()) ->getForm() ->createView(); @@ -126,10 +128,9 @@ public function testPassLabelTranslationParametersToView() { $this->requiresFeatureSet(403); - $view = $this->factory->create($this->getTestedType(), null, array_merge($this->getTestOptions(), [ + $view = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'label_translation_parameters' => ['%param%' => 'value'], - ])) - ->createView(); + ])->createView(); $this->assertSame(['%param%' => 'value'], $view->vars['label_translation_parameters']); } @@ -138,10 +139,9 @@ public function testPassAttrTranslationParametersToView() { $this->requiresFeatureSet(403); - $view = $this->factory->create($this->getTestedType(), null, array_merge($this->getTestOptions(), [ + $view = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'attr_translation_parameters' => ['%param%' => 'value'], - ])) - ->createView(); + ])->createView(); $this->assertSame(['%param%' => 'value'], $view->vars['attr_translation_parameters']); } @@ -154,7 +154,7 @@ public function testInheritLabelTranslationParametersFromParent() ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ 'label_translation_parameters' => ['%param%' => 'value'], ]) - ->add('child', $this->getTestedType(), $this->getTestOptions()) + ->add('child', $this->getTestedType(), $this->getTestedTypeOptions()) ->getForm() ->createView(); @@ -169,7 +169,7 @@ public function testInheritAttrTranslationParametersFromParent() ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ 'attr_translation_parameters' => ['%param%' => 'value'], ]) - ->add('child', $this->getTestedType(), $this->getTestOptions()) + ->add('child', $this->getTestedType(), $this->getTestedTypeOptions()) ->getForm() ->createView(); @@ -184,9 +184,9 @@ public function testPreferOwnLabelTranslationParameters() ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ 'label_translation_parameters' => ['%parent_param%' => 'parent_value', '%override_param%' => 'parent_override_value'], ]) - ->add('child', $this->getTestedType(), array_merge($this->getTestOptions(), [ + ->add('child', $this->getTestedType(), $this->getTestedTypeOptions() + [ 'label_translation_parameters' => ['%override_param%' => 'child_value'], - ])) + ]) ->getForm() ->createView(); @@ -201,9 +201,9 @@ public function testPreferOwnAttrTranslationParameters() ->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE, null, [ 'attr_translation_parameters' => ['%parent_param%' => 'parent_value', '%override_param%' => 'parent_override_value'], ]) - ->add('child', $this->getTestedType(), array_merge($this->getTestOptions(), [ + ->add('child', $this->getTestedType(), $this->getTestedTypeOptions() + [ 'attr_translation_parameters' => ['%override_param%' => 'child_value'], - ])) + ]) ->getForm() ->createView(); @@ -215,7 +215,7 @@ public function testDefaultLabelTranslationParameters() $this->requiresFeatureSet(403); $view = $this->factory->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE) - ->add('child', $this->getTestedType(), $this->getTestOptions()) + ->add('child', $this->getTestedType(), $this->getTestedTypeOptions()) ->getForm() ->createView(); @@ -227,7 +227,7 @@ public function testDefaultAttrTranslationParameters() $this->requiresFeatureSet(403); $view = $this->factory->createNamedBuilder('parent', FormTypeTest::TESTED_TYPE) - ->add('child', $this->getTestedType(), $this->getTestOptions()) + ->add('child', $this->getTestedType(), $this->getTestedTypeOptions()) ->getForm() ->createView(); @@ -236,26 +236,28 @@ public function testDefaultAttrTranslationParameters() public function testPassLabelToView() { - $view = $this->factory->createNamed('__test___field', $this->getTestedType(), null, array_merge( - $this->getTestOptions(), - ['label' => 'My label'] - )) - ->createView(); + $view = $this->factory->createNamed( + '__test___field', + $this->getTestedType(), + null, + $this->getTestedTypeOptions() + [ + 'label' => 'My label', + ] + )->createView(); $this->assertSame('My label', $view->vars['label']); } public function testPassMultipartFalseToView() { - $view = $this->factory->create($this->getTestedType(), null, $this->getTestOptions()) - ->createView(); + $view = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions())->createView(); $this->assertFalse($view->vars['multipart']); } public function testSubmitNull($expected = null, $norm = null, $view = null) { - $form = $this->factory->create($this->getTestedType(), null, $this->getTestOptions()); + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions()); $form->submit(null); $this->assertSame($expected, $form->getData()); @@ -265,7 +267,7 @@ public function testSubmitNull($expected = null, $norm = null, $view = null) public function testSubmitNullUsesDefaultEmptyData($emptyData = 'empty', $expectedData = null) { - $builder = $this->factory->createBuilder($this->getTestedType(), null, $this->getTestOptions()); + $builder = $this->factory->createBuilder($this->getTestedType(), null, $this->getTestedTypeOptions()); if ($builder->getCompound()) { $emptyData = []; @@ -290,8 +292,8 @@ protected function getTestedType() return static::TESTED_TYPE; } - protected function getTestOptions(): array + protected function getTestedTypeOptions(): array { - return []; + return static::TESTED_TYPE_OPTIONS; } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/BirthdayTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/BirthdayTypeTest.php index 47028ac014a75..bbea52fe88d8d 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/BirthdayTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/BirthdayTypeTest.php @@ -19,11 +19,12 @@ class BirthdayTypeTest extends DateTypeTest { public const TESTED_TYPE = 'Symfony\Component\Form\Extension\Core\Type\BirthdayType'; + public const TESTED_TYPE_OPTIONS = []; public function testSetInvalidYearsOption() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'years' => 'bad value', ]); } 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 129c2c97b9a34..00ea9193f71e8 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/CollectionTypeTest.php @@ -21,24 +21,26 @@ class CollectionTypeTest extends BaseTypeTest { public const TESTED_TYPE = 'Symfony\Component\Form\Extension\Core\Type\CollectionType'; + public const TESTED_TYPE_OPTIONS = [ + 'entry_type' => TextTypeTest::TESTED_TYPE, + 'entry_options' => ['empty_data' => null], + ]; public function testContainsNoChildByDefault() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => TextTypeTest::TESTED_TYPE, - ]); + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions()); $this->assertCount(0, $form); } public function testSetDataAdjustsSize() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => TextTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), null, [ 'entry_options' => [ + 'empty_data' => null, 'attr' => ['maxlength' => 20], ], - ]); + ] + $this->getTestedTypeOptions()); $form->setData(['foo@foo.com', 'foo@bar.com']); $this->assertInstanceOf(Form::class, $form[0]); @@ -62,18 +64,14 @@ public function testSetDataAdjustsSize() public function testThrowsExceptionIfObjectIsNotTraversable() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => TextTypeTest::TESTED_TYPE, - ]); + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions()); $this->expectException(UnexpectedTypeException::class); $form->setData(new \stdClass()); } public function testNotResizedIfSubmittedWithMissingData() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => TextTypeTest::TESTED_TYPE, - ]); + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions()); $form->setData(['foo@foo.com', 'bar@bar.com']); $form->submit(['foo@bar.com']); @@ -85,10 +83,9 @@ public function testNotResizedIfSubmittedWithMissingData() public function testResizedDownIfSubmittedWithMissingDataAndAllowDelete() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => TextTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), null, [ 'allow_delete' => true, - ]); + ] + $this->getTestedTypeOptions()); $form->setData(['foo@foo.com', 'bar@bar.com']); $form->submit(['foo@foo.com']); @@ -100,8 +97,7 @@ public function testResizedDownIfSubmittedWithMissingDataAndAllowDelete() public function testResizedDownIfSubmittedWithEmptyDataAndDeleteEmpty() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => TextTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'allow_delete' => true, 'delete_empty' => true, ]); @@ -117,7 +113,7 @@ public function testResizedDownIfSubmittedWithEmptyDataAndDeleteEmpty() public function testResizedDownWithDeleteEmptyCallable() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'entry_type' => AuthorType::class, 'allow_delete' => true, 'delete_empty' => function (Author $obj = null) { @@ -136,7 +132,7 @@ public function testResizedDownWithDeleteEmptyCallable() public function testResizedDownIfSubmittedWithCompoundEmptyDataDeleteEmptyAndNoDataClass() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'entry_type' => AuthorType::class, // If the field is not required, no new Author will be created if the // form is completely empty @@ -160,8 +156,7 @@ public function testResizedDownIfSubmittedWithCompoundEmptyDataDeleteEmptyAndNoD public function testDontAddEmptyDataIfDeleteEmpty() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => TextTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'allow_add' => true, 'delete_empty' => true, ]); @@ -177,8 +172,7 @@ public function testDontAddEmptyDataIfDeleteEmpty() public function testNoDeleteEmptyIfDeleteNotAllowed() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => TextTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'allow_delete' => false, 'delete_empty' => true, ]); @@ -192,7 +186,7 @@ public function testNoDeleteEmptyIfDeleteNotAllowed() public function testResizedDownIfSubmittedWithCompoundEmptyDataAndDeleteEmpty() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'entry_type' => 'Symfony\Component\Form\Tests\Fixtures\AuthorType', // If the field is not required, no new Author will be created if the // form is completely empty @@ -215,7 +209,7 @@ public function testResizedDownIfSubmittedWithCompoundEmptyDataAndDeleteEmpty() public function testNotDeleteEmptyIfInvalid() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'entry_type' => ChoiceType::class, 'entry_options' => [ 'choices' => ['a', 'b'], @@ -237,9 +231,7 @@ public function testNotDeleteEmptyIfInvalid() public function testNotResizedIfSubmittedWithExtraData() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => TextTypeTest::TESTED_TYPE, - ]); + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions()); $form->setData(['foo@bar.com']); $form->submit(['foo@foo.com', 'bar@bar.com']); @@ -250,8 +242,7 @@ public function testNotResizedIfSubmittedWithExtraData() public function testResizedUpIfSubmittedWithExtraDataAndAllowAdd() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => TextTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'allow_add' => true, ]); $form->setData(['foo@bar.com']); @@ -266,8 +257,7 @@ public function testResizedUpIfSubmittedWithExtraDataAndAllowAdd() public function testAllowAddButNoPrototype() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => FormTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'allow_add' => true, 'prototype' => false, ]); @@ -277,21 +267,18 @@ public function testAllowAddButNoPrototype() public function testPrototypeMultipartPropagation() { - $form = $this->factory - ->create(static::TESTED_TYPE, null, [ - 'entry_type' => FileTypeTest::TESTED_TYPE, - 'allow_add' => true, - 'prototype' => true, - ]) - ; + $form = $this->factory->create($this->getTestedType(), null, [ + 'entry_type' => FileTypeTest::TESTED_TYPE, + 'allow_add' => true, + 'prototype' => true, + ]); $this->assertTrue($form->createView()->vars['multipart']); } public function testGetDataDoesNotContainsPrototypeNameBeforeDataAreSet() { - $form = $this->factory->create(static::TESTED_TYPE, [], [ - 'entry_type' => FileTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), [], $this->getTestedTypeOptions() + [ 'prototype' => true, 'allow_add' => true, ]); @@ -302,8 +289,7 @@ public function testGetDataDoesNotContainsPrototypeNameBeforeDataAreSet() public function testGetDataDoesNotContainsPrototypeNameAfterDataAreSet() { - $form = $this->factory->create(static::TESTED_TYPE, [], [ - 'entry_type' => FileTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), [], $this->getTestedTypeOptions() + [ 'allow_add' => true, 'prototype' => true, ]); @@ -315,16 +301,14 @@ public function testGetDataDoesNotContainsPrototypeNameAfterDataAreSet() public function testPrototypeNameOption() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => FormTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'prototype' => true, 'allow_add' => true, ]); $this->assertSame('__name__', $form->getConfig()->getAttribute('prototype')->getName(), '__name__ is the default'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'entry_type' => FormTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'prototype' => true, 'allow_add' => true, 'prototype_name' => '__test__', @@ -335,8 +319,7 @@ public function testPrototypeNameOption() public function testPrototypeDefaultLabel() { - $form = $this->factory->create(static::TESTED_TYPE, [], [ - 'entry_type' => FileTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), [], $this->getTestedTypeOptions() + [ 'allow_add' => true, 'prototype' => true, 'prototype_name' => '__test__', @@ -347,16 +330,16 @@ public function testPrototypeDefaultLabel() public function testPrototypeData() { - $form = $this->factory->create(static::TESTED_TYPE, [], [ + $form = $this->factory->create($this->getTestedType(), [], [ 'allow_add' => true, 'prototype' => true, 'prototype_data' => 'foo', - 'entry_type' => TextTypeTest::TESTED_TYPE, 'entry_options' => [ + 'empty_data' => null, 'data' => 'bar', 'label' => false, ], - ]); + ] + $this->getTestedTypeOptions()); $this->assertSame('foo', $form->createView()->vars['prototype']->vars['value']); $this->assertFalse($form->createView()->vars['prototype']->vars['label']); @@ -364,7 +347,7 @@ public function testPrototypeData() public function testPrototypeDefaultRequired() { - $form = $this->factory->create(static::TESTED_TYPE, [], [ + $form = $this->factory->create($this->getTestedType(), [], [ 'entry_type' => FileTypeTest::TESTED_TYPE, 'allow_add' => true, 'prototype' => true, @@ -376,7 +359,7 @@ public function testPrototypeDefaultRequired() public function testPrototypeSetNotRequired() { - $form = $this->factory->create(static::TESTED_TYPE, [], [ + $form = $this->factory->create($this->getTestedType(), [], [ 'entry_type' => FileTypeTest::TESTED_TYPE, 'allow_add' => true, 'prototype' => true, @@ -390,7 +373,7 @@ public function testPrototypeSetNotRequired() public function testPrototypeSetNotRequiredIfParentNotRequired() { - $child = $this->factory->create(static::TESTED_TYPE, [], [ + $child = $this->factory->create($this->getTestedType(), [], [ 'entry_type' => FileTypeTest::TESTED_TYPE, 'allow_add' => true, 'prototype' => true, @@ -409,7 +392,7 @@ public function testPrototypeSetNotRequiredIfParentNotRequired() public function testPrototypeNotOverrideRequiredByEntryOptionsInFavorOfParent() { - $child = $this->factory->create(static::TESTED_TYPE, [], [ + $child = $this->factory->create($this->getTestedType(), [], [ 'entry_type' => FileTypeTest::TESTED_TYPE, 'allow_add' => true, 'prototype' => true, @@ -441,6 +424,7 @@ public function testPrototypeOptionsOverrideEntryOptions() ], 'prototype_options' => [ 'help' => 'foo', + 'empty_data' => null, ], ]); @@ -449,7 +433,7 @@ public function testPrototypeOptionsOverrideEntryOptions() public function testEntriesBlockPrefixes() { - $collectionView = $this->factory->createNamed('fields', static::TESTED_TYPE, [''], [ + $collectionView = $this->factory->createNamed('fields', $this->getTestedType(), [''], $this->getTestedTypeOptions() + [ 'allow_add' => true, ]) ->createView() @@ -469,9 +453,12 @@ public function testEntriesBlockPrefixes() public function testEntriesBlockPrefixesWithCustomBlockPrefix() { - $collectionView = $this->factory->createNamed('fields', static::TESTED_TYPE, [''], [ + $collectionView = $this->factory->createNamed('fields', $this->getTestedType(), [''], [ 'allow_add' => true, - 'entry_options' => ['block_prefix' => 'field'], + 'entry_options' => [ + 'empty_data' => null, + 'block_prefix' => 'field', + ], ]) ->createView() ; @@ -491,7 +478,7 @@ public function testEntriesBlockPrefixesWithCustomBlockPrefix() public function testEntriesBlockPrefixesWithCustomBlockPrefixedType() { - $collectionView = $this->factory->createNamed('fields', static::TESTED_TYPE, [''], [ + $collectionView = $this->factory->createNamed('fields', $this->getTestedType(), [''], [ 'allow_add' => true, 'entry_type' => BlockPrefixedFooTextType::class, ]) @@ -513,9 +500,12 @@ public function testEntriesBlockPrefixesWithCustomBlockPrefixedType() public function testPrototypeBlockPrefixesWithCustomBlockPrefix() { - $collectionView = $this->factory->createNamed('fields', static::TESTED_TYPE, [], [ + $collectionView = $this->factory->createNamed('fields', $this->getTestedType(), [], [ 'allow_add' => true, - 'entry_options' => ['block_prefix' => 'field'], + 'entry_options' => [ + 'empty_data' => null, + 'block_prefix' => 'field', + ], ]) ->createView() ; diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ColorTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ColorTypeTest.php index cfe7f0c527ce3..ce95f0d5b48a2 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/ColorTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/ColorTypeTest.php @@ -17,13 +17,16 @@ final class ColorTypeTest extends BaseTypeTest { public const TESTED_TYPE = ColorType::class; + public const TESTED_TYPE_OPTIONS = [ + 'empty_data' => null, + ]; /** * @dataProvider validationShouldPassProvider */ public function testValidationShouldPass(bool $html5, ?string $submittedValue) { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'html5' => $html5, 'trim' => true, ]); @@ -56,7 +59,7 @@ public function validationShouldPassProvider() */ public function testValidationShouldFail(string $expectedValueParameterValue, ?string $submittedValue, bool $trim = true) { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'html5' => true, 'trim' => $trim, ]); 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 71edd6afc7d61..62d4872cd3e96 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php @@ -17,6 +17,9 @@ class DateTimeTypeTest extends BaseTypeTest { public const TESTED_TYPE = 'Symfony\Component\Form\Extension\Core\Type\DateTimeType'; + public const TESTED_TYPE_OPTIONS = [ + 'empty_data' => null, + ]; private $defaultLocale; @@ -34,7 +37,7 @@ protected function tearDown(): void public function testSubmitDateTime() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'date_widget' => 'choice', @@ -62,7 +65,7 @@ public function testSubmitDateTime() public function testSubmitDateTimeImmutable() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'date_widget' => 'choice', @@ -90,7 +93,7 @@ public function testSubmitDateTimeImmutable() public function testSubmitString() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'string', @@ -116,7 +119,7 @@ public function testSubmitString() public function testSubmitTimestamp() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'timestamp', @@ -144,7 +147,7 @@ public function testSubmitTimestamp() public function testSubmitWithoutMinutes() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'date_widget' => 'choice', @@ -174,7 +177,7 @@ public function testSubmitWithoutMinutes() public function testSubmitWithSeconds() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'date_widget' => 'choice', @@ -206,7 +209,7 @@ public function testSubmitWithSeconds() public function testSubmitDifferentTimezones() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'America/New_York', 'view_timezone' => 'Pacific/Tahiti', 'date_widget' => 'choice', @@ -238,7 +241,7 @@ public function testSubmitDifferentTimezones() public function testSubmitDifferentTimezonesDateTime() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'America/New_York', 'view_timezone' => 'Pacific/Tahiti', 'widget' => 'single_text', @@ -257,7 +260,7 @@ public function testSubmitDifferentTimezonesDateTime() public function testSubmitDifferentTimezonesDateTimeImmutable() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'America/New_York', 'view_timezone' => 'Pacific/Tahiti', 'widget' => 'single_text', @@ -277,7 +280,7 @@ public function testSubmitDifferentTimezonesDateTimeImmutable() public function testSubmitStringSingleText() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'string', @@ -292,7 +295,7 @@ public function testSubmitStringSingleText() public function testSubmitStringSingleTextWithSeconds() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'string', @@ -308,7 +311,7 @@ public function testSubmitStringSingleTextWithSeconds() public function testSubmitDifferentPattern() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'html5' => false, 'date_format' => 'MM*yyyy*dd', 'date_widget' => 'single_text', @@ -330,12 +333,12 @@ public function testInitializeWithDateTime() { // Throws an exception if "data_class" option is not explicitly set // to null in the type - $this->assertInstanceOf(FormInterface::class, $this->factory->create(static::TESTED_TYPE, new \DateTime())); + $this->assertInstanceOf(FormInterface::class, $this->factory->create($this->getTestedType(), new \DateTime())); } public function testSingleTextWidgetShouldUseTheRightInputType() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', ]) ->createView(); @@ -345,7 +348,7 @@ public function testSingleTextWidgetShouldUseTheRightInputType() public function testPassDefaultPlaceholderToViewIfNotRequired() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'required' => false, 'with_seconds' => true, ]) @@ -361,7 +364,7 @@ public function testPassDefaultPlaceholderToViewIfNotRequired() public function testPassNoPlaceholderToViewIfRequired() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'required' => true, 'with_seconds' => true, ]) @@ -377,7 +380,7 @@ public function testPassNoPlaceholderToViewIfRequired() public function testPassPlaceholderAsString() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'placeholder' => 'Empty', 'with_seconds' => true, ]) @@ -393,7 +396,7 @@ public function testPassPlaceholderAsString() public function testPassPlaceholderAsArray() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'placeholder' => [ 'year' => 'Empty year', 'month' => 'Empty month', @@ -416,7 +419,7 @@ public function testPassPlaceholderAsArray() public function testPassPlaceholderAsPartialArrayAddEmptyIfNotRequired() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'required' => false, 'placeholder' => [ 'year' => 'Empty year', @@ -438,7 +441,7 @@ public function testPassPlaceholderAsPartialArrayAddEmptyIfNotRequired() public function testPassPlaceholderAsPartialArrayAddNullIfRequired() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'required' => true, 'placeholder' => [ 'year' => 'Empty year', @@ -460,7 +463,7 @@ public function testPassPlaceholderAsPartialArrayAddNullIfRequired() public function testPassHtml5TypeIfSingleTextAndHtml5Format() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', ]) ->createView(); @@ -470,7 +473,7 @@ public function testPassHtml5TypeIfSingleTextAndHtml5Format() public function testDontPassHtml5TypeIfHtml5NotAllowed() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', 'html5' => false, ]) @@ -481,7 +484,7 @@ public function testDontPassHtml5TypeIfHtml5NotAllowed() public function testDontPassHtml5TypeIfNotSingleText() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'text', ]) ->createView(); @@ -492,7 +495,7 @@ public function testDontPassHtml5TypeIfNotSingleText() public function testSingleTextWidgetWithSecondsShouldHaveRightStepAttribute() { $view = $this->factory - ->create(static::TESTED_TYPE, null, [ + ->create($this->getTestedType(), null, [ 'widget' => 'single_text', 'with_seconds' => true, ]) @@ -506,7 +509,7 @@ public function testSingleTextWidgetWithSecondsShouldHaveRightStepAttribute() public function testSingleTextWidgetWithSecondsShouldNotOverrideStepAttribute() { $view = $this->factory - ->create(static::TESTED_TYPE, null, [ + ->create($this->getTestedType(), null, [ 'widget' => 'single_text', 'with_seconds' => true, 'attr' => [ @@ -522,7 +525,7 @@ public function testSingleTextWidgetWithSecondsShouldNotOverrideStepAttribute() public function testSingleTextWidgetWithCustomNonHtml5Format() { - $form = $this->factory->create(static::TESTED_TYPE, new \DateTime('2019-02-13 19:12:13'), [ + $form = $this->factory->create($this->getTestedType(), new \DateTime('2019-02-13 19:12:13'), [ 'widget' => 'single_text', 'date_format' => \IntlDateFormatter::SHORT, 'format' => null, @@ -536,7 +539,7 @@ public function testSingleTextWidgetWithCustomNonHtml5Format() public function testDateTypeChoiceErrorsBubbleUp() { $error = new FormError('Invalid!'); - $form = $this->factory->create(static::TESTED_TYPE, null); + $form = $this->factory->create($this->getTestedType(), null); $form['date']->addError($error); @@ -547,7 +550,7 @@ public function testDateTypeChoiceErrorsBubbleUp() public function testDateTypeSingleTextErrorsBubbleUp() { $error = new FormError('Invalid!'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'date_widget' => 'single_text', ]); @@ -560,7 +563,7 @@ public function testDateTypeSingleTextErrorsBubbleUp() public function testTimeTypeChoiceErrorsBubbleUp() { $error = new FormError('Invalid!'); - $form = $this->factory->create(static::TESTED_TYPE, null); + $form = $this->factory->create($this->getTestedType(), null); $form['time']->addError($error); @@ -571,7 +574,7 @@ public function testTimeTypeChoiceErrorsBubbleUp() public function testTimeTypeSingleTextErrorsBubbleUp() { $error = new FormError('Invalid!'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'time_widget' => 'single_text', ]); @@ -583,7 +586,7 @@ public function testTimeTypeSingleTextErrorsBubbleUp() public function testPassDefaultChoiceTranslationDomain() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'with_seconds' => true, ]); @@ -599,7 +602,7 @@ public function testPassDefaultChoiceTranslationDomain() public function testPassChoiceTranslationDomainAsString() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'choice_translation_domain' => 'messages', 'with_seconds' => true, ]); @@ -615,7 +618,7 @@ public function testPassChoiceTranslationDomainAsString() public function testPassChoiceTranslationDomainAsArray() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'choice_translation_domain' => [ 'year' => 'foo', 'month' => 'test', @@ -645,7 +648,7 @@ public function testSubmitNull($expected = null, $norm = null, $view = null) public function testSubmitNullWithText() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'text', ]); $form->submit(null); @@ -661,7 +664,7 @@ public function testSubmitNullWithText() public function testSubmitNullWithSingleText() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', ]); $form->submit(null); @@ -673,7 +676,7 @@ public function testSubmitNullWithSingleText() public function testSubmitNullUsesDefaultEmptyData($emptyData = [], $expectedData = null) { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'empty_data' => $emptyData, ]); $form->submit(null); @@ -692,7 +695,7 @@ public function testSubmitNullUsesDefaultEmptyData($emptyData = [], $expectedDat */ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedData) { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => $widget, 'empty_data' => $emptyData, ]); @@ -725,7 +728,7 @@ public function provideEmptyData() public function testSubmitStringWithCustomInputFormat() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'string', 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 74e0a8d35524f..525f4fab2e0ef 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php @@ -40,7 +40,7 @@ protected function tearDown(): void public function testInvalidWidgetOption() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'widget' => 'fake_widget', ]); } @@ -48,14 +48,14 @@ public function testInvalidWidgetOption() public function testInvalidInputOption() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'input' => 'fake_input', ]); } public function testSubmitFromSingleTextDateTimeWithDefaultFormat() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'single_text', @@ -70,7 +70,7 @@ public function testSubmitFromSingleTextDateTimeWithDefaultFormat() public function testSubmitFromSingleTextDateTimeWithCustomFormat() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'single_text', @@ -92,7 +92,7 @@ public function testSubmitFromSingleTextDateTime() \Locale::setDefault('de_DE'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'format' => \IntlDateFormatter::MEDIUM, 'html5' => false, 'model_timezone' => 'UTC', @@ -114,7 +114,7 @@ public function testSubmitFromSingleTextDateTimeImmutable() \Locale::setDefault('de_DE'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'format' => \IntlDateFormatter::MEDIUM, 'html5' => false, 'model_timezone' => 'UTC', @@ -137,7 +137,7 @@ public function testSubmitFromSingleTextString() \Locale::setDefault('de_DE'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'format' => \IntlDateFormatter::MEDIUM, 'html5' => false, 'model_timezone' => 'UTC', @@ -159,7 +159,7 @@ public function testSubmitFromSingleTextTimestamp() \Locale::setDefault('de_DE'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'format' => \IntlDateFormatter::MEDIUM, 'html5' => false, 'model_timezone' => 'UTC', @@ -183,7 +183,7 @@ public function testSubmitFromSingleTextRaw() \Locale::setDefault('de_DE'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'format' => \IntlDateFormatter::MEDIUM, 'html5' => false, 'model_timezone' => 'UTC', @@ -217,7 +217,7 @@ public function testArrayDateWithReferenceDoesUseReferenceTimeOnZero() 'year' => '0', ]; - $form = $this->factory->create(static::TESTED_TYPE, $input, [ + $form = $this->factory->create($this->getTestedType(), $input, [ 'format' => \IntlDateFormatter::MEDIUM, 'html5' => false, 'model_timezone' => 'UTC', @@ -232,7 +232,7 @@ public function testArrayDateWithReferenceDoesUseReferenceTimeOnZero() public function testSubmitFromText() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'text', @@ -254,7 +254,7 @@ public function testSubmitFromText() public function testSubmitFromChoice() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'choice', @@ -277,7 +277,7 @@ public function testSubmitFromChoice() public function testSubmitFromChoiceEmpty() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'choice', @@ -298,7 +298,7 @@ public function testSubmitFromChoiceEmpty() public function testSubmitFromInputDateTimeDifferentPattern() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'format' => 'MM*yyyy*dd', @@ -315,7 +315,7 @@ public function testSubmitFromInputDateTimeDifferentPattern() public function testSubmitFromInputStringDifferentPattern() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'format' => 'MM*yyyy*dd', @@ -332,7 +332,7 @@ public function testSubmitFromInputStringDifferentPattern() public function testSubmitFromInputTimestampDifferentPattern() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'format' => 'MM*yyyy*dd', @@ -351,7 +351,7 @@ public function testSubmitFromInputTimestampDifferentPattern() public function testSubmitFromInputRawDifferentPattern() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'format' => 'MM*yyyy*dd', @@ -377,7 +377,7 @@ public function testSubmitFromInputRawDifferentPattern() */ public function testDatePatternWithFormatOption($format, $pattern) { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'format' => $format, ]) ->createView(); @@ -401,7 +401,7 @@ public function provideDateFormats() public function testThrowExceptionIfFormatIsNoPattern() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'format' => '0', 'html5' => false, 'widget' => 'single_text', @@ -413,7 +413,7 @@ public function testThrowExceptionIfFormatDoesNotContainYearMonthAndDay() { $this->expectException(InvalidOptionsException::class); $this->expectExceptionMessage('The "format" option should contain the letters "y", "M" and "d". Its current value is "yy".'); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'months' => [6, 7], 'format' => 'yy', ]); @@ -423,7 +423,7 @@ public function testThrowExceptionIfFormatMissesYearMonthAndDayWithSingleTextWid { $this->expectException(InvalidOptionsException::class); $this->expectExceptionMessage('The "format" option should contain the letters "y", "M" or "d". Its current value is "wrong".'); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', 'format' => 'wrong', 'html5' => false, @@ -433,7 +433,7 @@ public function testThrowExceptionIfFormatMissesYearMonthAndDayWithSingleTextWid public function testThrowExceptionIfFormatIsNoConstant() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'format' => 105, ]); } @@ -441,7 +441,7 @@ public function testThrowExceptionIfFormatIsNoConstant() public function testThrowExceptionIfFormatIsInvalid() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'format' => [], ]); } @@ -449,7 +449,7 @@ public function testThrowExceptionIfFormatIsInvalid() public function testThrowExceptionIfYearsIsInvalid() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'years' => 'bad value', ]); } @@ -457,7 +457,7 @@ public function testThrowExceptionIfYearsIsInvalid() public function testThrowExceptionIfMonthsIsInvalid() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'months' => 'bad value', ]); } @@ -465,7 +465,7 @@ public function testThrowExceptionIfMonthsIsInvalid() public function testThrowExceptionIfDaysIsInvalid() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'days' => 'bad value', ]); } @@ -477,7 +477,7 @@ public function testSetDataWithNegativeTimezoneOffsetStringInput() \Locale::setDefault('de_DE'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'format' => \IntlDateFormatter::MEDIUM, 'html5' => false, 'model_timezone' => 'UTC', @@ -500,7 +500,7 @@ public function testSetDataWithNegativeTimezoneOffsetDateTimeInput() \Locale::setDefault('de_DE'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'format' => \IntlDateFormatter::MEDIUM, 'html5' => false, 'model_timezone' => 'UTC', @@ -521,7 +521,7 @@ public function testSetDataWithNegativeTimezoneOffsetDateTimeInput() public function testYearsOption() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'years' => [2010, 2011], ]); @@ -536,7 +536,7 @@ public function testYearsOption() public function testMonthsOption() { \Locale::setDefault('en'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'months' => [6, 7], 'format' => \IntlDateFormatter::SHORT, ]); @@ -556,7 +556,7 @@ public function testMonthsOptionShortFormat() \Locale::setDefault('de_AT'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'months' => [1, 4], 'format' => 'dd.MMM.yy', ]); @@ -576,7 +576,7 @@ public function testMonthsOptionLongFormat() \Locale::setDefault('de_AT'); - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'months' => [1, 4], 'format' => 'dd.MMMM.yy', ]) @@ -595,7 +595,7 @@ public function testMonthsOptionLongFormatWithDifferentTimezone() \Locale::setDefault('de_AT'); - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'months' => [1, 4], 'format' => 'dd.MMMM.yy', ]) @@ -610,7 +610,7 @@ public function testMonthsOptionLongFormatWithDifferentTimezone() public function testIsDayWithinRangeReturnsTrueIfWithin() { \Locale::setDefault('en'); - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'days' => [6, 7], ]) ->createView(); @@ -623,7 +623,7 @@ public function testIsDayWithinRangeReturnsTrueIfWithin() public function testIsSynchronizedReturnsTrueIfChoiceAndCompletelyEmpty() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'choice', @@ -640,7 +640,7 @@ public function testIsSynchronizedReturnsTrueIfChoiceAndCompletelyEmpty() public function testIsSynchronizedReturnsTrueIfChoiceAndCompletelyFilled() { - $form = $this->factory->create(static::TESTED_TYPE, new \DateTime(), [ + $form = $this->factory->create($this->getTestedType(), new \DateTime(), [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'choice', @@ -657,7 +657,7 @@ public function testIsSynchronizedReturnsTrueIfChoiceAndCompletelyFilled() public function testIsSynchronizedReturnsFalseIfChoiceAndDayEmpty() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'choice', @@ -679,7 +679,7 @@ public function testPassDatePatternToView() \Locale::setDefault('de_AT'); - $view = $this->factory->create(static::TESTED_TYPE) + $view = $this->factory->create($this->getTestedType()) ->createView(); $this->assertSame('{{ day }}{{ month }}{{ year }}', $view->vars['date_pattern']); @@ -692,7 +692,7 @@ public function testPassDatePatternToViewDifferentFormat() \Locale::setDefault('de_AT'); - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'format' => \IntlDateFormatter::LONG, ]) ->createView(); @@ -702,7 +702,7 @@ public function testPassDatePatternToViewDifferentFormat() public function testPassDatePatternToViewDifferentPattern() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'format' => 'MMyyyydd', ]) ->createView(); @@ -712,7 +712,7 @@ public function testPassDatePatternToViewDifferentPattern() public function testPassDatePatternToViewDifferentPatternWithSeparators() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'format' => 'MM*yyyy*dd', ]) ->createView(); @@ -722,7 +722,7 @@ public function testPassDatePatternToViewDifferentPatternWithSeparators() public function testDontPassDatePatternIfText() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', ]) ->createView(); @@ -737,7 +737,7 @@ public function testDatePatternFormatWithQuotedStrings() \Locale::setDefault('es_ES'); - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ // EEEE, d 'de' MMMM 'de' y 'format' => \IntlDateFormatter::FULL, ]) @@ -748,7 +748,7 @@ public function testDatePatternFormatWithQuotedStrings() public function testPassWidgetToView() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', ]) ->createView(); @@ -760,12 +760,12 @@ public function testInitializeWithDateTime() { // Throws an exception if "data_class" option is not explicitly set // to null in the type - $this->assertInstanceOf(FormInterface::class, $this->factory->create(static::TESTED_TYPE, new \DateTime())); + $this->assertInstanceOf(FormInterface::class, $this->factory->create($this->getTestedType(), new \DateTime())); } public function testSingleTextWidgetShouldUseTheRightInputType() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', ]) ->createView(); @@ -775,7 +775,7 @@ public function testSingleTextWidgetShouldUseTheRightInputType() public function testPassDefaultPlaceholderToViewIfNotRequired() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'required' => false, ]) ->createView(); @@ -787,7 +787,7 @@ public function testPassDefaultPlaceholderToViewIfNotRequired() public function testPassNoPlaceholderToViewIfRequired() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'required' => true, ]) ->createView(); @@ -799,7 +799,7 @@ public function testPassNoPlaceholderToViewIfRequired() public function testPassPlaceholderAsString() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'placeholder' => 'Empty', ]) ->createView(); @@ -811,7 +811,7 @@ public function testPassPlaceholderAsString() public function testPassPlaceholderAsArray() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'placeholder' => [ 'year' => 'Empty year', 'month' => 'Empty month', @@ -827,7 +827,7 @@ public function testPassPlaceholderAsArray() public function testPassPlaceholderAsPartialArrayAddEmptyIfNotRequired() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'required' => false, 'placeholder' => [ 'year' => 'Empty year', @@ -843,7 +843,7 @@ public function testPassPlaceholderAsPartialArrayAddEmptyIfNotRequired() public function testPassPlaceholderAsPartialArrayAddNullIfRequired() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'required' => true, 'placeholder' => [ 'year' => 'Empty year', @@ -859,7 +859,7 @@ public function testPassPlaceholderAsPartialArrayAddNullIfRequired() public function testPassHtml5TypeIfSingleTextAndHtml5Format() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', ]) ->createView(); @@ -869,7 +869,7 @@ public function testPassHtml5TypeIfSingleTextAndHtml5Format() public function testDontPassHtml5TypeIfHtml5NotAllowed() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', 'html5' => false, ]) @@ -880,7 +880,7 @@ public function testDontPassHtml5TypeIfHtml5NotAllowed() public function testDontPassHtml5TypeIfNotHtml5Format() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', 'format' => \IntlDateFormatter::MEDIUM, 'html5' => false, @@ -892,7 +892,7 @@ public function testDontPassHtml5TypeIfNotHtml5Format() public function testDontPassHtml5TypeIfNotSingleText() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'text', ]) ->createView(); @@ -914,7 +914,7 @@ public function provideCompoundWidgets() public function testYearErrorsBubbleUp($widget) { $error = new FormError('Invalid!'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => $widget, ]); $form['year']->addError($error); @@ -929,7 +929,7 @@ public function testYearErrorsBubbleUp($widget) public function testMonthErrorsBubbleUp($widget) { $error = new FormError('Invalid!'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => $widget, ]); $form['month']->addError($error); @@ -944,7 +944,7 @@ public function testMonthErrorsBubbleUp($widget) public function testDayErrorsBubbleUp($widget) { $error = new FormError('Invalid!'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => $widget, ]); $form['day']->addError($error); @@ -955,7 +955,7 @@ public function testDayErrorsBubbleUp($widget) public function testYears() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'years' => [1900, 2000, 2040], ]) ->createView(); @@ -970,7 +970,7 @@ public function testYears() public function testPassDefaultChoiceTranslationDomain() { - $form = $this->factory->create(static::TESTED_TYPE); + $form = $this->factory->create($this->getTestedType()); $view = $form->createView(); $this->assertFalse($view['year']->vars['choice_translation_domain']); @@ -980,7 +980,7 @@ public function testPassDefaultChoiceTranslationDomain() public function testPassChoiceTranslationDomainAsString() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'choice_translation_domain' => 'messages', ]); @@ -992,7 +992,7 @@ public function testPassChoiceTranslationDomainAsString() public function testPassChoiceTranslationDomainAsArray() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'choice_translation_domain' => [ 'year' => 'foo', 'day' => 'test', @@ -1012,7 +1012,7 @@ public function testSubmitNull($expected = null, $norm = null, $view = null) public function testSubmitNullWithSingleText() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', ]); $form->submit(null); @@ -1024,7 +1024,7 @@ public function testSubmitNullWithSingleText() public function testSubmitNullUsesDefaultEmptyData($emptyData = [], $expectedData = null) { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'empty_data' => $emptyData, ]); $form->submit(null); @@ -1040,7 +1040,7 @@ public function testSubmitNullUsesDefaultEmptyData($emptyData = [], $expectedDat */ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedData) { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => $widget, 'empty_data' => $emptyData, ]); @@ -1073,7 +1073,7 @@ public function provideEmptyData() public function testSubmitStringWithCustomInputFormat() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'single_text', diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/EnumTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/EnumTypeTest.php index 9eb89442ea6a3..74656cd571b0e 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/EnumTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/EnumTypeTest.php @@ -22,6 +22,9 @@ class EnumTypeTest extends BaseTypeTest { public const TESTED_TYPE = EnumType::class; + public const TESTED_TYPE_OPTIONS = [ + 'class' => Suit::class, + ]; public function testClassOptionIsRequired() { @@ -119,7 +122,7 @@ public function testSubmitSingleNonExpandedInvalidChoice() public function testSubmitNull($expected = null, $norm = null, $view = null) { - $form = $this->factory->create($this->getTestedType(), null, $this->getTestOptions()); + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions()); $form->submit(null); @@ -256,9 +259,4 @@ public function testChoiceLabel() $this->assertSame('Yes', $view->children[0]->vars['label']); } - - protected function getTestOptions(): array - { - return ['class' => Suit::class]; - } } 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 3701b653f855e..c5f9f8d9a0ab0 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/FormTypeTest.php @@ -68,23 +68,23 @@ class FormTypeTest extends BaseTypeTest public function testCreateFormInstances() { - $this->assertInstanceOf(Form::class, $this->factory->create(static::TESTED_TYPE)); + $this->assertInstanceOf(Form::class, $this->factory->create($this->getTestedType())); } public function testPassRequiredAsOption() { - $form = $this->factory->create(static::TESTED_TYPE, null, ['required' => false]); + $form = $this->factory->create($this->getTestedType(), null, ['required' => false]); $this->assertFalse($form->isRequired()); - $form = $this->factory->create(static::TESTED_TYPE, null, ['required' => true]); + $form = $this->factory->create($this->getTestedType(), null, ['required' => true]); $this->assertTrue($form->isRequired()); } public function testSubmittedDataIsTrimmedBeforeTransforming() { - $form = $this->factory->createBuilder(static::TESTED_TYPE) + $form = $this->factory->createBuilder($this->getTestedType()) ->addViewTransformer(new FixedDataTransformer([ '' => '', 'reverse[a]' => 'a', @@ -100,7 +100,7 @@ public function testSubmittedDataIsTrimmedBeforeTransforming() public function testSubmittedDataIsNotTrimmedBeforeTransformingIfNoTrimming() { - $form = $this->factory->createBuilder(static::TESTED_TYPE, null, ['trim' => false]) + $form = $this->factory->createBuilder($this->getTestedType(), null, ['trim' => false]) ->addViewTransformer(new FixedDataTransformer([ '' => '', 'reverse[ a ]' => ' a ', @@ -116,8 +116,8 @@ public function testSubmittedDataIsNotTrimmedBeforeTransformingIfNoTrimming() public function testNonReadOnlyFormWithReadOnlyParentIsReadOnly() { - $view = $this->factory->createNamedBuilder('parent', static::TESTED_TYPE, null, ['attr' => ['readonly' => true]]) - ->add('child', static::TESTED_TYPE) + $view = $this->factory->createNamedBuilder('parent', $this->getTestedType(), null, ['attr' => ['readonly' => true]]) + ->add('child', $this->getTestedType()) ->getForm() ->createView(); @@ -126,8 +126,8 @@ public function testNonReadOnlyFormWithReadOnlyParentIsReadOnly() public function testReadOnlyFormWithNonReadOnlyParentIsReadOnly() { - $view = $this->factory->createNamedBuilder('parent', static::TESTED_TYPE) - ->add('child', static::TESTED_TYPE, ['attr' => ['readonly' => true]]) + $view = $this->factory->createNamedBuilder('parent', $this->getTestedType()) + ->add('child', $this->getTestedType(), ['attr' => ['readonly' => true]]) ->getForm() ->createView(); @@ -136,8 +136,8 @@ public function testReadOnlyFormWithNonReadOnlyParentIsReadOnly() public function testNonReadOnlyFormWithNonReadOnlyParentIsNotReadOnly() { - $view = $this->factory->createNamedBuilder('parent', static::TESTED_TYPE) - ->add('child', static::TESTED_TYPE) + $view = $this->factory->createNamedBuilder('parent', $this->getTestedType()) + ->add('child', $this->getTestedType()) ->getForm() ->createView(); @@ -146,7 +146,7 @@ public function testNonReadOnlyFormWithNonReadOnlyParentIsNotReadOnly() public function testPassMaxLengthToView() { - $view = $this->factory->create(static::TESTED_TYPE, null, ['attr' => ['maxlength' => 10]]) + $view = $this->factory->create($this->getTestedType(), null, ['attr' => ['maxlength' => 10]]) ->createView(); $this->assertSame(10, $view->vars['attr']['maxlength']); @@ -155,7 +155,7 @@ public function testPassMaxLengthToView() public function testDataClassMayBeNull() { $this->assertInstanceOf( - FormBuilderInterface::class, $this->factory->createBuilder(static::TESTED_TYPE, null, [ + FormBuilderInterface::class, $this->factory->createBuilder($this->getTestedType(), null, [ 'data_class' => null, ])); } @@ -163,7 +163,7 @@ public function testDataClassMayBeNull() public function testDataClassMayBeAbstractClass() { $this->assertInstanceOf( - FormBuilderInterface::class, $this->factory->createBuilder(static::TESTED_TYPE, null, [ + FormBuilderInterface::class, $this->factory->createBuilder($this->getTestedType(), null, [ 'data_class' => 'Symfony\Component\Form\Tests\Fixtures\AbstractAuthor', ])); } @@ -171,7 +171,7 @@ public function testDataClassMayBeAbstractClass() public function testDataClassMayBeInterface() { $this->assertInstanceOf( - FormBuilderInterface::class, $this->factory->createBuilder(static::TESTED_TYPE, null, [ + FormBuilderInterface::class, $this->factory->createBuilder($this->getTestedType(), null, [ 'data_class' => 'Symfony\Component\Form\Tests\Fixtures\AuthorInterface', ])); } @@ -179,7 +179,7 @@ public function testDataClassMayBeInterface() public function testDataClassMustBeValidClassOrInterface() { $this->expectException(InvalidArgumentException::class); - $this->factory->createBuilder(static::TESTED_TYPE, null, [ + $this->factory->createBuilder($this->getTestedType(), null, [ 'data_class' => 'foobar', ]); } @@ -191,12 +191,16 @@ public function testSubmitNullUsesDefaultEmptyData($emptyData = [], $expectedDat public function testSubmitWithEmptyDataCreatesObjectIfClassAvailable() { - $form = $this->factory->createBuilder(static::TESTED_TYPE, null, [ + $form = $this->factory->createBuilder($this->getTestedType(), null, [ 'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author', 'required' => false, ]) - ->add('firstName', TextTypeTest::TESTED_TYPE) - ->add('lastName', TextTypeTest::TESTED_TYPE) + ->add('firstName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) + ->add('lastName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) ->getForm(); $this->assertNull($form->getData()); @@ -214,13 +218,17 @@ public function testSubmitWithEmptyDataCreatesObjectIfClassAvailable() public function testSubmitWithDefaultDataDontCreateObject() { $defaultAuthor = new Author(); - $form = $this->factory->createBuilder(static::TESTED_TYPE, null, [ + $form = $this->factory->createBuilder($this->getTestedType(), null, [ // data class is inferred from the passed object 'data' => $defaultAuthor, 'required' => false, ]) - ->add('firstName', TextTypeTest::TESTED_TYPE) - ->add('lastName', TextTypeTest::TESTED_TYPE) + ->add('firstName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) + ->add('lastName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) ->getForm(); // partially empty @@ -236,11 +244,13 @@ public function testSubmitWithDefaultDataDontCreateObject() public function testSubmitWithEmptyDataCreatesArrayIfDataClassIsNull() { - $form = $this->factory->createBuilder(static::TESTED_TYPE, null, [ + $form = $this->factory->createBuilder($this->getTestedType(), null, [ 'data_class' => null, 'required' => false, ]) - ->add('firstName', TextTypeTest::TESTED_TYPE) + ->add('firstName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) ->getForm(); $this->assertNull($form->getData()); @@ -252,12 +262,16 @@ public function testSubmitWithEmptyDataCreatesArrayIfDataClassIsNull() public function testSubmitEmptyWithEmptyDataDontCreateObjectIfNotRequired() { - $form = $this->factory->createBuilder(static::TESTED_TYPE, null, [ + $form = $this->factory->createBuilder($this->getTestedType(), null, [ 'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author', 'required' => false, ]) - ->add('firstName', TextTypeTest::TESTED_TYPE) - ->add('lastName', TextTypeTest::TESTED_TYPE) + ->add('firstName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) + ->add('lastName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) ->getForm(); $this->assertNull($form->getData()); @@ -269,12 +283,16 @@ public function testSubmitEmptyWithEmptyDataDontCreateObjectIfNotRequired() public function testSubmitEmptyWithEmptyDataCreatesObjectIfRequired() { - $form = $this->factory->createBuilder(static::TESTED_TYPE, null, [ + $form = $this->factory->createBuilder($this->getTestedType(), null, [ 'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author', 'required' => true, ]) - ->add('firstName', TextTypeTest::TESTED_TYPE) - ->add('lastName', TextTypeTest::TESTED_TYPE) + ->add('firstName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) + ->add('lastName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) ->getForm(); $this->assertNull($form->getData()); @@ -289,8 +307,10 @@ public function testSubmitEmptyWithEmptyDataCreatesObjectIfRequired() */ public function testSubmitWithEmptyDataStoresArrayIfNoClassAvailable() { - $form = $this->factory->createBuilder(static::TESTED_TYPE) - ->add('firstName', TextTypeTest::TESTED_TYPE) + $form = $this->factory->createBuilder($this->getTestedType()) + ->add('firstName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) ->getForm(); $this->assertNull($form->getData()); @@ -302,7 +322,7 @@ public function testSubmitWithEmptyDataStoresArrayIfNoClassAvailable() public function testSubmitWithEmptyDataPassesEmptyStringToTransformerIfNotCompound() { - $form = $this->factory->createBuilder(static::TESTED_TYPE) + $form = $this->factory->createBuilder($this->getTestedType()) ->addViewTransformer(new FixedDataTransformer([ // required for the initial, internal setData(null) '' => 'null', @@ -327,11 +347,13 @@ public function testSubmitWithEmptyDataUsesEmptyDataOption() { $author = new Author(); - $form = $this->factory->createBuilder(static::TESTED_TYPE, null, [ + $form = $this->factory->createBuilder($this->getTestedType(), null, [ 'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author', 'empty_data' => $author, ]) - ->add('firstName', TextTypeTest::TESTED_TYPE) + ->add('firstName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) ->getForm(); $this->assertNull($form->getData()); @@ -346,18 +368,18 @@ public function testSubmitWithEmptyDataUsesEmptyDataOption() public function testAttributesException() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, ['attr' => '']); + $this->factory->create($this->getTestedType(), null, ['attr' => '']); } public function testActionCannotBeNull() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, ['action' => null]); + $this->factory->create($this->getTestedType(), null, ['action' => null]); } public function testNameCanBeEmptyString() { - $form = $this->factory->createNamed('', static::TESTED_TYPE); + $form = $this->factory->createNamed('', $this->getTestedType()); $this->assertEquals('', $form->getName()); } @@ -366,11 +388,13 @@ public function testSubformDoesntCallSettersForReferences() { $author = new FormTest_AuthorWithoutRefSetter(new Author()); - $builder = $this->factory->createBuilder(static::TESTED_TYPE, $author); - $builder->add('reference', static::TESTED_TYPE, [ + $builder = $this->factory->createBuilder($this->getTestedType(), $author); + $builder->add('reference', $this->getTestedType(), [ 'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author', ]); - $builder->get('reference')->add('firstName', TextTypeTest::TESTED_TYPE); + $builder->get('reference')->add('firstName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]); $form = $builder->getForm(); $form->submit([ @@ -389,11 +413,13 @@ public function testSubformCallsSettersIfTheObjectChanged() $author = new FormTest_AuthorWithoutRefSetter(null); $newReference = new Author(); - $builder = $this->factory->createBuilder(static::TESTED_TYPE, $author); - $builder->add('referenceCopy', static::TESTED_TYPE, [ + $builder = $this->factory->createBuilder($this->getTestedType(), $author); + $builder->add('referenceCopy', $this->getTestedType(), [ 'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author', ]); - $builder->get('referenceCopy')->add('firstName', TextTypeTest::TESTED_TYPE); + $builder->get('referenceCopy')->add('firstName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]); $form = $builder->getForm(); $form['referenceCopy']->setData($newReference); // new author object @@ -412,12 +438,14 @@ public function testSubformCallsSettersIfByReferenceIsFalse() { $author = new FormTest_AuthorWithoutRefSetter(new Author()); - $builder = $this->factory->createBuilder(static::TESTED_TYPE, $author); - $builder->add('referenceCopy', static::TESTED_TYPE, [ + $builder = $this->factory->createBuilder($this->getTestedType(), $author); + $builder->add('referenceCopy', $this->getTestedType(), [ 'data_class' => 'Symfony\Component\Form\Tests\Fixtures\Author', 'by_reference' => false, ]); - $builder->get('referenceCopy')->add('firstName', TextTypeTest::TESTED_TYPE); + $builder->get('referenceCopy')->add('firstName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]); $form = $builder->getForm(); $form->submit([ @@ -435,8 +463,8 @@ public function testSubformCallsSettersIfReferenceIsScalar() { $author = new FormTest_AuthorWithoutRefSetter('scalar'); - $builder = $this->factory->createBuilder(static::TESTED_TYPE, $author); - $builder->add('referenceCopy', static::TESTED_TYPE); + $builder = $this->factory->createBuilder($this->getTestedType(), $author); + $builder->add('referenceCopy', $this->getTestedType()); $builder->get('referenceCopy')->addViewTransformer(new CallbackTransformer( function () {}, function ($value) { // reverseTransform @@ -459,9 +487,9 @@ public function testSubformAlwaysInsertsIntoArrays() $ref2 = new Author(); $author = ['referenceCopy' => $ref1]; - $builder = $this->factory->createBuilder(static::TESTED_TYPE); + $builder = $this->factory->createBuilder($this->getTestedType()); $builder->setData($author); - $builder->add('referenceCopy', static::TESTED_TYPE); + $builder->add('referenceCopy', $this->getTestedType()); $builder->get('referenceCopy')->addViewTransformer(new CallbackTransformer( function () {}, function ($value) use ($ref2) { // reverseTransform @@ -481,9 +509,13 @@ function ($value) use ($ref2) { // reverseTransform public function testPassMultipartTrueIfAnyChildIsMultipartToView() { - $view = $this->factory->createBuilder(static::TESTED_TYPE) - ->add('foo', TextTypeTest::TESTED_TYPE) - ->add('bar', FileTypeTest::TESTED_TYPE) + $view = $this->factory->createBuilder($this->getTestedType()) + ->add('foo', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) + ->add('bar', FileTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) ->getForm() ->createView(); @@ -492,8 +524,8 @@ public function testPassMultipartTrueIfAnyChildIsMultipartToView() public function testViewIsNotRenderedByDefault() { - $view = $this->factory->createBuilder(static::TESTED_TYPE) - ->add('foo', static::TESTED_TYPE) + $view = $this->factory->createBuilder($this->getTestedType()) + ->add('foo', $this->getTestedType()) ->getForm() ->createView(); @@ -502,14 +534,14 @@ public function testViewIsNotRenderedByDefault() public function testErrorBubblingIfCompound() { - $form = $this->factory->create(static::TESTED_TYPE); + $form = $this->factory->create($this->getTestedType()); $this->assertTrue($form->getConfig()->getErrorBubbling()); } public function testNoErrorBubblingIfNotCompound() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'compound' => false, ]); @@ -518,7 +550,7 @@ public function testNoErrorBubblingIfNotCompound() public function testOverrideErrorBubbling() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'compound' => false, 'error_bubbling' => true, ]); @@ -528,7 +560,7 @@ public function testOverrideErrorBubbling() public function testErrorBubblingForCompoundFieldsIsDisabledByDefaultIfInheritDataIsEnabled() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'compound' => true, 'inherit_data' => true, ]); @@ -538,7 +570,7 @@ public function testErrorBubblingForCompoundFieldsIsDisabledByDefaultIfInheritDa public function testPropertyPath() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'property_path' => 'foo', ]); @@ -548,7 +580,7 @@ public function testPropertyPath() public function testPropertyPathNullImpliesDefault() { - $form = $this->factory->createNamed('name', static::TESTED_TYPE, null, [ + $form = $this->factory->createNamed('name', $this->getTestedType(), null, [ 'property_path' => null, ]); @@ -558,7 +590,7 @@ public function testPropertyPathNullImpliesDefault() public function testNotMapped() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'property_path' => 'foo', 'mapped' => false, ]); @@ -569,7 +601,7 @@ public function testNotMapped() public function testViewValidNotSubmitted() { - $view = $this->factory->create(static::TESTED_TYPE) + $view = $this->factory->create($this->getTestedType()) ->createView(); $this->assertTrue($view->vars['valid']); @@ -577,7 +609,7 @@ public function testViewValidNotSubmitted() public function testViewNotValidSubmitted() { - $form = $this->factory->create(static::TESTED_TYPE); + $form = $this->factory->create($this->getTestedType()); $form->submit([]); $form->addError(new FormError('An error')); @@ -586,7 +618,7 @@ public function testViewNotValidSubmitted() public function testViewSubmittedNotSubmitted() { - $view = $this->factory->create(static::TESTED_TYPE) + $view = $this->factory->create($this->getTestedType()) ->createView(); $this->assertFalse($view->vars['submitted']); @@ -594,7 +626,7 @@ public function testViewSubmittedNotSubmitted() public function testViewSubmittedSubmitted() { - $form = $this->factory->create(static::TESTED_TYPE); + $form = $this->factory->create($this->getTestedType()); $form->submit([]); $this->assertTrue($form->createView()->vars['submitted']); @@ -602,7 +634,7 @@ public function testViewSubmittedSubmitted() public function testDataOptionSupersedesSetDataCalls() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'data' => 'default', 'compound' => false, ]); @@ -614,7 +646,7 @@ public function testDataOptionSupersedesSetDataCalls() public function testPassedDataSupersedesSetDataCalls() { - $form = $this->factory->create(static::TESTED_TYPE, 'default', [ + $form = $this->factory->create($this->getTestedType(), 'default', [ 'compound' => false, ]); @@ -625,7 +657,7 @@ public function testPassedDataSupersedesSetDataCalls() public function testDataOptionSupersedesSetDataCallsIfNull() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'data' => null, 'compound' => false, ]); @@ -637,7 +669,7 @@ public function testDataOptionSupersedesSetDataCallsIfNull() public function testNormDataIsPassedToView() { - $view = $this->factory->createBuilder(static::TESTED_TYPE) + $view = $this->factory->createBuilder($this->getTestedType()) ->addModelTransformer(new FixedDataTransformer([ 'foo' => 'bar', ])) @@ -662,7 +694,9 @@ public function testDataMapperTransformationFailedExceptionInvalidMessageIsUsed( $builder = $factory ->createBuilder(FormType::class, $money, ['invalid_message' => 'not the one to display']) - ->add('amount', TextType::class) + ->add('amount', TextType::class, [ + 'empty_data' => null, + ]) ->add('currency', CurrencyType::class) ; $builder->setDataMapper(new MoneyDataMapper()); @@ -681,7 +715,7 @@ public function testDataMapperTransformationFailedExceptionInvalidMessageIsUsed( // https://github.com/symfony/symfony/issues/6862 public function testPassZeroLabelToView() { - $view = $this->factory->create(static::TESTED_TYPE, null, [ + $view = $this->factory->create($this->getTestedType(), null, [ 'label' => '0', ]) ->createView(); @@ -696,7 +730,7 @@ public function testSubmitNull($expected = null, $norm = null, $view = null) public function testPassBlockPrefixToViewWithParent() { - $view = $this->factory->createNamedBuilder('parent', static::TESTED_TYPE) + $view = $this->factory->createNamedBuilder('parent', $this->getTestedType()) ->add('child', $this->getTestedType(), [ 'block_prefix' => 'child', ]) @@ -840,12 +874,27 @@ public function testFormAttrAsStringWithNoId() public function testSortingViewChildrenBasedOnPriorityOption() { $view = $this->factory->createNamedBuilder('parent', self::TESTED_TYPE) - ->add('child1', null, ['priority' => -1]) - ->add('child2') - ->add('child3', null, ['priority' => -1]) - ->add('child4') - ->add('child5', null, ['priority' => 1]) - ->add('child6') + ->add('child1', null, [ + 'empty_data' => null, + 'priority' => -1, + ]) + ->add('child2', null, [ + 'empty_data' => null, + ]) + ->add('child3', null, [ + 'empty_data' => null, + 'priority' => -1, + ]) + ->add('child4', null, [ + 'empty_data' => null, + ]) + ->add('child5', null, [ + 'empty_data' => null, + 'priority' => 1, + ]) + ->add('child6', null, [ + 'empty_data' => null, + ]) ->getForm() ->createView(); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php index 29756f17b9abc..e6616d4631466 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/PasswordTypeTest.php @@ -14,10 +14,13 @@ class PasswordTypeTest extends BaseTypeTest { public const TESTED_TYPE = 'Symfony\Component\Form\Extension\Core\Type\PasswordType'; + public const TESTED_TYPE_OPTIONS = [ + 'empty_data' => null, + ]; public function testEmptyIfNotSubmitted() { - $form = $this->factory->create(static::TESTED_TYPE); + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions()); $form->setData('pAs5w0rd'); $this->assertSame('', $form->createView()->vars['value']); @@ -25,7 +28,7 @@ public function testEmptyIfNotSubmitted() public function testEmptyIfSubmitted() { - $form = $this->factory->create(static::TESTED_TYPE); + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions()); $form->submit('pAs5w0rd'); $this->assertSame('', $form->createView()->vars['value']); @@ -33,7 +36,9 @@ public function testEmptyIfSubmitted() public function testNotEmptyIfSubmittedAndNotAlwaysEmpty() { - $form = $this->factory->create(static::TESTED_TYPE, null, ['always_empty' => false]); + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ + 'always_empty' => false, + ]); $form->submit('pAs5w0rd'); $this->assertSame('pAs5w0rd', $form->createView()->vars['value']); @@ -41,7 +46,7 @@ public function testNotEmptyIfSubmittedAndNotAlwaysEmpty() public function testNotTrimmed() { - $form = $this->factory->create(static::TESTED_TYPE, null); + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions()); $form->submit(' pAs5w0rd '); $this->assertSame(' pAs5w0rd ', $form->getData()); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/RepeatedTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/RepeatedTypeTest.php index 60d565787699a..6587e9893aa99 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/RepeatedTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/RepeatedTypeTest.php @@ -18,6 +18,11 @@ class RepeatedTypeTest extends BaseTypeTest { public const TESTED_TYPE = 'Symfony\Component\Form\Extension\Core\Type\RepeatedType'; + public const TESTED_TYPE_OPTIONS = [ + 'type' => TextTypeTest::TESTED_TYPE, + 'first_options' => ['empty_data' => null], + 'second_options' => ['empty_data' => null], + ]; /** * @var Form @@ -28,9 +33,7 @@ protected function setUp(): void { parent::setUp(); - $this->form = $this->factory->create(static::TESTED_TYPE, null, [ - 'type' => TextTypeTest::TESTED_TYPE, - ]); + $this->form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions()); } public function testSetData() @@ -43,8 +46,7 @@ public function testSetData() public function testSetOptions() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'type' => TextTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'options' => ['label' => 'Global'], ]); @@ -56,11 +58,18 @@ public function testSetOptions() public function testSetOptionsPerChild() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ // the global required value cannot be overridden 'type' => TextTypeTest::TESTED_TYPE, - 'first_options' => ['label' => 'Test', 'required' => false], - 'second_options' => ['label' => 'Test2'], + 'first_options' => [ + 'empty_data' => null, + 'label' => 'Test', + 'required' => false, + ], + 'second_options' => [ + 'empty_data' => null, + 'label' => 'Test2', + ], ]); $this->assertSame('Test', $form['first']->getConfig()->getOption('label')); @@ -71,9 +80,8 @@ public function testSetOptionsPerChild() public function testSetRequired() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'required' => false, - 'type' => TextTypeTest::TESTED_TYPE, ]); $this->assertFalse($form['first']->isRequired()); @@ -85,8 +93,10 @@ public function testMappedOverridesDefault() $form = $this->factory->create(NotMappedType::class); $this->assertFalse($form->getConfig()->getMapped()); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'type' => NotMappedType::class, + 'first_options' => ['empty_data' => null], + 'second_options' => ['empty_data' => null], ]); $this->assertTrue($form['first']->getConfig()->getMapped()); @@ -98,8 +108,7 @@ public function testMappedOverridesDefault() */ public function testNotMappedInnerIsOverridden($configurationKey) { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'type' => TextTypeTest::TESTED_TYPE, + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ $configurationKey => ['mapped' => false], ]); @@ -118,8 +127,7 @@ public function notMappedConfigurationKeys() public function testSetInvalidOptions() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ - 'type' => TextTypeTest::TESTED_TYPE, + $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'options' => 'bad value', ]); } @@ -127,7 +135,7 @@ public function testSetInvalidOptions() public function testSetInvalidFirstOptions() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'type' => TextTypeTest::TESTED_TYPE, 'first_options' => 'bad value', ]); @@ -136,7 +144,7 @@ public function testSetInvalidFirstOptions() public function testSetInvalidSecondOptions() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'type' => TextTypeTest::TESTED_TYPE, 'second_options' => 'bad value', ]); @@ -144,7 +152,7 @@ public function testSetInvalidSecondOptions() public function testSetErrorBubblingToTrue() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'error_bubbling' => true, ]); @@ -155,7 +163,7 @@ public function testSetErrorBubblingToTrue() public function testSetErrorBubblingToFalse() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'error_bubbling' => false, ]); @@ -166,11 +174,16 @@ public function testSetErrorBubblingToFalse() public function testSetErrorBubblingIndividually() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'error_bubbling' => true, - 'options' => ['error_bubbling' => false], - 'second_options' => ['error_bubbling' => true], - ]); + 'options' => [ + 'error_bubbling' => false, + ], + 'second_options' => [ + 'empty_data' => null, + 'error_bubbling' => true, + ], + ] + $this->getTestedTypeOptions()); $this->assertTrue($form->getConfig()->getOption('error_bubbling')); $this->assertFalse($form['first']->getConfig()->getOption('error_bubbling')); @@ -179,11 +192,15 @@ public function testSetErrorBubblingIndividually() public function testSetOptionsPerChildAndOverwrite() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ - 'type' => TextTypeTest::TESTED_TYPE, - 'options' => ['label' => 'Label'], - 'second_options' => ['label' => 'Second label'], - ]); + $form = $this->factory->create($this->getTestedType(), null, [ + 'options' => [ + 'label' => 'Label', + ], + 'second_options' => [ + 'empty_data' => null, + 'label' => 'Second label', + ], + ] + $this->getTestedTypeOptions()); $this->assertSame('Label', $form['first']->getConfig()->getOption('label')); $this->assertSame('Second label', $form['second']->getConfig()->getOption('label')); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TextTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TextTypeTest.php index 3f8fbe7725ffc..20af6abfb0acf 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TextTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TextTypeTest.php @@ -11,9 +11,16 @@ namespace Symfony\Component\Form\Tests\Extension\Core\Type; +use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; + class TextTypeTest extends BaseTypeTest { + use ExpectDeprecationTrait; + public const TESTED_TYPE = 'Symfony\Component\Form\Extension\Core\Type\TextType'; + public const TESTED_TYPE_OPTIONS = [ + 'empty_data' => null, + ]; public function testSubmitNull($expected = null, $norm = null, $view = null) { @@ -22,7 +29,7 @@ public function testSubmitNull($expected = null, $norm = null, $view = null) public function testSubmitNullReturnsNullWithEmptyDataAsString() { - $form = $this->factory->create(static::TESTED_TYPE, 'name', [ + $form = $this->factory->create(static::TESTED_TYPE, null, [ 'empty_data' => '', ]); @@ -32,6 +39,21 @@ public function testSubmitNullReturnsNullWithEmptyDataAsString() $this->assertSame('', $form->getViewData()); } + /** + * @group legacy + */ + public function testDefaultEmptyDataCallback() + { + $this->expectDeprecation('Since symfony/form 6.1: The default value of "empty_data" option in "Symfony\Component\Form\Extension\Core\Type\TextType" will be changed to empty string. Declare "NULL" as value for "empty_data" if you still want use "NULL" as data.'); + + $form = $this->factory->create(static::TESTED_TYPE); + + $form->submit(null); + $this->assertNull($form->getData()); + $this->assertNull($form->getNormData()); + $this->assertSame('', $form->getViewData()); + } + public function provideZeros() { return [ @@ -48,7 +70,7 @@ public function provideZeros() */ public function testSetDataThroughParamsWithZero($data, $dataAsString) { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create(static::TESTED_TYPE, null, $this->getTestedTypeOptions() + [ 'data' => $data, ]); $view = $form->createView(); 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 08284dbbf00e7..b08e6d527eca6 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php @@ -21,10 +21,13 @@ class TimeTypeTest extends BaseTypeTest { public const TESTED_TYPE = 'Symfony\Component\Form\Extension\Core\Type\TimeType'; + public const TESTED_TYPE_OPTIONS = [ + 'empty_data' => null, + ]; public function testSubmitDateTime() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'datetime', @@ -45,7 +48,7 @@ public function testSubmitDateTime() public function testSubmitDateTimeImmutable() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'datetime_immutable', @@ -67,7 +70,7 @@ public function testSubmitDateTimeImmutable() public function testSubmitString() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'string', @@ -86,7 +89,7 @@ public function testSubmitString() public function testSubmitStringWithCustomFormat() { - $form = $this->factory->create(static::TESTED_TYPE, '11:33', [ + $form = $this->factory->create($this->getTestedType(), '11:33', [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'widget' => 'single_text', @@ -102,7 +105,7 @@ public function testSubmitStringWithCustomFormat() public function testSubmitTimestamp() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'timestamp', @@ -123,7 +126,7 @@ public function testSubmitTimestamp() public function testSubmitArray() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'array', @@ -142,7 +145,7 @@ public function testSubmitArray() public function testSubmitDatetimeSingleText() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'datetime', @@ -157,7 +160,7 @@ public function testSubmitDatetimeSingleText() public function testSubmitDatetimeSingleTextWithoutMinutes() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'datetime', @@ -173,7 +176,7 @@ public function testSubmitDatetimeSingleTextWithoutMinutes() public function testSubmitArraySingleText() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'array', @@ -193,7 +196,7 @@ public function testSubmitArraySingleText() public function testSubmitArraySingleTextWithoutMinutes() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'array', @@ -213,7 +216,7 @@ public function testSubmitArraySingleTextWithoutMinutes() public function testSubmitArraySingleTextWithSeconds() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'array', @@ -235,7 +238,7 @@ public function testSubmitArraySingleTextWithSeconds() public function testSubmitStringSingleText() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'string', @@ -250,7 +253,7 @@ public function testSubmitStringSingleText() public function testSubmitStringSingleTextWithoutMinutes() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'string', @@ -266,7 +269,7 @@ public function testSubmitStringSingleTextWithoutMinutes() public function testSubmitWithSecondsAndBrowserOmissionSeconds() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'string', @@ -352,7 +355,7 @@ public function testPreSetDataDifferentTimezonesDuringDaylightSavingTimeUsingSin public function testSubmitDifferentTimezones() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'Europe/Berlin', 'input' => 'datetime', @@ -370,7 +373,7 @@ public function testSubmitDifferentTimezones() public function testSubmitDifferentTimezonesDuringDaylightSavingTime() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'Europe/Berlin', 'input' => 'datetime', @@ -388,7 +391,7 @@ public function testSubmitDifferentTimezonesDuringDaylightSavingTime() public function testSubmitDifferentTimezonesDuringDaylightSavingTimeUsingSingleTextWidget() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'Europe/Berlin', 'input' => 'datetime', @@ -403,7 +406,7 @@ public function testSubmitDifferentTimezonesDuringDaylightSavingTimeUsingSingleT public function testSubmitWithoutSecondsAndBrowserAddingSeconds() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'string', @@ -419,7 +422,7 @@ public function testSubmitWithoutSecondsAndBrowserAddingSeconds() public function testSubmitWithSecondsAndBrowserAddingMicroseconds() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'string', @@ -435,7 +438,7 @@ public function testSubmitWithSecondsAndBrowserAddingMicroseconds() public function testSubmitWithoutSecondsAndBrowserAddingMicroseconds() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'string', @@ -451,7 +454,7 @@ public function testSubmitWithoutSecondsAndBrowserAddingMicroseconds() public function testSetDataWithoutMinutes() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'datetime', @@ -465,7 +468,7 @@ public function testSetDataWithoutMinutes() public function testSetDataWithSeconds() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'UTC', 'input' => 'datetime', @@ -479,7 +482,7 @@ public function testSetDataWithSeconds() public function testSetDataDifferentTimezones() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'America/New_York', 'view_timezone' => 'Asia/Hong_Kong', 'input' => 'string', @@ -506,7 +509,7 @@ public function testSetDataDifferentTimezones() public function testSetDataDifferentTimezonesDateTime() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'America/New_York', 'view_timezone' => 'Asia/Hong_Kong', 'input' => 'datetime', @@ -534,7 +537,7 @@ public function testSetDataDifferentTimezonesDateTime() public function testSetDataDifferentTimezonesDuringDaylightSavingTime() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'Europe/Berlin', 'input' => 'datetime', @@ -552,7 +555,7 @@ public function testSetDataDifferentTimezonesWithoutReferenceDate() $this->expectException(LogicException::class); $this->expectExceptionMessage('Using different values for the "model_timezone" and "view_timezone" options without configuring a reference date is not supported.'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'Europe/Berlin', 'input' => 'datetime', @@ -566,7 +569,7 @@ public function testSetDataDifferentTimezonesWithoutReferenceDate() public function testHoursOption() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'hours' => [6, 7], ]); @@ -580,7 +583,7 @@ public function testHoursOption() public function testIsMinuteWithinRangeReturnsTrueIfWithin() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'minutes' => [6, 7], ]); @@ -594,7 +597,7 @@ public function testIsMinuteWithinRangeReturnsTrueIfWithin() public function testIsSecondWithinRangeReturnsTrueIfWithin() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'seconds' => [6, 7], 'with_seconds' => true, ]); @@ -611,7 +614,7 @@ public function testIsPartiallyFilledReturnsFalseIfCompletelyEmpty() { $this->markTestIncomplete('Needs to be reimplemented using validators'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'choice', ]); @@ -627,7 +630,7 @@ public function testIsPartiallyFilledReturnsFalseIfCompletelyEmptyWithSeconds() { $this->markTestIncomplete('Needs to be reimplemented using validators'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'choice', 'with_seconds' => true, ]); @@ -645,7 +648,7 @@ public function testIsPartiallyFilledReturnsFalseIfCompletelyFilled() { $this->markTestIncomplete('Needs to be reimplemented using validators'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'choice', ]); @@ -661,7 +664,7 @@ public function testIsPartiallyFilledReturnsFalseIfCompletelyFilledWithSeconds() { $this->markTestIncomplete('Needs to be reimplemented using validators'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'choice', 'with_seconds' => true, ]); @@ -679,7 +682,7 @@ public function testIsPartiallyFilledReturnsTrueIfChoiceAndHourEmpty() { $this->markTestIncomplete('Needs to be reimplemented using validators'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'choice', 'with_seconds' => true, ]); @@ -697,7 +700,7 @@ public function testIsPartiallyFilledReturnsTrueIfChoiceAndMinuteEmpty() { $this->markTestIncomplete('Needs to be reimplemented using validators'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'choice', 'with_seconds' => true, ]); @@ -715,7 +718,7 @@ public function testIsPartiallyFilledReturnsTrueIfChoiceAndSecondsEmpty() { $this->markTestIncomplete('Needs to be reimplemented using validators'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'choice', 'with_seconds' => true, ]); @@ -733,12 +736,12 @@ public function testInitializeWithDateTime() { // Throws an exception if "data_class" option is not explicitly set // to null in the type - $this->assertInstanceOf(FormInterface::class, $this->factory->create(static::TESTED_TYPE, new \DateTime())); + $this->assertInstanceOf(FormInterface::class, $this->factory->create($this->getTestedType(), new \DateTime())); } public function testSingleTextWidgetShouldUseTheRightInputType() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', ]); @@ -748,7 +751,7 @@ public function testSingleTextWidgetShouldUseTheRightInputType() public function testSingleTextWidgetWithSecondsShouldHaveRightStepAttribute() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', 'with_seconds' => true, ]); @@ -760,7 +763,7 @@ public function testSingleTextWidgetWithSecondsShouldHaveRightStepAttribute() public function testSingleTextWidgetWithSecondsShouldNotOverrideStepAttribute() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', 'with_seconds' => true, 'attr' => [ @@ -775,7 +778,7 @@ public function testSingleTextWidgetWithSecondsShouldNotOverrideStepAttribute() public function testDontPassHtml5TypeIfHtml5NotAllowed() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => 'single_text', 'html5' => false, ]); @@ -786,7 +789,7 @@ public function testDontPassHtml5TypeIfHtml5NotAllowed() public function testPassDefaultPlaceholderToViewIfNotRequired() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'required' => false, 'with_seconds' => true, ]); @@ -799,7 +802,7 @@ public function testPassDefaultPlaceholderToViewIfNotRequired() public function testPassNoPlaceholderToViewIfRequired() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'required' => true, 'with_seconds' => true, ]); @@ -812,7 +815,7 @@ public function testPassNoPlaceholderToViewIfRequired() public function testPassPlaceholderAsString() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'placeholder' => 'Empty', 'with_seconds' => true, ]); @@ -825,7 +828,7 @@ public function testPassPlaceholderAsString() public function testPassPlaceholderAsArray() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'placeholder' => [ 'hour' => 'Empty hour', 'minute' => 'Empty minute', @@ -842,7 +845,7 @@ public function testPassPlaceholderAsArray() public function testPassPlaceholderAsPartialArrayAddEmptyIfNotRequired() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'required' => false, 'placeholder' => [ 'hour' => 'Empty hour', @@ -859,7 +862,7 @@ public function testPassPlaceholderAsPartialArrayAddEmptyIfNotRequired() public function testPassPlaceholderAsPartialArrayAddNullIfRequired() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'required' => true, 'placeholder' => [ 'hour' => 'Empty hour', @@ -888,7 +891,7 @@ public function provideCompoundWidgets() public function testHourErrorsBubbleUp($widget) { $error = new FormError('Invalid!'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => $widget, ]); $form['hour']->addError($error); @@ -903,7 +906,7 @@ public function testHourErrorsBubbleUp($widget) public function testMinuteErrorsBubbleUp($widget) { $error = new FormError('Invalid!'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => $widget, ]); $form['minute']->addError($error); @@ -918,7 +921,7 @@ public function testMinuteErrorsBubbleUp($widget) public function testSecondErrorsBubbleUp($widget) { $error = new FormError('Invalid!'); - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => $widget, 'with_seconds' => true, ]); @@ -931,7 +934,7 @@ public function testSecondErrorsBubbleUp($widget) public function testInitializeWithSecondsAndWithoutMinutes() { $this->expectException(InvalidConfigurationException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'with_minutes' => false, 'with_seconds' => true, ]); @@ -940,7 +943,7 @@ public function testInitializeWithSecondsAndWithoutMinutes() public function testThrowExceptionIfHoursIsInvalid() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'hours' => 'bad value', ]); } @@ -948,7 +951,7 @@ public function testThrowExceptionIfHoursIsInvalid() public function testThrowExceptionIfMinutesIsInvalid() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'minutes' => 'bad value', ]); } @@ -956,7 +959,7 @@ public function testThrowExceptionIfMinutesIsInvalid() public function testThrowExceptionIfSecondsIsInvalid() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'seconds' => 'bad value', ]); } @@ -964,7 +967,7 @@ public function testThrowExceptionIfSecondsIsInvalid() public function testReferenceDateTimezoneMustMatchModelTimezone() { $this->expectException(InvalidConfigurationException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'Europe/Berlin', 'reference_date' => new \DateTimeImmutable('now', new \DateTimeZone('Europe/Berlin')), @@ -973,7 +976,7 @@ public function testReferenceDateTimezoneMustMatchModelTimezone() public function testModelTimezoneDefaultToReferenceDateTimezoneIfProvided() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'view_timezone' => 'Europe/Berlin', 'reference_date' => new \DateTimeImmutable('now', new \DateTimeZone('Europe/Berlin')), ]); @@ -983,7 +986,7 @@ public function testModelTimezoneDefaultToReferenceDateTimezoneIfProvided() public function testViewTimezoneDefaultsToModelTimezoneIfProvided() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'Europe/Berlin', ]); @@ -992,7 +995,7 @@ public function testViewTimezoneDefaultsToModelTimezoneIfProvided() public function testPassDefaultChoiceTranslationDomain() { - $form = $this->factory->create(static::TESTED_TYPE); + $form = $this->factory->create($this->getTestedType()); $view = $form->createView(); $this->assertFalse($view['hour']->vars['choice_translation_domain']); @@ -1001,7 +1004,7 @@ public function testPassDefaultChoiceTranslationDomain() public function testPassChoiceTranslationDomainAsString() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'choice_translation_domain' => 'messages', 'with_seconds' => true, ]); @@ -1014,7 +1017,7 @@ public function testPassChoiceTranslationDomainAsString() public function testPassChoiceTranslationDomainAsArray() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'choice_translation_domain' => [ 'hour' => 'foo', 'second' => 'test', @@ -1037,7 +1040,7 @@ public function testSubmitNull($expected = null, $norm = null, $view = null) public function testSubmitNullUsesDefaultEmptyData($emptyData = [], $expectedData = null) { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'empty_data' => $emptyData, ]); $form->submit(null); @@ -1050,7 +1053,7 @@ public function testSubmitNullUsesDefaultEmptyData($emptyData = [], $expectedDat public function testArrayTimeWithReferenceDoesNotUseReferenceTimeOnZero() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'model_timezone' => 'UTC', 'view_timezone' => 'Europe/Berlin', 'reference_date' => new \DateTimeImmutable('01-01-2021 12:34:56', new \DateTimeZone('UTC')), @@ -1096,7 +1099,7 @@ public function testArrayTimeWithReferenceDoesUseReferenceDateOnModelTransform() */ public function testSubmitNullUsesDateEmptyData($widget, $emptyData, $expectedData) { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'widget' => $widget, 'empty_data' => $emptyData, ]); 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 b9387d01a45e6..e1a6bb781ecb3 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/UrlTypeTest.php @@ -16,10 +16,13 @@ class UrlTypeTest extends TextTypeTest { public const TESTED_TYPE = 'Symfony\Component\Form\Extension\Core\Type\UrlType'; + public const TESTED_TYPE_OPTIONS = [ + 'empty_data' => null, + ]; public function testSubmitAddsDefaultProtocolIfNoneIsIncluded() { - $form = $this->factory->create(static::TESTED_TYPE, 'name'); + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions()); $form->submit('www.domain.com'); @@ -29,7 +32,7 @@ public function testSubmitAddsDefaultProtocolIfNoneIsIncluded() public function testSubmitAddsNoDefaultProtocolIfAlreadyIncluded() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'default_protocol' => 'http', ]); @@ -41,7 +44,7 @@ public function testSubmitAddsNoDefaultProtocolIfAlreadyIncluded() public function testSubmitAddsNoDefaultProtocolIfEmpty() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'default_protocol' => 'http', ]); @@ -53,7 +56,7 @@ public function testSubmitAddsNoDefaultProtocolIfEmpty() public function testSubmitAddsNoDefaultProtocolIfNull() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'default_protocol' => 'http', ]); @@ -65,7 +68,7 @@ public function testSubmitAddsNoDefaultProtocolIfNull() public function testSubmitAddsNoDefaultProtocolIfSetToNull() { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'default_protocol' => null, ]); @@ -78,14 +81,14 @@ public function testSubmitAddsNoDefaultProtocolIfSetToNull() public function testThrowExceptionIfDefaultProtocolIsInvalid() { $this->expectException(InvalidOptionsException::class); - $this->factory->create(static::TESTED_TYPE, null, [ + $this->factory->create($this->getTestedType(), null, $this->getTestedTypeOptions() + [ 'default_protocol' => [], ]); } public function testSubmitNullUsesDefaultEmptyData($emptyData = 'empty', $expectedData = 'http://empty') { - $form = $this->factory->create(static::TESTED_TYPE, null, [ + $form = $this->factory->create($this->getTestedType(), null, [ 'empty_data' => $emptyData, ]); $form->submit(null); diff --git a/src/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php index b8e2cf7bcacc6..6b04ed0615c6c 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php @@ -27,7 +27,9 @@ public function buildForm(FormBuilderInterface $builder, array $options) { // The form needs a child in order to trigger CSRF protection by // default - $builder->add('name', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $builder->add('name', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); } } @@ -186,7 +188,9 @@ public function testValidateTokenOnSubmitIfRootAndCompound($valid) 'csrf_token_id' => 'TOKEN_ID', 'compound' => true, ]) - ->add('child', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('child', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm(); $form->submit([ @@ -217,7 +221,9 @@ public function testValidateTokenOnSubmitIfRootAndCompoundUsesFormNameAsIntentio 'csrf_token_manager' => $this->tokenManager, 'compound' => true, ]) - ->add('child', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('child', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm(); $form->submit([ @@ -248,7 +254,9 @@ public function testValidateTokenOnSubmitIfRootAndCompoundUsesTypeClassAsIntenti 'csrf_token_manager' => $this->tokenManager, 'compound' => true, ]) - ->add('child', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('child', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm(); $form->submit([ @@ -275,7 +283,9 @@ public function testFailIfRootAndCompoundAndTokenMissing() 'csrf_token_id' => 'TOKEN_ID', 'compound' => true, ]) - ->add('child', 'Symfony\Component\Form\Extension\Core\Type\TextType') + ->add('child', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]) ->getForm(); $form->submit([ diff --git a/src/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php b/src/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php index 39009b598c530..5a3d95510c5cc 100644 --- a/src/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/DataCollector/FormDataCollectorTest.php @@ -590,6 +590,9 @@ public function testCollectMissingDataFromChildFormAddedOnFormEvents() $form = $this->factory->createNamedBuilder('root', FormType::class, ['items' => null]) ->add('items', CollectionType::class, [ 'entry_type' => TextType::class, + 'entry_options' => [ + 'empty_data' => null, + ], 'allow_add' => true, // data is locked and modelData (null) is different to the // configured data, so modifications of the configured data diff --git a/src/Symfony/Component/Form/Tests/Extension/HtmlSanitizer/Type/TextTypeHtmlSanitizerExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/HtmlSanitizer/Type/TextTypeHtmlSanitizerExtensionTest.php index 39b8d03323342..a2de8fa18a948 100644 --- a/src/Symfony/Component/Form/Tests/Extension/HtmlSanitizer/Type/TextTypeHtmlSanitizerExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/HtmlSanitizer/Type/TextTypeHtmlSanitizerExtensionTest.php @@ -45,7 +45,10 @@ protected function getExtensions() public function testSanitizer() { $form = $this->factory->createBuilder(FormType::class, ['data' => null]) - ->add('data', TextType::class, ['sanitize_html' => true]) + ->add('data', TextType::class, [ + 'empty_data' => null, + 'sanitize_html' => true, + ]) ->getForm() ; $form->submit(['data' => 'foobar']); @@ -53,7 +56,11 @@ public function testSanitizer() $this->assertSame(['data' => 'foo'], $form->getData()); $form = $this->factory->createBuilder(FormType::class, ['data' => null]) - ->add('data', TextType::class, ['sanitize_html' => true, 'sanitizer' => 'bar']) + ->add('data', TextType::class, [ + 'empty_data' => null, + 'sanitize_html' => true, + 'sanitizer' => 'bar', + ]) ->getForm() ; $form->submit(['data' => 'foobar']); diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorFunctionalTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorFunctionalTest.php index f712805e004e0..08c7f95f76aad 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorFunctionalTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Constraints/FormValidatorFunctionalTest.php @@ -86,9 +86,10 @@ public function testFieldConstraintsInvalidateFormIfFieldIsSubmitted() public function testNonCompositeConstraintValidatedOnce() { $form = $this->formFactory->create(TextType::class, null, [ - 'constraints' => [new NotBlank(['groups' => ['foo', 'bar']])], - 'validation_groups' => ['foo', 'bar'], - ]); + 'empty_data' => null, + 'constraints' => [new NotBlank(['groups' => ['foo', 'bar']])], + 'validation_groups' => ['foo', 'bar'], + ]); $form->submit(''); $violations = $this->validator->validate($form); @@ -113,8 +114,12 @@ public function testCompositeConstraintValidatedInEachGroup() ], 'validation_groups' => ['field1', 'field2'], ]); - $form->add('field1'); - $form->add('field2'); + $form->add('field1', null, [ + 'empty_data' => null, + ]); + $form->add('field2', null, [ + 'empty_data' => null, + ]); $form->submit([ 'field1' => '', 'field2' => '', @@ -144,8 +149,12 @@ public function testCompositeConstraintValidatedInSequence() ], 'validation_groups' => new GroupSequence(['field1', 'field2']), ]); - $form->add('field1'); - $form->add('field2'); + $form->add('field1', null, [ + 'empty_data' => null, + ]); + $form->add('field2', null, [ + 'empty_data' => null, + ]); $form->submit([ 'field1' => '', @@ -165,9 +174,11 @@ public function testFieldsValidateInSequence() 'validation_groups' => new GroupSequence(['group1', 'group2']), ]) ->add('foo', TextType::class, [ + 'empty_data' => null, 'constraints' => [new Length(['min' => 10, 'groups' => ['group1']])], ]) ->add('bar', TextType::class, [ + 'empty_data' => null, 'constraints' => [new NotBlank(['groups' => ['group2']])], ]) ; @@ -186,12 +197,15 @@ public function testFieldsValidateInSequenceWithNestedGroupsArray() 'validation_groups' => new GroupSequence([['group1', 'group2'], 'group3']), ]) ->add('foo', TextType::class, [ + 'empty_data' => null, 'constraints' => [new Length(['min' => 10, 'groups' => ['group1']])], ]) ->add('bar', TextType::class, [ + 'empty_data' => null, 'constraints' => [new Length(['min' => 10, 'groups' => ['group2']])], ]) ->add('baz', TextType::class, [ + 'empty_data' => null, 'constraints' => [new NotBlank(['groups' => ['group3']])], ]) ; @@ -211,6 +225,7 @@ public function testConstraintsInDifferentGroupsOnSingleField() 'validation_groups' => new GroupSequence(['group1', 'group2']), ]) ->add('foo', TextType::class, [ + 'empty_data' => null, 'constraints' => [ new NotBlank([ 'groups' => ['group1'], @@ -237,8 +252,11 @@ public function testConstraintsInDifferentGroupsOnSingleFieldWithAdditionalField $form = $this->formFactory->create(FormType::class, null, [ 'validation_groups' => new GroupSequence(['group1', 'group2']), ]) - ->add('bar') + ->add('bar', null, [ + 'empty_data' => null, + ]) ->add('foo', TextType::class, [ + 'empty_data' => null, 'constraints' => [ new NotBlank([ 'groups' => ['group1'], @@ -266,10 +284,12 @@ public function testCascadeValidationToChildFormsUsingPropertyPaths() 'validation_groups' => ['group1', 'group2'], ]) ->add('field1', null, [ + 'empty_data' => null, 'constraints' => [new NotBlank(['groups' => 'group1'])], 'property_path' => '[foo]', ]) ->add('field2', null, [ + 'empty_data' => null, 'constraints' => [new NotBlank(['groups' => 'group2'])], 'property_path' => '[bar]', ]) @@ -327,7 +347,9 @@ public function testCascadeValidationToArrayChildForm() $form = $this->formFactory->create(FormType::class, null, [ 'data_class' => Review::class, ]) - ->add('title') + ->add('title', null, [ + 'empty_data' => null, + ]) ->add('customers', CollectionType::class, [ 'mapped' => false, 'entry_type' => CustomerType::class, @@ -357,10 +379,12 @@ public function testCascadeValidationToChildFormsUsingPropertyPathsValidatedInSe 'validation_groups' => new GroupSequence(['group1', 'group2']), ]) ->add('field1', null, [ + 'empty_data' => null, 'constraints' => [new NotBlank(['groups' => 'group1'])], 'property_path' => '[foo]', ]) ->add('field2', null, [ + 'empty_data' => null, 'constraints' => [new NotBlank(['groups' => 'group2'])], 'property_path' => '[bar]', ]) @@ -382,11 +406,14 @@ public function testContextIsPopulatedWithFormBeingValidated() { $form = $this->formFactory->create(FormType::class) ->add('field1', null, [ + 'empty_data' => null, 'constraints' => [new Expression([ 'expression' => '!this.getParent().get("field2").getData()', ])], ]) - ->add('field2') + ->add('field2', null, [ + 'empty_data' => null, + ]) ; $form->submit([ @@ -405,12 +432,15 @@ public function testContextIsPopulatedWithFormBeingValidatedUsingGroupSequence() 'validation_groups' => new GroupSequence(['group1']), ]) ->add('field1', null, [ + 'empty_data' => null, 'constraints' => [new Expression([ 'expression' => '!this.getParent().get("field2").getData()', 'groups' => ['group1'], ])], ]) - ->add('field2') + ->add('field2', null, [ + 'empty_data' => null, + ]) ; $form->submit([ @@ -448,8 +478,12 @@ public function testSubmitFormChoiceInvalid() public function testDoNotAddInvalidMessageIfChildFormIsAlreadyNotSynchronized() { $formBuilder = $this->formFactory->createBuilder() - ->add('field1') - ->add('field2') + ->add('field1', null, [ + 'empty_data' => null, + ]) + ->add('field2', null, [ + 'empty_data' => null, + ]) ->addModelTransformer(new CallbackTransformer( function () { }, @@ -497,8 +531,11 @@ class FooType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { $builder - ->add('bar') + ->add('bar', null, [ + 'empty_data' => null, + ]) ->add('baz', null, [ + 'empty_data' => null, 'constraints' => [new NotBlank()], ]) ; @@ -531,7 +568,9 @@ public function buildForm(FormBuilderInterface $builder, array $options) ->add('rating', IntegerType::class, [ 'constraints' => [new Valid()], ]) - ->add('title') + ->add('title', null, [ + 'empty_data' => null, + ]) ->add('author', CustomerType::class, [ 'constraints' => [new Valid()], ]) @@ -559,7 +598,9 @@ class CustomerType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { $builder - ->add('email') + ->add('email', null, [ + 'empty_data' => null, + ]) ; } diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/ColorTypeValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/ColorTypeValidatorExtensionTest.php index 51567835c147f..e3130494d09a2 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/ColorTypeValidatorExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/ColorTypeValidatorExtensionTest.php @@ -20,7 +20,9 @@ class ColorTypeValidatorExtensionTest extends BaseValidatorExtensionTest protected function createForm(array $options = []) { - return $this->factory->create(ColorType::class, null, $options); + return $this->factory->create(ColorType::class, null, [ + 'empty_data' => null, + ] + $options); } public function testInvalidMessage() diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/EmailTypeValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/EmailTypeValidatorExtensionTest.php index e8de05ae05d4a..1b1d0fd9c2145 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/EmailTypeValidatorExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/EmailTypeValidatorExtensionTest.php @@ -20,7 +20,9 @@ class EmailTypeValidatorExtensionTest extends BaseValidatorExtensionTest protected function createForm(array $options = []) { - return $this->factory->create(EmailType::class, null, $options); + return $this->factory->create(EmailType::class, null, [ + 'empty_data' => null, + ] + $options); } public function testInvalidMessage() diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php index 30db508520260..8287124683081 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/FormTypeValidatorExtensionTest.php @@ -80,6 +80,7 @@ public function testGroupSequenceWithConstraintsOption() ->getFormFactory() ->create(FormTypeTest::TESTED_TYPE, null, ['validation_groups' => new GroupSequence(['First', 'Second'])]) ->add('field', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, 'constraints' => [ new Length(['min' => 10, 'groups' => ['First']]), new NotBlank(['groups' => ['Second']]), @@ -125,13 +126,17 @@ public function testManyFieldsGroupSequenceWithConstraintsOption() ->addExtension(new ValidatorExtension($validator)) ->getFormFactory() ->create(FormTypeTest::TESTED_TYPE, new Author(), ['validation_groups' => new GroupSequence(['First', 'Second'])]) - ->add('firstName', TextTypeTest::TESTED_TYPE) + ->add('firstName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, + ]) ->add('lastName', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, 'constraints' => [ new Length(['min' => 10, 'groups' => ['First']]), ], ]) ->add('australian', TextTypeTest::TESTED_TYPE, [ + 'empty_data' => null, 'constraints' => [ new NotBlank(['groups' => ['Second']]), ], diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/PasswordTypeValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/PasswordTypeValidatorExtensionTest.php index 489d87283b7a8..4af998e011f29 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/PasswordTypeValidatorExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/PasswordTypeValidatorExtensionTest.php @@ -20,7 +20,9 @@ class PasswordTypeValidatorExtensionTest extends BaseValidatorExtensionTest protected function createForm(array $options = []) { - return $this->factory->create(PasswordType::class, null, $options); + return $this->factory->create(PasswordType::class, null, [ + 'empty_data' => null, + ] + $options); } public function testInvalidMessage() diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/RangeTypeValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/RangeTypeValidatorExtensionTest.php index eba6049e95fc6..caa33a677965e 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/RangeTypeValidatorExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/RangeTypeValidatorExtensionTest.php @@ -20,7 +20,9 @@ class RangeTypeValidatorExtensionTest extends BaseValidatorExtensionTest protected function createForm(array $options = []) { - return $this->factory->create(RangeType::class, null, $options); + return $this->factory->create(RangeType::class, null, [ + 'empty_data' => null, + ] + $options); } public function testInvalidMessage() diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/RepeatedTypeValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/RepeatedTypeValidatorExtensionTest.php index 445e60c6c270c..28fa256d8d022 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/RepeatedTypeValidatorExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/RepeatedTypeValidatorExtensionTest.php @@ -20,7 +20,10 @@ class RepeatedTypeValidatorExtensionTest extends BaseValidatorExtensionTest protected function createForm(array $options = []) { - return $this->factory->create(RepeatedType::class, null, $options); + return $this->factory->create(RepeatedType::class, null, [ + 'first_options' => ['empty_data' => null], + 'second_options' => ['empty_data' => null], + ] + $options); } public function testInvalidMessage() diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/SearchTypeValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/SearchTypeValidatorExtensionTest.php index d362c8cfe620c..3366c91cf74bf 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/SearchTypeValidatorExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/SearchTypeValidatorExtensionTest.php @@ -20,7 +20,9 @@ class SearchTypeValidatorExtensionTest extends BaseValidatorExtensionTest protected function createForm(array $options = []) { - return $this->factory->create(SearchType::class, null, $options); + return $this->factory->create(SearchType::class, null, [ + 'empty_data' => null, + ] + $options); } public function testInvalidMessage() diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/TelTypeValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/TelTypeValidatorExtensionTest.php index 7d7f5307bfd0e..5e36ec6c6dd5c 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/TelTypeValidatorExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/TelTypeValidatorExtensionTest.php @@ -20,7 +20,9 @@ class TelTypeValidatorExtensionTest extends BaseValidatorExtensionTest protected function createForm(array $options = []) { - return $this->factory->create(TelType::class, null, $options); + return $this->factory->create(TelType::class, null, [ + 'empty_data' => null, + ] + $options); } public function testInvalidMessage() diff --git a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/UrlTypeValidatorExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/UrlTypeValidatorExtensionTest.php index cb85fde39ac38..b62e2b4ffb8bb 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Validator/Type/UrlTypeValidatorExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Validator/Type/UrlTypeValidatorExtensionTest.php @@ -20,7 +20,9 @@ class UrlTypeValidatorExtensionTest extends BaseValidatorExtensionTest protected function createForm(array $options = []) { - return $this->factory->create(UrlType::class, null, $options); + return $this->factory->create(UrlType::class, null, [ + 'empty_data' => null, + ] + $options); } public function testInvalidMessage() diff --git a/src/Symfony/Component/Form/Tests/Fixtures/AlternatingRowType.php b/src/Symfony/Component/Form/Tests/Fixtures/AlternatingRowType.php index 556166f5547ed..cae32fa7728d7 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/AlternatingRowType.php +++ b/src/Symfony/Component/Form/Tests/Fixtures/AlternatingRowType.php @@ -16,7 +16,9 @@ public function buildForm(FormBuilderInterface $builder, array $options) $type = 0 === $form->getName() % 2 ? 'Symfony\Component\Form\Extension\Core\Type\TextType' : 'Symfony\Component\Form\Extension\Core\Type\TextareaType'; - $form->add('title', $type); + $form->add('title', $type, [ + 'empty_data' => null, + ]); }); } } diff --git a/src/Symfony/Component/Form/Tests/Fixtures/AuthorType.php b/src/Symfony/Component/Form/Tests/Fixtures/AuthorType.php index 84c988984f64d..bdc7d764d8a0c 100644 --- a/src/Symfony/Component/Form/Tests/Fixtures/AuthorType.php +++ b/src/Symfony/Component/Form/Tests/Fixtures/AuthorType.php @@ -11,8 +11,12 @@ class AuthorType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { $builder - ->add('firstName') - ->add('lastName') + ->add('firstName', null, [ + 'empty_data' => null, + ]) + ->add('lastName', null, [ + 'empty_data' => null, + ]) ; } diff --git a/src/Symfony/Component/Form/Tests/FormBuilderTest.php b/src/Symfony/Component/Form/Tests/FormBuilderTest.php index c08c64867afc7..25c7c69d398f3 100644 --- a/src/Symfony/Component/Form/Tests/FormBuilderTest.php +++ b/src/Symfony/Component/Form/Tests/FormBuilderTest.php @@ -56,21 +56,28 @@ public function testAddWithGuessFluent() public function testAddIsFluent() { - $builder = $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType', ['bar' => 'baz']); + $builder = $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + 'bar' => 'baz', + ]); $this->assertSame($builder, $this->builder); } public function testAdd() { $this->assertFalse($this->builder->has('foo')); - $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $this->assertTrue($this->builder->has('foo')); } public function testAddIntegerName() { $this->assertFalse($this->builder->has(0)); - $this->builder->add(0, 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $this->builder->add(0, 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $this->assertTrue($this->builder->has(0)); } @@ -79,7 +86,9 @@ public function testAll() $this->assertCount(0, $this->builder->all()); $this->assertFalse($this->builder->has('foo')); - $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $children = $this->builder->all(); $this->assertTrue($this->builder->has('foo')); @@ -92,9 +101,13 @@ public function testAll() */ public function testMaintainOrderOfLazyAndExplicitChildren() { - $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $this->builder->add(new FormBuilder('bar', null, new EventDispatcher(), $this->factory)); - $this->builder->add('baz', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $this->builder->add('baz', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $children = $this->builder->all(); @@ -103,7 +116,9 @@ public function testMaintainOrderOfLazyAndExplicitChildren() public function testRemove() { - $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $this->builder->remove('foo'); $this->assertFalse($this->builder->has('foo')); } @@ -117,7 +132,9 @@ public function testRemoveUnknown() // https://github.com/symfony/symfony/pull/4826 public function testRemoveAndGetForm() { - $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $this->builder->remove('foo'); $form = $this->builder->getForm(); $this->assertInstanceOf(Form::class, $form); @@ -125,7 +142,9 @@ public function testRemoveAndGetForm() public function testCreateNoTypeNo() { - $builder = $this->builder->create('foo'); + $builder = $this->builder->create('foo', null, [ + 'empty_data' => null, + ]); $this->assertInstanceOf(TextType::class, $builder->getType()->getInnerType()); } @@ -148,7 +167,9 @@ public function testGetUnknown() public function testGetExplicitType() { - $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType'); + $this->builder->add('foo', 'Symfony\Component\Form\Extension\Core\Type\TextType', [ + 'empty_data' => null, + ]); $builder = $this->builder->get('foo'); $this->assertNotSame($builder, $this->builder); @@ -157,7 +178,9 @@ public function testGetExplicitType() public function testGetGuessedType() { $rootFormBuilder = new FormBuilder('name', 'stdClass', new EventDispatcher(), $this->factory); - $rootFormBuilder->add('foo'); + $rootFormBuilder->add('foo', null, [ + 'empty_data' => null, + ]); $fooBuilder = $rootFormBuilder->get('foo'); $this->assertNotSame($fooBuilder, $rootFormBuilder); diff --git a/src/Symfony/Component/Form/Tests/FormFactoryTest.php b/src/Symfony/Component/Form/Tests/FormFactoryTest.php index ab13c67775765..3c9ef677d9a21 100644 --- a/src/Symfony/Component/Form/Tests/FormFactoryTest.php +++ b/src/Symfony/Component/Form/Tests/FormFactoryTest.php @@ -102,7 +102,9 @@ public function testCreateNamed() public function testCreateBuilderForPropertyWithoutTypeGuesser() { - $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName'); + $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName', null, [ + 'empty_data' => null, + ]); $this->assertSame('firstName', $builder->getName()); } @@ -112,7 +114,9 @@ public function testCreateBuilderForPropertyCreatesFormWithHighestConfidence() $this->guesser1->configureTypeGuess(TextType::class, ['attr' => ['maxlength' => 10]], Guess::MEDIUM_CONFIDENCE); $this->guesser2->configureTypeGuess(PasswordType::class, ['attr' => ['maxlength' => 7]], Guess::HIGH_CONFIDENCE); - $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName'); + $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName', null, [ + 'empty_data' => null, + ]); $this->assertSame('firstName', $builder->getName()); $this->assertSame(['maxlength' => 7], $builder->getOption('attr')); @@ -121,7 +125,9 @@ public function testCreateBuilderForPropertyCreatesFormWithHighestConfidence() public function testCreateBuilderCreatesTextFormIfNoGuess() { - $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName'); + $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName', null, [ + 'empty_data' => null, + ]); $this->assertSame('firstName', $builder->getName()); $this->assertInstanceOf(TextType::class, $builder->getType()->getInnerType()); @@ -131,7 +137,10 @@ public function testOptionsCanBeOverridden() { $this->guesser1->configureTypeGuess(TextType::class, ['attr' => ['class' => 'foo', 'maxlength' => 10]], Guess::MEDIUM_CONFIDENCE); - $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName', null, ['attr' => ['maxlength' => 11]]); + $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName', null, [ + 'empty_data' => null, + 'attr' => ['maxlength' => 11], + ]); $this->assertSame('firstName', $builder->getName()); $this->assertSame(['class' => 'foo', 'maxlength' => 11], $builder->getOption('attr')); @@ -143,7 +152,9 @@ public function testCreateBuilderUsesMaxLengthIfFound() $this->guesser1->configureMaxLengthGuess(15, Guess::MEDIUM_CONFIDENCE); $this->guesser2->configureMaxLengthGuess(20, Guess::HIGH_CONFIDENCE); - $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName'); + $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName', null, [ + 'empty_data' => null, + ]); $this->assertSame('firstName', $builder->getName()); $this->assertSame(['maxlength' => 20], $builder->getOption('attr')); @@ -155,7 +166,10 @@ public function testCreateBuilderUsesMaxLengthAndPattern() $this->guesser1->configureMaxLengthGuess(20, Guess::HIGH_CONFIDENCE); $this->guesser2->configurePatternGuess('.{5,}', Guess::HIGH_CONFIDENCE); - $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName', null, ['attr' => ['class' => 'tinymce']]); + $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName', null, [ + 'empty_data' => null, + 'attr' => ['class' => 'tinymce'] + ]); $this->assertSame('firstName', $builder->getName()); $this->assertSame(['maxlength' => 20, 'pattern' => '.{5,}', 'class' => 'tinymce'], $builder->getOption('attr')); @@ -167,7 +181,9 @@ public function testCreateBuilderUsesRequiredSettingWithHighestConfidence() $this->guesser1->configureRequiredGuess(true, Guess::MEDIUM_CONFIDENCE); $this->guesser2->configureRequiredGuess(false, Guess::HIGH_CONFIDENCE); - $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName'); + $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName', null, [ + 'empty_data' => null, + ]); $this->assertSame('firstName', $builder->getName()); $this->assertFalse($builder->getOption('required')); @@ -179,7 +195,9 @@ public function testCreateBuilderUsesPatternIfFound() $this->guesser1->configurePatternGuess('[a-z]', Guess::MEDIUM_CONFIDENCE); $this->guesser2->configurePatternGuess('[a-zA-Z]', Guess::HIGH_CONFIDENCE); - $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName'); + $builder = $this->factory->createBuilderForProperty('Application\Author', 'firstName', null, [ + 'empty_data' => null, + ]); $this->assertSame('firstName', $builder->getName()); $this->assertSame(['pattern' => '[a-zA-Z]'], $builder->getOption('attr'));