Преглед на файлове

merged branch eriksencosta/locale-fixes-2.0 (PR #3947)

Commits
-------

b1ea552 [Locale] micro-optimization
663d218 [Locale] changed method name
bb61e09 [Locale] use the correct way for Intl error

Discussion
----------

[2.0][Locale] rebased PR 3765 plus few changes

Bug fix: yes
Feature addition: no
Backwards compatibility break: no
Symfony2 tests pass: yes
Fixes the following tickets: -
Todo: -

#3765 was right but was made in master. Cherry-picked and rebased for 2.0.

Tests are passing.
Fabien Potencier преди 13 години
родител
ревизия
48af0ba722

+ 2 - 2
src/Symfony/Component/Locale/Stub/DateFormat/FullTransformer.php

@@ -155,7 +155,7 @@ class FullTransformer
         }
 
         // behave like the intl extension
-        StubIntl::setErrorCode(StubIntl::U_PARSE_ERROR);
+        StubIntl::setError(StubIntl::U_PARSE_ERROR, 'Date parsing failed');
 
         return false;
     }
@@ -292,7 +292,7 @@ class FullTransformer
 
         // If month is false, return immediately (intl behavior)
         if (false === $month) {
-            StubIntl::setErrorCode(StubIntl::U_PARSE_ERROR);
+            StubIntl::setError(StubIntl::U_PARSE_ERROR, 'Date parsing failed');
 
             return false;
         }

+ 16 - 18
src/Symfony/Component/Locale/Stub/StubIntl.php

@@ -45,28 +45,24 @@ abstract class StubIntl
      * @var array
      */
     private static $errorCodes = array(
-        self::U_ZERO_ERROR,
-        self::U_ILLEGAL_ARGUMENT_ERROR,
-        self::U_PARSE_ERROR,
+        self::U_ZERO_ERROR => 'U_ZERO_ERROR',
+        self::U_ILLEGAL_ARGUMENT_ERROR => 'U_ILLEGAL_ARGUMENT_ERROR',
+        self::U_PARSE_ERROR => 'U_PARSE_ERROR',
     );
 
     /**
-     * The error messages of all known error codes
+     * The error code of the last operation
      *
-     * @var array
+     * @var integer
      */
-    private static $errorMessages = array(
-        self::U_ZERO_ERROR => 'U_ZERO_ERROR',
-        self::U_ILLEGAL_ARGUMENT_ERROR => 'datefmt_format: takes either an array  or an integer timestamp value : U_ILLEGAL_ARGUMENT_ERROR',
-        self::U_PARSE_ERROR => 'Date parsing failed: U_PARSE_ERROR',
-    );
+    private static $errorCode = self::U_ZERO_ERROR;
 
     /**
      * The error code of the last operation
      *
      * @var integer
      */
-    private static $errorCode = self::U_ZERO_ERROR;
+    private static $errorMessage = 'U_ZERO_ERROR';
 
     /**
      * Returns whether the error code indicates a failure
@@ -77,8 +73,8 @@ abstract class StubIntl
      */
     static public function isFailure($errorCode)
     {
-        return in_array($errorCode, self::$errorCodes, true)
-            && $errorCode !== self::U_ZERO_ERROR;
+        return isset(self::$errorCodes[$errorCode])
+            && $errorCode > self::U_ZERO_ERROR;
     }
 
     /**
@@ -102,22 +98,24 @@ abstract class StubIntl
      */
     static public function getErrorMessage()
     {
-        return self::$errorMessages[self::$errorCode];
+        return self::$errorMessage;
     }
 
     /**
-     * Sets the current error code
+     * Sets the current error
      *
-     * @param  integer $code  One of the error constants in this class
+     * @param  integer $code     One of the error constants in this class
+     * @param  string  $message  The ICU class error message
      *
      * @throws \InvalidArgumentException If the code is not one of the error constants in this class
      */
-    static public function setErrorCode($code)
+    static public function setError($code, $message = '')
     {
-        if (!isset(self::$errorMessages[$code])) {
+        if (!isset(self::$errorCodes[$code])) {
             throw new \InvalidArgumentException(sprintf('No such error code: "%s"', $code));
         }
 
+        self::$errorMessage = $message ? sprintf('%s: %s', $message, self::$errorCodes[$code]) : self::$errorCodes[$code];
         self::$errorCode = $code;
     }
 }

+ 21 - 12
src/Symfony/Component/Locale/Stub/StubIntlDateFormatter.php

