This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
symfony/tests/Symfony/Tests/Component/Locale/Stub/StubIntlDateFormatterTest.php

842 lines
30 KiB
PHP
Raw Normal View History

<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Component\Locale\Stub;
require_once __DIR__.'/../TestCase.php';
use Symfony\Component\Locale\Locale;
use Symfony\Component\Locale\Stub\StubIntlDateFormatter;
use Symfony\Tests\Component\Locale\TestCase as LocaleTestCase;
class StubIntlDateFormatterTest extends LocaleTestCase
{
/**
* @expectedException Symfony\Component\Locale\Exception\MethodArgumentValueNotImplementedException
*/
public function testConstructorWithUnsupportedLocale()
{
$formatter = new StubIntlDateFormatter('pt_BR', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT);
}
public function testConstructor()
{
$formatter = new StubIntlDateFormatter('en', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT, 'UTC', StubIntlDateFormatter::GREGORIAN, 'y-M-d');
$this->assertEquals('y-M-d', $formatter->getPattern());
}
/**
2011-03-07 02:46:23 +00:00
* When a time zone is not specified, it uses the system default however it returns null in the getter method
* @covers Symfony\Component\Locale\Stub\StubIntlDateFormatter::getTimeZoneId
* @covers Symfony\Component\Locale\Stub\StubIntlDateFormatter::setTimeZoneId
* @see StubIntlDateFormatterTest::testDefaultTimeZoneIntl()
*/
public function testConstructorDefaultTimeZoneStub()
{
$formatter = new StubIntlDateFormatter('en', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT);
$this->assertNull($formatter->getTimeZoneId());
}
public function testConstructorDefaultTimeZoneIntl()
{
$this->skipIfIntlExtensionIsNotLoaded();
$formatter = new \IntlDateFormatter('en', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT);
$this->assertNull($formatter->getTimeZoneId());
}
/**
* @dataProvider formatProvider
*/
public function testFormatStub($pattern, $timestamp, $expected)
{
$formatter = $this->createStubFormatter($pattern);
$this->assertSame($expected, $formatter->format($timestamp));
}
/**
* @dataProvider formatProvider
*/
public function testFormatIntl($pattern, $timestamp, $expected)
{
$this->skipIfIntlExtensionIsNotLoaded();
$formatter = $this->createIntlFormatter($pattern);
$this->assertSame($expected, $formatter->format($timestamp));
}
public function formatProvider()
{
2011-02-18 21:44:27 +00:00
$formatData = array(
/* general */
array('y-M-d', 0, '1970-1-1'),
array("yyyy.MM.dd 'at' HH:mm:ss zzz", 0, '1970.01.01 at 00:00:00 GMT+00:00'),
2011-02-17 08:46:11 +00:00
array("EEE, MMM d, ''yy", 0, "Thu, Jan 1, '70"),
array('h:mm a', 0, '12:00 AM'),
array('K:mm a, z', 0, '0:00 AM, GMT+00:00'),
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"),
2011-02-06 19:21:41 +00:00
/* month */
array('M', 0, '1'),
array('MM', 0, '01'),
array('MMM', 0, 'Jan'),
array('MMMM', 0, 'January'),
array('MMMMM', 0, 'J'),
2011-02-06 19:21:41 +00:00
array('MMMMMM', 0, '000001'),
array('L', 0, '1'),
array('LL', 0, '01'),
array('LLL', 0, 'Jan'),
array('LLLL', 0, 'January'),
array('LLLLL', 0, 'J'),
2011-02-06 19:21:41 +00:00
array('LLLLLL', 0, '000001'),
2011-02-06 19:21:41 +00:00
/* 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'),
2011-02-06 19:30:29 +00:00
// 4 months
array('Q', 7776000, '2'),
array('QQ', 7776000, '02'),
array('QQQ', 7776000, 'Q2'),
array('QQQQ', 7776000, '2nd quarter'),
2011-02-06 19:30:29 +00:00
// 7 months
array('QQQQ', 15638400, '3rd quarter'),
2011-02-06 19:30:29 +00:00
// 10 months
array('QQQQ', 23587200, '4th quarter'),
2011-02-06 19:21:41 +00:00
/* 12-hour (1-12) */
2011-02-06 19:21:41 +00:00
array('h', 0, '12'),
array('hh', 0, '12'),
array('hhh', 0, '012'),
array('h', 1, '12'),
array('h', 3600, '1'),
2011-02-06 20:06:48 +00:00
array('h', 43200, '12'), // 12 hours
2011-02-06 19:30:29 +00:00
/* 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
2011-02-06 19:42:30 +00:00
/* 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'),
2011-02-06 20:00:22 +00:00
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'),
2011-02-06 20:06:48 +00:00
2011-02-07 11:07:41 +00:00
/* 24-hour (0-23) */
2011-02-06 20:06:48 +00:00
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'),
2011-02-07 11:07:41 +00:00
/* 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
2011-02-07 11:23:47 +00:00
/* 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
/* timezone */
array('z', 0, 'GMT+00:00'),
array('zz', 0, 'GMT+00:00'),
array('zzz', 0, 'GMT+00:00'),
array('zzzz', 0, 'GMT+00:00'),
array('zzzzz', 0, 'GMT+00:00'),
);
2011-02-18 21:44:27 +00:00
return $formatData;
}
/**
2011-03-07 02:46:23 +00:00
* @dataProvider formatWithTimezoneProvider
*/
public function testFormatWithTimezoneStub($timestamp, $timezone, $expected)
{
$pattern = 'yyyy-MM-dd HH:mm:ss';
$formatter = new StubIntlDateFormatter('en', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT, $timezone, StubIntlDateFormatter::GREGORIAN, $pattern);
$this->assertSame($expected, $formatter->format($timestamp));
}
/**
2011-03-07 02:46:23 +00:00
* @dataProvider formatWithTimezoneProvider
*/
public function testFormatWithTimezoneIntl($timestamp, $timezone, $expected)
{
$this->skipIfIntlExtensionIsNotLoaded();
$pattern = 'yyyy-MM-dd HH:mm:ss';
$formatter = new \IntlDateFormatter('en', \IntlDateFormatter::MEDIUM, \IntlDateFormatter::SHORT, $timezone, \IntlDateFormatter::GREGORIAN, $pattern);
$this->assertSame($expected, $formatter->format($timestamp));
}
public function formatWithTimezoneProvider()
{
return array(
array(0, 'UTC', '1970-01-01 00:00:00'),
2011-03-07 02:46:23 +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'),
2011-03-07 02:46:23 +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'),
2011-03-07 02:46:23 +00:00
// When time zone not exists, uses UTC by default
array(0, 'Foo/Bar', '1970-01-01 00:00:00'),
2011-03-07 02:46:23 +00:00
array(0, 'UTC+04:30', '1970-01-01 00:00:00'),
array(0, 'UTC+04:AA', '1970-01-01 00:00:00'),
);
}
/**
* @expectedException Symfony\Component\Locale\Exception\NotImplementedException
*/
public function testFormatWithTimezoneFormatOptionAndDifferentThanUtcStub()
{
$formatter = $this->createStubFormatter('zzzz');
$formatter->setTimeZoneId('Pacific/Fiji');
$formatter->format(0);
}
public function testFormatWithTimezoneFormatOptionAndDifferentThanUtcIntl()
{
$this->skipIfIntlExtensionIsNotLoaded();
$formatter = $this->createIntlFormatter('zzzz');
$formatter->setTimeZoneId('Pacific/Fiji');
$this->assertEquals('Fiji Time', $formatter->format(0));
}
public function testFormatWithGmtTimezoneStub()
{
$formatter = $this->createStubFormatter('zzzz');
$formatter->setTimeZoneId('GMT+03:00');
$this->assertEquals('GMT+03:00', $formatter->format(0));
}
public function testFormatWithGmtTimezoneIntl()
{
$this->skipIfIntlExtensionIsNotLoaded();
$formatter = $this->createIntlFormatter('zzzz');
$formatter->setTimeZoneId('GMT+03:00');
$this->assertEquals('GMT+03:00', $formatter->format(0));
}
public function testFormatWithDefaultTimezoneStub()
{
$formatter = new StubIntlDateFormatter('en', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT);
$formatter->setPattern('yyyy-MM-dd HH:mm:ss');
$this->assertEquals(
$this->createDateTime(0)->format('Y-m-d H:i:s'),
$formatter->format(0)
);
}
public function testFormatWithDefaultTimezoneIntl()
{
$this->skipIfIntlExtensionIsNotLoaded();
$formatter = new \IntlDateFormatter('en', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT);
$formatter->setPattern('yyyy-MM-dd HH:mm:ss');
$this->assertEquals(
$this->createDateTime(0)->format('Y-m-d H:i:s'),
$formatter->format(0)
);
}
/**
* @expectedException Symfony\Component\Locale\Exception\NotImplementedException
*/
public function testFormatWithUnimplementedCharsStub()
{
$pattern = 'Y';
$formatter = new StubIntlDateFormatter('en', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT, 'UTC', StubIntlDateFormatter::GREGORIAN, $pattern);
$formatter->format(0);
}
/**
* @expectedException Symfony\Component\Locale\Exception\NotImplementedException
*/
public function testFormatWithNonIntegerTimestamp()
{
$formatter = $this->createStubFormatter();
$formatter->format(array());
}
/**
* @dataProvider dateAndTimeTypeProvider
*/
public function testDateAndTimeTypeStub($timestamp, $datetype, $timetype, $expected)
{
$formatter = new StubIntlDateFormatter('en', $datetype, $timetype, 'UTC');
$this->assertSame($expected, $formatter->format($timestamp));
}
/**
* @dataProvider dateAndTimeTypeProvider
*/
public function testDateAndTimeTypeIntl($timestamp, $datetype, $timetype, $expected)
{
$this->skipIfIntlExtensionIsNotLoaded();
$formatter = new \IntlDateFormatter('en', $datetype, $timetype, 'UTC');
$this->assertSame($expected, $formatter->format($timestamp));
}
public function dateAndTimeTypeProvider()
{
return array(
array(0, StubIntlDateFormatter::FULL, StubIntlDateFormatter::NONE, 'Thursday, January 1, 1970'),
array(0, StubIntlDateFormatter::LONG, StubIntlDateFormatter::NONE, 'January 1, 1970'),
array(0, StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::NONE, 'Jan 1, 1970'),
array(0, StubIntlDateFormatter::SHORT, StubIntlDateFormatter::NONE, '1/1/70'),
array(0, StubIntlDateFormatter::NONE, StubIntlDateFormatter::FULL, '12:00:00 AM GMT+00:00'),
array(0, StubIntlDateFormatter::NONE, StubIntlDateFormatter::LONG, '12:00:00 AM GMT+00:00'),
array(0, StubIntlDateFormatter::NONE, StubIntlDateFormatter::MEDIUM, '12:00:00 AM'),
array(0, StubIntlDateFormatter::NONE, StubIntlDateFormatter::SHORT, '12:00 AM'),
);
}
public function testGetCalendar()
{
$formatter = $this->createStubFormatter();
$this->assertEquals(StubIntlDateFormatter::GREGORIAN, $formatter->getCalendar());
}
public function testGetDateType()
{
$formatter = new StubIntlDateFormatter('en', StubIntlDateFormatter::FULL, StubIntlDateFormatter::NONE);
$this->assertEquals(StubIntlDateFormatter::FULL, $formatter->getDateType());
}
public function testGetErrorCode()
{
$formatter = $this->createStubFormatter();
$this->assertEquals(StubIntlDateFormatter::U_ZERO_ERROR, $formatter->getErrorCode());
}
public function testGetErrorMessage()
{
$formatter = $this->createStubFormatter();
$this->assertEquals(StubIntlDateFormatter::U_ZERO_ERROR_MESSAGE, $formatter->getErrorMessage());
}
public function testGetLocale()
{
$formatter = $this->createStubFormatter();
$this->assertEquals('en', $formatter->getLocale());
}
public function testGetPattern()
{
$formatter = new StubIntlDateFormatter('en', StubIntlDateFormatter::FULL, StubIntlDateFormatter::NONE, 'UTC', StubIntlDateFormatter::GREGORIAN, 'yyyy-MM-dd');
$this->assertEquals('yyyy-MM-dd', $formatter->getPattern());
}
public function testGetTimeType()
{
$formatter = new StubIntlDateFormatter('en', StubIntlDateFormatter::NONE, StubIntlDateFormatter::FULL);
$this->assertEquals(StubIntlDateFormatter::FULL, $formatter->getTimeType());
}
/**
* @expectedException Symfony\Component\Locale\Exception\MethodNotImplementedException
*/
public function testIsLenient()
{
$formatter = $this->createStubFormatter();
$formatter->isLenient();
}
/**
* @expectedException Symfony\Component\Locale\Exception\MethodNotImplementedException
*/
public function testLocaltime()
{
$formatter = $this->createStubFormatter();
$formatter->localtime('Wednesday, December 31, 1969 4:00:00 PM PT');
}
/**
* @dataProvider parseProvider
*/
public function testParseIntl($pattern, $value, $expected)
{
$this->skipIfIntlExtensionIsNotLoaded();
$formatter = $this->createIntlFormatter($pattern);
2011-02-28 09:16:40 +00:00
$this->assertSame($expected, $formatter->parse($value));
}
/**
* @dataProvider parseProvider
*/
public function testParseStub($pattern, $value, $expected)
{
$formatter = $this->createStubFormatter($pattern);
2011-02-28 09:16:40 +00:00
$this->assertSame($expected, $formatter->parse($value));
}
public function parseProvider()
{
return array(
// years
array('y-M-d', '1970-1-1', 0),
// TODO: review to support or not this variant
// array('yy-M-d', '70-1-1', 0),
// months
array('y-M-d', '1970-1-1', 0),
array('y-MMM-d', '1970-Jan-1', 0),
array('y-MMMM-d', '1970-January-1', 0),
// 1 char month
array('y-MMMMM-d', '1970-J-1', false),
array('y-MMMMM-d', '1970-S-1', false),
// standalone months
array('y-L-d', '1970-1-1', 0),
array('y-LLL-d', '1970-Jan-1', 0),
array('y-LLLL-d', '1970-January-1', 0),
// standalone 1 char month
array('y-LLLLL-d', '1970-J-1', false),
array('y-LLLLL-d', '1970-S-1', false),
// days
array('y-M-d', '1970-1-1', 0),
array('y-M-dd', '1970-1-01', 0),
array('y-M-ddd', '1970-1-001', 0),
// 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),
// 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),
// 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),
// 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),
// minutes
array('y-M-d HH:m', '1970-1-1 0:1', 60),
array('y-M-d HH:mm', '1970-1-1 0:10', 600),
// seconds
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),
// timezone
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),
2011-03-07 02:46:23 +00:00
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 timezoned parsing should not change the timezone for the next parsing
array('y-M-d HH:mm:ss', '1970-1-1 00:00:00', 0),
// 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),
// regExp metachars in the pattern string
array('y[M-d', '1970[1-1', 0),
array('y[M/d', '1970[1/1', 0),
// quote characters
array("'M'", 'M', 0),
array("'yy'", 'yy', 0),
array("'''yy'", "'yy", 0),
array("''y", "'1970", 0),
array("H 'o'' clock'", "0 o' clock", 0),
);
}
/**
* Just to document the differencies 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
*
* @dataProvider parseDifferencies()
*/
public function testParseDifferenciesStub($pattern, $value, $stubExpected, $intlExpected)
{
$formatter = $this->createStubFormatter($pattern);
$this->assertSame($stubExpected, $formatter->parse($value));
}
/**
* @dataProvider parseDifferencies()
*/
public function testParseDifferenciesIntl($pattern, $value, $stubExpected, $intlExpected)
{
$formatter = $this->createIntlFormatter($pattern);
$this->assertSame($intlExpected, $formatter->parse($value));
}
public function parseDifferencies()
{
return array(
// AM/PM, ignored if alone
array('a', 'AM', 0, 0),
array('a', 'PM', 0, 43200),
// day of week
array('E', 'Thu', 0, 0),
array('EE', 'Thu', 0, 0),
array('EEE', 'Thu', 0, 0),
array('EEEE', 'Thursday', 0, 0),
array('EEEEE', 'T', 0, 432000),
array('EEEEEE', 'Thu', 0, 0),
// day of year
array('D', '1', 0, 0),
array('D', '2', 0, 86400),
// quarter
array('Q', '1', 0, 0),
array('QQ', '01', 0, 0),
array('QQQ', 'Q1', 0, 0),
array('QQQQ', '1st quarter', 0, 0),
array('QQQQQ', '1st quarter', 0, 0),
array('Q', '2', 0, 7776000),
array('QQ', '02', 0, 7776000),
array('QQQ', 'Q2', 0, 7776000),
array('QQQQ', '2nd quarter', 0, 7776000),
array('QQQQQ', '2nd quarter', 0, 7776000),
array('q', '1', 0, 0),
array('qq', '01', 0, 0),
array('qqq', 'Q1', 0, 0),
array('qqqq', '1st quarter', 0, 0),
array('qqqqq', '1st quarter', 0, 0),
);
}
public function testParseWithNullPositionValueStub()
{
$position = null;
$formatter = $this->createStubFormatter('y');
$this->assertSame(0, $formatter->parse('1970', $position));
$this->assertNull($position);
}
/**
* @expectedException Symfony\Component\Locale\Exception\MethodArgumentNotImplementedException
*/
public function testParseWithNotNullPositionValueStub()
{
$position = 0;
$formatter = $this->createStubFormatter('y');
$this->assertSame(0, $formatter->parse('1970', $position));
}
/**
* @expectedException Symfony\Component\Locale\Exception\MethodNotImplementedException
*/
public function testSetCalendar()
{
$formatter = $this->createStubFormatter();
$formatter->setCalendar(StubIntlDateFormatter::GREGORIAN);
}
/**
* @expectedException Symfony\Component\Locale\Exception\MethodNotImplementedException
*/
public function testSetLenient()
{
$formatter = $this->createStubFormatter();
$formatter->setLenient(true);
}
public function testSetPattern()
{
$formatter = $this->createStubFormatter();
$formatter->setPattern('yyyy-MM-dd');
$this->assertEquals('yyyy-MM-dd', $formatter->getPattern());
}
2011-03-07 02:46:23 +00:00
/**
* @covers Symfony\Component\Locale\Stub\StubIntlDateFormatter::getTimeZoneId
* @dataProvider setTimeZoneIdProvider()
*/
public function testSetTimeZoneIdStub($timeZoneId)
{
$formatter = $this->createStubFormatter();
2011-03-07 02:46:23 +00:00
$formatter->setTimeZoneId($timeZoneId);
$this->assertEquals($timeZoneId, $formatter->getTimeZoneId());
}
2011-03-07 02:46:23 +00:00
/**
* @dataProvider setTimeZoneIdProvider()
*/
public function testSetTimeZoneIdIntl($timeZoneId)
{
$this->skipIfIntlExtensionIsNotLoaded();
$formatter = $this->createIntlFormatter();
2011-03-07 02:46:23 +00:00
$formatter->setTimeZoneId($timeZoneId);
$this->assertEquals($timeZoneId, $formatter->getTimeZoneId());
}
public function setTimeZoneIdProvider()
{
return array(
array('UTC'),
array('GMT'),
array('GMT-03:00'),
array('GMT-0300'),
array('Europe/Zurich'),
2011-03-07 02:46:23 +00:00
// When time zone not exists, uses UTC by default
array('Foo/Bar'),
array('GMT+00:AA'),
array('GMT+00AA'),
);
}
/**
* @expectedException Symfony\Component\Locale\Exception\NotImplementedException
*/
public function testSetTimeZoneIdWithGmtTimeZoneWithMinutesOffsetStub()
{
$formatter = $this->createStubFormatter();
$formatter->setTimeZoneId('GMT+00:30');
}
public function testSetTimeZoneIdWithGmtTimeZoneWithMinutesOffsetIntl()
{
$this->skipIfIntlExtensionIsNotLoaded();
$formatter = $this->createIntlFormatter();
$formatter->setTimeZoneId('GMT+00:30');
$this->assertEquals('GMT+00:30', $formatter->getTimeZoneId());
}
public function testStaticCreate()
{
$formatter = StubIntlDateFormatter::create('en', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT);
$this->assertInstanceOf('Symfony\Component\Locale\Stub\StubIntlDateFormatter', $formatter);
}
protected function createStubFormatter($pattern = null)
{
return new StubIntlDateFormatter('en', StubIntlDateFormatter::MEDIUM, StubIntlDateFormatter::SHORT, 'UTC', StubIntlDateFormatter::GREGORIAN, $pattern);
}
protected function createIntlFormatter($pattern = null)
{
return new \IntlDateFormatter('en', \IntlDateFormatter::MEDIUM, \IntlDateFormatter::SHORT, 'UTC', \IntlDateFormatter::GREGORIAN, $pattern);
}
2011-03-07 02:46:23 +00:00
protected function createDateTime($timestamp = null, $timeZone = null)
{
$timestamp = is_null($timestamp) ? time() : $timestamp;
$timeZone = is_null($timeZone) ? date_default_timezone_get() : $timeZone;
$dateTime = new \DateTime();
$dateTime->setTimestamp($timestamp);
$dateTime->setTimeZone(new \DateTimeZone($timeZone));
return $dateTime;
}
}