Permalink
Browse files

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.
  • Loading branch information...
2 parents 9af658a + b1ea552 commit 48af0ba722c261e643ad32df5e75bdbd588f31c8 @fabpot fabpot committed Apr 15, 2012
@@ -155,7 +155,7 @@ public function parse(\DateTime $dateTime, $value)
}
// 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 @@ protected function calculateUnixTimestamp(\DateTime $dateTime, array $options)
// 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;
}
@@ -45,28 +45,24 @@
* @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 @@
*/
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 @@ static public function getErrorCode()
*/
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;
}
}
@@ -26,14 +26,18 @@
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 @@ public function format($timestamp)
// 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 @@ public function getDateType()
*/
public function getErrorCode()
{
- return self::U_ZERO_ERROR;
+ return $this->errorCode;
}
/**
@@ -237,7 +241,7 @@ public function getErrorCode()
*/
public function getErrorMessage()
{
- return self::U_ZERO_ERROR_MESSAGE;
+ return $this->errorMessage;
}
/**
@@ -350,12 +354,17 @@ public function parse($value, &$position = null)
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;
}
/**
@@ -25,31 +25,18 @@
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 @@ public function getErrorCode()
*/
public function getErrorMessage()
{
- return $this->errorMessages[$this->errorCode];
+ return $this->errorMessage;
}
/**
@@ -514,7 +501,9 @@ public function parse($value, $type = self::TYPE_DOUBLE, &$position = null)
// 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;
}
@@ -63,6 +63,9 @@ public function testFormatStub($pattern, $timestamp, $expected, $errorCode = 0,
$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 @@ public function testGetDateType()
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 @@ public function testParseStub($pattern, $value, $expected)
$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 @@ public function testParseErrorIntl($pattern, $value)
$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 @@ public function testParseErrorStub($pattern, $value)
$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()
@@ -14,6 +14,7 @@
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 @@ public function formatRoundingModeRoundHalfEvenProvider()
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 @@ public function testParseStub($value, $expected, $message = '')
$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());
}
}

0 comments on commit 48af0ba

Please sign in to comment.