1
0
Fork 0
mirror of https://github.com/wallabag/wallabag.git synced 2025-09-05 18:41:02 +00:00

twig implementation

This commit is contained in:
Nicolas Lœuillet 2013-08-03 19:26:54 +02:00
parent 2b840e0cfb
commit 4f5b44bd3b
1418 changed files with 108207 additions and 1586 deletions

View file

@ -0,0 +1,62 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\Collator;
use Symfony\Component\Intl\Collator\Collator;
use Symfony\Component\Intl\Locale;
/**
* Test case for Collator implementations.
*
* @author Bernhard Schussek <bschussek@gmail.com>
*/
abstract class AbstractCollatorTest extends \PHPUnit_Framework_TestCase
{
/**
* @dataProvider asortProvider
*/
public function testAsort($array, $sortFlag, $expected)
{
$collator = $this->getCollator('en');
$collator->asort($array, $sortFlag);
$this->assertSame($expected, $array);
}
public function asortProvider()
{
return array(
/* array, sortFlag, expected */
array(
array('a', 'b', 'c'),
Collator::SORT_REGULAR,
array('a', 'b', 'c'),
),
array(
array('c', 'b', 'a'),
Collator::SORT_REGULAR,
array(2 => 'a', 1 => 'b', 0 => 'c'),
),
array(
array('b', 'c', 'a'),
Collator::SORT_REGULAR,
array(2 => 'a', 0 => 'b', 1 => 'c'),
),
);
}
/**
* @param string $locale
*
* @return \Collator
*/
abstract protected function getCollator($locale);
}

View file

