DateTimeToLocalizedStringTransformerTest.php 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Tests\Component\Form\Extension\Core\DataTransformer;
  11. require_once __DIR__ . '/DateTimeTestCase.php';
  12. use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToLocalizedStringTransformer;
  13. class DateTimeToLocalizedStringTransformerTest extends DateTimeTestCase
  14. {
  15. protected $dateTime;
  16. protected $dateTimeWithoutSeconds;
  17. protected function setUp()
  18. {
  19. parent::setUp();
  20. \Locale::setDefault('de_AT');
  21. $this->dateTime = new \DateTime('2010-02-03 04:05:06 UTC');
  22. $this->dateTimeWithoutSeconds = new \DateTime('2010-02-03 04:05:00 UTC');
  23. }
  24. protected function tearDown()
  25. {
  26. $this->dateTime = null;
  27. $this->dateTimeWithoutSeconds = null;
  28. }
  29. public static function assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10, $canonicalize = FALSE, $ignoreCase = FALSE)
  30. {
  31. if ($expected instanceof \DateTime && $actual instanceof \DateTime) {
  32. $expected = $expected->format('c');
  33. $actual = $actual->format('c');
  34. }
  35. parent::assertEquals($expected, $actual, $message, $delta, $maxDepth, $canonicalize, $ignoreCase);
  36. }
  37. public function testTransformShortDate()
  38. {
  39. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::SHORT);
  40. $this->assertEquals('03.02.10 04:05', $transformer->transform($this->dateTime));
  41. }
  42. public function testTransformMediumDate()
  43. {
  44. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::MEDIUM);
  45. $this->assertEquals('03.02.2010 04:05', $transformer->transform($this->dateTime));
  46. }
  47. public function testTransformLongDate()
  48. {
  49. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::LONG);
  50. $this->assertEquals('03. Februar 2010 04:05', $transformer->transform($this->dateTime));
  51. }
  52. public function testTransformFullDate()
  53. {
  54. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::FULL);
  55. $this->assertEquals('Mittwoch, 03. Februar 2010 04:05', $transformer->transform($this->dateTime));
  56. }
  57. public function testTransformShortTime()
  58. {
  59. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', null, \IntlDateFormatter::SHORT);
  60. $this->assertEquals('03.02.2010 04:05', $transformer->transform($this->dateTime));
  61. }
  62. public function testTransformMediumTime()
  63. {
  64. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', null, \IntlDateFormatter::MEDIUM);
  65. $this->assertEquals('03.02.2010 04:05:06', $transformer->transform($this->dateTime));
  66. }
  67. public function testTransformLongTime()
  68. {
  69. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', null, \IntlDateFormatter::LONG);
  70. $expected = $this->isLowerThanIcuVersion('4.8') ? '03.02.2010 04:05:06 GMT+00:00' : '03.02.2010 04:05:06 GMT';
  71. $this->assertEquals($expected, $transformer->transform($this->dateTime));
  72. }
  73. public function testTransformFullTime()
  74. {
  75. if ($this->isLowerThanIcuVersion(3.8)) {
  76. $this->markTestSkipped('Please upgrade ICU version to 3.8+');
  77. }
  78. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', null, \IntlDateFormatter::FULL);
  79. $expected = $this->isLowerThanIcuVersion('4.8') ? '03.02.2010 04:05:06 GMT+00:00' : '03.02.2010 04:05:06 GMT';
  80. $this->assertEquals($expected, $transformer->transform($this->dateTime));
  81. }
  82. public function testTransformToDifferentLocale()
  83. {
  84. \Locale::setDefault('en_US');
  85. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC');
  86. $this->assertEquals('Feb 3, 2010 4:05 AM', $transformer->transform($this->dateTime));
  87. }
  88. public function testTransform_empty()
  89. {
  90. $transformer = new DateTimeToLocalizedStringTransformer();
  91. $this->assertSame('', $transformer->transform(null));
  92. }
  93. public function testTransform_differentTimezones()
  94. {
  95. $transformer = new DateTimeToLocalizedStringTransformer('America/New_York', 'Asia/Hong_Kong');
  96. $input = new \DateTime('2010-02-03 04:05:06 America/New_York');
  97. $dateTime = clone $input;
  98. $dateTime->setTimezone(new \DateTimeZone('Asia/Hong_Kong'));
  99. $this->assertEquals($dateTime->format('d.m.Y H:i'), $transformer->transform($input));
  100. }
  101. public function testTransform_differentPatterns()
  102. {
  103. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::FULL, \IntlDateFormatter::FULL, \IntlDateFormatter::GREGORIAN, 'MM*yyyy*dd HH|mm|ss');
  104. $this->assertEquals('02*2010*03 04|05|06', $transformer->transform($this->dateTime));
  105. }
  106. /**
  107. * @expectedException Symfony\Component\Form\Exception\UnexpectedTypeException
  108. */
  109. public function testTransformRequiresValidDateTime()
  110. {
  111. $transformer = new DateTimeToLocalizedStringTransformer();
  112. $transformer->transform('2010-01-01');
  113. }
  114. public function testTransformWrapsIntlErrors()
  115. {
  116. $transformer = new DateTimeToLocalizedStringTransformer();
  117. // HOW TO REPRODUCE?
  118. //$this->setExpectedException('Symfony\Component\Form\Extension\Core\DataTransformer\Transdate_formationFailedException');
  119. //$transformer->transform(1.5);
  120. }
  121. public function testReverseTransformShortDate()
  122. {
  123. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::SHORT);
  124. $this->assertDateTimeEquals($this->dateTimeWithoutSeconds, $transformer->reverseTransform('03.02.10 04:05'));
  125. }
  126. public function testReverseTransformMediumDate()
  127. {
  128. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::MEDIUM);
  129. $this->assertDateTimeEquals($this->dateTimeWithoutSeconds, $transformer->reverseTransform('03.02.2010 04:05'));
  130. }
  131. public function testReverseTransformLongDate()
  132. {
  133. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::LONG);
  134. $this->assertDateTimeEquals($this->dateTimeWithoutSeconds, $transformer->reverseTransform('03. Februar 2010 04:05'));
  135. }
  136. public function testReverseTransformFullDate()
  137. {
  138. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::FULL);
  139. $this->assertDateTimeEquals($this->dateTimeWithoutSeconds, $transformer->reverseTransform('Mittwoch, 03. Februar 2010 04:05'));
  140. }
  141. public function testReverseTransformShortTime()
  142. {
  143. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', null, \IntlDateFormatter::SHORT);
  144. $this->assertDateTimeEquals($this->dateTimeWithoutSeconds, $transformer->reverseTransform('03.02.2010 04:05'));
  145. }
  146. public function testReverseTransformMediumTime()
  147. {
  148. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', null, \IntlDateFormatter::MEDIUM);
  149. $this->assertDateTimeEquals($this->dateTime, $transformer->reverseTransform('03.02.2010 04:05:06'));
  150. }
  151. public function testReverseTransformLongTime()
  152. {
  153. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', null, \IntlDateFormatter::LONG);
  154. $this->assertDateTimeEquals($this->dateTime, $transformer->reverseTransform('03.02.2010 04:05:06 GMT+00:00'));
  155. }
  156. public function testReverseTransformFullTime()
  157. {
  158. if ($this->isLowerThanIcuVersion(3.8)) {
  159. $this->markTestSkipped('Please upgrade ICU version to 3.8+');
  160. }
  161. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', null, \IntlDateFormatter::FULL);
  162. $this->assertDateTimeEquals($this->dateTime, $transformer->reverseTransform('03.02.2010 04:05:06 GMT+00:00'));
  163. }
  164. public function testReverseTransformFromDifferentLocale()
  165. {
  166. \Locale::setDefault('en_US');
  167. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC');
  168. $this->assertDateTimeEquals($this->dateTimeWithoutSeconds, $transformer->reverseTransform('Feb 3, 2010 04:05 AM'));
  169. }
  170. public function testReverseTransform_differentTimezones()
  171. {
  172. $transformer = new DateTimeToLocalizedStringTransformer('America/New_York', 'Asia/Hong_Kong');
  173. $dateTime = new \DateTime('2010-02-03 04:05:00 Asia/Hong_Kong');
  174. $dateTime->setTimezone(new \DateTimeZone('America/New_York'));
  175. $this->assertDateTimeEquals($dateTime, $transformer->reverseTransform('03.02.2010 04:05'));
  176. }
  177. public function testReverseTransform_differentPatterns()
  178. {
  179. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::FULL, \IntlDateFormatter::FULL, \IntlDateFormatter::GREGORIAN, 'MM*yyyy*dd HH|mm|ss');
  180. $this->assertDateTimeEquals($this->dateTime, $transformer->reverseTransform('02*2010*03 04|05|06'));
  181. }
  182. public function testReverseTransform_empty()
  183. {
  184. $transformer = new DateTimeToLocalizedStringTransformer();
  185. $this->assertNull($transformer->reverseTransform(''));
  186. }
  187. /**
  188. * @expectedException Symfony\Component\Form\Exception\UnexpectedTypeException
  189. */
  190. public function testReverseTransformRequiresString()
  191. {
  192. $transformer = new DateTimeToLocalizedStringTransformer();
  193. $transformer->reverseTransform(12345);
  194. }
  195. /**
  196. * @expectedException Symfony\Component\Form\Exception\TransformationFailedException
  197. */
  198. public function testReverseTransformWrapsIntlErrors()
  199. {
  200. $transformer = new DateTimeToLocalizedStringTransformer();
  201. $transformer->reverseTransform('12345');
  202. }
  203. /**
  204. * @expectedException Symfony\Component\Form\Exception\UnexpectedTypeException
  205. */
  206. public function testValidateDateFormatOption()
  207. {
  208. new DateTimeToLocalizedStringTransformer(null, null, 'foobar');
  209. }
  210. /**
  211. * @expectedException Symfony\Component\Form\Exception\UnexpectedTypeException
  212. */
  213. public function testValidateTimeFormatOption()
  214. {
  215. new DateTimeToLocalizedStringTransformer(null, null, null, 'foobar');
  216. }
  217. /**
  218. * @expectedException Symfony\Component\Form\Exception\TransformationFailedException
  219. */
  220. public function testReverseTransformWithNonExistingDate()
  221. {
  222. $transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::SHORT);
  223. $this->assertDateTimeEquals($this->dateTimeWithoutSeconds, $transformer->reverseTransform('31.04.10 04:05'));
  224. }
  225. }