Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from Apr 15, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down
34 changes: 16 additions & 18 deletions src/Symfony/Component/Locale/Stub/StubIntl.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
}

/**
Expand All @@ -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;
}
}
33 changes: 21 additions & 12 deletions src/Symfony/Component/Locale/Stub/StubIntlDateFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -225,7 +229,7 @@ public function getDateType()
*/
public function getErrorCode()
{
return self::U_ZERO_ERROR;
return $this->errorCode;
}

/**
Expand All @@ -237,7 +241,7 @@ public function getErrorCode()
*/
public function getErrorMessage()
{
return self::U_ZERO_ERROR_MESSAGE;
return $this->errorMessage;
}

/**
Expand Down Expand Up @@ -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;
}

/**
Expand Down
31 changes: 10 additions & 21 deletions src/Symfony/Component/Locale/Stub/StubNumberFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -403,7 +390,7 @@ public function getErrorCode()
*/
public function getErrorMessage()
{
return $this->errorMessages[$this->errorCode];
return $this->errorMessage;
}

/**
Expand Down Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()));
}

/**
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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()));
Expand All @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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());
}
}

Expand Down