Selaa lähdekoodia

[Form] Fixed error handling in DateTimeToArrayTransformer

Bernhard Schussek 14 vuotta sitten
vanhempi
commit
0a260b96fb

+ 14 - 10
src/Symfony/Component/Form/ValueTransformer/DateTimeToArrayTransformer.php

@@ -112,16 +112,20 @@ class DateTimeToArrayTransformer extends BaseDateTimeTransformer
             return null;
         }
 
-        $dateTime = new \DateTime(sprintf(
-            '%s-%s-%s %s:%s:%s %s',
-            empty($value['year']) ? '1970' : $value['year'],
-            empty($value['month']) ? '1' : $value['month'],
-            empty($value['day']) ? '1' : $value['day'],
-            empty($value['hour']) ? '0' : $value['hour'],
-            empty($value['minute']) ? '0' : $value['minute'],
-            empty($value['second']) ? '0' : $value['second'],
-            $outputTimezone
-        ));
+        try {
+            $dateTime = new \DateTime(sprintf(
+                '%s-%s-%s %s:%s:%s %s',
+                empty($value['year']) ? '1970' : $value['year'],
+                empty($value['month']) ? '1' : $value['month'],
+                empty($value['day']) ? '1' : $value['day'],
+                empty($value['hour']) ? '0' : $value['hour'],
+                empty($value['minute']) ? '0' : $value['minute'],
+                empty($value['second']) ? '0' : $value['second'],
+                $outputTimezone
+            ));
+        } catch (\Exception $e) {
+            throw new TransformationFailedException($e->getMessage(), null, $e);
+        }
 
         if ($inputTimezone != $outputTimezone) {
             $dateTime->setTimezone(new \DateTimeZone($inputTimezone));

+ 101 - 5
tests/Symfony/Tests/Component/Form/ValueTransformer/DateTimeToArrayTransformerTest.php

@@ -120,12 +120,12 @@ class DateTimeToArrayTransformerTest extends DateTimeTestCase
         $this->assertSame($output, $transformer->transform($input));
     }
 
+    /**
+     * @expectedException Symfony\Component\Form\Exception\UnexpectedTypeException
+     */
     public function testTransformRequiresDateTime()
     {
         $transformer = new DateTimeToArrayTransformer();
-
-        $this->setExpectedException('Symfony\Component\Form\Exception\UnexpectedTypeException');
-
         $transformer->reverseTransform('12345', null);
     }
 
@@ -217,12 +217,108 @@ class DateTimeToArrayTransformerTest extends DateTimeTestCase
         $this->assertDateTimeEquals($output, $transformer->reverseTransform($input, null));
     }
 
+    /**
+     * @expectedException Symfony\Component\Form\Exception\UnexpectedTypeException
+     */
     public function testReverseTransformRequiresArray()
     {
         $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform('12345', null);
+    }
 
-        $this->setExpectedException('Symfony\Component\Form\Exception\UnexpectedTypeException');
+    /**
+     * @expectedException Symfony\Component\Form\ValueTransformer\TransformationFailedException
+     */
+    public function testReverseTransformWithNegativeYear()
+    {
+        $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform(array(
+            'year' => '-1',
+            'month' => '2',
+            'day' => '3',
+            'hour' => '4',
+            'minute' => '5',
+            'second' => '6',
+        ));
+    }
 
-        $transformer->reverseTransform('12345', null);
+    /**
+     * @expectedException Symfony\Component\Form\ValueTransformer\TransformationFailedException
+     */
+    public function testReverseTransformWithNegativeMonth()
+    {
+        $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform(array(
+            'year' => '2010',
+            'month' => '-1',
+            'day' => '3',
+            'hour' => '4',
+            'minute' => '5',
+            'second' => '6',
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Form\ValueTransformer\TransformationFailedException
+     */
+    public function testReverseTransformWithNegativeDay()
+    {
+        $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform(array(
+            'year' => '2010',
+            'month' => '2',
+            'day' => '-1',
+            'hour' => '4',
+            'minute' => '5',
+            'second' => '6',
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Form\ValueTransformer\TransformationFailedException
+     */
+    public function testReverseTransformWithNegativeHour()
+    {
+        $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform(array(
+            'year' => '2010',
+            'month' => '2',
+            'day' => '3',
+            'hour' => '-1',
+            'minute' => '5',
+            'second' => '6',
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Form\ValueTransformer\TransformationFailedException
+     */
+    public function testReverseTransformWithNegativeMinute()
+    {
+        $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform(array(
+            'year' => '2010',
+            'month' => '2',
+            'day' => '3',
+            'hour' => '4',
+            'minute' => '-1',
+            'second' => '6',
+        ));
+    }
+
+    /**
+     * @expectedException Symfony\Component\Form\ValueTransformer\TransformationFailedException
+     */
+    public function testReverseTransformWithNegativeSecond()
+    {
+        $transformer = new DateTimeToArrayTransformer();
+        $transformer->reverseTransform(array(
+            'year' => '2010',
+            'month' => '2',
+            'day' => '3',
+            'hour' => '4',
+            'minute' => '5',
+            'second' => '-1',
+        ));
     }
 }