@ -0,0 +1,109 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\Collator;
use Symfony\Component\Intl\Collator\Collator;
use Symfony\Component\Intl\Globals\IntlGlobals;
class CollatorTest extends AbstractCollatorTest
{
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException
*/
public function testConstructorWithUnsupportedLocale()
{
new Collator('pt_BR');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testCompare()
{
$collator = $this->getCollator('en');
$collator->compare('a', 'b');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetAttribute()
{
$collator = $this->getCollator('en');
$collator->getAttribute(Collator::NUMERIC_COLLATION);
}
public function testGetErrorCode()
{
$collator = $this->getCollator('en');
$this->assertEquals(IntlGlobals::U_ZERO_ERROR, $collator->getErrorCode());
}
public function testGetErrorMessage()
{
$collator = $this->getCollator('en');
$this->assertEquals('U_ZERO_ERROR', $collator->getErrorMessage());
}
public function testGetLocale()
{
$collator = $this->getCollator('en');
$this->assertEquals('en', $collator->getLocale());
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetSortKey()
{
$collator = $this->getCollator('en');
$collator->getSortKey('Hello');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetStrength()
{
$collator = $this->getCollator('en');
$collator->getStrength();
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testSetAttribute()
{
$collator = $this->getCollator('en');
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testSetStrength()
{
$collator = $this->getCollator('en');
$collator->setStrength(Collator::PRIMARY);
}
public function testStaticCreate()
{
$collator = Collator::create('en');
$this->assertInstanceOf('\Symfony\Component\Intl\Collator\Collator', $collator);
}
protected function getCollator($locale)
{
return new Collator($locale);
}
}

View file

@ -0,0 +1,37 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\Collator\Verification;
use Symfony\Component\Intl\Locale;
use Symfony\Component\Intl\Tests\Collator\AbstractCollatorTest;
use Symfony\Component\Intl\Util\IntlTestHelper;
/**
* Verifies that {@link AbstractCollatorTest} matches the behavior of the
* {@link \Collator} class in a specific version of ICU.
*
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class CollatorTest extends AbstractCollatorTest
{
protected function setUp()
{
IntlTestHelper::requireFullIntl($this);
parent::setUp();
}
protected function getCollator($locale)
{
return new \Collator($locale);
}
}

View file

@ -0,0 +1,932 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\DateFormatter;
use Symfony\Component\Intl\DateFormatter\IntlDateFormatter;
use Symfony\Component\Intl\Globals\IntlGlobals;
use Symfony\Component\Intl\Intl;
/**
* Test case for IntlDateFormatter implementations.
*
* @author Bernhard Schussek <bschussek@gmail.com>
*/
abstract class AbstractIntlDateFormatterTest extends \PHPUnit_Framework_TestCase
{
/**
* When a time zone is not specified, it uses the system default however it returns null in the getter method
* @covers Symfony\Component\Intl\DateFormatter\IntlDateFormatter::getTimeZoneId
* @see StubIntlDateFormatterTest::testDefaultTimeZoneIntl()
*/
public function testConstructorDefaultTimeZone()
{
$formatter = $this->getDateFormatter('en', IntlDateFormatter::MEDIUM, IntlDateFormatter::SHORT);
// In PHP 5.5 default timezone depends on `date_default_timezone_get()` method
if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
$this->assertEquals(date_default_timezone_get(), $formatter->getTimeZoneId());
} else {
$this->assertNull($formatter->getTimeZoneId());
}
}
/**
* @dataProvider formatProvider
*/
public function testFormat($pattern, $timestamp, $expected)
{
$errorCode = IntlGlobals::U_ZERO_ERROR;
$errorMessage = 'U_ZERO_ERROR';
$formatter = $this->getDefaultDateFormatter($pattern);
$this->assertSame($expected, $formatter->format($timestamp));
$this->assertIsIntlSuccess($formatter, $errorMessage, $errorCode);
}
public function formatProvider()
{
$formatData = array(
/* general */
array('y-M-d', 0, '1970-1-1'),
array("EEE, MMM d, ''yy", 0, "Thu, Jan 1, '70"),
array('h:mm a', 0, '12:00 AM'),
array('yyyyy.MMMM.dd hh:mm aaa', 0, '01970.January.01 12:00 AM'),
/* escaping */
array("'M'", 0, 'M'),
array("'yy'", 0, 'yy'),
array("'''yy'", 0, "'yy"),
array("''y", 0, "'1970"),
array("''yy", 0, "'70"),
array("H 'o'' clock'", 0, "0 o' clock"),
/* month */
array('M', 0, '1'),
array('MM', 0, '01'),
array('MMM', 0, 'Jan'),
array('MMMM', 0, 'January'),
array('MMMMM', 0, 'J'),
array('MMMMMM', 0, '000001'),
array('L', 0, '1'),
array('LL', 0, '01'),
array('LLL', 0, 'Jan'),
array('LLLL', 0, 'January'),
array('LLLLL', 0, 'J'),
array('LLLLLL', 0, '000001'),
/* year */
array('y', 0, '1970'),
array('yy', 0, '70'),
array('yyy', 0, '1970'),
array('yyyy', 0, '1970'),
array('yyyyy', 0, '01970'),
array('yyyyyy', 0, '001970'),
/* day */
array('d', 0, '1'),
array('dd', 0, '01'),
array('ddd', 0, '001'),
/* quarter */
array('Q', 0, '1'),
array('QQ', 0, '01'),
array('QQQ', 0, 'Q1'),
array('QQQQ', 0, '1st quarter'),
array('QQQQQ', 0, '1st quarter'),
array('q', 0, '1'),
array('qq', 0, '01'),
array('qqq', 0, 'Q1'),
array('qqqq', 0, '1st quarter'),
array('qqqqq', 0, '1st quarter'),
// 4 months
array('Q', 7776000, '2'),
array('QQ', 7776000, '02'),
array('QQQ', 7776000, 'Q2'),
array('QQQQ', 7776000, '2nd quarter'),
// 7 months
array('QQQQ', 15638400, '3rd quarter'),
// 10 months
array('QQQQ', 23587200, '4th quarter'),
/* 12-hour (1-12) */
array('h', 0, '12'),
array('hh', 0, '12'),
array('hhh', 0, '012'),
array('h', 1, '12'),
array('h', 3600, '1'),
array('h', 43200, '12'), // 12 hours
/* day of year */
array('D', 0, '1'),
array('D', 86400, '2'), // 1 day
array('D', 31536000, '1'), // 1 year
array('D', 31622400, '2'), // 1 year + 1 day
/* day of week */
array('E', 0, 'Thu'),
array('EE', 0, 'Thu'),
array('EEE', 0, 'Thu'),
array('EEEE', 0, 'Thursday'),
array('EEEEE', 0, 'T'),
array('EEEEEE', 0, 'Thu'),
array('E', 1296540000, 'Tue'), // 2011-02-01
array('E', 1296950400, 'Sun'), // 2011-02-06
/* am/pm marker */
array('a', 0, 'AM'),
array('aa', 0, 'AM'),
array('aaa', 0, 'AM'),
array('aaaa', 0, 'AM'),
// 12 hours
array('a', 43200, 'PM'),
array('aa', 43200, 'PM'),
array('aaa', 43200, 'PM'),
array('aaaa', 43200, 'PM'),
/* 24-hour (0-23) */
array('H', 0, '0'),
array('HH', 0, '00'),
array('HHH', 0, '000'),
array('H', 1, '0'),
array('H', 3600, '1'),
array('H', 43200, '12'),
array('H', 46800, '13'),
/* 24-hour (1-24) */
array('k', 0, '24'),
array('kk', 0, '24'),
array('kkk', 0, '024'),
array('k', 1, '24'),
array('k', 3600, '1'),
array('k', 43200, '12'),
array('k', 46800, '13'),
/* 12-hour (0-11) */
array('K', 0, '0'),
array('KK', 0, '00'),
array('KKK', 0, '000'),
array('K', 1, '0'),
array('K', 3600, '1'),
array('K', 43200, '0'), // 12 hours
/* minute */
array('m', 0, '0'),
array('mm', 0, '00'),
array('mmm', 0, '000'),
array('m', 1, '0'),
array('m', 60, '1'),
array('m', 120, '2'),
array('m', 180, '3'),
array('m', 3600, '0'),
array('m', 3660, '1'),
array('m', 43200, '0'), // 12 hours
/* second */
array('s', 0, '0'),
array('ss', 0, '00'),
array('sss', 0, '000'),
array('s', 1, '1'),
array('s', 2, '2'),
array('s', 5, '5'),
array('s', 30, '30'),
array('s', 59, '59'),
array('s', 60, '0'),
array('s', 120, '0'),
array('s', 180, '0'),
array('s', 3600, '0'),
array('s', 3601, '1'),
array('s', 3630, '30'),
array('s', 43200, '0'), // 12 hours
// general
array("yyyy.MM.dd 'at' HH:mm:ss zzz", 0, '1970.01.01 at 00:00:00 GMT'),
array('K:mm a, z', 0, '0:00 AM, GMT'),
// timezone
array('z', 0, 'GMT'),
array('zz', 0, 'GMT'),
array('zzz', 0, 'GMT'),
array('zzzz', 0, 'GMT'),
array('zzzzz', 0, 'GMT'),
);
// As of PHP 5.3.4, IntlDateFormatter::format() accepts DateTime instances
if (version_compare(PHP_VERSION, '5.3.4', '>=')) {
$dateTime = new \DateTime('@0');
/* general, DateTime */
$formatData[] = array('y-M-d', $dateTime, '1970-1-1');
$formatData[] = array("EEE, MMM d, ''yy", $dateTime, "Thu, Jan 1, '70");
$formatData[] = array('h:mm a', $dateTime, '12:00 AM');
$formatData[] = array('yyyyy.MMMM.dd hh:mm aaa', $dateTime, '01970.January.01 12:00 AM');
$formatData[] = array("yyyy.MM.dd 'at' HH:mm:ss zzz", $dateTime, '1970.01.01 at 00:00:00 GMT');
$formatData[] = array('K:mm a, z', $dateTime, '0:00 AM, GMT');
}
return $formatData;
}
/**
* @dataProvider formatErrorProvider
*/
public function testFormatIllegalArgumentError($pattern, $timestamp, $errorMessage)
{
$errorCode = IntlGlobals::U_ILLEGAL_ARGUMENT_ERROR;
$formatter = $this->getDefaultDateFormatter($pattern);
$this->assertFalse($formatter->format($timestamp));
$this->assertIsIntlFailure($formatter, $errorMessage, $errorCode);
}
public function formatErrorProvider()
{
// With PHP 5.5 IntlDateFormatter accepts empty values ('0')
if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
return array(
array('y-M-d', 'foobar', 'datefmt_format: string \'foobar\' is not numeric, which would be required for it to be a valid date: U_ILLEGAL_ARGUMENT_ERROR')
);
}
$message = 'datefmt_format: takes either an array or an integer timestamp value : U_ILLEGAL_ARGUMENT_ERROR';
if (version_compare(PHP_VERSION, '5.3.4', '>=')) {
$message = 'datefmt_format: takes either an array or an integer timestamp value or a DateTime object: U_ILLEGAL_ARGUMENT_ERROR';
}
return array(
array('y-M-d', '0', $message),
array('y-M-d', 'foobar', $message),
);
}
/**
* @dataProvider formatWithTimezoneProvider
*/
public function testFormatWithTimezone($timestamp, $timezone, $expected)
{
$pattern = 'yyyy-MM-dd HH:mm:ss';
$formatter = $this->getDateFormatter('en', IntlDateFormatter::MEDIUM, IntlDateFormatter::SHORT, $timezone, IntlDateFormatter::GREGORIAN, $pattern);
$this->assertSame($expected, $formatter->format($timestamp));
}
public function formatWithTimezoneProvider()
{
$data = array(
array(0, 'UTC', '1970-01-01 00:00:00'),
array(0, 'GMT', '1970-01-01 00:00:00'),
array(0, 'GMT-03:00', '1969-12-31 21:00:00'),
array(0, 'GMT+03:00', '1970-01-01 03:00:00'),
array(0, 'Europe/Zurich', '1970-01-01 01:00:00'),
array(0, 'Europe/Paris', '1970-01-01 01:00:00'),
array(0, 'Africa/Cairo', '1970-01-01 02:00:00'),
array(0, 'Africa/Casablanca', '1970-01-01 00:00:00'),
array(0, 'Africa/Djibouti', '1970-01-01 03:00:00'),
array(0, 'Africa/Johannesburg', '1970-01-01 02:00:00'),
array(0, 'America/Antigua', '1969-12-31 20:00:00'),
array(0, 'America/Toronto', '1969-12-31 19:00:00'),
array(0, 'America/Vancouver', '1969-12-31 16:00:00'),
array(0, 'Asia/Aqtau', '1970-01-01 05:00:00'),
array(0, 'Asia/Bangkok', '1970-01-01 07:00:00'),
array(0, 'Asia/Dubai', '1970-01-01 04:00:00'),
array(0, 'Australia/Brisbane', '1970-01-01 10:00:00'),
array(0, 'Australia/Eucla', '1970-01-01 08:45:00'),
array(0, 'Australia/Melbourne', '1970-01-01 10:00:00'),
array(0, 'Europe/Berlin', '1970-01-01 01:00:00'),
array(0, 'Europe/Dublin', '1970-01-01 01:00:00'),
array(0, 'Europe/Warsaw', '1970-01-01 01:00:00'),
array(0, 'Pacific/Fiji', '1970-01-01 12:00:00'),
);
// As of PHP 5.5, intl ext no longer fallbacks invalid time zones to UTC
if (!version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
// When time zone not exists, uses UTC by default
$data[] = array(0, 'Foo/Bar', '1970-01-01 00:00:00');
$data[] = array(0, 'UTC+04:30', '1970-01-01 00:00:00');
$data[] = array(0, 'UTC+04:AA', '1970-01-01 00:00:00');
}
return $data;
}
public function testFormatWithGmtTimezone()
{
$formatter = $this->getDefaultDateFormatter('zzzz');
if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
$formatter->setTimeZone('GMT+03:00');
} else {
$formatter->setTimeZoneId('GMT+03:00');
}
$this->assertEquals('GMT+03:00', $formatter->format(0));
}
public function testFormatWithGmtTimeZoneAndMinutesOffset()
{
$formatter = $this->getDefaultDateFormatter('zzzz');
if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
$formatter->setTimeZone('GMT+00:30');
} else {
$formatter->setTimeZoneId('GMT+00:30');
}
$this->assertEquals('GMT+00:30', $formatter->format(0));
}
public function testFormatWithNonStandardTimezone()
{
$formatter = $this->getDefaultDateFormatter('zzzz');
if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
$formatter->setTimeZone('Pacific/Fiji');
} else {
$formatter->setTimeZoneId('Pacific/Fiji');
}
$this->assertEquals('Fiji Standard Time', $formatter->format(0));
}
public function testFormatWithConstructorTimezone()
{
$formatter = $this->getDateFormatter('en', IntlDateFormatter::MEDIUM, IntlDateFormatter::SHORT, 'UTC');
$formatter->setPattern('yyyy-MM-dd HH:mm:ss');
$this->assertEquals(
$this->getDateTime(0)->format('Y-m-d H:i:s'),
$formatter->format(0)
);
}
public function testFormatWithTimezoneFromEnvironmentVariable()
{
if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
$this->markTestSkipped('IntlDateFormatter in PHP 5.5 no longer depends on TZ environment.');
}
$tz = getenv('TZ');
putenv('TZ=Europe/London');
$formatter = $this->getDateFormatter('en', IntlDateFormatter::MEDIUM, IntlDateFormatter::SHORT);
$formatter->setPattern('yyyy-MM-dd HH:mm:ss');
$this->assertEquals(
$this->getDateTime(0)->format('Y-m-d H:i:s'),
$formatter->format(0)
);
$this->assertEquals('Europe/London', getenv('TZ'));
// Restores TZ.
putenv('TZ='.$tz);
}
public function testFormatWithTimezoneFromPhp()
{
if (!version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
$this->markTestSkipped('Only in PHP 5.5 IntlDateFormatter depends on default timezone (`date_default_timezone_get()`).');
}
$tz = date_default_timezone_get();
date_default_timezone_set('Europe/London');
$formatter = $this->getDateFormatter('en', IntlDateFormatter::MEDIUM, IntlDateFormatter::SHORT);
$formatter->setPattern('yyyy-MM-dd HH:mm:ss');
$this->assertEquals(
$this->getDateTime(0)->format('Y-m-d H:i:s'),
$formatter->format(0)
);
$this->assertEquals('Europe/London', date_default_timezone_get());
// Restores TZ.
date_default_timezone_set($tz);
}
/**
* @dataProvider dateAndTimeTypeProvider
*/
public function testDateAndTimeType($timestamp, $datetype, $timetype, $expected)
{
$formatter = $this->getDateFormatter('en', $datetype, $timetype, 'UTC');
$this->assertSame($expected, $formatter->format($timestamp));
}
public function dateAndTimeTypeProvider()
{
return array(
array(0, IntlDateFormatter::FULL, IntlDateFormatter::NONE, 'Thursday, January 1, 1970'),
array(0, IntlDateFormatter::LONG, IntlDateFormatter::NONE, 'January 1, 1970'),
array(0, IntlDateFormatter::MEDIUM, IntlDateFormatter::NONE, 'Jan 1, 1970'),
array(0, IntlDateFormatter::SHORT, IntlDateFormatter::NONE, '1/1/70'),
array(0, IntlDateFormatter::NONE, IntlDateFormatter::FULL, '12:00:00 AM GMT'),
array(0, IntlDateFormatter::NONE, IntlDateFormatter::LONG, '12:00:00 AM GMT'),
array(0, IntlDateFormatter::NONE, IntlDateFormatter::MEDIUM, '12:00:00 AM'),
array(0, IntlDateFormatter::NONE, IntlDateFormatter::SHORT, '12:00 AM'),
);
}
public function testGetCalendar()
{
$formatter = $this->getDefaultDateFormatter();
$this->assertEquals(IntlDateFormatter::GREGORIAN, $formatter->getCalendar());
}
public function testGetDateType()
{
$formatter = $this->getDateFormatter('en', IntlDateFormatter::FULL, IntlDateFormatter::NONE);
$this->assertEquals(IntlDateFormatter::FULL, $formatter->getDateType());
}
public function testGetLocale()
{
$formatter = $this->getDefaultDateFormatter();
$this->assertEquals('en', $formatter->getLocale());
}
public function testGetPattern()
{
$formatter = $this->getDateFormatter('en', IntlDateFormatter::FULL, IntlDateFormatter::NONE, 'UTC', IntlDateFormatter::GREGORIAN, 'yyyy-MM-dd');
$this->assertEquals('yyyy-MM-dd', $formatter->getPattern());
}
public function testGetTimeType()
{
$formatter = $this->getDateFormatter('en', IntlDateFormatter::NONE, IntlDateFormatter::FULL);
$this->assertEquals(IntlDateFormatter::FULL, $formatter->getTimeType());
}
/**
* @dataProvider parseProvider
*/
public function testParse($pattern, $value, $expected)
{
$errorCode = IntlGlobals::U_ZERO_ERROR;
$errorMessage = 'U_ZERO_ERROR';
$formatter = $this->getDefaultDateFormatter($pattern);
$this->assertSame($expected, $formatter->parse($value));
$this->assertIsIntlSuccess($formatter, $errorMessage, $errorCode);
}
public function parseProvider()
{
return array_merge(
$this->parseYearProvider(),
$this->parseQuarterProvider(),
$this->parseMonthProvider(),
$this->parseStandaloneMonthProvider(),
$this->parseDayProvider(),
$this->parseDayOfWeekProvider(),
$this->parseDayOfYearProvider(),
$this->parseHour12ClockOneBasedProvider(),
$this->parseHour12ClockZeroBasedProvider(),
$this->parseHour24ClockOneBasedProvider(),
$this->parseHour24ClockZeroBasedProvider(),
$this->parseMinuteProvider(),
$this->parseSecondProvider(),
$this->parseTimezoneProvider(),
$this->parseAmPmProvider(),
$this->parseStandaloneAmPmProvider(),
$this->parseRegexMetaCharsProvider(),
$this->parseQuoteCharsProvider(),
$this->parseDashSlashProvider()
);
}
public function parseYearProvider()
{
return array(
array('y-M-d', '1970-1-1', 0),
array('yy-M-d', '70-1-1', 0),
);
}
public function parseQuarterProvider()
{
return array(
array('Q', '1', 0),
array('QQ', '01', 0),
array('QQQ', 'Q1', 0),
array('QQQQ', '1st quarter', 0),
array('QQQQQ', '1st quarter', 0),
array('Q', '2', 7776000),
array('QQ', '02', 7776000),
array('QQQ', 'Q2', 7776000),
array('QQQQ', '2nd quarter', 7776000),
array('QQQQQ', '2nd quarter', 7776000),
array('q', '1', 0),
array('qq', '01', 0),
array('qqq', 'Q1', 0),
array('qqqq', '1st quarter', 0),
array('qqqqq', '1st quarter', 0),
);
}
public function parseMonthProvider()
{
return array(
array('y-M-d', '1970-1-1', 0),
array('y-MMM-d', '1970-Jan-1', 0),
array('y-MMMM-d', '1970-January-1', 0),
);
}
public function parseStandaloneMonthProvider()
{
return array(
array('y-L-d', '1970-1-1', 0),
array('y-LLL-d', '1970-Jan-1', 0),
array('y-LLLL-d', '1970-January-1', 0),
);
}
public function parseDayProvider()
{
return array(
array('y-M-d', '1970-1-1', 0),
array('y-M-dd', '1970-1-01', 0),
array('y-M-ddd', '1970-1-001', 0),
);
}
public function parseDayOfWeekProvider()
{
return array(
array('E', 'Thu', 0),
array('EE', 'Thu', 0),
array('EEE', 'Thu', 0),
array('EEEE', 'Thursday', 0),
array('EEEEE', 'T', 432000),
array('EEEEEE', 'Thu', 0),
);
}
public function parseDayOfYearProvider()
{
return array(
array('D', '1', 0),
array('D', '2', 86400),
);
}
public function parseHour12ClockOneBasedProvider()
{
return array(
// 12 hours (1-12)
array('y-M-d h', '1970-1-1 1', 3600),
array('y-M-d h', '1970-1-1 10', 36000),
array('y-M-d hh', '1970-1-1 11', 39600),
array('y-M-d hh', '1970-1-1 12', 0),
array('y-M-d hh a', '1970-1-1 0 AM', 0),
array('y-M-d hh a', '1970-1-1 1 AM', 3600),
array('y-M-d hh a', '1970-1-1 10 AM', 36000),
array('y-M-d hh a', '1970-1-1 11 AM', 39600),
array('y-M-d hh a', '1970-1-1 12 AM', 0),
array('y-M-d hh a', '1970-1-1 23 AM', 82800),
array('y-M-d hh a', '1970-1-1 24 AM', 86400),
array('y-M-d hh a', '1970-1-1 0 PM', 43200),
array('y-M-d hh a', '1970-1-1 1 PM', 46800),
array('y-M-d hh a', '1970-1-1 10 PM', 79200),
array('y-M-d hh a', '1970-1-1 11 PM', 82800),
array('y-M-d hh a', '1970-1-1 12 PM', 43200),
array('y-M-d hh a', '1970-1-1 23 PM', 126000),
array('y-M-d hh a', '1970-1-1 24 PM', 129600),
);
}
public function parseHour12ClockZeroBasedProvider()
{
return array(
// 12 hours (0-11)
array('y-M-d K', '1970-1-1 1', 3600),
array('y-M-d K', '1970-1-1 10', 36000),
array('y-M-d KK', '1970-1-1 11', 39600),
array('y-M-d KK', '1970-1-1 12', 43200),
array('y-M-d KK a', '1970-1-1 0 AM', 0),
array('y-M-d KK a', '1970-1-1 1 AM', 3600),
array('y-M-d KK a', '1970-1-1 10 AM', 36000),
array('y-M-d KK a', '1970-1-1 11 AM', 39600),
array('y-M-d KK a', '1970-1-1 12 AM', 43200),
array('y-M-d KK a', '1970-1-1 23 AM', 82800),
array('y-M-d KK a', '1970-1-1 24 AM', 86400),
array('y-M-d KK a', '1970-1-1 0 PM', 43200),
array('y-M-d KK a', '1970-1-1 1 PM', 46800),
array('y-M-d KK a', '1970-1-1 10 PM', 79200),
array('y-M-d KK a', '1970-1-1 11 PM', 82800),
array('y-M-d KK a', '1970-1-1 12 PM', 86400),
array('y-M-d KK a', '1970-1-1 23 PM', 126000),
array('y-M-d KK a', '1970-1-1 24 PM', 129600),
);
}
public function parseHour24ClockOneBasedProvider()
{
return array(
// 24 hours (1-24)
array('y-M-d k', '1970-1-1 1', 3600),
array('y-M-d k', '1970-1-1 10', 36000),
array('y-M-d kk', '1970-1-1 11', 39600),
array('y-M-d kk', '1970-1-1 12', 43200),
array('y-M-d kk', '1970-1-1 23', 82800),
array('y-M-d kk', '1970-1-1 24', 0),
array('y-M-d kk a', '1970-1-1 0 AM', 0),
array('y-M-d kk a', '1970-1-1 1 AM', 0),
array('y-M-d kk a', '1970-1-1 10 AM', 0),
array('y-M-d kk a', '1970-1-1 11 AM', 0),
array('y-M-d kk a', '1970-1-1 12 AM', 0),
array('y-M-d kk a', '1970-1-1 23 AM', 0),
array('y-M-d kk a', '1970-1-1 24 AM', 0),
array('y-M-d kk a', '1970-1-1 0 PM', 43200),
array('y-M-d kk a', '1970-1-1 1 PM', 43200),
array('y-M-d kk a', '1970-1-1 10 PM', 43200),
array('y-M-d kk a', '1970-1-1 11 PM', 43200),
array('y-M-d kk a', '1970-1-1 12 PM', 43200),
array('y-M-d kk a', '1970-1-1 23 PM', 43200),
array('y-M-d kk a', '1970-1-1 24 PM', 43200),
);
}
public function parseHour24ClockZeroBasedProvider()
{
return array(
// 24 hours (0-23)
array('y-M-d H', '1970-1-1 0', 0),
array('y-M-d H', '1970-1-1 1', 3600),
array('y-M-d H', '1970-1-1 10', 36000),
array('y-M-d HH', '1970-1-1 11', 39600),
array('y-M-d HH', '1970-1-1 12', 43200),
array('y-M-d HH', '1970-1-1 23', 82800),
array('y-M-d HH a', '1970-1-1 0 AM', 0),
array('y-M-d HH a', '1970-1-1 1 AM', 0),
array('y-M-d HH a', '1970-1-1 10 AM', 0),
array('y-M-d HH a', '1970-1-1 11 AM', 0),
array('y-M-d HH a', '1970-1-1 12 AM', 0),
array('y-M-d HH a', '1970-1-1 23 AM', 0),
array('y-M-d HH a', '1970-1-1 24 AM', 0),
array('y-M-d HH a', '1970-1-1 0 PM', 43200),
array('y-M-d HH a', '1970-1-1 1 PM', 43200),
array('y-M-d HH a', '1970-1-1 10 PM', 43200),
array('y-M-d HH a', '1970-1-1 11 PM', 43200),
array('y-M-d HH a', '1970-1-1 12 PM', 43200),
array('y-M-d HH a', '1970-1-1 23 PM', 43200),
array('y-M-d HH a', '1970-1-1 24 PM', 43200),
);
}
public function parseMinuteProvider()
{
return array(
array('y-M-d HH:m', '1970-1-1 0:1', 60),
array('y-M-d HH:mm', '1970-1-1 0:10', 600),
);
}
public function parseSecondProvider()
{
return array(
array('y-M-d HH:mm:s', '1970-1-1 00:01:1', 61),
array('y-M-d HH:mm:ss', '1970-1-1 00:01:10', 70),
);
}
public function parseTimezoneProvider()
{
return array(
array('y-M-d HH:mm:ss zzzz', '1970-1-1 00:00:00 GMT-03:00', 10800),
array('y-M-d HH:mm:ss zzzz', '1970-1-1 00:00:00 GMT-04:00', 14400),
array('y-M-d HH:mm:ss zzzz', '1970-1-1 00:00:00 GMT-00:00', 0),
array('y-M-d HH:mm:ss zzzz', '1970-1-1 00:00:00 GMT+03:00', -10800),
array('y-M-d HH:mm:ss zzzz', '1970-1-1 00:00:00 GMT+04:00', -14400),
array('y-M-d HH:mm:ss zzzz', '1970-1-1 00:00:00 GMT-0300', 10800),
array('y-M-d HH:mm:ss zzzz', '1970-1-1 00:00:00 GMT+0300', -10800),
// a previous timezone parsing should not change the timezone for the next parsing
array('y-M-d HH:mm:ss', '1970-1-1 00:00:00', 0),
);
}
public function parseAmPmProvider()
{
return array(
// AM/PM (already covered by hours tests)
array('y-M-d HH:mm:ss a', '1970-1-1 00:00:00 AM', 0),
array('y-M-d HH:mm:ss a', '1970-1-1 00:00:00 PM', 43200),
);
}
public function parseStandaloneAmPmProvider()
{
return array(
array('a', 'AM', 0),
array('a', 'PM', 43200),
);
}
public function parseRegexMetaCharsProvider()
{
return array(
// regexp meta chars in the pattern string
array('y[M-d', '1970[1-1', 0),
array('y[M/d', '1970[1/1', 0),
);
}
public function parseQuoteCharsProvider()
{
return array(
array("'M'", 'M', 0),
array("'yy'", 'yy', 0),
array("'''yy'", "'yy", 0),
array("''y", "'1970", 0),
array("H 'o'' clock'", "0 o' clock", 0),
);
}
public function parseDashSlashProvider()
{
return array(
array('y-M-d', '1970/1/1', 0),
array('yy-M-d', '70/1/1', 0),
array('y/M/d', '1970-1-1', 0),
array('yy/M/d', '70-1-1', 0),
);
}
/**
* @dataProvider parseErrorProvider
*/
public function testParseError($pattern, $value)
{
$errorCode = IntlGlobals::U_PARSE_ERROR;
$errorMessage = 'Date parsing failed: U_PARSE_ERROR';
$formatter = $this->getDefaultDateFormatter($pattern);
$this->assertFalse($formatter->parse($value));
$this->assertIsIntlFailure($formatter, $errorMessage, $errorCode);
}
public function parseErrorProvider()
{
return array(
// 1 char month
array('y-MMMMM-d', '1970-J-1'),
array('y-MMMMM-d', '1970-S-1'),
// standalone 1 char month
array('y-LLLLL-d', '1970-J-1'),
array('y-LLLLL-d', '1970-S-1'),
);
}
/*
* https://github.com/symfony/symfony/issues/4242
*/
public function testParseAfterError()
{
$this->testParseError('y-MMMMM-d', '1970-J-1');
$this->testParse('y-M-d', '1970-1-1', 0);
}
public function testParseWithNullPositionValue()
{
$position = null;
$formatter = $this->getDefaultDateFormatter('y');
$this->assertSame(0, $formatter->parse('1970', $position));
$this->assertNull($position);
}
public function testSetPattern()
{
$formatter = $this->getDefaultDateFormatter();
$formatter->setPattern('yyyy-MM-dd');
$this->assertEquals('yyyy-MM-dd', $formatter->getPattern());
}
/**
* @covers Symfony\Component\Intl\DateFormatter\IntlDateFormatter::getTimeZoneId
* @dataProvider setTimeZoneIdProvider
*/
public function testSetTimeZoneId($timeZoneId, $expectedTimeZoneId)
{
$formatter = $this->getDefaultDateFormatter();
if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
$formatter->setTimeZone($timeZoneId);
} else {
$formatter->setTimeZoneId($timeZoneId);
}
$this->assertEquals($expectedTimeZoneId, $formatter->getTimeZoneId());
}
public function setTimeZoneIdProvider()
{
return array(
array('UTC', 'UTC'),
array('GMT', 'GMT'),
array('GMT-03:00', 'GMT-03:00'),
array('Europe/Zurich', 'Europe/Zurich'),
array('GMT-0300', 'GMT-0300'),
array('Foo/Bar', 'Foo/Bar'),
array('GMT+00:AA', 'GMT+00:AA'),
array('GMT+00AA', 'GMT+00AA'),
);
}
protected function getDefaultDateFormatter($pattern = null)
{
return $this->getDateFormatter('en', IntlDateFormatter::MEDIUM, IntlDateFormatter::SHORT, 'UTC', IntlDateFormatter::GREGORIAN, $pattern);
}
protected function getDateTime($timestamp = null)
{
if (version_compare(PHP_VERSION, '5.5.0-dev', '>=')) {
$timeZone = date_default_timezone_get();
} else {
$timeZone = getenv('TZ') ?: 'UTC';
}
$dateTime = new \DateTime();
$dateTime->setTimestamp(null === $timestamp ? time() : $timestamp);
$dateTime->setTimeZone(new \DateTimeZone($timeZone));
return $dateTime;
}
protected function assertIsIntlFailure($formatter, $errorMessage, $errorCode)
{
$this->assertSame($errorMessage, $this->getIntlErrorMessage());
$this->assertSame($errorCode, $this->getIntlErrorCode());
$this->assertTrue($this->isIntlFailure($this->getIntlErrorCode()));
$this->assertSame($errorMessage, $formatter->getErrorMessage());
$this->assertSame($errorCode, $formatter->getErrorCode());
$this->assertTrue($this->isIntlFailure($formatter->getErrorCode()));
}
protected function assertIsIntlSuccess($formatter, $errorMessage, $errorCode)
{
/* @var IntlDateFormatter $formatter */
$this->assertSame($errorMessage, $this->getIntlErrorMessage());
$this->assertSame($errorCode, $this->getIntlErrorCode());
$this->assertFalse($this->isIntlFailure($this->getIntlErrorCode()));
$this->assertSame($errorMessage, $formatter->getErrorMessage());
$this->assertSame($errorCode, $formatter->getErrorCode());
$this->assertFalse($this->isIntlFailure($formatter->getErrorCode()));
}
/**
* @param $locale
* @param $datetype
* @param $timetype
* @param null $timezone
* @param int $calendar
* @param null $pattern
*
* @return mixed
*/
abstract protected function getDateFormatter($locale, $datetype, $timetype, $timezone = null, $calendar = IntlDateFormatter::GREGORIAN, $pattern = null);
/**
* @return string
*/
abstract protected function getIntlErrorMessage();
/**
* @return integer
*/
abstract protected function getIntlErrorCode();
/**
* @param integer $errorCode
*
* @return Boolean
*/
abstract protected function isIntlFailure($errorCode);
}

