comparison vendor/symfony/var-dumper/Tests/Caster/DateCasterTest.php @ 12:7a779792577d

Update Drupal core to v8.4.5 (via Composer)
author Chris Cannam
date Fri, 23 Feb 2018 15:52:07 +0000
parents
children 129ea1e6d783
comparison
equal deleted inserted replaced
11:bfffd8d7479a 12:7a779792577d
1 <?php
2
3 /*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12 namespace Symfony\Component\VarDumper\Tests\Caster;
13
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\VarDumper\Caster\Caster;
16 use Symfony\Component\VarDumper\Caster\DateCaster;
17 use Symfony\Component\VarDumper\Cloner\Stub;
18 use Symfony\Component\VarDumper\Test\VarDumperTestTrait;
19
20 /**
21 * @author Dany Maillard <danymaillard93b@gmail.com>
22 */
23 class DateCasterTest extends TestCase
24 {
25 use VarDumperTestTrait;
26
27 /**
28 * @dataProvider provideDateTimes
29 */
30 public function testDumpDateTime($time, $timezone, $xDate, $xTimestamp)
31 {
32 if ((defined('HHVM_VERSION_ID') || PHP_VERSION_ID <= 50509) && preg_match('/[-+]\d{2}:\d{2}/', $timezone)) {
33 $this->markTestSkipped('DateTimeZone GMT offsets are supported since 5.5.10. See https://github.com/facebook/hhvm/issues/5875 for HHVM.');
34 }
35
36 $date = new \DateTime($time, new \DateTimeZone($timezone));
37
38 $xDump = <<<EODUMP
39 DateTime @$xTimestamp {
40 date: $xDate
41 }
42 EODUMP;
43
44 $this->assertDumpEquals($xDump, $date);
45 }
46
47 /**
48 * @dataProvider provideDateTimes
49 */
50 public function testCastDateTime($time, $timezone, $xDate, $xTimestamp, $xInfos)
51 {
52 if ((defined('HHVM_VERSION_ID') || PHP_VERSION_ID <= 50509) && preg_match('/[-+]\d{2}:\d{2}/', $timezone)) {
53 $this->markTestSkipped('DateTimeZone GMT offsets are supported since 5.5.10. See https://github.com/facebook/hhvm/issues/5875 for HHVM.');
54 }
55
56 $stub = new Stub();
57 $date = new \DateTime($time, new \DateTimeZone($timezone));
58 $cast = DateCaster::castDateTime($date, array('foo' => 'bar'), $stub, false, 0);
59
60 $xDump = <<<EODUMP
61 array:1 [
62 "\\x00~\\x00date" => $xDate
63 ]
64 EODUMP;
65
66 $this->assertDumpEquals($xDump, $cast);
67
68 $xDump = <<<EODUMP
69 Symfony\Component\VarDumper\Caster\ConstStub {
70 +type: 1
71 +class: "$xDate"
72 +value: "%A$xInfos%A"
73 +cut: 0
74 +handle: 0
75 +refCount: 0
76 +position: 0
77 +attr: []
78 }
79 EODUMP;
80
81 $this->assertDumpMatchesFormat($xDump, $cast["\0~\0date"]);
82 }
83
84 public function provideDateTimes()
85 {
86 return array(
87 array('2017-04-30 00:00:00.000000', 'Europe/Zurich', '2017-04-30 00:00:00.0 Europe/Zurich (+02:00)', 1493503200, 'Sunday, April 30, 2017%Afrom now%ADST On'),
88 array('2017-12-31 00:00:00.000000', 'Europe/Zurich', '2017-12-31 00:00:00.0 Europe/Zurich (+01:00)', 1514674800, 'Sunday, December 31, 2017%Afrom now%ADST Off'),
89 array('2017-04-30 00:00:00.000000', '+02:00', '2017-04-30 00:00:00.0 +02:00', 1493503200, 'Sunday, April 30, 2017%Afrom now'),
90
91 array('2017-04-30 00:00:00.100000', '+00:00', '2017-04-30 00:00:00.100 +00:00', 1493510400, 'Sunday, April 30, 2017%Afrom now'),
92 array('2017-04-30 00:00:00.120000', '+00:00', '2017-04-30 00:00:00.120 +00:00', 1493510400, 'Sunday, April 30, 2017%Afrom now'),
93 array('2017-04-30 00:00:00.123000', '+00:00', '2017-04-30 00:00:00.123 +00:00', 1493510400, 'Sunday, April 30, 2017%Afrom now'),
94 array('2017-04-30 00:00:00.123400', '+00:00', '2017-04-30 00:00:00.123400 +00:00', 1493510400, 'Sunday, April 30, 2017%Afrom now'),
95 array('2017-04-30 00:00:00.123450', '+00:00', '2017-04-30 00:00:00.123450 +00:00', 1493510400, 'Sunday, April 30, 2017%Afrom now'),
96 array('2017-04-30 00:00:00.123456', '+00:00', '2017-04-30 00:00:00.123456 +00:00', 1493510400, 'Sunday, April 30, 2017%Afrom now'),
97 );
98 }
99
100 /**
101 * @dataProvider provideIntervals
102 */
103 public function testDumpInterval($intervalSpec, $ms, $invert, $expected)
104 {
105 if ($ms && PHP_VERSION_ID >= 70200 && version_compare(PHP_VERSION, '7.2.0rc3', '<=')) {
106 $this->markTestSkipped('Skipped on 7.2 before rc4 because of php bug #75354.');
107 }
108
109 $interval = $this->createInterval($intervalSpec, $ms, $invert);
110
111 $xDump = <<<EODUMP
112 DateInterval {
113 interval: $expected
114 %A}
115 EODUMP;
116
117 $this->assertDumpMatchesFormat($xDump, $interval);
118 }
119
120 /**
121 * @dataProvider provideIntervals
122 */
123 public function testDumpIntervalExcludingVerbosity($intervalSpec, $ms, $invert, $expected)
124 {
125 if ($ms && PHP_VERSION_ID >= 70200 && version_compare(PHP_VERSION, '7.2.0rc3', '<=')) {
126 $this->markTestSkipped('Skipped on 7.2 before rc4 because of php bug #75354.');
127 }
128
129 $interval = $this->createInterval($intervalSpec, $ms, $invert);
130
131 $xDump = <<<EODUMP
132 DateInterval {
133 interval: $expected
134 }
135 EODUMP;
136
137 $this->assertDumpEquals($xDump, $interval, Caster::EXCLUDE_VERBOSE);
138 }
139
140 /**
141 * @dataProvider provideIntervals
142 */
143 public function testCastInterval($intervalSpec, $ms, $invert, $xInterval, $xSeconds)
144 {
145 if ($ms && PHP_VERSION_ID >= 70200 && version_compare(PHP_VERSION, '7.2.0rc3', '<=')) {
146 $this->markTestSkipped('Skipped on 7.2 before rc4 because of php bug #75354.');
147 }
148
149 $interval = $this->createInterval($intervalSpec, $ms, $invert);
150 $stub = new Stub();
151
152 $cast = DateCaster::castInterval($interval, array('foo' => 'bar'), $stub, false, Caster::EXCLUDE_VERBOSE);
153
154 $xDump = <<<EODUMP
155 array:1 [
156 "\\x00~\\x00interval" => $xInterval
157 ]
158 EODUMP;
159
160 $this->assertDumpEquals($xDump, $cast);
161
162 if (null === $xSeconds) {
163 return;
164 }
165
166 $xDump = <<<EODUMP
167 Symfony\Component\VarDumper\Caster\ConstStub {
168 +type: 1
169 +class: "$xInterval"
170 +value: "$xSeconds"
171 +cut: 0
172 +handle: 0
173 +refCount: 0
174 +position: 0
175 +attr: []
176 }
177 EODUMP;
178
179 $this->assertDumpMatchesFormat($xDump, $cast["\0~\0interval"]);
180 }
181
182 public function provideIntervals()
183 {
184 $i = new \DateInterval('PT0S');
185 $ms = ($withMs = \PHP_VERSION_ID >= 70100 && isset($i->f)) ? '.0' : '';
186
187 return array(
188 array('PT0S', 0, 0, '0s', '0s'),
189 array('PT0S', 0.1, 0, $withMs ? '+ 00:00:00.100' : '0s', '%is'),
190 array('PT1S', 0, 0, '+ 00:00:01'.$ms, '%is'),
191 array('PT2M', 0, 0, '+ 00:02:00'.$ms, '%is'),
192 array('PT3H', 0, 0, '+ 03:00:00'.$ms, '%ss'),
193 array('P4D', 0, 0, '+ 4d', '%ss'),
194 array('P5M', 0, 0, '+ 5m', null),
195 array('P6Y', 0, 0, '+ 6y', null),
196 array('P1Y2M3DT4H5M6S', 0, 0, '+ 1y 2m 3d 04:05:06'.$ms, null),
197 array('PT1M60S', 0, 0, '+ 00:02:00'.$ms, null),
198 array('PT1H60M', 0, 0, '+ 02:00:00'.$ms, null),
199 array('P1DT24H', 0, 0, '+ 2d', null),
200 array('P1M32D', 0, 0, '+ 1m 32d', null),
201
202 array('PT0S', 0, 1, '0s', '0s'),
203 array('PT0S', 0.1, 1, $withMs ? '- 00:00:00.100' : '0s', '%is'),
204 array('PT1S', 0, 1, '- 00:00:01'.$ms, '%is'),
205 array('PT2M', 0, 1, '- 00:02:00'.$ms, '%is'),
206 array('PT3H', 0, 1, '- 03:00:00'.$ms, '%ss'),
207 array('P4D', 0, 1, '- 4d', '%ss'),
208 array('P5M', 0, 1, '- 5m', null),
209 array('P6Y', 0, 1, '- 6y', null),
210 array('P1Y2M3DT4H5M6S', 0, 1, '- 1y 2m 3d 04:05:06'.$ms, null),
211 array('PT1M60S', 0, 1, '- 00:02:00'.$ms, null),
212 array('PT1H60M', 0, 1, '- 02:00:00'.$ms, null),
213 array('P1DT24H', 0, 1, '- 2d', null),
214 array('P1M32D', 0, 1, '- 1m 32d', null),
215 );
216 }
217
218 /**
219 * @dataProvider provideTimeZones
220 */
221 public function testDumpTimeZone($timezone, $expected)
222 {
223 if ((defined('HHVM_VERSION_ID') || PHP_VERSION_ID <= 50509) && !preg_match('/\w+\/\w+/', $timezone)) {
224 $this->markTestSkipped('DateTimeZone GMT offsets are supported since 5.5.10. See https://github.com/facebook/hhvm/issues/5875 for HHVM.');
225 }
226
227 $timezone = new \DateTimeZone($timezone);
228
229 $xDump = <<<EODUMP
230 DateTimeZone {
231 timezone: $expected
232 %A}
233 EODUMP;
234
235 $this->assertDumpMatchesFormat($xDump, $timezone);
236 }
237
238 /**
239 * @dataProvider provideTimeZones
240 */
241 public function testDumpTimeZoneExcludingVerbosity($timezone, $expected)
242 {
243 if ((defined('HHVM_VERSION_ID') || PHP_VERSION_ID <= 50509) && !preg_match('/\w+\/\w+/', $timezone)) {
244 $this->markTestSkipped('DateTimeZone GMT offsets are supported since 5.5.10. See https://github.com/facebook/hhvm/issues/5875 for HHVM.');
245 }
246
247 $timezone = new \DateTimeZone($timezone);
248
249 $xDump = <<<EODUMP
250 DateTimeZone {
251 timezone: $expected
252 }
253 EODUMP;
254
255 $this->assertDumpMatchesFormat($xDump, $timezone, Caster::EXCLUDE_VERBOSE);
256 }
257
258 /**
259 * @dataProvider provideTimeZones
260 */
261 public function testCastTimeZone($timezone, $xTimezone, $xRegion)
262 {
263 if ((defined('HHVM_VERSION_ID') || PHP_VERSION_ID <= 50509) && !preg_match('/\w+\/\w+/', $timezone)) {
264 $this->markTestSkipped('DateTimeZone GMT offsets are supported since 5.5.10. See https://github.com/facebook/hhvm/issues/5875 for HHVM.');
265 }
266
267 $timezone = new \DateTimeZone($timezone);
268 $stub = new Stub();
269
270 $cast = DateCaster::castTimeZone($timezone, array('foo' => 'bar'), $stub, false, Caster::EXCLUDE_VERBOSE);
271
272 $xDump = <<<EODUMP
273 array:1 [
274 "\\x00~\\x00timezone" => $xTimezone
275 ]
276 EODUMP;
277
278 $this->assertDumpMatchesFormat($xDump, $cast);
279
280 $xDump = <<<EODUMP
281 Symfony\Component\VarDumper\Caster\ConstStub {
282 +type: 1
283 +class: "$xTimezone"
284 +value: "$xRegion"
285 +cut: 0
286 +handle: 0
287 +refCount: 0
288 +position: 0
289 +attr: []
290 }
291 EODUMP;
292
293 $this->assertDumpMatchesFormat($xDump, $cast["\0~\0timezone"]);
294 }
295
296 public function provideTimeZones()
297 {
298 $xRegion = extension_loaded('intl') ? '%s' : '';
299
300 return array(
301 // type 1 (UTC offset)
302 array('-12:00', '-12:00', ''),
303 array('+00:00', '+00:00', ''),
304 array('+14:00', '+14:00', ''),
305
306 // type 2 (timezone abbreviation)
307 array('GMT', '+00:00', ''),
308 array('a', '+01:00', ''),
309 array('b', '+02:00', ''),
310 array('z', '+00:00', ''),
311
312 // type 3 (timezone identifier)
313 array('Africa/Tunis', 'Africa/Tunis (%s:00)', $xRegion),
314 array('America/Panama', 'America/Panama (%s:00)', $xRegion),
315 array('Asia/Jerusalem', 'Asia/Jerusalem (%s:00)', $xRegion),
316 array('Atlantic/Canary', 'Atlantic/Canary (%s:00)', $xRegion),
317 array('Australia/Perth', 'Australia/Perth (%s:00)', $xRegion),
318 array('Europe/Zurich', 'Europe/Zurich (%s:00)', $xRegion),
319 array('Pacific/Tahiti', 'Pacific/Tahiti (%s:00)', $xRegion),
320 );
321 }
322
323 /**
324 * @dataProvider providePeriods
325 */
326 public function testDumpPeriod($start, $interval, $end, $options, $expected)
327 {
328 if (defined('HHVM_VERSION_ID') || \PHP_VERSION_ID < 50620 || (\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70005)) {
329 $this->markTestSkipped();
330 }
331
332 $p = new \DatePeriod(new \DateTime($start), new \DateInterval($interval), is_int($end) ? $end : new \DateTime($end), $options);
333
334 $xDump = <<<EODUMP
335 DatePeriod {
336 period: $expected
337 %A}
338 EODUMP;
339
340 $this->assertDumpMatchesFormat($xDump, $p);
341 }
342
343 /**
344 * @dataProvider providePeriods
345 */
346 public function testCastPeriod($start, $interval, $end, $options, $xPeriod, $xDates)
347 {
348 if (defined('HHVM_VERSION_ID') || \PHP_VERSION_ID < 50620 || (\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70005)) {
349 $this->markTestSkipped();
350 }
351
352 $p = new \DatePeriod(new \DateTime($start), new \DateInterval($interval), is_int($end) ? $end : new \DateTime($end), $options);
353 $stub = new Stub();
354
355 $cast = DateCaster::castPeriod($p, array(), $stub, false, 0);
356
357 $xDump = <<<EODUMP
358 array:1 [
359 "\\x00~\\x00period" => $xPeriod
360 ]
361 EODUMP;
362
363 $this->assertDumpEquals($xDump, $cast);
364
365 $xDump = <<<EODUMP
366 Symfony\Component\VarDumper\Caster\ConstStub {
367 +type: 1
368 +class: "$xPeriod"
369 +value: "%A$xDates%A"
370 +cut: 0
371 +handle: 0
372 +refCount: 0
373 +position: 0
374 +attr: []
375 }
376 EODUMP;
377
378 $this->assertDumpMatchesFormat($xDump, $cast["\0~\0period"]);
379 }
380
381 public function providePeriods()
382 {
383 $i = new \DateInterval('PT0S');
384 $ms = \PHP_VERSION_ID >= 70100 && isset($i->f) ? '.0' : '';
385
386 $periods = array(
387 array('2017-01-01', 'P1D', '2017-01-03', 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) to 2017-01-03 00:00:00.0', '1) 2017-01-01%a2) 2017-01-02'),
388 array('2017-01-01', 'P1D', 1, 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) recurring 2 time/s', '1) 2017-01-01%a2) 2017-01-02'),
389
390 array('2017-01-01', 'P1D', '2017-01-04', 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) to 2017-01-04 00:00:00.0', '1) 2017-01-01%a2) 2017-01-02%a3) 2017-01-03'),
391 array('2017-01-01', 'P1D', 2, 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) recurring 3 time/s', '1) 2017-01-01%a2) 2017-01-02%a3) 2017-01-03'),
392
393 array('2017-01-01', 'P1D', '2017-01-05', 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) to 2017-01-05 00:00:00.0', '1) 2017-01-01%a2) 2017-01-02%a1 more'),
394 array('2017-01-01', 'P1D', 3, 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) recurring 4 time/s', '1) 2017-01-01%a2) 2017-01-02%a3) 2017-01-03%a1 more'),
395
396 array('2017-01-01', 'P1D', '2017-01-21', 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) to 2017-01-21 00:00:00.0', '1) 2017-01-01%a17 more'),
397 array('2017-01-01', 'P1D', 19, 0, 'every + 1d, from 2017-01-01 00:00:00.0 (included) recurring 20 time/s', '1) 2017-01-01%a17 more'),
398
399 array('2017-01-01 01:00:00', 'P1D', '2017-01-03 01:00:00', 0, 'every + 1d, from 2017-01-01 01:00:00.0 (included) to 2017-01-03 01:00:00.0', '1) 2017-01-01 01:00:00.0%a2) 2017-01-02 01:00:00.0'),
400 array('2017-01-01 01:00:00', 'P1D', 1, 0, 'every + 1d, from 2017-01-01 01:00:00.0 (included) recurring 2 time/s', '1) 2017-01-01 01:00:00.0%a2) 2017-01-02 01:00:00.0'),
401
402 array('2017-01-01', 'P1DT1H', '2017-01-03', 0, "every + 1d 01:00:00$ms, from 2017-01-01 00:00:00.0 (included) to 2017-01-03 00:00:00.0", '1) 2017-01-01 00:00:00.0%a2) 2017-01-02 01:00:00.0'),
403 array('2017-01-01', 'P1DT1H', 1, 0, "every + 1d 01:00:00$ms, from 2017-01-01 00:00:00.0 (included) recurring 2 time/s", '1) 2017-01-01 00:00:00.0%a2) 2017-01-02 01:00:00.0'),
404
405 array('2017-01-01', 'P1D', '2017-01-04', \DatePeriod::EXCLUDE_START_DATE, 'every + 1d, from 2017-01-01 00:00:00.0 (excluded) to 2017-01-04 00:00:00.0', '1) 2017-01-02%a2) 2017-01-03'),
406 array('2017-01-01', 'P1D', 2, \DatePeriod::EXCLUDE_START_DATE, 'every + 1d, from 2017-01-01 00:00:00.0 (excluded) recurring 2 time/s', '1) 2017-01-02%a2) 2017-01-03'),
407 );
408
409 if (\PHP_VERSION_ID < 70107) {
410 array_walk($periods, function (&$i) { $i[5] = ''; });
411 }
412
413 return $periods;
414 }
415
416 private function createInterval($intervalSpec, $ms, $invert)
417 {
418 $interval = new \DateInterval($intervalSpec);
419 if (\PHP_VERSION_ID >= 70100 && isset($interval->f)) {
420 $interval->f = $ms;
421 }
422 $interval->invert = $invert;
423
424 return $interval;
425 }
426 }