From 10b49c357514c85d68689100381456c405fc15f1 Mon Sep 17 00:00:00 2001 From: Valentin Date: Fri, 22 Dec 2017 17:02:25 +0300 Subject: [PATCH 1/7] Added input=datetime_immutable for DateType, TimeType, DateTimeType. --- ...DateTimeImmutableToDateTimeTransformer.php | 67 +++++++++++++++++ .../Form/Extension/Core/Type/DateTimeType.php | 6 +- .../Form/Extension/Core/Type/DateType.php | 6 +- .../Form/Extension/Core/Type/TimeType.php | 6 +- .../Component/Form/Test/TypeTestCase.php | 5 ++ .../DataTransformer/DateIntervalTestCase.php | 5 ++ ...TimeImmutableToDateTimeTransformerTest.php | 71 +++++++++++++++++++ .../Extension/Core/Type/DateTimeTypeTest.php | 47 ++++++++++++ .../Extension/Core/Type/DateTypeTest.php | 21 ++++++ .../Extension/Core/Type/TimeTypeTest.php | 21 ++++++ 10 files changed, 252 insertions(+), 3 deletions(-) create mode 100644 src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php create mode 100644 src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php new file mode 100644 index 0000000000000..eae8c79e82ec4 --- /dev/null +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Extension\Core\DataTransformer; + +use Symfony\Component\Form\DataTransformerInterface; +use Symfony\Component\Form\Exception\TransformationFailedException; + +/** + * Transforms between a DateTimeImmutable object and a DateTime object. + * + * @author Valentin Udaltsov + */ +class DateTimeImmutableToDateTimeTransformer implements DataTransformerInterface +{ + /** + * Transforms a DateTimeImmutable into a DateTime object. + * + * @param \DateTimeImmutable|null $value A DateTimeImmutable object + * + * @return \DateTime|null A \DateTime object + * + * @throws TransformationFailedException If the given value is not a \DateTimeImmutable + */ + public function transform($value): ?\DateTime + { + if (null === $value) { + return null; + } + + if (!$value instanceof \DateTimeImmutable) { + throw new TransformationFailedException('Expected a \DateTimeImmutable.'); + } + + return new \DateTime($value->format(\DateTime::RFC3339)); + } + + /** + * Transforms a DateTime object into a DateTimeImmutable object. + * + * @param \DateTime|null $value A DateTime object + * + * @return \DateTimeImmutable|null A DateTimeImmutable object + * + * @throws TransformationFailedException If the given value is not a \DateTime + */ + public function reverseTransform($value): ?\DateTimeImmutable + { + if (null === $value) { + return null; + } + + if (!$value instanceof \DateTime) { + throw new TransformationFailedException('Expected a \DateTime.'); + } + + return \DateTimeImmutable::createFromMutable($value); + } +} diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php index d34d1c210044c..06d085d30c1d7 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateTimeType.php @@ -18,6 +18,7 @@ use Symfony\Component\Form\FormView; use Symfony\Component\Form\ReversedTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DataTransformerChain; +use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeImmutableToDateTimeTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToArrayTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer; @@ -165,7 +166,9 @@ public function buildForm(FormBuilderInterface $builder, array $options) ; } - if ('string' === $options['input']) { + if ('datetime_immutable' === $options['input']) { + $builder->addModelTransformer(new DateTimeImmutableToDateTimeTransformer()); + } elseif ('string' === $options['input']) { $builder->addModelTransformer(new ReversedTransformer( new DateTimeToStringTransformer($options['model_timezone'], $options['model_timezone']) )); @@ -254,6 +257,7 @@ public function configureOptions(OptionsResolver $resolver) $resolver->setAllowedValues('input', array( 'datetime', + 'datetime_immutable', 'string', 'timestamp', 'array', diff --git a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php index bf51b15b6a4dc..91aa8e383926d 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/DateType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/DateType.php @@ -15,6 +15,7 @@ use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormView; +use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeImmutableToDateTimeTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToArrayTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer; @@ -123,7 +124,9 @@ class_exists('IntlTimeZone', false) ? \IntlTimeZone::createDefault() : null, ; } - if ('string' === $options['input']) { + if ('datetime_immutable' === $options['input']) { + $builder->addModelTransformer(new DateTimeImmutableToDateTimeTransformer()); + } elseif ('string' === $options['input']) { $builder->addModelTransformer(new ReversedTransformer( new DateTimeToStringTransformer($options['model_timezone'], $options['model_timezone'], 'Y-m-d') )); @@ -258,6 +261,7 @@ public function configureOptions(OptionsResolver $resolver) $resolver->setAllowedValues('input', array( 'datetime', + 'datetime_immutable', 'string', 'timestamp', 'array', diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php index d1c04f73d9278..df8973d932e2c 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php @@ -18,6 +18,7 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\ReversedTransformer; use Symfony\Component\Form\Exception\InvalidConfigurationException; +use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeImmutableToDateTimeTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToTimestampTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToArrayTransformer; @@ -133,7 +134,9 @@ public function buildForm(FormBuilderInterface $builder, array $options) $builder->addViewTransformer(new DateTimeToArrayTransformer($options['model_timezone'], $options['view_timezone'], $parts, 'text' === $options['widget'])); } - if ('string' === $options['input']) { + if ('datetime_immutable' === $options['input']) { + $builder->addModelTransformer(new DateTimeImmutableToDateTimeTransformer()); + } elseif ('string' === $options['input']) { $builder->addModelTransformer(new ReversedTransformer( new DateTimeToStringTransformer($options['model_timezone'], $options['model_timezone'], 'H:i:s') )); @@ -252,6 +255,7 @@ public function configureOptions(OptionsResolver $resolver) $resolver->setAllowedValues('input', array( 'datetime', + 'datetime_immutable', 'string', 'timestamp', 'array', diff --git a/src/Symfony/Component/Form/Test/TypeTestCase.php b/src/Symfony/Component/Form/Test/TypeTestCase.php index 346dc61648896..66e00371d0cd5 100644 --- a/src/Symfony/Component/Form/Test/TypeTestCase.php +++ b/src/Symfony/Component/Form/Test/TypeTestCase.php @@ -58,6 +58,11 @@ public static function assertDateTimeEquals(\DateTime $expected, \DateTime $actu self::assertEquals($expected->format('c'), $actual->format('c')); } + public static function assertDateTimeImmutableEquals(\DateTimeImmutable $expected, \DateTimeImmutable $actual) + { + self::assertEquals($expected->format('c'), $actual->format('c')); + } + public static function assertDateIntervalEquals(\DateInterval $expected, \DateInterval $actual) { self::assertEquals($expected->format('%RP%yY%mM%dDT%hH%iM%sS'), $actual->format('%RP%yY%mM%dDT%hH%iM%sS')); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateIntervalTestCase.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateIntervalTestCase.php index d4435d273e049..dbad61515d4f4 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateIntervalTestCase.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateIntervalTestCase.php @@ -19,4 +19,9 @@ public static function assertDateIntervalEquals(\DateInterval $expected, \DateIn { self::assertEquals($expected->format('%RP%yY%mM%dDT%hH%iM%sS'), $actual->format('%RP%yY%mM%dDT%hH%iM%sS')); } + + public static function assertDateTimeImmutableEquals(\DateTimeImmutable $expected, \DateTimeImmutable $actual) + { + self::assertEquals($expected->format('U'), $actual->format('U')); + } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php new file mode 100644 index 0000000000000..c5adea85fbbd9 --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer; + +use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeImmutableToDateTimeTransformer; + +class DateTimeImmutableToDateTimeTransformerTest extends DateTimeTestCase +{ + public function testTransform() + { + $transformer = new DateTimeImmutableToDateTimeTransformer(); + + $input = new \DateTimeImmutable('2010-02-03 04:05:06 UTC'); + $output = new \DateTime('2010-02-03 04:05:06 UTC'); + + $this->assertDateTimeEquals($output, $transformer->transform($input)); + } + + public function testTransformEmpty() + { + $transformer = new DateTimeImmutableToDateTimeTransformer(); + + $this->assertNull($transformer->transform(null)); + } + + /** + * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException + * @expectedExceptionMessage Expected a \DateTimeImmutable. + */ + public function testTransformFail() + { + $transformer = new DateTimeImmutableToDateTimeTransformer(); + $transformer->transform(new \DateTime()); + } + + public function testReverseTransform() + { + $transformer = new DateTimeImmutableToDateTimeTransformer(); + + $input = new \DateTime('2010-02-03 04:05:06 UTC'); + $output = new \DateTimeImmutable('2010-02-03 04:05:06 UTC'); + + $this->assertDateTimeImmutableEquals($output, $transformer->reverseTransform($input)); + } + + public function testReverseTransformEmpty() + { + $transformer = new DateTimeImmutableToDateTimeTransformer(); + + $this->assertNull($transformer->reverseTransform(null)); + } + + /** + * @expectedException \Symfony\Component\Form\Exception\TransformationFailedException + * @expectedExceptionMessage Expected a \DateTime. + */ + public function testReverseTransformFail() + { + $transformer = new DateTimeImmutableToDateTimeTransformer(); + $transformer->reverseTransform(new \DateTimeImmutable()); + } +} 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 a22da49ac5137..8aea5dcad396d 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php @@ -52,6 +52,34 @@ public function testSubmitDateTime() $this->assertEquals($dateTime, $form->getData()); } + public function testSubmitDateTimeImmutable() + { + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'model_timezone' => 'UTC', + 'view_timezone' => 'UTC', + 'date_widget' => 'choice', + 'years' => array(2010), + 'time_widget' => 'choice', + 'input' => 'datetime_immutable', + )); + + $form->submit(array( + 'date' => array( + 'day' => '2', + 'month' => '6', + 'year' => '2010', + ), + 'time' => array( + 'hour' => '3', + 'minute' => '4', + ), + )); + + $dateTime = new \DateTimeImmutable('2010-06-02 03:04:00 UTC'); + + $this->assertDateTimeImmutableEquals($dateTime, $form->getData()); + } + public function testSubmitString() { $form = $this->factory->create(static::TESTED_TYPE, null, array( @@ -219,6 +247,25 @@ public function testSubmitDifferentTimezonesDateTime() $this->assertEquals('2010-06-02T03:04:00-10:00', $form->getViewData()); } + public function testSubmitDifferentTimezonesDateTimeImmutable() + { + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'model_timezone' => 'America/New_York', + 'view_timezone' => 'Pacific/Tahiti', + 'widget' => 'single_text', + 'input' => 'datetime_immutable', + )); + + $outputTime = new \DateTimeImmutable('2010-06-02 03:04:00 Pacific/Tahiti'); + + $form->submit('2010-06-02T03:04:00-10:00'); + + $outputTime = $outputTime->setTimezone(new \DateTimeZone('America/New_York')); + + $this->assertDateTimeImmutableEquals($outputTime, $form->getData()); + $this->assertEquals('2010-06-02T03:04:00-10:00', $form->getViewData()); + } + public function testSubmitStringSingleText() { $form = $this->factory->create(static::TESTED_TYPE, null, array( 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 3a0289a4f34e8..dc9ee0c738714 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php @@ -105,6 +105,27 @@ public function testSubmitFromSingleTextDateTime() $this->assertEquals('02.06.2010', $form->getViewData()); } + public function testSubmitFromSingleTextDateTimeImmutable() + { + // we test against "de_DE", so we need the full implementation + IntlTestHelper::requireFullIntl($this, false); + + \Locale::setDefault('de_DE'); + + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'format' => \IntlDateFormatter::MEDIUM, + 'model_timezone' => 'UTC', + 'view_timezone' => 'UTC', + 'widget' => 'single_text', + 'input' => 'datetime_immutable', + )); + + $form->submit('2.6.2010'); + + $this->assertDateTimeImmutableEquals(new \DateTimeImmutable('2010-06-02 UTC'), $form->getData()); + $this->assertEquals('02.06.2010', $form->getViewData()); + } + public function testSubmitFromSingleTextString() { // we test against "de_DE", so we need the full implementation 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 56b1d14774cd2..6b4c5814c0f1c 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php @@ -39,6 +39,27 @@ public function testSubmitDateTime() $this->assertEquals($input, $form->getViewData()); } + public function testSubmitDateTimeImmutable() + { + $form = $this->factory->create(static::TESTED_TYPE, null, array( + 'model_timezone' => 'UTC', + 'view_timezone' => 'UTC', + 'input' => 'datetime_immutable', + )); + + $input = array( + 'hour' => '3', + 'minute' => '4', + ); + + $form->submit($input); + + $dateTime = new \DateTimeImmutable('1970-01-01 03:04:00 UTC'); + + $this->assertDateTimeImmutableEquals($dateTime, $form->getData()); + $this->assertEquals($input, $form->getViewData()); + } + public function testSubmitString() { $form = $this->factory->create(static::TESTED_TYPE, null, array( From 6c07eb546582e67d60752888f10e69b93c3697d1 Mon Sep 17 00:00:00 2001 From: Valentin Date: Fri, 22 Dec 2017 17:30:29 +0300 Subject: [PATCH 2/7] Use createFromFormat when transforming DateTimeImmutable -> DateTime. --- .../DataTransformer/DateTimeImmutableToDateTimeTransformer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php index eae8c79e82ec4..d7d5aa8d6281a 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php @@ -40,7 +40,7 @@ public function transform($value): ?\DateTime throw new TransformationFailedException('Expected a \DateTimeImmutable.'); } - return new \DateTime($value->format(\DateTime::RFC3339)); + return \DateTime::createFromFormat(\DateTime::RFC3339, $value->format(\DateTime::RFC3339)); } /** From 1590140c735e0ec5e878054ad96d402e52bdb2e7 Mon Sep 17 00:00:00 2001 From: Valentin Date: Mon, 8 Jan 2018 13:26:17 +0300 Subject: [PATCH 3/7] Removed return typehints in DateTimeImmutableToDateTimeTransformer. --- .../DateTimeImmutableToDateTimeTransformer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php index d7d5aa8d6281a..6c0957ab7a676 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php @@ -30,7 +30,7 @@ class DateTimeImmutableToDateTimeTransformer implements DataTransformerInterface * * @throws TransformationFailedException If the given value is not a \DateTimeImmutable */ - public function transform($value): ?\DateTime + public function transform($value) { if (null === $value) { return null; @@ -52,7 +52,7 @@ public function transform($value): ?\DateTime * * @throws TransformationFailedException If the given value is not a \DateTime */ - public function reverseTransform($value): ?\DateTimeImmutable + public function reverseTransform($value) { if (null === $value) { return null; From a0a8e64bdc394536ab70ced36847d72362cafebd Mon Sep 17 00:00:00 2001 From: Valentin Date: Sat, 13 Jan 2018 19:12:20 +0300 Subject: [PATCH 4/7] Marked DateTimeImmutableToDateTimeTransformer as final. --- .../DataTransformer/DateTimeImmutableToDateTimeTransformer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php index 6c0957ab7a676..b0737393e4e3f 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformer.php @@ -19,7 +19,7 @@ * * @author Valentin Udaltsov */ -class DateTimeImmutableToDateTimeTransformer implements DataTransformerInterface +final class DateTimeImmutableToDateTimeTransformer implements DataTransformerInterface { /** * Transforms a DateTimeImmutable into a DateTime object. From 83697db8cec0aabbfa9e7895ff695c0f8e0f5658 Mon Sep 17 00:00:00 2001 From: Valentin Date: Tue, 6 Feb 2018 08:37:01 +0300 Subject: [PATCH 5/7] Use assertEquals to compare \DateTimeImmutable. --- src/Symfony/Component/Form/Test/TypeTestCase.php | 5 ----- .../Core/DataTransformer/DateIntervalTestCase.php | 5 ----- .../DateTimeImmutableToDateTimeTransformerTest.php | 7 ++++--- .../Form/Tests/Extension/Core/Type/DateTimeTypeTest.php | 4 ++-- .../Form/Tests/Extension/Core/Type/DateTypeTest.php | 2 +- .../Form/Tests/Extension/Core/Type/TimeTypeTest.php | 2 +- 6 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/Symfony/Component/Form/Test/TypeTestCase.php b/src/Symfony/Component/Form/Test/TypeTestCase.php index 66e00371d0cd5..346dc61648896 100644 --- a/src/Symfony/Component/Form/Test/TypeTestCase.php +++ b/src/Symfony/Component/Form/Test/TypeTestCase.php @@ -58,11 +58,6 @@ public static function assertDateTimeEquals(\DateTime $expected, \DateTime $actu self::assertEquals($expected->format('c'), $actual->format('c')); } - public static function assertDateTimeImmutableEquals(\DateTimeImmutable $expected, \DateTimeImmutable $actual) - { - self::assertEquals($expected->format('c'), $actual->format('c')); - } - public static function assertDateIntervalEquals(\DateInterval $expected, \DateInterval $actual) { self::assertEquals($expected->format('%RP%yY%mM%dDT%hH%iM%sS'), $actual->format('%RP%yY%mM%dDT%hH%iM%sS')); diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateIntervalTestCase.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateIntervalTestCase.php index dbad61515d4f4..d4435d273e049 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateIntervalTestCase.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateIntervalTestCase.php @@ -19,9 +19,4 @@ public static function assertDateIntervalEquals(\DateInterval $expected, \DateIn { self::assertEquals($expected->format('%RP%yY%mM%dDT%hH%iM%sS'), $actual->format('%RP%yY%mM%dDT%hH%iM%sS')); } - - public static function assertDateTimeImmutableEquals(\DateTimeImmutable $expected, \DateTimeImmutable $actual) - { - self::assertEquals($expected->format('U'), $actual->format('U')); - } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php index c5adea85fbbd9..30e8885a78a9f 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php @@ -11,9 +11,10 @@ namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer; +use PHPUnit\Framework\TestCase; use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeImmutableToDateTimeTransformer; -class DateTimeImmutableToDateTimeTransformerTest extends DateTimeTestCase +class DateTimeImmutableToDateTimeTransformerTest extends TestCase { public function testTransform() { @@ -22,7 +23,7 @@ public function testTransform() $input = new \DateTimeImmutable('2010-02-03 04:05:06 UTC'); $output = new \DateTime('2010-02-03 04:05:06 UTC'); - $this->assertDateTimeEquals($output, $transformer->transform($input)); + $this->assertEquals($output, $transformer->transform($input)); } public function testTransformEmpty() @@ -49,7 +50,7 @@ public function testReverseTransform() $input = new \DateTime('2010-02-03 04:05:06 UTC'); $output = new \DateTimeImmutable('2010-02-03 04:05:06 UTC'); - $this->assertDateTimeImmutableEquals($output, $transformer->reverseTransform($input)); + $this->assertEquals($output, $transformer->reverseTransform($input)); } public function testReverseTransformEmpty() 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 8aea5dcad396d..9badb4f6f2ff0 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php @@ -77,7 +77,7 @@ public function testSubmitDateTimeImmutable() $dateTime = new \DateTimeImmutable('2010-06-02 03:04:00 UTC'); - $this->assertDateTimeImmutableEquals($dateTime, $form->getData()); + $this->assertEquals($dateTime, $form->getData()); } public function testSubmitString() @@ -262,7 +262,7 @@ public function testSubmitDifferentTimezonesDateTimeImmutable() $outputTime = $outputTime->setTimezone(new \DateTimeZone('America/New_York')); - $this->assertDateTimeImmutableEquals($outputTime, $form->getData()); + $this->assertEquals($outputTime, $form->getData()); $this->assertEquals('2010-06-02T03:04:00-10:00', $form->getViewData()); } 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 dc9ee0c738714..5748e758abb06 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php @@ -122,7 +122,7 @@ public function testSubmitFromSingleTextDateTimeImmutable() $form->submit('2.6.2010'); - $this->assertDateTimeImmutableEquals(new \DateTimeImmutable('2010-06-02 UTC'), $form->getData()); + $this->assertEquals(new \DateTimeImmutable('2010-06-02 UTC'), $form->getData()); $this->assertEquals('02.06.2010', $form->getViewData()); } 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 6b4c5814c0f1c..a1f1635580050 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php @@ -56,7 +56,7 @@ public function testSubmitDateTimeImmutable() $dateTime = new \DateTimeImmutable('1970-01-01 03:04:00 UTC'); - $this->assertDateTimeImmutableEquals($dateTime, $form->getData()); + $this->assertEquals($dateTime, $form->getData()); $this->assertEquals($input, $form->getViewData()); } From 7721aed2c1a551e3a7bcb3d70d33fad97150cf46 Mon Sep 17 00:00:00 2001 From: Valentin Date: Tue, 6 Feb 2018 08:38:46 +0300 Subject: [PATCH 6/7] Added line to CHANGELOG. --- src/Symfony/Component/Form/CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md index 5d01cb38931c9..537ba84286885 100644 --- a/src/Symfony/Component/Form/CHANGELOG.md +++ b/src/Symfony/Component/Form/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +4.1.0 +----- + + * added `input=datetime_immutable` to DateType, TimeType, DateTimeType + 4.0.0 ----- From 1eff2b5963e0c7875b1d45012b801a5a71ef3af8 Mon Sep 17 00:00:00 2001 From: Valentin Date: Tue, 6 Feb 2018 12:22:55 +0300 Subject: [PATCH 7/7] Added instanceof assertions. --- .../DateTimeImmutableToDateTimeTransformerTest.php | 12 ++++++++---- .../Tests/Extension/Core/Type/DateTimeTypeTest.php | 1 + .../Form/Tests/Extension/Core/Type/DateTypeTest.php | 1 + .../Form/Tests/Extension/Core/Type/TimeTypeTest.php | 1 + 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php index 30e8885a78a9f..244ef0f790fa9 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeImmutableToDateTimeTransformerTest.php @@ -21,9 +21,11 @@ public function testTransform() $transformer = new DateTimeImmutableToDateTimeTransformer(); $input = new \DateTimeImmutable('2010-02-03 04:05:06 UTC'); - $output = new \DateTime('2010-02-03 04:05:06 UTC'); + $expectedOutput = new \DateTime('2010-02-03 04:05:06 UTC'); + $actualOutput = $transformer->transform($input); - $this->assertEquals($output, $transformer->transform($input)); + $this->assertInstanceOf(\DateTime::class, $actualOutput); + $this->assertEquals($expectedOutput, $actualOutput); } public function testTransformEmpty() @@ -48,9 +50,11 @@ public function testReverseTransform() $transformer = new DateTimeImmutableToDateTimeTransformer(); $input = new \DateTime('2010-02-03 04:05:06 UTC'); - $output = new \DateTimeImmutable('2010-02-03 04:05:06 UTC'); + $expectedOutput = new \DateTimeImmutable('2010-02-03 04:05:06 UTC'); + $actualOutput = $transformer->reverseTransform($input); - $this->assertEquals($output, $transformer->reverseTransform($input)); + $this->assertInstanceOf(\DateTimeImmutable::class, $actualOutput); + $this->assertEquals($expectedOutput, $actualOutput); } public function testReverseTransformEmpty() 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 9badb4f6f2ff0..0602ca5e13f3d 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTimeTypeTest.php @@ -262,6 +262,7 @@ public function testSubmitDifferentTimezonesDateTimeImmutable() $outputTime = $outputTime->setTimezone(new \DateTimeZone('America/New_York')); + $this->assertInstanceOf(\DateTimeImmutable::class, $form->getData()); $this->assertEquals($outputTime, $form->getData()); $this->assertEquals('2010-06-02T03:04:00-10:00', $form->getViewData()); } 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 5748e758abb06..c8d1b4614d7cf 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/DateTypeTest.php @@ -122,6 +122,7 @@ public function testSubmitFromSingleTextDateTimeImmutable() $form->submit('2.6.2010'); + $this->assertInstanceOf(\DateTimeImmutable::class, $form->getData()); $this->assertEquals(new \DateTimeImmutable('2010-06-02 UTC'), $form->getData()); $this->assertEquals('02.06.2010', $form->getViewData()); } 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 a1f1635580050..c58cb44fa8c2d 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/TimeTypeTest.php @@ -56,6 +56,7 @@ public function testSubmitDateTimeImmutable() $dateTime = new \DateTimeImmutable('1970-01-01 03:04:00 UTC'); + $this->assertInstanceOf(\DateTimeImmutable::class, $form->getData()); $this->assertEquals($dateTime, $form->getData()); $this->assertEquals($input, $form->getViewData()); }