View file

@ -0,0 +1,220 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\DateFormatter;
use Symfony\Component\Intl\DateFormatter\IntlDateFormatter;
use Symfony\Component\Intl\Globals\IntlGlobals;
class IntlDateFormatterTest extends AbstractIntlDateFormatterTest
{
public function testConstructor()
{
$formatter = new IntlDateFormatter('en', IntlDateFormatter::MEDIUM, IntlDateFormatter::SHORT, 'UTC', IntlDateFormatter::GREGORIAN, 'y-M-d');
$this->assertEquals('y-M-d', $formatter->getPattern());
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException
*/
public function testConstructorWithUnsupportedLocale()
{
new IntlDateFormatter('pt_BR', IntlDateFormatter::MEDIUM, IntlDateFormatter::SHORT);
}
public function testStaticCreate()
{
$formatter = IntlDateFormatter::create('en', IntlDateFormatter::MEDIUM, IntlDateFormatter::SHORT);
$this->assertInstanceOf('\Symfony\Component\Intl\DateFormatter\IntlDateFormatter', $formatter);
}
public function testFormatWithUnsupportedTimestampArgument()
{
$formatter = $this->getDefaultDateFormatter();
$localtime = array(
'tm_sec' => 59,
'tm_min' => 3,
'tm_hour' => 15,
'tm_mday' => 15,
'tm_mon' => 3,
'tm_year' => 112,
'tm_wday' => 0,
'tm_yday' => 105,
'tm_isdst' => 0
);
try {
$formatter->format($localtime);
} catch (\Exception $e) {
$this->assertInstanceOf('Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException', $e);
if (version_compare(PHP_VERSION, '5.3.4', '>=')) {
$this->assertStringEndsWith('Only integer unix timestamps and DateTime objects are supported. Please install the "intl" extension for full localization capabilities.', $e->getMessage());
} else {
$this->assertStringEndsWith('Only integer unix timestamps are supported. Please install the "intl" extension for full localization capabilities.', $e->getMessage());
}
}
}
/**
* @expectedException \Symfony\Component\Intl\Exception\NotImplementedException
*/
public function testFormatWithUnimplementedChars()
{
$pattern = 'Y';
$formatter = new IntlDateFormatter('en', IntlDateFormatter::MEDIUM, IntlDateFormatter::SHORT, 'UTC', IntlDateFormatter::GREGORIAN, $pattern);
$formatter->format(0);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\NotImplementedException
*/
public function testFormatWithNonIntegerTimestamp()
{
$formatter = $this->getDefaultDateFormatter();
$formatter->format(array());
}
public function testGetErrorCode()
{
$formatter = $this->getDefaultDateFormatter();
$this->assertEquals(IntlGlobals::getErrorCode(), $formatter->getErrorCode());
}
public function testGetErrorMessage()
{
$formatter = $this->getDefaultDateFormatter();
$this->assertEquals(IntlGlobals::getErrorMessage(), $formatter->getErrorMessage());
}
public function testIsLenient()
{
$formatter = $this->getDefaultDateFormatter();
$this->assertFalse($formatter->isLenient());
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testLocaltime()
{
$formatter = $this->getDefaultDateFormatter();
$formatter->localtime('Wednesday, December 31, 1969 4:00:00 PM PT');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentNotImplementedException
*/
public function testParseWithNotNullPositionValue()
{
$position = 0;
$formatter = $this->getDefaultDateFormatter('y');
$this->assertSame(0, $formatter->parse('1970', $position));
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testSetCalendar()
{
$formatter = $this->getDefaultDateFormatter();
$formatter->setCalendar(IntlDateFormatter::GREGORIAN);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException
*/
public function testSetLenient()
{
$formatter = $this->getDefaultDateFormatter();
$formatter->setLenient(true);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\NotImplementedException
*/
public function testFormatWithGmtTimeZoneAndMinutesOffset()
{
parent::testFormatWithGmtTimeZoneAndMinutesOffset();
}
/**
* @expectedException \Symfony\Component\Intl\Exception\NotImplementedException
*/
public function testFormatWithNonStandardTimezone()
{
parent::testFormatWithNonStandardTimezone();
}
public function parseStandaloneAmPmProvider()
{
return $this->notImplemented(parent::parseStandaloneAmPmProvider());
}
public function parseDayOfWeekProvider()
{
return $this->notImplemented(parent::parseDayOfWeekProvider());
}
public function parseDayOfYearProvider()
{
return $this->notImplemented(parent::parseDayOfYearProvider());
}
public function parseQuarterProvider()
{
return $this->notImplemented(parent::parseQuarterProvider());
}
protected function getDateFormatter($locale, $datetype, $timetype, $timezone = null, $calendar = IntlDateFormatter::GREGORIAN, $pattern = null)
{
return new IntlDateFormatter($locale, $datetype, $timetype, $timezone, $calendar, $pattern);
}
protected function getIntlErrorMessage()
{
return IntlGlobals::getErrorMessage();
}
protected function getIntlErrorCode()
{
return IntlGlobals::getErrorCode();
}
protected function isIntlFailure($errorCode)
{
return IntlGlobals::isFailure($errorCode);
}
/**
* Just to document the differences between the stub and the intl
* implementations. The intl can parse any of the tested formats alone. The
* stub does not implement them as it would be needed to add more
* abstraction, passing more context to the transformers objects. Any of the
* formats are ignored alone or with date/time data (years, months, days,
* hours, minutes and seconds).
*
* Also in intl, format like 'ss E' for '10 2' (2nd day of year
* + 10 seconds) are added, then we have 86,400 seconds (24h * 60min * 60s)
* + 10 seconds
*
* @param array $dataSets
*
* @return array
*/
private function notImplemented(array $dataSets)
{
return array_map(function ($row) {
return array($row[0], $row[1], 0);
}, $dataSets);
}
}

View file

@ -0,0 +1,64 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\DateFormatter\Verification;
use Symfony\Component\Intl\DateFormatter\IntlDateFormatter;
use Symfony\Component\Intl\Tests\DateFormatter\AbstractIntlDateFormatterTest;
use Symfony\Component\Intl\Util\IntlTestHelper;
/**
* Verifies that {@link AbstractIntlDateFormatterTest} matches the behavior of
* the {@link \IntlDateFormatter} class in a specific version of ICU.
*
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class IntlDateFormatterTest extends AbstractIntlDateFormatterTest
{
protected function setUp()
{
IntlTestHelper::requireFullIntl($this);
parent::setUp();
}
/**
* It seems IntlDateFormatter caches the timezone id when not explicitly set via constructor or by the
* setTimeZoneId() method. Since testFormatWithDefaultTimezoneIntl() runs using the default environment
* time zone, this test would use it too if not running in a separated process.
*
* @runInSeparateProcess
*/
public function testFormatWithTimezoneFromEnvironmentVariable()
{
parent::testFormatWithTimezoneFromEnvironmentVariable();
}
protected function getDateFormatter($locale, $datetype, $timetype, $timezone = null, $calendar = IntlDateFormatter::GREGORIAN, $pattern = null)
{
return new \IntlDateFormatter($locale, $datetype, $timetype, $timezone, $calendar, $pattern);
}
protected function getIntlErrorMessage()
{
return intl_get_error_message();
}
protected function getIntlErrorCode()
{
return intl_get_error_code();
}
protected function isIntlFailure($errorCode)
{
return intl_is_failure($errorCode);
}
}

View file

@ -0,0 +1,41 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\Globals;
/**
* Test case for intl function implementations.
*
* @author Bernhard Schussek <bschussek@gmail.com>
*/
abstract class AbstractIntlGlobalsTest extends \PHPUnit_Framework_TestCase
{
public function errorNameProvider()
{
return array (
array(-129, '[BOGUS UErrorCode]'),
array(0, 'U_ZERO_ERROR'),
array(1, 'U_ILLEGAL_ARGUMENT_ERROR'),
array(9, 'U_PARSE_ERROR'),
array(129, '[BOGUS UErrorCode]'),
);
}
/**
* @dataProvider errorNameProvider
*/
public function testGetErrorName($errorCode, $errorName)
{
$this->assertSame($errorName, $this->getIntlErrorName($errorCode));
}
abstract protected function getIntlErrorName($errorCode);
}

View file

@ -0,0 +1,22 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\Globals;
use Symfony\Component\Intl\Globals\IntlGlobals;
class IntlGlobalsTest extends AbstractIntlGlobalsTest
{
protected function getIntlErrorName($errorCode)
{
return IntlGlobals::getErrorName($errorCode);
}
}

View file

@ -0,0 +1,36 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\Globals\Verification;
use Symfony\Component\Intl\Tests\Globals\AbstractIntlGlobalsTest;
use Symfony\Component\Intl\Util\IntlTestHelper;
/**
* Verifies that {@link AbstractIntlGlobalsTest} matches the behavior of the
* intl functions with a specific version of ICU.
*
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class IntlGlobalsTest extends AbstractIntlGlobalsTest
{
protected function setUp()
{
IntlTestHelper::requireFullIntl($this);
parent::setUp();
}
protected function getIntlErrorName($errorCode)
{
return intl_error_name($errorCode);
}
}

View file

@ -0,0 +1,29 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\Locale;
/**
* Test case for Locale implementations.
*
* @author Bernhard Schussek <bschussek@gmail.com>
*/
abstract class AbstractLocaleTest extends \PHPUnit_Framework_TestCase
{
public function testSetDefault()
{
$this->call('setDefault', 'en_GB');
$this->assertSame('en_GB', $this->call('getDefault'));
}
abstract protected function call($methodName);
}

View file

@ -0,0 +1,159 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\Locale;
class LocaleTest extends AbstractLocaleTest
{
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testAcceptFromHttp()
{
$this->call('acceptFromHttp', 'pt-br,en-us;q=0.7,en;q=0.5');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testComposeLocale()
{
$subtags = array(
'language' => 'pt',
'script' => 'Latn',
'region' => 'BR'
);
$this->call('composeLocale', $subtags);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testFilterMatches()
{
$this->call('filterMatches', 'pt-BR', 'pt-BR');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetAllVariants()
{
$this->call('getAllVariants', 'pt_BR_Latn');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetDisplayLanguage()
{
$this->call('getDisplayLanguage', 'pt-Latn-BR', 'en');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetDisplayName()
{
$this->call('getDisplayName', 'pt-Latn-BR', 'en');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetDisplayRegion()
{
$this->call('getDisplayRegion', 'pt-Latn-BR', 'en');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetDisplayScript()
{
$this->call('getDisplayScript', 'pt-Latn-BR', 'en');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetDisplayVariant()
{
$this->call('getDisplayVariant', 'pt-Latn-BR', 'en');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetKeywords()
{
$this->call('getKeywords', 'pt-BR@currency=BRL');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetPrimaryLanguage()
{
$this->call('getPrimaryLanguage', 'pt-Latn-BR');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetRegion()
{
$this->call('getRegion', 'pt-Latn-BR');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetScript()
{
$this->call('getScript', 'pt-Latn-BR');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testLookup()
{
$langtag = array(
'pt-Latn-BR',
'pt-BR'
);
$this->call('lookup', $langtag, 'pt-BR-x-priv1');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testParseLocale()
{
$this->call('parseLocale', 'pt-Latn-BR');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testSetDefault()
{
$this->call('setDefault', 'pt_BR');
}
protected function call($methodName)
{
$args = array_slice(func_get_args(), 1);
return call_user_func_array(array('Symfony\Component\Intl\Locale\Locale', $methodName), $args);
}
}

View file

@ -0,0 +1,38 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\Locale\Verification;
use Symfony\Component\Intl\Tests\Locale\AbstractLocaleTest;
use Symfony\Component\Intl\Util\IntlTestHelper;
/**
* Verifies that {@link AbstractLocaleTest} matches the behavior of the
* {@link Locale} class with a specific version of ICU.
*
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class LocaleTest extends AbstractLocaleTest
{
protected function setUp()
{
IntlTestHelper::requireFullIntl($this);
parent::setUp();
}
protected function call($methodName)
{
$args = array_slice(func_get_args(), 1);
return call_user_func_array(array('Locale', $methodName), $args);
}
}

View file

@ -0,0 +1,707 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\NumberFormatter;
use Symfony\Component\Intl\Globals\IntlGlobals;
use Symfony\Component\Intl\Intl;
use Symfony\Component\Intl\Locale;
use Symfony\Component\Intl\NumberFormatter\NumberFormatter;
use Symfony\Component\Intl\Util\IntlTestHelper;
/**
* Note that there are some values written like -2147483647 - 1. This is the lower 32bit int max and is a known
* behavior of PHP.
*/
abstract class AbstractNumberFormatterTest extends \PHPUnit_Framework_TestCase
{
/**
* @dataProvider formatCurrencyWithDecimalStyleProvider
*/
public function testFormatCurrencyWithDecimalStyle($value, $currency, $expected)
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$this->assertEquals($expected, $formatter->formatCurrency($value, $currency));
}
public function formatCurrencyWithDecimalStyleProvider()
{
return array(
array(100, 'ALL', '100'),
array(100, 'BRL', '100.00'),
array(100, 'CRC', '100'),
array(100, 'JPY', '100'),
array(100, 'CHF', '100'),
array(-100, 'ALL', '-100'),
array(-100, 'BRL', '-100'),
array(-100, 'CRC', '-100'),
array(-100, 'JPY', '-100'),
array(-100, 'CHF', '-100'),
array(1000.12, 'ALL', '1,000.12'),
array(1000.12, 'BRL', '1,000.12'),
array(1000.12, 'CRC', '1,000.12'),
array(1000.12, 'JPY', '1,000.12'),
array(1000.12, 'CHF', '1,000.12')
);
}
/**
* @dataProvider formatCurrencyWithCurrencyStyleProvider
*/
public function testFormatCurrencyWithCurrencyStyle($value, $currency, $expected)
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::CURRENCY);
$this->assertEquals($expected, $formatter->formatCurrency($value, $currency));
}
public function formatCurrencyWithCurrencyStyleProvider()
{
return array(
array(100, 'ALL', 'ALL100'),
array(-100, 'ALL', '(ALL100)'),
array(1000.12, 'ALL', 'ALL1,000'),
array(100, 'JPY', '¥100'),
array(-100, 'JPY', '(¥100)'),
array(1000.12, 'JPY', '¥1,000'),
array(100, 'EUR', '€100.00'),
array(-100, 'EUR', '(€100.00)'),
array(1000.12, 'EUR', '€1,000.12'),
);
}
/**
* @dataProvider formatCurrencyWithCurrencyStyleCostaRicanColonsRoundingProvider
*/
public function testFormatCurrencyWithCurrencyStyleCostaRicanColonsRounding($value, $currency, $symbol, $expected)
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::CURRENCY);
$this->assertEquals(sprintf($expected, $symbol), $formatter->formatCurrency($value, $currency));
}
public function formatCurrencyWithCurrencyStyleCostaRicanColonsRoundingProvider()
{
return array(
array(100, 'CRC', 'CRC', '%s100'),
array(-100, 'CRC', 'CRC', '(%s100)'),
array(1000.12, 'CRC', 'CRC', '%s1,000'),
);
}
/**
* @dataProvider formatCurrencyWithCurrencyStyleBrazilianRealRoundingProvider
*/
public function testFormatCurrencyWithCurrencyStyleBrazilianRealRounding($value, $currency, $symbol, $expected)
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::CURRENCY);
$this->assertEquals(sprintf($expected, $symbol), $formatter->formatCurrency($value, $currency));
}
public function formatCurrencyWithCurrencyStyleBrazilianRealRoundingProvider()
{
return array(
array(100, 'BRL', 'R', '%s$100.00'),
array(-100, 'BRL', 'R', '(%s$100.00)'),
array(1000.12, 'BRL', 'R', '%s$1,000.12'),
// Rounding checks
array(1000.121, 'BRL', 'R', '%s$1,000.12'),
array(1000.123, 'BRL', 'R', '%s$1,000.12'),
array(1000.125, 'BRL', 'R', '%s$1,000.12'),
array(1000.127, 'BRL', 'R', '%s$1,000.13'),
array(1000.129, 'BRL', 'R', '%s$1,000.13'),
array(11.50999, 'BRL', 'R', '%s$11.51'),
array(11.9999464, 'BRL', 'R', '%s$12.00')
);
}
/**
* @dataProvider formatCurrencyWithCurrencyStyleSwissRoundingProvider
*/
public function testFormatCurrencyWithCurrencyStyleSwissRounding($value, $currency, $symbol, $expected)
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::CURRENCY);
$this->assertEquals(sprintf($expected, $symbol), $formatter->formatCurrency($value, $currency));
}
public function formatCurrencyWithCurrencyStyleSwissRoundingProvider()
{
return array(
array(100, 'CHF', 'CHF', '%s100.00'),
array(-100, 'CHF', 'CHF', '(%s100.00)'),
array(1000.12, 'CHF', 'CHF', '%s1,000.10'),
array('1000.12', 'CHF', 'CHF', '%s1,000.10'),
// Rounding checks
array(1000.121, 'CHF', 'CHF', '%s1,000.10'),
array(1000.123, 'CHF', 'CHF', '%s1,000.10'),
array(1000.125, 'CHF', 'CHF', '%s1,000.10'),
array(1000.127, 'CHF', 'CHF', '%s1,000.15'),
array(1000.129, 'CHF', 'CHF', '%s1,000.15'),
array(1200000.00, 'CHF', 'CHF', '%s1,200,000.00'),
array(1200000.1, 'CHF', 'CHF', '%s1,200,000.10'),
array(1200000.10, 'CHF', 'CHF', '%s1,200,000.10'),
array(1200000.101, 'CHF', 'CHF', '%s1,200,000.10')
);
}
public function testFormat()
{
$errorCode = IntlGlobals::U_ZERO_ERROR;
$errorMessage = 'U_ZERO_ERROR';
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$this->assertSame('9.555', $formatter->format(9.555));
$this->assertSame($errorMessage, $this->getIntlErrorMessage());
$this->assertSame($errorCode, $this->getIntlErrorCode());
$this->assertFalse($this->isIntlFailure($this->getIntlErrorCode()));
$this->assertSame($errorMessage, $formatter->getErrorMessage());
$this->assertSame($errorCode, $formatter->getErrorCode());
$this->assertFalse($this->isIntlFailure($formatter->getErrorCode()));
}
public function testFormatWithCurrencyStyle()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::CURRENCY);
$this->assertEquals('¤1.00', $formatter->format(1));
}
/**
* @dataProvider formatTypeInt32Provider
*/
public function testFormatTypeInt32($formatter, $value, $expected, $message = '')
{
$formattedValue = $formatter->format($value, NumberFormatter::TYPE_INT32);
$this->assertEquals($expected, $formattedValue, $message);
}
public function formatTypeInt32Provider()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$message = '->format() TYPE_INT32 formats inconsistently an integer if out of the 32 bit range.';
return array(
array($formatter, 1, '1'),
array($formatter, 1.1, '1'),
array($formatter, 2147483648, '-2,147,483,648', $message),
array($formatter, -2147483649, '2,147,483,647', $message),
);
}
/**
* @dataProvider formatTypeInt32WithCurrencyStyleProvider
*/
public function testFormatTypeInt32WithCurrencyStyle($formatter, $value, $expected, $message = '')
{
$formattedValue = $formatter->format($value, NumberFormatter::TYPE_INT32);
$this->assertEquals($expected, $formattedValue, $message);
}
public function formatTypeInt32WithCurrencyStyleProvider()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::CURRENCY);
$message = '->format() TYPE_INT32 formats inconsistently an integer if out of the 32 bit range.';
return array(
array($formatter, 1, '¤1.00'),
array($formatter, 1.1, '¤1.00'),
array($formatter, 2147483648, '(¤2,147,483,648.00)', $message),
array($formatter, -2147483649, '¤2,147,483,647.00', $message)
);
}
/**
* The parse() method works differently with integer out of the 32 bit range. format() works fine.
* @dataProvider formatTypeInt64Provider
*/
public function testFormatTypeInt64($formatter, $value, $expected)
{
$formattedValue = $formatter->format($value, NumberFormatter::TYPE_INT64);
$this->assertEquals($expected, $formattedValue);
}
public function formatTypeInt64Provider()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
return array(
array($formatter, 1, '1'),
array($formatter, 1.1, '1'),
array($formatter, 2147483648, '2,147,483,648'),
array($formatter, -2147483649, '-2,147,483,649'),
);
}
/**
* @dataProvider formatTypeInt64WithCurrencyStyleProvider
*/
public function testFormatTypeInt64WithCurrencyStyle($formatter, $value, $expected)
{
$formattedValue = $formatter->format($value, NumberFormatter::TYPE_INT64);
$this->assertEquals($expected, $formattedValue);
}
public function formatTypeInt64WithCurrencyStyleProvider()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::CURRENCY);
return array(
array($formatter, 1, '¤1.00'),
array($formatter, 1.1, '¤1.00'),
array($formatter, 2147483648, '¤2,147,483,648.00'),
array($formatter, -2147483649, '(¤2,147,483,649.00)')
);
}
/**
* @dataProvider formatTypeDoubleProvider
*/
public function testFormatTypeDouble($formatter, $value, $expected)
{
$formattedValue = $formatter->format($value, NumberFormatter::TYPE_DOUBLE);
$this->assertEquals($expected, $formattedValue);
}
public function formatTypeDoubleProvider()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
return array(
array($formatter, 1, '1'),
array($formatter, 1.1, '1.1'),
);
}
/**
* @dataProvider formatTypeDoubleWithCurrencyStyleProvider
*/
public function testFormatTypeDoubleWithCurrencyStyle($formatter, $value, $expected)
{
$formattedValue = $formatter->format($value, NumberFormatter::TYPE_DOUBLE);
$this->assertEquals($expected, $formattedValue);
}
public function formatTypeDoubleWithCurrencyStyleProvider()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::CURRENCY);
return array(
array($formatter, 1, '¤1.00'),
array($formatter, 1.1, '¤1.10'),
);
}
/**
* @dataProvider formatTypeCurrencyProvider
* @expectedException \PHPUnit_Framework_Error_Warning
*/
public function testFormatTypeCurrency($formatter, $value)
{
$formatter->format($value, NumberFormatter::TYPE_CURRENCY);
}
/**
* @dataProvider formatTypeCurrencyProvider
*/
public function testFormatTypeCurrencyReturn($formatter, $value)
{
$this->assertFalse(@$formatter->format($value, NumberFormatter::TYPE_CURRENCY));
}
public function formatTypeCurrencyProvider()
{
$df = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$cf = $this->getNumberFormatter('en', NumberFormatter::CURRENCY);
return array(
array($df, 1),
array($cf, 1),
);
}
/**
* @dataProvider formatFractionDigitsProvider
*/
public function testFormatFractionDigits($value, $expected, $fractionDigits = null, $expectedFractionDigits = 1)
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
if (null !== $fractionDigits) {
$attributeRet = $formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, $fractionDigits);
}
$formattedValue = $formatter->format($value);
$this->assertSame($expected, $formattedValue);
$this->assertSame($expectedFractionDigits, $formatter->getAttribute(NumberFormatter::FRACTION_DIGITS));
if (isset($attributeRet)) {
$this->assertTrue($attributeRet);
}
}
public function formatFractionDigitsProvider()
{
return array(
array(1.123, '1.123', null, 0),
array(1.123, '1', 0, 0),
array(1.123, '1.1', 1, 1),
array(1.123, '1.12', 2, 2),
array(1.123, '1', -1, 0),
array(1.123, '1', 'abc', 0)
);
}
/**
* @dataProvider formatGroupingUsedProvider
*/
public function testFormatGroupingUsed($value, $expected, $groupingUsed = null, $expectedGroupingUsed = 1)
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
if (null !== $groupingUsed) {
$attributeRet = $formatter->setAttribute(NumberFormatter::GROUPING_USED, $groupingUsed);
}
$formattedValue = $formatter->format($value);
$this->assertSame($expected, $formattedValue);
$this->assertSame($expectedGroupingUsed, $formatter->getAttribute(NumberFormatter::GROUPING_USED));
if (isset($attributeRet)) {
$this->assertTrue($attributeRet);
}
}
public function formatGroupingUsedProvider()
{
return array(
array(1000, '1,000', null, 1),
array(1000, '1000', 0, 0),
array(1000, '1,000', 1, 1),
array(1000, '1,000', 2, 1),
array(1000, '1000', 'abc', 0),
array(1000, '1,000', -1, 1),
);
}
/**
* @dataProvider formatRoundingModeRoundHalfUpProvider
*/
public function testFormatRoundingModeHalfUp($value, $expected)
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
$formatter->setAttribute(NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_HALFUP);
$this->assertSame($expected, $formatter->format($value), '->format() with ROUND_HALFUP rounding mode.');
}
public function formatRoundingModeRoundHalfUpProvider()
{
// The commented value is differently rounded by intl's NumberFormatter in 32 and 64 bit architectures
return array(
array(1.121, '1.12'),
array(1.123, '1.12'),
// array(1.125, '1.13'),
array(1.127, '1.13'),
array(1.129, '1.13'),
);
}
/**
* @dataProvider formatRoundingModeRoundHalfDownProvider
*/
public function testFormatRoundingModeHalfDown($value, $expected)
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
$formatter->setAttribute(NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_HALFDOWN);
$this->assertSame($expected, $formatter->format($value), '->format() with ROUND_HALFDOWN rounding mode.');
}
public function formatRoundingModeRoundHalfDownProvider()
{
return array(
array(1.121, '1.12'),
array(1.123, '1.12'),
array(1.125, '1.12'),
array(1.127, '1.13'),
array(1.129, '1.13'),
);
}
/**
* @dataProvider formatRoundingModeRoundHalfEvenProvider
*/
public function testFormatRoundingModeHalfEven($value, $expected)
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
$formatter->setAttribute(NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_HALFEVEN);
$this->assertSame($expected, $formatter->format($value), '->format() with ROUND_HALFEVEN rounding mode.');
}
public function formatRoundingModeRoundHalfEvenProvider()
{
return array(
array(1.121, '1.12'),
array(1.123, '1.12'),
array(1.125, '1.12'),
array(1.127, '1.13'),
array(1.129, '1.13'),
);
}
public function testGetLocale()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$this->assertEquals('en', $formatter->getLocale());
}
/**
* @dataProvider parseProvider
*/
public function testParse($value, $expected, $message = '')
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$parsedValue = $formatter->parse($value, NumberFormatter::TYPE_DOUBLE);
$this->assertSame($expected, $parsedValue, $message);
if ($expected === false) {
$errorCode = IntlGlobals::U_PARSE_ERROR;
$errorMessage = 'Number parsing failed: U_PARSE_ERROR';
} else {
$errorCode = IntlGlobals::U_ZERO_ERROR;
$errorMessage = 'U_ZERO_ERROR';
}
$this->assertSame($errorMessage, $this->getIntlErrorMessage());
$this->assertSame($errorCode, $this->getIntlErrorCode());
$this->assertSame($errorCode !== 0, $this->isIntlFailure($this->getIntlErrorCode()));
$this->assertSame($errorMessage, $formatter->getErrorMessage());
$this->assertSame($errorCode, $formatter->getErrorCode());
$this->assertSame($errorCode !== 0, $this->isIntlFailure($formatter->getErrorCode()));
}
public function parseProvider()
{
return array(
array('prefix1', false, '->parse() does not parse a number with a string prefix.'),
array('1suffix', (float) 1, '->parse() parses a number with a string suffix.'),
);
}
/**
* @expectedException \PHPUnit_Framework_Error_Warning
*/
public function testParseTypeDefault()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->parse('1', NumberFormatter::TYPE_DEFAULT);
}
/**
* @dataProvider parseTypeInt32Provider
*/
public function testParseTypeInt32($value, $expected, $message = '')
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$parsedValue = $formatter->parse($value, NumberFormatter::TYPE_INT32);
$this->assertSame($expected, $parsedValue);
}
public function parseTypeInt32Provider()
{
return array(
array('1', 1),
array('1.1', 1),
array('2,147,483,647', 2147483647),
array('-2,147,483,648', -2147483647 - 1),
array('2,147,483,648', false, '->parse() TYPE_INT32 returns false when the number is greater than the integer positive range.'),
array('-2,147,483,649', false, '->parse() TYPE_INT32 returns false when the number is greater than the integer negative range.')
);
}
public function testParseTypeInt64With32BitIntegerInPhp32Bit()
{
IntlTestHelper::require32Bit($this);
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$parsedValue = $formatter->parse('2,147,483,647', NumberFormatter::TYPE_INT64);
$this->assertInternalType('integer', $parsedValue);
$this->assertEquals(2147483647, $parsedValue);
$parsedValue = $formatter->parse('-2,147,483,648', NumberFormatter::TYPE_INT64);
// Bug #59597 was fixed on PHP 5.3.14 and 5.4.4
// The negative PHP_INT_MAX was being converted to float
if (
(version_compare(PHP_VERSION, '5.4.0', '<') && version_compare(PHP_VERSION, '5.3.14', '>=')) ||
version_compare(PHP_VERSION, '5.4.4', '>=')
) {
$this->assertInternalType('int', $parsedValue);
} else {
$this->assertInternalType('float', $parsedValue);
}
$this->assertEquals(-2147483648, $parsedValue);
}
public function testParseTypeInt64With32BitIntegerInPhp64Bit()
{
IntlTestHelper::require64Bit($this);
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$parsedValue = $formatter->parse('2,147,483,647', NumberFormatter::TYPE_INT64);
$this->assertInternalType('integer', $parsedValue);
$this->assertEquals(2147483647, $parsedValue);
$parsedValue = $formatter->parse('-2,147,483,648', NumberFormatter::TYPE_INT64);
$this->assertInternalType('integer', $parsedValue);
$this->assertEquals(-2147483647 - 1, $parsedValue);
}
/**
* If PHP is compiled in 32bit mode, the returned value for a 64bit integer are float numbers.
*/
public function testParseTypeInt64With64BitIntegerInPhp32Bit()
{
IntlTestHelper::require32Bit($this);
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
// int 64 using only 32 bit range strangeness
$parsedValue = $formatter->parse('2,147,483,648', NumberFormatter::TYPE_INT64);
$this->assertInternalType('float', $parsedValue);
$this->assertEquals(2147483648, $parsedValue, '->parse() TYPE_INT64 does not use true 64 bit integers, using only the 32 bit range.');
$parsedValue = $formatter->parse('-2,147,483,649', NumberFormatter::TYPE_INT64);
$this->assertInternalType('float', $parsedValue);
$this->assertEquals(-2147483649, $parsedValue, '->parse() TYPE_INT64 does not use true 64 bit integers, using only the 32 bit range.');
}
/**
* If PHP is compiled in 64bit mode, the returned value for a 64bit integer are 32bit integer numbers.
*/
public function testParseTypeInt64With64BitIntegerInPhp64Bit()
{
IntlTestHelper::require64Bit($this);
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$parsedValue = $formatter->parse('2,147,483,648', NumberFormatter::TYPE_INT64);
$this->assertInternalType('integer', $parsedValue);
// Bug #59597 was fixed on PHP 5.3.14 and 5.4.4
// A 32 bit integer was being generated instead of a 64 bit integer
if (
(version_compare(PHP_VERSION, '5.3.14', '<')) ||
(version_compare(PHP_VERSION, '5.4.0', '>=') && version_compare(PHP_VERSION, '5.4.4', '<'))
) {
$this->assertEquals(-2147483648, $parsedValue, '->parse() TYPE_INT64 does not use true 64 bit integers, using only the 32 bit range (PHP < 5.3.14 and PHP < 5.4.4).');
} else {
$this->assertEquals(2147483648, $parsedValue, '->parse() TYPE_INT64 uses true 64 bit integers (PHP >= 5.3.14 and PHP >= 5.4.4).');
}
$parsedValue = $formatter->parse('-2,147,483,649', NumberFormatter::TYPE_INT64);
$this->assertInternalType('integer', $parsedValue);
// Bug #59597 was fixed on PHP 5.3.14 and 5.4.4
// A 32 bit integer was being generated instead of a 64 bit integer
if (
(version_compare(PHP_VERSION, '5.3.14', '<')) ||
(version_compare(PHP_VERSION, '5.4.0', '>=') && version_compare(PHP_VERSION, '5.4.4', '<'))
) {
$this->assertEquals(2147483647, $parsedValue, '->parse() TYPE_INT64 does not use true 64 bit integers, using only the 32 bit range (PHP < 5.3.14 and PHP < 5.4.4).');
} else {
$this->assertEquals(-2147483649, $parsedValue, '->parse() TYPE_INT64 uses true 64 bit integers (PHP >= 5.3.14 and PHP >= 5.4.4).');
}
}
/**
* @dataProvider parseTypeDoubleProvider
*/
public function testParseTypeDouble($value, $expectedValue)
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$parsedValue = $formatter->parse($value, NumberFormatter::TYPE_DOUBLE);
$this->assertSame($expectedValue, $parsedValue);
}
public function parseTypeDoubleProvider()
{
return array(
array('1', (float) 1),
array('1.1', 1.1),
array('9,223,372,036,854,775,808', 9223372036854775808),
array('-9,223,372,036,854,775,809', -9223372036854775809),
);
}
/**
* @expectedException \PHPUnit_Framework_Error_Warning
*/
public function testParseTypeCurrency()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->parse('1', NumberFormatter::TYPE_CURRENCY);
}
public function testParseWithNullPositionValue()
{
$position = null;
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->parse('123', NumberFormatter::TYPE_INT32, $position);
$this->assertNull($position);
}
public function testParseWithNotNullPositionValue()
{
$position = 1;
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->parse('123', NumberFormatter::TYPE_DOUBLE, $position);
$this->assertEquals(3, $position);
}
/**
* @param string $locale
* @param null $style
* @param null $pattern
*
* @return \NumberFormatter
*/
abstract protected function getNumberFormatter($locale = 'en', $style = null, $pattern = null);
/**
* @return string
*/
abstract protected function getIntlErrorMessage();
/**
* @return integer
*/
abstract protected function getIntlErrorCode();
/**
* @param integer $errorCode
*
* @return Boolean
*/
abstract protected function isIntlFailure($errorCode);
}