@@ -26,14 +26,18 @@ use Symfony\Component\Locale\Exception\MethodArgumentValueNotImplementedExceptio
 class StubIntlDateFormatter
 {
     /**
-     * Constants defined by the intl extension, not class constants in IntlDateFormatter
-     * TODO: remove if the Form component drop the call to the intl_is_failure() function
+     * The error code from the last operation
      *
-     * @see StubIntlDateFormatter::getErrorCode()
-     * @see StubIntlDateFormatter::getErrorMessage()
+     * @var integer
      */
-    const U_ZERO_ERROR = 0;
-    const U_ZERO_ERROR_MESSAGE = 'U_ZERO_ERROR';
+    protected $errorCode = StubIntl::U_ZERO_ERROR;
+
+    /**
+     * The error message from the last operation
+     *
+     * @var string
+     */
+    protected $errorMessage = 'U_ZERO_ERROR';
 
     /* date/time format types */
     const NONE = -1;
@@ -176,7 +180,7 @@ class StubIntlDateFormatter
 
         // behave like the intl extension
         if (!is_int($timestamp) && version_compare(\PHP_VERSION, '5.3.4', '<')) {
-            StubIntl::setErrorCode(StubIntl::U_ILLEGAL_ARGUMENT_ERROR);
+            StubIntl::setError(StubIntl::U_ILLEGAL_ARGUMENT_ERROR, 'datefmt_format: takes either an array  or an integer timestamp value ');
 
             return false;
         }
@@ -225,7 +229,7 @@ class StubIntlDateFormatter
      */
     public function getErrorCode()
     {
-        return self::U_ZERO_ERROR;
+        return $this->errorCode;
     }
 
     /**
@@ -237,7 +241,7 @@ class StubIntlDateFormatter
      */
     public function getErrorMessage()
     {
-        return self::U_ZERO_ERROR_MESSAGE;
+        return $this->errorMessage;
     }
 
     /**
@@ -350,12 +354,17 @@ class StubIntlDateFormatter
             throw new MethodArgumentNotImplementedException(__METHOD__, 'position');
         }
 
-        StubIntl::setErrorCode(StubIntl::U_ZERO_ERROR);
-
         $dateTime = $this->createDateTime(0);
         $transformer = new FullTransformer($this->getPattern(), $this->getTimeZoneId());
 
-        return $transformer->parse($dateTime, $value);
+        $timestamp = $transformer->parse($dateTime, $value);
+
+        if (false === $timestamp) {
+            $this->errorCode = StubIntl::getErrorCode();
+            $this->errorMessage = StubIntl::getErrorMessage();
+        }
+
+        return $timestamp;
     }
 
     /**

+ 10 - 21
src/Symfony/Component/Locale/Stub/StubNumberFormatter.php

@@ -25,31 +25,18 @@ use Symfony\Component\Locale\Exception\MethodArgumentValueNotImplementedExceptio
 class StubNumberFormatter
 {
     /**
-     * Constants defined by the intl extension, not class constants in NumberFormatter
-     * TODO: remove if the Form component drop the call to the intl_is_failure() function
-     *
-     * @see StubNumberFormatter::getErrorCode()
-     * @see StubNumberFormatter::getErrorMessage()
-     */
-    const U_ZERO_ERROR = 0;
-    const U_PARSE_ERROR = 9;
-
-    /**
-     * The error messages for each error code
+     * The error code from the last operation
      *
-     * @var array
+     * @var integer
      */
-    protected $errorMessages = array(
-        self::U_ZERO_ERROR => 'U_ZERO_ERROR',
-        self::U_PARSE_ERROR => 'Number parsing failed: U_PARSE_ERROR',
-    );
+    protected $errorCode = StubIntl::U_ZERO_ERROR;
 
     /**
-     * The error code from the last operation
+     * The error message from the last operation
      *
-     * @var integer
+     * @var string
      */
-    protected $errorCode = self::U_ZERO_ERROR;
+    protected $errorMessage = 'U_ZERO_ERROR';
 
     /** Format style constants */
     const PATTERN_DECIMAL   = 0;
@@ -403,7 +390,7 @@ class StubNumberFormatter
      */
     public function getErrorMessage()
     {
-        return $this->errorMessages[$this->errorCode];
+        return $this->errorMessage;
     }
 
     /**
@@ -514,7 +501,9 @@ class StubNumberFormatter
 
         // Any string before the numeric value causes error in the parsing
         if (isset($matches[1]) && !empty($matches[1])) {
-            $this->errorCode = self::U_PARSE_ERROR;
+            StubIntl::setError(StubIntl::U_PARSE_ERROR);
+            $this->errorCode = StubIntl::getErrorCode();
+            $this->errorMessage = StubIntl::getErrorMessage();
 
             return false;
         }

+ 13 - 4
tests/Symfony/Tests/Component/Locale/Stub/StubIntlDateFormatterTest.php

@@ -63,6 +63,9 @@ class StubIntlDateFormatterTest extends LocaleTestCase
         $this->assertSame($errorMessage, StubIntl::getErrorMessage());
         $this->assertSame($errorCode, StubIntl::getErrorCode());
         $this->assertSame($errorCode != 0, StubIntl::isFailure(StubIntl::getErrorCode()));
+        $this->assertSame($errorMessage, $formatter->getErrorMessage());
+        $this->assertSame($errorCode, $formatter->getErrorCode());
+        $this->assertSame($errorCode != 0, StubIntl::isFailure($formatter->getErrorCode()));
     }
 
     /**
@@ -482,13 +485,13 @@ class StubIntlDateFormatterTest extends LocaleTestCase
     public function testGetErrorCode()
     {
         $formatter = $this->createStubFormatter();
-        $this->assertEquals(StubIntlDateFormatter::U_ZERO_ERROR, $formatter->getErrorCode());
+        $this->assertEquals(StubIntl::getErrorCode(), $formatter->getErrorCode());
     }
 
     public function testGetErrorMessage()
     {
         $formatter = $this->createStubFormatter();
-        $this->assertEquals(StubIntlDateFormatter::U_ZERO_ERROR_MESSAGE, $formatter->getErrorMessage());
+        $this->assertEquals(StubIntl::getErrorMessage(), $formatter->getErrorMessage());
     }
 
     public function testGetLocale()
@@ -556,6 +559,9 @@ class StubIntlDateFormatterTest extends LocaleTestCase
         $this->assertSame($errorMessage, StubIntl::getErrorMessage());
         $this->assertSame($errorCode, StubIntl::getErrorCode());
         $this->assertSame($errorCode != 0, StubIntl::isFailure(StubIntl::getErrorCode()));
+        $this->assertSame($errorMessage, $formatter->getErrorMessage());
+        $this->assertSame($errorCode, $formatter->getErrorCode());
+        $this->assertSame($errorCode != 0, StubIntl::isFailure($formatter->getErrorCode()));
     }
 
     public function parseProvider()
@@ -711,7 +717,7 @@ class StubIntlDateFormatterTest extends LocaleTestCase
 
         $this->skipIfIntlExtensionIsNotLoaded();
         $formatter = $this->createIntlFormatter($pattern);
-        $this->assertSame(false, $formatter->parse($value));
+        $this->assertFalse($formatter->parse($value));
         $this->assertSame($errorMessage, intl_get_error_message());
         $this->assertSame($errorCode, intl_get_error_code());
         $this->assertSame($errorCode != 0, intl_is_failure(intl_get_error_code()));
@@ -726,10 +732,13 @@ class StubIntlDateFormatterTest extends LocaleTestCase
         $errorMessage = 'Date parsing failed: U_PARSE_ERROR';
 
         $formatter = $this->createStubFormatter($pattern);
-        $this->assertSame(false, $formatter->parse($value));
+        $this->assertFalse($formatter->parse($value));
         $this->assertSame($errorMessage, StubIntl::getErrorMessage());
         $this->assertSame($errorCode, StubIntl::getErrorCode());
         $this->assertSame($errorCode != 0, StubIntl::isFailure(StubIntl::getErrorCode()));
+        $this->assertSame($errorMessage, $formatter->getErrorMessage());
+        $this->assertSame($errorCode, $formatter->getErrorCode());
+        $this->assertSame($errorCode != 0, StubIntl::isFailure($formatter->getErrorCode()));
     }
 
     public function parseErrorProvider()

+ 4 - 3
tests/Symfony/Tests/Component/Locale/Stub/StubNumberFormatterTest.php

@@ -14,6 +14,7 @@ namespace Symfony\Tests\Component\Locale\Stub;
 require_once __DIR__.'/../TestCase.php';
 
 use Symfony\Component\Locale\Locale;
+use Symfony\Component\Locale\Stub\StubIntl;
 use Symfony\Component\Locale\Stub\StubNumberFormatter;
 use Symfony\Tests\Component\Locale\TestCase as LocaleTestCase;
 
@@ -613,7 +614,7 @@ class StubNumberFormatterTest extends LocaleTestCase
     public function testGetErrorCode()
     {
         $formatter = $this->getStubFormatterWithDecimalStyle();
-        $this->assertEquals(StubNumberFormatter::U_ZERO_ERROR, $formatter->getErrorCode());
+        $this->assertEquals(StubIntl::U_ZERO_ERROR, $formatter->getErrorCode());
     }
 
     public function testGetLocale()
@@ -668,9 +669,9 @@ class StubNumberFormatterTest extends LocaleTestCase
         $this->assertSame($expected, $parsedValue, $message);
 
         if ($expected === false) {
-            $this->assertSame($formatter::U_PARSE_ERROR, $formatter->getErrorCode());
+            $this->assertSame(StubIntl::U_PARSE_ERROR, $formatter->getErrorCode());
         } else {
-            $this->assertEquals($formatter::U_ZERO_ERROR, $formatter->getErrorCode());
+            $this->assertEquals(StubIntl::U_ZERO_ERROR, $formatter->getErrorCode());
         }
     }