View file

@ -0,0 +1,239 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\NumberFormatter;
use Symfony\Component\Intl\Globals\IntlGlobals;
use Symfony\Component\Intl\NumberFormatter\NumberFormatter;
use Symfony\Component\Intl\Util\IntlTestHelper;
/**
* Note that there are some values written like -2147483647 - 1. This is the lower 32bit int max and is a known
* behavior of PHP.
*/
class NumberFormatterTest extends AbstractNumberFormatterTest
{
protected function setUp()
{
IntlTestHelper::requireIntl($this);
parent::setUp();
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException
*/
public function testConstructorWithUnsupportedLocale()
{
new NumberFormatter('pt_BR');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException
*/
public function testConstructorWithUnsupportedStyle()
{
new NumberFormatter('en', NumberFormatter::PATTERN_DECIMAL);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentNotImplementedException
*/
public function testConstructorWithPatternDifferentThanNull()
{
new NumberFormatter('en', NumberFormatter::DECIMAL, '');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException
*/
public function testSetAttributeWithUnsupportedAttribute()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::LENIENT_PARSE, null);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException
*/
public function testSetAttributeInvalidRoundingMode()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::ROUNDING_MODE, null);
}
public function testCreate()
{
$this->assertInstanceOf(
'\Symfony\Component\Intl\NumberFormatter\NumberFormatter',
NumberFormatter::create('en', NumberFormatter::DECIMAL)
);
}
/**
* @expectedException \RuntimeException
*/
public function testFormatWithCurrencyStyle()
{
parent::testFormatWithCurrencyStyle();
}
/**
* @dataProvider formatTypeInt32Provider
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException
*/
public function testFormatTypeInt32($formatter, $value, $expected, $message = '')
{
parent::testFormatTypeInt32($formatter, $value, $expected, $message);
}
/**
* @dataProvider formatTypeInt32WithCurrencyStyleProvider
* @expectedException \Symfony\Component\Intl\Exception\NotImplementedException
*/
public function testFormatTypeInt32WithCurrencyStyle($formatter, $value, $expected, $message = '')
{
parent::testFormatTypeInt32WithCurrencyStyle($formatter, $value, $expected, $message);
}
/**
* @dataProvider formatTypeInt64Provider
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException
*/
public function testFormatTypeInt64($formatter, $value, $expected)
{
parent::testFormatTypeInt64($formatter, $value, $expected);
}
/**
* @dataProvider formatTypeInt64WithCurrencyStyleProvider
* @expectedException \Symfony\Component\Intl\Exception\NotImplementedException
*/
public function testFormatTypeInt64WithCurrencyStyle($formatter, $value, $expected)
{
parent::testFormatTypeInt64WithCurrencyStyle($formatter, $value, $expected);
}
/**
* @dataProvider formatTypeDoubleProvider
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentValueNotImplementedException
*/
public function testFormatTypeDouble($formatter, $value, $expected)
{
parent::testFormatTypeDouble($formatter, $value, $expected);
}
/**
* @dataProvider formatTypeDoubleWithCurrencyStyleProvider
* @expectedException \Symfony\Component\Intl\Exception\NotImplementedException
*/
public function testFormatTypeDoubleWithCurrencyStyle($formatter, $value, $expected)
{
parent::testFormatTypeDoubleWithCurrencyStyle($formatter, $value, $expected);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetPattern()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->getPattern();
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetSymbol()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->getSymbol(null);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testGetTextAttribute()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->getTextAttribute(null);
}
public function testGetErrorCode()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$this->assertEquals(IntlGlobals::U_ZERO_ERROR, $formatter->getErrorCode());
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testParseCurrency()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->parseCurrency(null, $currency);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodArgumentNotImplementedException
*/
public function testParseWithNotNullPositionValue()
{
parent::testParseWithNotNullPositionValue();
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testSetPattern()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->setPattern(null);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testSetSymbol()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->setSymbol(null, null);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\MethodNotImplementedException
*/
public function testSetTextAttribute()
{
$formatter = $this->getNumberFormatter('en', NumberFormatter::DECIMAL);
$formatter->setTextAttribute(null, null);
}
protected function getNumberFormatter($locale = 'en', $style = null, $pattern = null)
{
return new NumberFormatter($locale, $style, $pattern);
}
protected function getIntlErrorMessage()
{
return IntlGlobals::getErrorMessage();
}
protected function getIntlErrorCode()
{
return IntlGlobals::getErrorCode();
}
protected function isIntlFailure($errorCode)
{
return IntlGlobals::isFailure($errorCode);
}
}

View file

@ -0,0 +1,54 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\NumberFormatter\Verification;
use Symfony\Component\Intl\Tests\NumberFormatter\AbstractNumberFormatterTest;
use Symfony\Component\Intl\Util\IntlTestHelper;
/**
* Note that there are some values written like -2147483647 - 1. This is the lower 32bit int max and is a known
* behavior of PHP.
*/
class NumberFormatterTest extends AbstractNumberFormatterTest
{
protected function setUp()
{
IntlTestHelper::requireFullIntl($this);
parent::setUp();
}
public function testCreate()
{
$this->assertInstanceOf('\NumberFormatter', \NumberFormatter::create('en', \NumberFormatter::DECIMAL));
}
protected function getNumberFormatter($locale = 'en', $style = null, $pattern = null)
{
return new \NumberFormatter($locale, $style, $pattern);
}
protected function getIntlErrorMessage()
{
return intl_get_error_message();
}
protected function getIntlErrorCode()
{
return intl_get_error_code();
}
protected function isIntlFailure($errorCode)
{
return intl_is_failure($errorCode);
}
}

View file

@ -0,0 +1,55 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\ResourceBundle;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class AbstractBundleTest extends \PHPUnit_Framework_TestCase
{
const RES_DIR = '/base/dirName';
/**
* @var \Symfony\Component\Intl\ResourceBundle\AbstractBundle
*/
private $bundle;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $reader;
protected function setUp()
{
$this->reader = $this->getMock('Symfony\Component\Intl\ResourceBundle\Reader\StructuredBundleReaderInterface');
$this->bundle = $this->getMockForAbstractClass(
'Symfony\Component\Intl\ResourceBundle\AbstractBundle',
array(self::RES_DIR, $this->reader)
);
$this->bundle->expects($this->any())
->method('getDirectoryName')
->will($this->returnValue('dirName'));
}
public function testGetLocales()
{
$locales = array('de', 'en', 'fr');
$this->reader->expects($this->once())
->method('getLocales')
->with(self::RES_DIR)
->will($this->returnValue($locales));
$this->assertSame($locales, $this->bundle->getLocales());
}
}

View file

@ -0,0 +1,98 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\ResourceBundle;
use Symfony\Component\Intl\ResourceBundle\CurrencyBundle;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class CurrencyBundleTest extends \PHPUnit_Framework_TestCase
{
const RES_DIR = '/base/curr';
/**
* @var CurrencyBundle
*/
private $bundle;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $reader;
protected function setUp()
{
$this->reader = $this->getMock('Symfony\Component\Intl\ResourceBundle\Reader\StructuredBundleReaderInterface');
$this->bundle = new CurrencyBundle(self::RES_DIR, $this->reader);
}
public function testGetCurrencySymbol()
{
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Currencies', 'EUR', 1))
->will($this->returnValue('€'));
$this->assertSame('€', $this->bundle->getCurrencySymbol('EUR', 'en'));
}
public function testGetCurrencyName()
{
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Currencies', 'EUR', 0))
->will($this->returnValue('Euro'));
$this->assertSame('Euro', $this->bundle->getCurrencyName('EUR', 'en'));
}
public function testGetCurrencyNames()
{
$sortedCurrencies = array(
'USD' => array(0 => 'Dollar'),
'EUR' => array(0 => 'Euro'),
);
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Currencies'))
->will($this->returnValue($sortedCurrencies));
$sortedNames = array(
'USD' => 'Dollar',
'EUR' => 'Euro',
);
$this->assertSame($sortedNames, $this->bundle->getCurrencyNames('en'));
}
public function testGetFractionDigits()
{
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Currencies', 'EUR', 2))
->will($this->returnValue(123));
$this->assertSame(123, $this->bundle->getFractionDigits('EUR'));
}
public function testGetRoundingIncrement()
{
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Currencies', 'EUR', 3))
->will($this->returnValue(123));
$this->assertSame(123, $this->bundle->getRoundingIncrement('EUR'));
}
}

View file

@ -0,0 +1,197 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\ResourceBundle;
use Symfony\Component\Intl\ResourceBundle\LanguageBundle;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class LanguageBundleTest extends \PHPUnit_Framework_TestCase
{
const RES_DIR = '/base/lang';
/**
* @var LanguageBundle
*/
private $bundle;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $reader;
protected function setUp()
{
$this->reader = $this->getMock('Symfony\Component\Intl\ResourceBundle\Reader\StructuredBundleReaderInterface');
$this->bundle = new LanguageBundle(self::RES_DIR, $this->reader);
}
public function testGetLanguageName()
{
$languages = array(
'de' => 'German',
'en' => 'English',
);
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Languages'))
->will($this->returnValue($languages));
$this->assertSame('German', $this->bundle->getLanguageName('de', null, 'en'));
}
public function testGetLanguageNameWithRegion()
{
$languages = array(
'de' => 'German',
'en' => 'English',
'en_GB' => 'British English',
);
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Languages'))
->will($this->returnValue($languages));
$this->assertSame('British English', $this->bundle->getLanguageName('en', 'GB', 'en'));
}
public function testGetLanguageNameWithUntranslatedRegion()
{
$languages = array(
'de' => 'German',
'en' => 'English',
);
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Languages'))
->will($this->returnValue($languages));
$this->assertSame('English', $this->bundle->getLanguageName('en', 'US', 'en'));
}
public function testGetLanguageNames()
{
$sortedLanguages = array(
'en' => 'English',
'de' => 'German',
);
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Languages'))
->will($this->returnValue($sortedLanguages));
$this->assertSame($sortedLanguages, $this->bundle->getLanguageNames('en'));
}
public function testGetScriptName()
{
$data = array(
'Languages' => array(
'de' => 'German',
'en' => 'English',
),
'Scripts' => array(
'Latn' => 'latin',
'Cyrl' => 'cyrillique',
),
);
$this->reader->expects($this->once())
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue($data));
$this->assertSame('latin', $this->bundle->getScriptName('Latn', null, 'en'));
}
public function testGetScriptNameIncludedInLanguage()
{
$data = array(
'Languages' => array(
'de' => 'German',
'en' => 'English',
'zh_Hans' => 'Simplified Chinese',
),
'Scripts' => array(
'Latn' => 'latin',
'Cyrl' => 'cyrillique',
),
);
$this->reader->expects($this->once())
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue($data));
// Null because the script is included in the language anyway
$this->assertNull($this->bundle->getScriptName('Hans', 'zh', 'en'));
}
public function testGetScriptNameIncludedInLanguageInBraces()
{
$data = array(
'Languages' => array(
'de' => 'German',
'en' => 'English',
'zh_Hans' => 'Chinese (simplified)',
),
'Scripts' => array(
'Latn' => 'latin',
'Cyrl' => 'cyrillique',
),
);
$this->reader->expects($this->once())
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue($data));
$this->assertSame('simplified', $this->bundle->getScriptName('Hans', 'zh', 'en'));
}
public function testGetScriptNameNoScriptsBlock()
{
$data = array(
'Languages' => array(
'de' => 'German',
'en' => 'English',
),
);
$this->reader->expects($this->once())
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue($data));
$this->assertNull($this->bundle->getScriptName('Latn', null, 'en'));
}
public function testGetScriptNames()
{
$sortedScripts = array(
'Cyrl' => 'cyrillique',
'Latn' => 'latin',
);
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Scripts'))
->will($this->returnValue($sortedScripts));
$this->assertSame($sortedScripts, $this->bundle->getScriptNames('en'));
}
}

View file

@ -0,0 +1,64 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\ResourceBundle;
use Symfony\Component\Intl\ResourceBundle\LocaleBundle;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class LocaleBundleTest extends \PHPUnit_Framework_TestCase
{
const RES_DIR = '/base/locales';
/**
* @var LocaleBundle
*/
private $bundle;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $reader;
protected function setUp()
{
$this->reader = $this->getMock('Symfony\Component\Intl\ResourceBundle\Reader\StructuredBundleReaderInterface');
$this->bundle = new LocaleBundle(self::RES_DIR, $this->reader);
}
public function testGetLocaleName()
{
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Locales', 'de_AT'))
->will($this->returnValue('German (Austria)'));
$this->assertSame('German (Austria)', $this->bundle->getLocaleName('de_AT', 'en'));
}
public function testGetLocaleNames()
{
$sortedLocales = array(
'en_IE' => 'English (Ireland)',
'en_GB' => 'English (United Kingdom)',
'en_US' => 'English (United States)',
);
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Locales'))
->will($this->returnValue($sortedLocales));
$this->assertSame($sortedLocales, $this->bundle->getLocaleNames('en'));
}
}

View file

@ -0,0 +1,64 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\ResourceBundle\Reader;
use Symfony\Component\Filesystem\Filesystem;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class AbstractBundleReaderTest extends \PHPUnit_Framework_TestCase
{
private $directory;
/**
* @var Filesystem
*/
private $filesystem;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $reader;
protected function setUp()
{
$this->directory = sys_get_temp_dir() . '/AbstractBundleReaderTest/' . rand(1000, 9999);
$this->filesystem = new Filesystem();
$this->reader = $this->getMockForAbstractClass('Symfony\Component\Intl\ResourceBundle\Reader\AbstractBundleReader');
$this->filesystem->mkdir($this->directory);
}
protected function tearDown()
{
$this->filesystem->remove($this->directory);
}
public function testGetLocales()
{
$this->filesystem->touch($this->directory . '/en.foo');
$this->filesystem->touch($this->directory . '/de.foo');
$this->filesystem->touch($this->directory . '/fr.foo');
$this->filesystem->touch($this->directory . '/bo.txt');
$this->filesystem->touch($this->directory . '/gu.bin');
$this->filesystem->touch($this->directory . '/s.lol');
$this->reader->expects($this->any())
->method('getFileExtension')
->will($this->returnValue('foo'));
$sortedLocales = array('de', 'en', 'fr');
$this->assertSame($sortedLocales, $this->reader->getLocales($this->directory));
}
}

View file

@ -0,0 +1,58 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\ResourceBundle\Reader;
use Symfony\Component\Intl\ResourceBundle\Reader\BinaryBundleReader;
use Symfony\Component\Intl\Util\IntlTestHelper;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class BinaryBundleReaderTest extends \PHPUnit_Framework_TestCase
{
/**
* @var BinaryBundleReader
*/
private $reader;
protected function setUp()
{
IntlTestHelper::requireFullIntl($this);
$this->reader = new BinaryBundleReader();
}
public function testReadReturnsArrayAccess()
{
$data = $this->reader->read(__DIR__ . '/Fixtures', 'en');
$this->assertInstanceOf('\ArrayAccess', $data);
$this->assertSame('Bar', $data['Foo']);
$this->assertFalse(isset($data['ExistsNot']));
}
/**
* @expectedException \Symfony\Component\Intl\Exception\RuntimeException
*/
public function testReadFailsIfNonExistingLocale()
{
$this->reader->read(__DIR__ . '/Fixtures', 'foo');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\RuntimeException
*/
public function testReadFailsIfNonExistingDirectory()
{
$this->reader->read(__DIR__ . '/foo', 'en');
}
}

View file

@ -0,0 +1,14 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
return array(
'Foo' => 'Bar',
);

View file

@ -0,0 +1,3 @@
en{
Foo{"Bar"}
}

View file

@ -0,0 +1,63 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\ResourceBundle\Reader;
use Symfony\Component\Intl\ResourceBundle\Reader\PhpBundleReader;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class PhpBundleReaderTest extends \PHPUnit_Framework_TestCase
{
/**
* @var PhpBundleReader
*/
private $reader;
protected function setUp()
{
$this->reader = new PhpBundleReader();
}
public function testReadReturnsArray()
{
$data = $this->reader->read(__DIR__ . '/Fixtures', 'en');
$this->assertTrue(is_array($data));
$this->assertSame('Bar', $data['Foo']);
$this->assertFalse(isset($data['ExistsNot']));
}
/**
* @expectedException \Symfony\Component\Intl\Exception\InvalidArgumentException
*/
public function testReadFailsIfLocaleOtherThanEn()
{
$this->reader->read(__DIR__ . '/Fixtures', 'foo');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\RuntimeException
*/
public function testReadFailsIfNonExistingDirectory()
{
$this->reader->read(__DIR__ . '/foo', 'en');
}
/**
* @expectedException \Symfony\Component\Intl\Exception\RuntimeException
*/
public function testReadFailsIfNotAFile()
{
$this->reader->read(__DIR__ . '/Fixtures/NotAFile', 'en');
}
}

View file

@ -0,0 +1,223 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\ResourceBundle\Reader;
use Symfony\Component\Intl\ResourceBundle\Reader\StructuredBundleReader;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class StructuredBundleReaderTest extends \PHPUnit_Framework_TestCase
{
const RES_DIR = '/res/dir';
/**
* @var StructuredBundleReader
*/
private $reader;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $readerImpl;
protected function setUp()
{
$this->readerImpl = $this->getMock('Symfony\Component\Intl\ResourceBundle\Reader\StructuredBundleReaderInterface');
$this->reader = new StructuredBundleReader($this->readerImpl);
}
public function testGetLocales()
{
$locales = array('en', 'de', 'fr');
$this->readerImpl->expects($this->once())
->method('getLocales')
->with(self::RES_DIR)
->will($this->returnValue($locales));
$this->assertSame($locales, $this->reader->getLocales(self::RES_DIR));
}
public function testRead()
{
$data = array('foo', 'bar');
$this->readerImpl->expects($this->once())
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue($data));
$this->assertSame($data, $this->reader->read(self::RES_DIR, 'en'));
}
public function testReadEntryNoParams()
{
$data = array('foo', 'bar');
$this->readerImpl->expects($this->once())
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue($data));
$this->assertSame($data, $this->reader->readEntry(self::RES_DIR, 'en', array()));
}
public function testReadEntryWithParam()
{
$data = array('Foo' => array('Bar' => 'Baz'));
$this->readerImpl->expects($this->once())
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue($data));
$this->assertSame('Baz', $this->reader->readEntry(self::RES_DIR, 'en', array('Foo', 'Bar')));
}
public function testReadEntryWithUnresolvablePath()
{
$data = array('Foo' => 'Baz');
$this->readerImpl->expects($this->once())
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue($data));
$this->assertNull($this->reader->readEntry(self::RES_DIR, 'en', array('Foo', 'Bar')));
}
public function readMergedEntryProvider()
{
return array(
array('foo', null, 'foo'),
array(null, 'foo', 'foo'),
array(array('foo', 'bar'), null, array('foo', 'bar')),
array(array('foo', 'bar'), array(), array('foo', 'bar')),
array(null, array('baz'), array('baz')),
array(array(), array('baz'), array('baz')),
array(array('foo', 'bar'), array('baz'), array('baz', 'foo', 'bar')),
);
}
/**
* @dataProvider readMergedEntryProvider
*/
public function testReadMergedEntryNoParams($childData, $parentData, $result)
{
$this->readerImpl->expects($this->at(0))
->method('read')
->with(self::RES_DIR, 'en_GB')
->will($this->returnValue($childData));
if (null === $childData || is_array($childData)) {
$this->readerImpl->expects($this->at(1))
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue($parentData));
}
$this->assertSame($result, $this->reader->readEntry(self::RES_DIR, 'en_GB', array(), true));
}
/**
* @dataProvider readMergedEntryProvider
*/
public function testReadMergedEntryWithParams($childData, $parentData, $result)
{
$this->readerImpl->expects($this->at(0))
->method('read')
->with(self::RES_DIR, 'en_GB')
->will($this->returnValue(array('Foo' => array('Bar' => $childData))));
if (null === $childData || is_array($childData)) {
$this->readerImpl->expects($this->at(1))
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue(array('Foo' => array('Bar' => $parentData))));
}
$this->assertSame($result, $this->reader->readEntry(self::RES_DIR, 'en_GB', array('Foo', 'Bar'), true));
}
public function testReadMergedEntryWithUnresolvablePath()
{
$this->readerImpl->expects($this->at(0))
->method('read')
->with(self::RES_DIR, 'en_GB')
->will($this->returnValue(array('Foo' => 'Baz')));
$this->readerImpl->expects($this->at(1))
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue(array('Foo' => 'Bar')));
$this->assertNull($this->reader->readEntry(self::RES_DIR, 'en_GB', array('Foo', 'Bar'), true));
}
public function testReadMergedEntryWithUnresolvablePathInParent()
{
$this->readerImpl->expects($this->at(0))
->method('read')
->with(self::RES_DIR, 'en_GB')
->will($this->returnValue(array('Foo' => array('Bar' => array('three')))));
$this->readerImpl->expects($this->at(1))
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue(array('Foo' => 'Bar')));
$result = array('three');
$this->assertSame($result, $this->reader->readEntry(self::RES_DIR, 'en_GB', array('Foo', 'Bar'), true));
}
public function testReadMergedEntryWithUnresolvablePathInChild()
{
$this->readerImpl->expects($this->at(0))
->method('read')
->with(self::RES_DIR, 'en_GB')
->will($this->returnValue(array('Foo' => 'Baz')));
$this->readerImpl->expects($this->at(1))
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue(array('Foo' => array('Bar' => array('one', 'two')))));
$result = array('one', 'two');
$this->assertSame($result, $this->reader->readEntry(self::RES_DIR, 'en_GB', array('Foo', 'Bar'), true));
}
/**
* @dataProvider readMergedEntryProvider
*/
public function testReadMergedEntryWithTraversables($childData, $parentData, $result)
{
$parentData = is_array($parentData) ? new \ArrayObject($parentData) : $parentData;
$childData = is_array($childData) ? new \ArrayObject($childData) : $childData;
$this->readerImpl->expects($this->at(0))
->method('read')
->with(self::RES_DIR, 'en_GB')
->will($this->returnValue(array('Foo' => array('Bar' => $childData))));
if (null === $childData || $childData instanceof \ArrayObject) {
$this->readerImpl->expects($this->at(1))
->method('read')
->with(self::RES_DIR, 'en')
->will($this->returnValue(array('Foo' => array('Bar' => $parentData))));
}
$this->assertSame($result, $this->reader->readEntry(self::RES_DIR, 'en_GB', array('Foo', 'Bar'), true));
}
}

View file

@ -0,0 +1,63 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\ResourceBundle;
use Symfony\Component\Intl\ResourceBundle\RegionBundle;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class RegionBundleTest extends \PHPUnit_Framework_TestCase
{
const RES_DIR = '/base/region';
/**
* @var RegionBundle
*/
private $bundle;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $reader;
protected function setUp()
{
$this->reader = $this->getMock('Symfony\Component\Intl\ResourceBundle\Reader\StructuredBundleReaderInterface');
$this->bundle = new RegionBundle(self::RES_DIR, $this->reader);
}
public function testGetCountryName()
{
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Countries', 'AT'))
->will($this->returnValue('Austria'));
$this->assertSame('Austria', $this->bundle->getCountryName('AT', 'en'));
}
public function testGetCountryNames()
{
$sortedCountries = array(
'AT' => 'Austria',
'DE' => 'Germany',
);
$this->reader->expects($this->once())
->method('readEntry')
->with(self::RES_DIR, 'en', array('Countries'))
->will($this->returnValue($sortedCountries));
$this->assertSame($sortedCountries, $this->bundle->getCountryNames('en'));
}
}

View file

@ -0,0 +1,101 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\ResourceBundle\Util;
use Symfony\Component\Intl\ResourceBundle\Util\RingBuffer;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class RingBufferTest extends \PHPUnit_Framework_TestCase
{
/**
* @var RingBuffer
*/
private $buffer;
protected function setUp()
{
$this->buffer = new RingBuffer(2);
}
public function testWriteWithinBuffer()
{
$this->buffer[0] = 'foo';
$this->buffer['bar'] = 'baz';
$this->assertTrue(isset($this->buffer[0]));
$this->assertTrue(isset($this->buffer['bar']));
$this->assertSame('foo', $this->buffer[0]);
$this->assertSame('baz', $this->buffer['bar']);
}
public function testWritePastBuffer()
{
$this->buffer[0] = 'foo';
$this->buffer['bar'] = 'baz';
$this->buffer[2] = 'bam';
$this->assertTrue(isset($this->buffer['bar']));
$this->assertTrue(isset($this->buffer[2]));
$this->assertSame('baz', $this->buffer['bar']);
$this->assertSame('bam', $this->buffer[2]);
}
/**
* @expectedException \Symfony\Component\Intl\Exception\OutOfBoundsException
*/
public function testReadNonExistingFails()
{
$this->buffer['foo'];
}
public function testQueryNonExisting()
{
$this->assertFalse(isset($this->buffer['foo']));
}
public function testUnsetNonExistingSucceeds()
{
unset($this->buffer['foo']);
$this->assertFalse(isset($this->buffer['foo']));
}
/**
* @expectedException \Symfony\Component\Intl\Exception\OutOfBoundsException
*/
public function testReadOverwrittenFails()
{
$this->buffer[0] = 'foo';
$this->buffer['bar'] = 'baz';
$this->buffer[2] = 'bam';
$this->buffer[0];
}
public function testQueryOverwritten()
{
$this->assertFalse(isset($this->buffer[0]));
}
public function testUnsetOverwrittenSucceeds()
{
$this->buffer[0] = 'foo';
$this->buffer['bar'] = 'baz';
$this->buffer[2] = 'bam';
unset($this->buffer[0]);
$this->assertFalse(isset($this->buffer[0]));
}
}

View file

@ -0,0 +1,23 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
return array(
'Entry1' => array(
'Array' => array(
0 => 'foo',
1 => 'bar',
),
'Integer' => 5,
'Boolean' => false,
'Float' => 1.23,
),
'Entry2' => 'String',
);

View file

@ -0,0 +1,23 @@
en{
Entry1{
Array{
"foo",
"bar",
{
Key{"value"}
},
}
Integer:int{5}
IntVector:intvector{
0,
1,
2,
3,
}
FalseBoolean{"false"}
TrueBoolean{"true"}
Null{""}
Float{"1.23"}
}
Entry2{"String"}
}

View file

@ -0,0 +1,62 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\ResourceBundle\Writer;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Intl\ResourceBundle\Writer\PhpBundleWriter;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class PhpBundleWriterTest extends \PHPUnit_Framework_TestCase
{
/**
* @var PhpBundleWriter
*/
private $writer;
private $directory;
/**
* @var Filesystem
*/
private $filesystem;
protected function setUp()
{
$this->writer = new PhpBundleWriter();
$this->directory = sys_get_temp_dir() . '/PhpBundleWriterTest/' . rand(1000, 9999);
$this->filesystem = new Filesystem();
$this->filesystem->mkdir($this->directory);
}
protected function tearDown()
{
$this->filesystem->remove($this->directory);
}
public function testWrite()
{
$this->writer->write($this->directory, 'en', array(
'Entry1' => array(
'Array' => array('foo', 'bar'),
'Integer' => 5,
'Boolean' => false,
'Float' => 1.23,
),
'Entry2' => 'String',
));
$this->assertFileEquals(__DIR__ . '/Fixtures/en.php', $this->directory . '/en.php');
}
}

View file

@ -0,0 +1,67 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\ResourceBundle\Writer;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Intl\ResourceBundle\Writer\TextBundleWriter;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*
* @see http://source.icu-project.org/repos/icu/icuhtml/trunk/design/bnf_rb.txt
*/
class TextBundleWriterTest extends \PHPUnit_Framework_TestCase
{
/**
* @var TextBundleWriter
*/
private $writer;
private $directory;
/**
* @var Filesystem
*/
private $filesystem;
protected function setUp()
{
$this->writer = new TextBundleWriter();
$this->directory = sys_get_temp_dir() . '/TextBundleWriterTest/' . rand(1000, 9999);
$this->filesystem = new Filesystem();
$this->filesystem->mkdir($this->directory);
}
protected function tearDown()
{
$this->filesystem->remove($this->directory);
}
public function testWrite()
{
$this->writer->write($this->directory, 'en', array(
'Entry1' => array(
'Array' => array('foo', 'bar', array('Key' => 'value')),
'Integer' => 5,
'IntVector' => array(0, 1, 2, 3),
'FalseBoolean' => false,
'TrueBoolean' => true,
'Null' => null,
'Float' => 1.23,
),
'Entry2' => 'String',
));
$this->assertFileEquals(__DIR__ . '/Fixtures/en.txt', $this->directory . '/en.txt');
}
}

View file

@ -0,0 +1,111 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\Util;
use Symfony\Component\Intl\Util\IcuVersion;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class IcuVersionTest extends \PHPUnit_Framework_TestCase
{
public function normalizeProvider()
{
return array(
array(null, '1', '10'),
array(null, '1.2', '12'),
array(null, '1.2.3', '12.3'),
array(null, '1.2.3.4', '12.3.4'),
array(1, '1', '10'),
array(1, '1.2', '12'),
array(1, '1.2.3', '12'),
array(1, '1.2.3.4', '12'),
array(2, '1', '10'),
array(2, '1.2', '12'),
array(2, '1.2.3', '12.3'),
array(2, '1.2.3.4', '12.3'),
array(3, '1', '10'),
array(3, '1.2', '12'),
array(3, '1.2.3', '12.3'),
array(3, '1.2.3.4', '12.3.4'),
);
}
/**
* @dataProvider normalizeProvider
*/
public function testNormalize($precision, $version, $result)
{
$this->assertSame($result, IcuVersion::normalize($version, $precision));
}
public function compareProvider()
{
return array(
array(null, '1', '==', '1', true),
array(null, '1.0', '==', '1.1', false),
array(null, '1.0.0', '==', '1.0.1', false),
array(null, '1.0.0.0', '==', '1.0.0.1', false),
array(null, '1.0.0.0.0', '==', '1.0.0.0.1', false),
array(null, '1', '==', '10', true),
array(null, '1.0', '==', '11', false),
array(null, '1.0.0', '==', '10.1', false),
array(null, '1.0.0.0', '==', '10.0.1', false),
array(null, '1.0.0.0.0', '==', '10.0.0.1', false),
array(1, '1', '==', '1', true),
array(1, '1.0', '==', '1.1', false),
array(1, '1.0.0', '==', '1.0.1', true),
array(1, '1.0.0.0', '==', '1.0.0.1', true),
array(1, '1.0.0.0.0', '==', '1.0.0.0.1', true),
array(1, '1', '==', '10', true),
array(1, '1.0', '==', '11', false),
array(1, '1.0.0', '==', '10.1', true),
array(1, '1.0.0.0', '==', '10.0.1', true),
array(1, '1.0.0.0.0', '==', '10.0.0.1', true),
array(2, '1', '==', '1', true),
array(2, '1.0', '==', '1.1', false),
array(2, '1.0.0', '==', '1.0.1', false),
array(2, '1.0.0.0', '==', '1.0.0.1', true),
array(2, '1.0.0.0.0', '==', '1.0.0.0.1', true),
array(2, '1', '==', '10', true),
array(2, '1.0', '==', '11', false),
array(2, '1.0.0', '==', '10.1', false),
array(2, '1.0.0.0', '==', '10.0.1', true),
array(2, '1.0.0.0.0', '==', '10.0.0.1', true),
array(3, '1', '==', '1', true),
array(3, '1.0', '==', '1.1', false),
array(3, '1.0.0', '==', '1.0.1', false),
array(3, '1.0.0.0', '==', '1.0.0.1', false),
array(3, '1.0.0.0.0', '==', '1.0.0.0.1', true),
array(3, '1', '==', '10', true),
array(3, '1.0', '==', '11', false),
array(3, '1.0.0', '==', '10.1', false),
array(3, '1.0.0.0', '==', '10.0.1', false),
array(3, '1.0.0.0.0', '==', '10.0.0.1', true),
);
}
/**
* @dataProvider compareProvider
*/
public function testCompare($precision, $version1, $operator, $version2, $result)
{
$this->assertSame($result, IcuVersion::compare($version1, $version2, $operator, $precision));
}
}

View file

@ -0,0 +1,87 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Intl\Tests\Util;
use Symfony\Component\Intl\Util\Version;
/**
* @author Bernhard Schussek <bschussek@gmail.com>
*/
class VersionTest extends \PHPUnit_Framework_TestCase
{
public function normalizeProvider()
{
return array(
array(null, '1', '1'),
array(null, '1.2', '1.2'),
array(null, '1.2.3', '1.2.3'),
array(null, '1.2.3.4', '1.2.3.4'),
array(1, '1', '1'),
array(1, '1.2', '1'),
array(1, '1.2.3', '1'),
array(1, '1.2.3.4', '1'),
array(2, '1', '1'),
array(2, '1.2', '1.2'),
array(2, '1.2.3', '1.2'),
array(2, '1.2.3.4', '1.2'),
array(3, '1', '1'),
array(3, '1.2', '1.2'),
array(3, '1.2.3', '1.2.3'),
array(3, '1.2.3.4', '1.2.3'),
array(4, '1', '1'),
array(4, '1.2', '1.2'),
array(4, '1.2.3', '1.2.3'),
array(4, '1.2.3.4', '1.2.3.4'),
);
}
/**
* @dataProvider normalizeProvider
*/
public function testNormalize($precision, $version, $result)
{
$this->assertSame($result, Version::normalize($version, $precision));
}
public function compareProvider()
{
return array(
array(null, '1', '==', '1', true),
array(null, '1.0', '==', '1.1', false),
array(null, '1.0.0', '==', '1.0.1', false),
array(null, '1.0.0.0', '==', '1.0.0.1', false),
array(1, '1', '==', '1', true),
array(1, '1.0', '==', '1.1', true),
array(1, '1.0.0', '==', '1.0.1', true),
array(1, '1.0.0.0', '==', '1.0.0.1', true),
array(2, '1', '==', '1', true),
array(2, '1.0', '==', '1.1', false),
array(2, '1.0.0', '==', '1.0.1', true),
array(2, '1.0.0.0', '==', '1.0.0.1', true),
array(3, '1', '==', '1', true),
array(3, '1.0', '==', '1.1', false),
array(3, '1.0.0', '==', '1.0.1', false),
array(3, '1.0.0.0', '==', '1.0.0.1', true),
);
}
/**
* @dataProvider compareProvider
*/
public function testCompare($precision, $version1, $operator, $version2, $result)
{
$this->assertSame($result, Version::compare($version1, $version2, $operator, $precision));
}
}