Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\Component\Datetime;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Component\Datetime\DateTimePlus;
|
Chris@0
|
6 use PHPUnit\Framework\TestCase;
|
Chris@0
|
7
|
Chris@0
|
8 /**
|
Chris@0
|
9 * @coversDefaultClass \Drupal\Component\Datetime\DateTimePlus
|
Chris@0
|
10 * @group Datetime
|
Chris@0
|
11 */
|
Chris@0
|
12 class DateTimePlusTest extends TestCase {
|
Chris@0
|
13
|
Chris@0
|
14 /**
|
Chris@0
|
15 * Test creating dates from string and array input.
|
Chris@0
|
16 *
|
Chris@0
|
17 * @param mixed $input
|
Chris@0
|
18 * Input argument for DateTimePlus.
|
Chris@0
|
19 * @param string $timezone
|
Chris@0
|
20 * Timezone argument for DateTimePlus.
|
Chris@0
|
21 * @param string $expected
|
Chris@0
|
22 * Expected output from DateTimePlus::format().
|
Chris@0
|
23 *
|
Chris@0
|
24 * @dataProvider providerTestDates
|
Chris@0
|
25 */
|
Chris@0
|
26 public function testDates($input, $timezone, $expected) {
|
Chris@0
|
27 $date = new DateTimePlus($input, $timezone);
|
Chris@0
|
28 $value = $date->format('c');
|
Chris@0
|
29
|
Chris@0
|
30 if (is_array($input)) {
|
Chris@0
|
31 $input = var_export($input, TRUE);
|
Chris@0
|
32 }
|
Chris@0
|
33 $this->assertEquals($expected, $value, sprintf("Test new DateTimePlus(%s, %s): should be %s, found %s.", $input, $timezone, $expected, $value));
|
Chris@0
|
34 }
|
Chris@0
|
35
|
Chris@0
|
36 /**
|
Chris@0
|
37 * Test creating dates from string and array input.
|
Chris@0
|
38 *
|
Chris@0
|
39 * @param mixed $input
|
Chris@0
|
40 * Input argument for DateTimePlus.
|
Chris@0
|
41 * @param string $timezone
|
Chris@0
|
42 * Timezone argument for DateTimePlus.
|
Chris@0
|
43 * @param string $expected
|
Chris@0
|
44 * Expected output from DateTimePlus::format().
|
Chris@0
|
45 *
|
Chris@0
|
46 * @dataProvider providerTestDateArrays
|
Chris@0
|
47 */
|
Chris@0
|
48 public function testDateArrays($input, $timezone, $expected) {
|
Chris@0
|
49 $date = DateTimePlus::createFromArray($input, $timezone);
|
Chris@0
|
50 $value = $date->format('c');
|
Chris@0
|
51
|
Chris@0
|
52 if (is_array($input)) {
|
Chris@0
|
53 $input = var_export($input, TRUE);
|
Chris@0
|
54 }
|
Chris@0
|
55 $this->assertEquals($expected, $value, sprintf("Test new DateTimePlus(%s, %s): should be %s, found %s.", $input, $timezone, $expected, $value));
|
Chris@0
|
56 }
|
Chris@0
|
57
|
Chris@0
|
58 /**
|
Chris@0
|
59 * Test date diffs.
|
Chris@0
|
60 *
|
Chris@0
|
61 * @param mixed $input1
|
Chris@0
|
62 * A DateTimePlus object.
|
Chris@0
|
63 * @param mixed $input2
|
Chris@0
|
64 * Date argument for DateTimePlus::diff method.
|
Chris@0
|
65 * @param bool $absolute
|
Chris@0
|
66 * Absolute flag for DateTimePlus::diff method.
|
Chris@0
|
67 * @param \DateInterval $expected
|
Chris@0
|
68 * The expected result of the DateTimePlus::diff operation.
|
Chris@0
|
69 *
|
Chris@0
|
70 * @dataProvider providerTestDateDiff
|
Chris@0
|
71 */
|
Chris@0
|
72 public function testDateDiff($input1, $input2, $absolute, \DateInterval $expected) {
|
Chris@0
|
73 $interval = $input1->diff($input2, $absolute);
|
Chris@0
|
74 $this->assertEquals($interval, $expected);
|
Chris@0
|
75 }
|
Chris@0
|
76
|
Chris@0
|
77 /**
|
Chris@0
|
78 * Test date diff exception caused by invalid input.
|
Chris@0
|
79 *
|
Chris@0
|
80 * @param mixed $input1
|
Chris@0
|
81 * A DateTimePlus object.
|
Chris@0
|
82 * @param mixed $input2
|
Chris@0
|
83 * Date argument for DateTimePlus::diff method.
|
Chris@0
|
84 * @param bool $absolute
|
Chris@0
|
85 * Absolute flag for DateTimePlus::diff method.
|
Chris@0
|
86 *
|
Chris@0
|
87 * @dataProvider providerTestInvalidDateDiff
|
Chris@0
|
88 */
|
Chris@0
|
89 public function testInvalidDateDiff($input1, $input2, $absolute) {
|
Chris@0
|
90 $this->setExpectedException(\BadMethodCallException::class, 'Method Drupal\Component\Datetime\DateTimePlus::diff expects parameter 1 to be a \DateTime or \Drupal\Component\Datetime\DateTimePlus object');
|
Chris@0
|
91 $interval = $input1->diff($input2, $absolute);
|
Chris@0
|
92 }
|
Chris@0
|
93
|
Chris@0
|
94 /**
|
Chris@0
|
95 * Test creating dates from invalid array input.
|
Chris@0
|
96 *
|
Chris@0
|
97 * @param mixed $input
|
Chris@0
|
98 * Input argument for DateTimePlus.
|
Chris@0
|
99 * @param string $timezone
|
Chris@0
|
100 * Timezone argument for DateTimePlus.
|
Chris@0
|
101 * @param string $class
|
Chris@0
|
102 * The Exception subclass to expect to be thrown.
|
Chris@0
|
103 *
|
Chris@0
|
104 * @dataProvider providerTestInvalidDateArrays
|
Chris@0
|
105 */
|
Chris@0
|
106 public function testInvalidDateArrays($input, $timezone, $class) {
|
Chris@0
|
107 $this->setExpectedException($class);
|
Chris@0
|
108 $this->assertInstanceOf(
|
Chris@0
|
109 '\Drupal\Component\DateTimePlus',
|
Chris@0
|
110 DateTimePlus::createFromArray($input, $timezone)
|
Chris@0
|
111 );
|
Chris@0
|
112 }
|
Chris@0
|
113
|
Chris@0
|
114 /**
|
Chris@0
|
115 * Test creating dates from timestamps, and manipulating timezones.
|
Chris@0
|
116 *
|
Chris@0
|
117 * @param int $input
|
Chris@0
|
118 * Input argument for DateTimePlus::createFromTimestamp().
|
Chris@0
|
119 * @param array $initial
|
Chris@0
|
120 * An array containing:
|
Chris@0
|
121 * - 'timezone_initial' - Timezone argument for DateTimePlus.
|
Chris@0
|
122 * - 'format_initial' - Format argument for DateTimePlus.
|
Chris@0
|
123 * - 'expected_initial_date' - Expected output from DateTimePlus::format().
|
Chris@0
|
124 * - 'expected_initial_timezone' - Expected output from
|
Chris@0
|
125 * DateTimePlus::getTimeZone()::getName().
|
Chris@0
|
126 * - 'expected_initial_offset' - Expected output from DateTimePlus::getOffset().
|
Chris@0
|
127 * @param array $transform
|
Chris@0
|
128 * An array containing:
|
Chris@0
|
129 * - 'timezone_transform' - Argument to transform date to another timezone via
|
Chris@0
|
130 * DateTimePlus::setTimezone().
|
Chris@0
|
131 * - 'format_transform' - Format argument to use when transforming date to
|
Chris@0
|
132 * another timezone.
|
Chris@0
|
133 * - 'expected_transform_date' - Expected output from DateTimePlus::format(),
|
Chris@0
|
134 * after timezone transform.
|
Chris@0
|
135 * - 'expected_transform_timezone' - Expected output from
|
Chris@0
|
136 * DateTimePlus::getTimeZone()::getName(), after timezone transform.
|
Chris@0
|
137 * - 'expected_transform_offset' - Expected output from
|
Chris@0
|
138 * DateTimePlus::getOffset(), after timezone transform.
|
Chris@0
|
139 *
|
Chris@0
|
140 * @dataProvider providerTestTimestamp
|
Chris@0
|
141 */
|
Chris@0
|
142 public function testTimestamp($input, array $initial, array $transform) {
|
Chris@0
|
143 // Initialize a new date object.
|
Chris@0
|
144 $date = DateTimePlus::createFromTimestamp($input, $initial['timezone']);
|
Chris@0
|
145 $this->assertDateTimestamp($date, $input, $initial, $transform);
|
Chris@0
|
146 }
|
Chris@0
|
147
|
Chris@0
|
148 /**
|
Chris@0
|
149 * Test creating dates from datetime strings.
|
Chris@0
|
150 *
|
Chris@0
|
151 * @param string $input
|
Chris@0
|
152 * Input argument for DateTimePlus().
|
Chris@0
|
153 * @param array $initial
|
Chris@0
|
154 * @see testTimestamp()
|
Chris@0
|
155 * @param array $transform
|
Chris@0
|
156 * @see testTimestamp()
|
Chris@0
|
157 *
|
Chris@0
|
158 * @dataProvider providerTestDateTimestamp
|
Chris@0
|
159 */
|
Chris@0
|
160 public function testDateTimestamp($input, array $initial, array $transform) {
|
Chris@0
|
161 // Initialize a new date object.
|
Chris@0
|
162 $date = new DateTimePlus($input, $initial['timezone']);
|
Chris@0
|
163 $this->assertDateTimestamp($date, $input, $initial, $transform);
|
Chris@0
|
164 }
|
Chris@0
|
165
|
Chris@0
|
166 /**
|
Chris@0
|
167 * Assertion helper for testTimestamp and testDateTimestamp since they need
|
Chris@0
|
168 * different dataProviders.
|
Chris@0
|
169 *
|
Chris@12
|
170 * @param \Drupal\Component\Datetime\DateTimePlus $date
|
Chris@0
|
171 * DateTimePlus to test.
|
Chris@0
|
172 * @input mixed $input
|
Chris@0
|
173 * The original input passed to the test method.
|
Chris@0
|
174 * @param array $initial
|
Chris@0
|
175 * @see testTimestamp()
|
Chris@0
|
176 * @param array $transform
|
Chris@0
|
177 * @see testTimestamp()
|
Chris@0
|
178 */
|
Chris@0
|
179 public function assertDateTimestamp($date, $input, $initial, $transform) {
|
Chris@0
|
180 // Check format.
|
Chris@0
|
181 $value = $date->format($initial['format']);
|
Chris@0
|
182 $this->assertEquals($initial['expected_date'], $value, sprintf("Test new DateTimePlus(%s, %s): should be %s, found %s.", $input, $initial['timezone'], $initial['expected_date'], $value));
|
Chris@0
|
183
|
Chris@0
|
184 // Check timezone name.
|
Chris@0
|
185 $value = $date->getTimeZone()->getName();
|
Chris@0
|
186 $this->assertEquals($initial['expected_timezone'], $value, sprintf("The current timezone is %s: should be %s.", $value, $initial['expected_timezone']));
|
Chris@0
|
187
|
Chris@0
|
188 // Check offset.
|
Chris@0
|
189 $value = $date->getOffset();
|
Chris@0
|
190 $this->assertEquals($initial['expected_offset'], $value, sprintf("The current offset is %s: should be %s.", $value, $initial['expected_offset']));
|
Chris@0
|
191
|
Chris@0
|
192 // Transform the date to another timezone.
|
Chris@0
|
193 $date->setTimezone(new \DateTimeZone($transform['timezone']));
|
Chris@0
|
194
|
Chris@0
|
195 // Check transformed format.
|
Chris@0
|
196 $value = $date->format($transform['format']);
|
Chris@0
|
197 $this->assertEquals($transform['expected_date'], $value, sprintf("Test \$date->setTimezone(new \\DateTimeZone(%s)): should be %s, found %s.", $transform['timezone'], $transform['expected_date'], $value));
|
Chris@0
|
198
|
Chris@0
|
199 // Check transformed timezone.
|
Chris@0
|
200 $value = $date->getTimeZone()->getName();
|
Chris@0
|
201 $this->assertEquals($transform['expected_timezone'], $value, sprintf("The current timezone should be %s, found %s.", $transform['expected_timezone'], $value));
|
Chris@0
|
202
|
Chris@0
|
203 // Check transformed offset.
|
Chris@0
|
204 $value = $date->getOffset();
|
Chris@0
|
205 $this->assertEquals($transform['expected_offset'], $value, sprintf("The current offset should be %s, found %s.", $transform['expected_offset'], $value));
|
Chris@0
|
206 }
|
Chris@0
|
207
|
Chris@0
|
208 /**
|
Chris@0
|
209 * Test creating dates from format strings.
|
Chris@0
|
210 *
|
Chris@0
|
211 * @param string $input
|
Chris@0
|
212 * Input argument for DateTimePlus.
|
Chris@0
|
213 * @param string $timezone
|
Chris@0
|
214 * Timezone argument for DateTimePlus.
|
Chris@0
|
215 * @param string $format_date
|
Chris@0
|
216 * Format argument for DateTimePlus::format().
|
Chris@0
|
217 * @param string $expected
|
Chris@0
|
218 * Expected output from DateTimePlus::format().
|
Chris@0
|
219 *
|
Chris@0
|
220 * @dataProvider providerTestDateFormat
|
Chris@0
|
221 */
|
Chris@0
|
222 public function testDateFormat($input, $timezone, $format, $format_date, $expected) {
|
Chris@0
|
223 $date = DateTimePlus::createFromFormat($format, $input, $timezone);
|
Chris@0
|
224 $value = $date->format($format_date);
|
Chris@0
|
225 $this->assertEquals($expected, $value, sprintf("Test new DateTimePlus(%s, %s, %s): should be %s, found %s.", $input, $timezone, $format, $expected, $value));
|
Chris@0
|
226 }
|
Chris@0
|
227
|
Chris@0
|
228 /**
|
Chris@0
|
229 * Test invalid date handling.
|
Chris@0
|
230 *
|
Chris@0
|
231 * @param mixed $input
|
Chris@0
|
232 * Input argument for DateTimePlus.
|
Chris@0
|
233 * @param string $timezone
|
Chris@0
|
234 * Timezone argument for DateTimePlus.
|
Chris@0
|
235 * @param string $format
|
Chris@0
|
236 * Format argument for DateTimePlus.
|
Chris@0
|
237 * @param string $message
|
Chris@0
|
238 * Message to print if no errors are thrown by the invalid dates.
|
Chris@0
|
239 * @param string $class
|
Chris@0
|
240 * The Exception subclass to expect to be thrown.
|
Chris@0
|
241 *
|
Chris@0
|
242 * @dataProvider providerTestInvalidDates
|
Chris@0
|
243 */
|
Chris@0
|
244 public function testInvalidDates($input, $timezone, $format, $message, $class) {
|
Chris@0
|
245 $this->setExpectedException($class);
|
Chris@0
|
246 DateTimePlus::createFromFormat($format, $input, $timezone);
|
Chris@0
|
247 }
|
Chris@0
|
248
|
Chris@0
|
249 /**
|
Chris@0
|
250 * Tests that DrupalDateTime can detect the right timezone to use.
|
Chris@0
|
251 * When specified or not.
|
Chris@0
|
252 *
|
Chris@0
|
253 * @param mixed $input
|
Chris@0
|
254 * Input argument for DateTimePlus.
|
Chris@0
|
255 * @param mixed $timezone
|
Chris@0
|
256 * Timezone argument for DateTimePlus.
|
Chris@0
|
257 * @param string $expected_timezone
|
Chris@0
|
258 * Expected timezone returned from DateTimePlus::getTimezone::getName().
|
Chris@0
|
259 * @param string $message
|
Chris@0
|
260 * Message to print on test failure.
|
Chris@0
|
261 *
|
Chris@0
|
262 * @dataProvider providerTestDateTimezone
|
Chris@0
|
263 */
|
Chris@0
|
264 public function testDateTimezone($input, $timezone, $expected_timezone, $message) {
|
Chris@0
|
265 $date = new DateTimePlus($input, $timezone);
|
Chris@0
|
266 $timezone = $date->getTimezone()->getName();
|
Chris@0
|
267 $this->assertEquals($timezone, $expected_timezone, $message);
|
Chris@0
|
268 }
|
Chris@0
|
269
|
Chris@0
|
270 /**
|
Chris@0
|
271 * Test that DrupalDateTime can detect the right timezone to use when
|
Chris@0
|
272 * constructed from a datetime object.
|
Chris@0
|
273 */
|
Chris@0
|
274 public function testDateTimezoneWithDateTimeObject() {
|
Chris@0
|
275 // Create a date object with another date object.
|
Chris@0
|
276 $input = new \DateTime('now', new \DateTimeZone('Pacific/Midway'));
|
Chris@0
|
277 $timezone = NULL;
|
Chris@0
|
278 $expected_timezone = 'Pacific/Midway';
|
Chris@0
|
279 $message = 'DateTimePlus uses the specified timezone if provided.';
|
Chris@0
|
280
|
Chris@0
|
281 $date = DateTimePlus::createFromDateTime($input, $timezone);
|
Chris@0
|
282 $timezone = $date->getTimezone()->getName();
|
Chris@0
|
283 $this->assertEquals($timezone, $expected_timezone, $message);
|
Chris@0
|
284 }
|
Chris@0
|
285
|
Chris@0
|
286 /**
|
Chris@0
|
287 * Provides data for date tests.
|
Chris@0
|
288 *
|
Chris@0
|
289 * @return array
|
Chris@0
|
290 * An array of arrays, each containing the input parameters for
|
Chris@0
|
291 * DateTimePlusTest::testDates().
|
Chris@0
|
292 *
|
Chris@0
|
293 * @see DateTimePlusTest::testDates()
|
Chris@0
|
294 */
|
Chris@0
|
295 public function providerTestDates() {
|
Chris@0
|
296 $dates = [
|
Chris@0
|
297 // String input.
|
Chris@0
|
298 // Create date object from datetime string.
|
Chris@0
|
299 ['2009-03-07 10:30', 'America/Chicago', '2009-03-07T10:30:00-06:00'],
|
Chris@0
|
300 // Same during daylight savings time.
|
Chris@0
|
301 ['2009-06-07 10:30', 'America/Chicago', '2009-06-07T10:30:00-05:00'],
|
Chris@0
|
302 // Create date object from date string.
|
Chris@0
|
303 ['2009-03-07', 'America/Chicago', '2009-03-07T00:00:00-06:00'],
|
Chris@0
|
304 // Same during daylight savings time.
|
Chris@0
|
305 ['2009-06-07', 'America/Chicago', '2009-06-07T00:00:00-05:00'],
|
Chris@0
|
306 // Create date object from date string.
|
Chris@0
|
307 ['2009-03-07 10:30', 'Australia/Canberra', '2009-03-07T10:30:00+11:00'],
|
Chris@0
|
308 // Same during daylight savings time.
|
Chris@0
|
309 ['2009-06-07 10:30', 'Australia/Canberra', '2009-06-07T10:30:00+10:00'],
|
Chris@0
|
310 ];
|
Chris@0
|
311
|
Chris@0
|
312 // On 32-bit systems, timestamps are limited to 1901-2038.
|
Chris@0
|
313 if (PHP_INT_SIZE > 4) {
|
Chris@0
|
314 // Create a date object in the distant past.
|
Chris@0
|
315 // @see https://www.drupal.org/node/2795489#comment-12127088
|
Chris@0
|
316 if (version_compare(PHP_VERSION, '5.6.15', '>=')) {
|
Chris@0
|
317 $dates[] = ['1809-02-12 10:30', 'America/Chicago', '1809-02-12T10:30:00-06:00'];
|
Chris@0
|
318 }
|
Chris@0
|
319 // Create a date object in the far future.
|
Chris@0
|
320 $dates[] = ['2345-01-02 02:04', 'UTC', '2345-01-02T02:04:00+00:00'];
|
Chris@0
|
321 }
|
Chris@0
|
322
|
Chris@0
|
323 return $dates;
|
Chris@0
|
324 }
|
Chris@0
|
325
|
Chris@0
|
326 /**
|
Chris@0
|
327 * Provides data for date tests.
|
Chris@0
|
328 *
|
Chris@0
|
329 * @return array
|
Chris@0
|
330 * An array of arrays, each containing the input parameters for
|
Chris@0
|
331 * DateTimePlusTest::testDates().
|
Chris@0
|
332 *
|
Chris@0
|
333 * @see DateTimePlusTest::testDates()
|
Chris@0
|
334 */
|
Chris@0
|
335 public function providerTestDateArrays() {
|
Chris@0
|
336 $dates = [
|
Chris@0
|
337 // Array input.
|
Chris@0
|
338 // Create date object from date array, date only.
|
Chris@0
|
339 [['year' => 2010, 'month' => 2, 'day' => 28], 'America/Chicago', '2010-02-28T00:00:00-06:00'],
|
Chris@0
|
340 // Create date object from date array with hour.
|
Chris@0
|
341 [['year' => 2010, 'month' => 2, 'day' => 28, 'hour' => 10], 'America/Chicago', '2010-02-28T10:00:00-06:00'],
|
Chris@0
|
342 // Create date object from date array, date only.
|
Chris@0
|
343 [['year' => 2010, 'month' => 2, 'day' => 28], 'Europe/Berlin', '2010-02-28T00:00:00+01:00'],
|
Chris@0
|
344 // Create date object from date array with hour.
|
Chris@0
|
345 [['year' => 2010, 'month' => 2, 'day' => 28, 'hour' => 10], 'Europe/Berlin', '2010-02-28T10:00:00+01:00'],
|
Chris@0
|
346 ];
|
Chris@0
|
347
|
Chris@0
|
348 // On 32-bit systems, timestamps are limited to 1901-2038.
|
Chris@0
|
349 if (PHP_INT_SIZE > 4) {
|
Chris@0
|
350 // Create a date object in the distant past.
|
Chris@0
|
351 // @see https://www.drupal.org/node/2795489#comment-12127088
|
Chris@0
|
352 if (version_compare(PHP_VERSION, '5.6.15', '>=')) {
|
Chris@0
|
353 $dates[] = [['year' => 1809, 'month' => 2, 'day' => 12], 'America/Chicago', '1809-02-12T00:00:00-06:00'];
|
Chris@0
|
354 }
|
Chris@0
|
355 // Create a date object in the far future.
|
Chris@0
|
356 $dates[] = [['year' => 2345, 'month' => 1, 'day' => 2], 'UTC', '2345-01-02T00:00:00+00:00'];
|
Chris@0
|
357 }
|
Chris@0
|
358
|
Chris@0
|
359 return $dates;
|
Chris@0
|
360 }
|
Chris@0
|
361
|
Chris@0
|
362 /**
|
Chris@0
|
363 * Provides data for testDateFormats.
|
Chris@0
|
364 *
|
Chris@0
|
365 * @return array
|
Chris@0
|
366 * An array of arrays, each containing:
|
Chris@0
|
367 * - 'input' - Input to DateTimePlus.
|
Chris@0
|
368 * - 'timezone' - Timezone for DateTimePlus.
|
Chris@0
|
369 * - 'format' - Date format for DateTimePlus.
|
Chris@0
|
370 * - 'format_date' - Date format for use in $date->format() method.
|
Chris@0
|
371 * - 'expected' - The expected return from DateTimePlus.
|
Chris@0
|
372 *
|
Chris@0
|
373 * @see testDateFormats()
|
Chris@0
|
374 */
|
Chris@0
|
375 public function providerTestDateFormat() {
|
Chris@0
|
376 return [
|
Chris@0
|
377 // Create a year-only date.
|
Chris@0
|
378 ['2009', NULL, 'Y', 'Y', '2009'],
|
Chris@0
|
379 // Create a month and year-only date.
|
Chris@0
|
380 ['2009-10', NULL, 'Y-m', 'Y-m', '2009-10'],
|
Chris@0
|
381 // Create a time-only date.
|
Chris@0
|
382 ['T10:30:00', NULL, '\TH:i:s', 'H:i:s', '10:30:00'],
|
Chris@0
|
383 // Create a time-only date.
|
Chris@0
|
384 ['10:30:00', NULL, 'H:i:s', 'H:i:s', '10:30:00'],
|
Chris@0
|
385 ];
|
Chris@0
|
386 }
|
Chris@0
|
387
|
Chris@0
|
388 /**
|
Chris@0
|
389 * Provides data for testInvalidDates.
|
Chris@0
|
390 *
|
Chris@0
|
391 * @return array
|
Chris@0
|
392 * An array of arrays, each containing:
|
Chris@0
|
393 * - 'input' - Input for DateTimePlus.
|
Chris@0
|
394 * - 'timezone' - Timezone for DateTimePlus.
|
Chris@0
|
395 * - 'format' - Format for DateTimePlus.
|
Chris@0
|
396 * - 'message' - Message to display on failure.
|
Chris@0
|
397 *
|
Chris@0
|
398 * @see testInvalidDates
|
Chris@0
|
399 */
|
Chris@0
|
400 public function providerTestInvalidDates() {
|
Chris@0
|
401 return [
|
Chris@0
|
402 // Test for invalid month names when we are using a short version
|
Chris@0
|
403 // of the month.
|
Chris@0
|
404 ['23 abc 2012', NULL, 'd M Y', "23 abc 2012 contains an invalid month name and did not produce errors.", \InvalidArgumentException::class],
|
Chris@0
|
405 // Test for invalid hour.
|
Chris@0
|
406 ['0000-00-00T45:30:00', NULL, 'Y-m-d\TH:i:s', "0000-00-00T45:30:00 contains an invalid hour and did not produce errors.", \UnexpectedValueException::class],
|
Chris@0
|
407 // Test for invalid day.
|
Chris@0
|
408 ['0000-00-99T05:30:00', NULL, 'Y-m-d\TH:i:s', "0000-00-99T05:30:00 contains an invalid day and did not produce errors.", \UnexpectedValueException::class],
|
Chris@0
|
409 // Test for invalid month.
|
Chris@0
|
410 ['0000-75-00T15:30:00', NULL, 'Y-m-d\TH:i:s', "0000-75-00T15:30:00 contains an invalid month and did not produce errors.", \UnexpectedValueException::class],
|
Chris@0
|
411 // Test for invalid year.
|
Chris@0
|
412 ['11-08-01T15:30:00', NULL, 'Y-m-d\TH:i:s', "11-08-01T15:30:00 contains an invalid year and did not produce errors.", \UnexpectedValueException::class],
|
Chris@0
|
413
|
Chris@0
|
414 ];
|
Chris@0
|
415 }
|
Chris@0
|
416
|
Chris@0
|
417 /**
|
Chris@0
|
418 * Data provider for testInvalidDateArrays.
|
Chris@0
|
419 *
|
Chris@0
|
420 * @return array
|
Chris@0
|
421 * An array of arrays, each containing:
|
Chris@0
|
422 * - 'input' - Input for DateTimePlus.
|
Chris@0
|
423 * - 'timezone' - Timezone for DateTimePlus.
|
Chris@0
|
424 *
|
Chris@0
|
425 * @see testInvalidDateArrays
|
Chris@0
|
426 */
|
Chris@0
|
427 public function providerTestInvalidDateArrays() {
|
Chris@0
|
428 return [
|
Chris@0
|
429 // One year larger than the documented upper limit of checkdate().
|
Chris@0
|
430 [['year' => 32768, 'month' => 1, 'day' => 8, 'hour' => 8, 'minute' => 0, 'second' => 0], 'America/Chicago', \InvalidArgumentException::class],
|
Chris@0
|
431 // One year smaller than the documented lower limit of checkdate().
|
Chris@0
|
432 [['year' => 0, 'month' => 1, 'day' => 8, 'hour' => 8, 'minute' => 0, 'second' => 0], 'America/Chicago', \InvalidArgumentException::class],
|
Chris@0
|
433 // Test for invalid month from date array.
|
Chris@0
|
434 [['year' => 2010, 'month' => 27, 'day' => 8, 'hour' => 8, 'minute' => 0, 'second' => 0], 'America/Chicago', \InvalidArgumentException::class],
|
Chris@0
|
435 // Test for invalid hour from date array.
|
Chris@0
|
436 [['year' => 2010, 'month' => 2, 'day' => 28, 'hour' => 80, 'minute' => 0, 'second' => 0], 'America/Chicago', \InvalidArgumentException::class],
|
Chris@0
|
437 // Test for invalid minute from date array.
|
Chris@0
|
438 [['year' => 2010, 'month' => 7, 'day' => 8, 'hour' => 8, 'minute' => 88, 'second' => 0], 'America/Chicago', \InvalidArgumentException::class],
|
Chris@0
|
439 // Regression test for https://www.drupal.org/node/2084455.
|
Chris@0
|
440 [['hour' => 59, 'minute' => 1, 'second' => 1], 'America/Chicago', \InvalidArgumentException::class],
|
Chris@0
|
441 ];
|
Chris@0
|
442 }
|
Chris@0
|
443
|
Chris@0
|
444 /**
|
Chris@0
|
445 * Provides data for testDateTimezone.
|
Chris@0
|
446 *
|
Chris@0
|
447 * @return array
|
Chris@0
|
448 * An array of arrays, each containing:
|
Chris@0
|
449 * - 'date' - Date string or object for DateTimePlus.
|
Chris@0
|
450 * - 'timezone' - Timezone string for DateTimePlus.
|
Chris@0
|
451 * - 'expected' - Expected return from DateTimePlus::getTimezone()::getName().
|
Chris@0
|
452 * - 'message' - Message to display on test failure.
|
Chris@0
|
453 *
|
Chris@0
|
454 * @see testDateTimezone
|
Chris@0
|
455 */
|
Chris@0
|
456 public function providerTestDateTimezone() {
|
Chris@0
|
457 // Use a common date for most of the tests.
|
Chris@0
|
458 $date_string = '2007-01-31 21:00:00';
|
Chris@0
|
459
|
Chris@0
|
460 // Detect the system timezone.
|
Chris@0
|
461 $system_timezone = date_default_timezone_get();
|
Chris@0
|
462
|
Chris@0
|
463 return [
|
Chris@0
|
464 // Create a date object with an unspecified timezone, which should
|
Chris@0
|
465 // end up using the system timezone.
|
Chris@0
|
466 [$date_string, NULL, $system_timezone, 'DateTimePlus uses the system timezone when there is no site timezone.'],
|
Chris@0
|
467 // Create a date object with a specified timezone name.
|
Chris@0
|
468 [$date_string, 'America/Yellowknife', 'America/Yellowknife', 'DateTimePlus uses the specified timezone if provided.'],
|
Chris@0
|
469 // Create a date object with a timezone object.
|
Chris@0
|
470 [$date_string, new \DateTimeZone('Australia/Canberra'), 'Australia/Canberra', 'DateTimePlus uses the specified timezone if provided.'],
|
Chris@0
|
471 // Create a date object with another date object.
|
Chris@0
|
472 [new DateTimePlus('now', 'Pacific/Midway'), NULL, 'Pacific/Midway', 'DateTimePlus uses the specified timezone if provided.'],
|
Chris@0
|
473 ];
|
Chris@0
|
474 }
|
Chris@0
|
475
|
Chris@0
|
476 /**
|
Chris@0
|
477 * Provides data for testTimestamp.
|
Chris@0
|
478 *
|
Chris@0
|
479 * @return array
|
Chris@0
|
480 * An array of arrays, each containing the arguments required for
|
Chris@0
|
481 * self::testTimestamp().
|
Chris@0
|
482 *
|
Chris@0
|
483 * @see testTimestamp()
|
Chris@0
|
484 */
|
Chris@0
|
485 public function providerTestTimestamp() {
|
Chris@0
|
486 return [
|
Chris@0
|
487 // Create date object from a unix timestamp and display it in
|
Chris@0
|
488 // local time.
|
Chris@0
|
489 [
|
Chris@0
|
490 'input' => 0,
|
Chris@0
|
491 'initial' => [
|
Chris@0
|
492 'timezone' => 'UTC',
|
Chris@0
|
493 'format' => 'c',
|
Chris@0
|
494 'expected_date' => '1970-01-01T00:00:00+00:00',
|
Chris@0
|
495 'expected_timezone' => 'UTC',
|
Chris@0
|
496 'expected_offset' => 0,
|
Chris@0
|
497 ],
|
Chris@0
|
498 'transform' => [
|
Chris@0
|
499 'timezone' => 'America/Los_Angeles',
|
Chris@0
|
500 'format' => 'c',
|
Chris@0
|
501 'expected_date' => '1969-12-31T16:00:00-08:00',
|
Chris@0
|
502 'expected_timezone' => 'America/Los_Angeles',
|
Chris@0
|
503 'expected_offset' => '-28800',
|
Chris@0
|
504 ],
|
Chris@0
|
505 ],
|
Chris@0
|
506 // Create a date using the timestamp of zero, then display its
|
Chris@0
|
507 // value both in UTC and the local timezone.
|
Chris@0
|
508 [
|
Chris@0
|
509 'input' => 0,
|
Chris@0
|
510 'initial' => [
|
Chris@0
|
511 'timezone' => 'America/Los_Angeles',
|
Chris@0
|
512 'format' => 'c',
|
Chris@0
|
513 'expected_date' => '1969-12-31T16:00:00-08:00',
|
Chris@0
|
514 'expected_timezone' => 'America/Los_Angeles',
|
Chris@0
|
515 'expected_offset' => '-28800',
|
Chris@0
|
516 ],
|
Chris@0
|
517 'transform' => [
|
Chris@0
|
518 'timezone' => 'UTC',
|
Chris@0
|
519 'format' => 'c',
|
Chris@0
|
520 'expected_date' => '1970-01-01T00:00:00+00:00',
|
Chris@0
|
521 'expected_timezone' => 'UTC',
|
Chris@0
|
522 'expected_offset' => 0,
|
Chris@0
|
523 ],
|
Chris@0
|
524 ],
|
Chris@0
|
525 ];
|
Chris@0
|
526 }
|
Chris@0
|
527
|
Chris@0
|
528 /**
|
Chris@0
|
529 * Provides data for testDateTimestamp.
|
Chris@0
|
530 *
|
Chris@0
|
531 * @return array
|
Chris@0
|
532 * An array of arrays, each containing the arguments required for
|
Chris@0
|
533 * self::testDateTimestamp().
|
Chris@0
|
534 *
|
Chris@0
|
535 * @see testDateTimestamp()
|
Chris@0
|
536 */
|
Chris@0
|
537 public function providerTestDateTimestamp() {
|
Chris@0
|
538 return [
|
Chris@0
|
539 // Create date object from datetime string in UTC, and convert
|
Chris@0
|
540 // it to a local date.
|
Chris@0
|
541 [
|
Chris@0
|
542 'input' => '1970-01-01 00:00:00',
|
Chris@0
|
543 'initial' => [
|
Chris@0
|
544 'timezone' => 'UTC',
|
Chris@0
|
545 'format' => 'c',
|
Chris@0
|
546 'expected_date' => '1970-01-01T00:00:00+00:00',
|
Chris@0
|
547 'expected_timezone' => 'UTC',
|
Chris@0
|
548 'expected_offset' => 0,
|
Chris@0
|
549 ],
|
Chris@0
|
550 'transform' => [
|
Chris@0
|
551 'timezone' => 'America/Los_Angeles',
|
Chris@0
|
552 'format' => 'c',
|
Chris@0
|
553 'expected_date' => '1969-12-31T16:00:00-08:00',
|
Chris@0
|
554 'expected_timezone' => 'America/Los_Angeles',
|
Chris@0
|
555 'expected_offset' => '-28800',
|
Chris@0
|
556 ],
|
Chris@0
|
557 ],
|
Chris@0
|
558 // Convert the local time to UTC using string input.
|
Chris@0
|
559 [
|
Chris@0
|
560 'input' => '1969-12-31 16:00:00',
|
Chris@0
|
561 'initial' => [
|
Chris@0
|
562 'timezone' => 'America/Los_Angeles',
|
Chris@0
|
563 'format' => 'c',
|
Chris@0
|
564 'expected_date' => '1969-12-31T16:00:00-08:00',
|
Chris@0
|
565 'expected_timezone' => 'America/Los_Angeles',
|
Chris@0
|
566 'expected_offset' => '-28800',
|
Chris@0
|
567 ],
|
Chris@0
|
568 'transform' => [
|
Chris@0
|
569 'timezone' => 'UTC',
|
Chris@0
|
570 'format' => 'c',
|
Chris@0
|
571 'expected_date' => '1970-01-01T00:00:00+00:00',
|
Chris@0
|
572 'expected_timezone' => 'UTC',
|
Chris@0
|
573 'expected_offset' => 0,
|
Chris@0
|
574 ],
|
Chris@0
|
575 ],
|
Chris@0
|
576 // Convert the local time to UTC using string input.
|
Chris@0
|
577 [
|
Chris@0
|
578 'input' => '1969-12-31 16:00:00',
|
Chris@0
|
579 'initial' => [
|
Chris@0
|
580 'timezone' => 'Europe/Warsaw',
|
Chris@0
|
581 'format' => 'c',
|
Chris@0
|
582 'expected_date' => '1969-12-31T16:00:00+01:00',
|
Chris@0
|
583 'expected_timezone' => 'Europe/Warsaw',
|
Chris@0
|
584 'expected_offset' => '+3600',
|
Chris@0
|
585 ],
|
Chris@0
|
586 'transform' => [
|
Chris@0
|
587 'timezone' => 'UTC',
|
Chris@0
|
588 'format' => 'c',
|
Chris@0
|
589 'expected_date' => '1969-12-31T15:00:00+00:00',
|
Chris@0
|
590 'expected_timezone' => 'UTC',
|
Chris@0
|
591 'expected_offset' => 0,
|
Chris@0
|
592 ],
|
Chris@0
|
593 ],
|
Chris@0
|
594 ];
|
Chris@0
|
595 }
|
Chris@0
|
596
|
Chris@0
|
597 /**
|
Chris@0
|
598 * Provides data for date tests.
|
Chris@0
|
599 *
|
Chris@0
|
600 * @return array
|
Chris@0
|
601 * An array of arrays, each containing the input parameters for
|
Chris@0
|
602 * DateTimePlusTest::testDateDiff().
|
Chris@0
|
603 *
|
Chris@0
|
604 * @see DateTimePlusTest::testDateDiff()
|
Chris@0
|
605 */
|
Chris@0
|
606 public function providerTestDateDiff() {
|
Chris@0
|
607
|
Chris@0
|
608 $empty_interval = new \DateInterval('PT0S');
|
Chris@0
|
609
|
Chris@0
|
610 $positive_19_hours = new \DateInterval('PT19H');
|
Chris@0
|
611
|
Chris@0
|
612 $positive_18_hours = new \DateInterval('PT18H');
|
Chris@0
|
613
|
Chris@0
|
614 $positive_1_hour = new \DateInterval('PT1H');
|
Chris@0
|
615
|
Chris@0
|
616 $negative_1_hour = new \DateInterval('PT1H');
|
Chris@0
|
617 $negative_1_hour->invert = 1;
|
Chris@0
|
618
|
Chris@0
|
619 return [
|
Chris@0
|
620 // There should be a 19 hour time interval between
|
Chris@0
|
621 // new years in Sydney and new years in LA in year 2000.
|
Chris@0
|
622 [
|
Chris@0
|
623 'input2' => DateTimePlus::createFromFormat('Y-m-d H:i:s', '2000-01-01 00:00:00', new \DateTimeZone('Australia/Sydney')),
|
Chris@0
|
624 'input1' => DateTimePlus::createFromFormat('Y-m-d H:i:s', '2000-01-01 00:00:00', new \DateTimeZone('America/Los_Angeles')),
|
Chris@0
|
625 'absolute' => FALSE,
|
Chris@0
|
626 'expected' => $positive_19_hours,
|
Chris@0
|
627 ],
|
Chris@0
|
628 // In 1970 Sydney did not observe daylight savings time
|
Chris@0
|
629 // So there is only a 18 hour time interval.
|
Chris@0
|
630 [
|
Chris@0
|
631 'input2' => DateTimePlus::createFromFormat('Y-m-d H:i:s', '1970-01-01 00:00:00', new \DateTimeZone('Australia/Sydney')),
|
Chris@0
|
632 'input1' => DateTimePlus::createFromFormat('Y-m-d H:i:s', '1970-01-01 00:00:00', new \DateTimeZone('America/Los_Angeles')),
|
Chris@0
|
633 'absolute' => FALSE,
|
Chris@0
|
634 'expected' => $positive_18_hours,
|
Chris@0
|
635 ],
|
Chris@0
|
636 [
|
Chris@0
|
637 'input1' => DateTimePlus::createFromFormat('U', 3600, new \DateTimeZone('America/Los_Angeles')),
|
Chris@0
|
638 'input2' => DateTimePlus::createFromFormat('U', 0, new \DateTimeZone('UTC')),
|
Chris@0
|
639 'absolute' => FALSE,
|
Chris@0
|
640 'expected' => $negative_1_hour,
|
Chris@0
|
641 ],
|
Chris@0
|
642 [
|
Chris@0
|
643 'input1' => DateTimePlus::createFromFormat('U', 3600),
|
Chris@0
|
644 'input2' => DateTimePlus::createFromFormat('U', 0),
|
Chris@0
|
645 'absolute' => FALSE,
|
Chris@0
|
646 'expected' => $negative_1_hour,
|
Chris@0
|
647 ],
|
Chris@0
|
648 [
|
Chris@0
|
649 'input1' => DateTimePlus::createFromFormat('U', 3600),
|
Chris@0
|
650 'input2' => \DateTime::createFromFormat('U', 0),
|
Chris@0
|
651 'absolute' => FALSE,
|
Chris@0
|
652 'expected' => $negative_1_hour,
|
Chris@0
|
653 ],
|
Chris@0
|
654 [
|
Chris@0
|
655 'input1' => DateTimePlus::createFromFormat('U', 3600),
|
Chris@0
|
656 'input2' => DateTimePlus::createFromFormat('U', 0),
|
Chris@0
|
657 'absolute' => TRUE,
|
Chris@0
|
658 'expected' => $positive_1_hour,
|
Chris@0
|
659 ],
|
Chris@0
|
660 [
|
Chris@0
|
661 'input1' => DateTimePlus::createFromFormat('U', 3600),
|
Chris@0
|
662 'input2' => \DateTime::createFromFormat('U', 0),
|
Chris@0
|
663 'absolute' => TRUE,
|
Chris@0
|
664 'expected' => $positive_1_hour,
|
Chris@0
|
665 ],
|
Chris@0
|
666 [
|
Chris@0
|
667 'input1' => DateTimePlus::createFromFormat('U', 0),
|
Chris@0
|
668 'input2' => DateTimePlus::createFromFormat('U', 0),
|
Chris@0
|
669 'absolute' => FALSE,
|
Chris@0
|
670 'expected' => $empty_interval,
|
Chris@0
|
671 ],
|
Chris@0
|
672 ];
|
Chris@0
|
673 }
|
Chris@0
|
674
|
Chris@0
|
675 /**
|
Chris@0
|
676 * Provides data for date tests.
|
Chris@0
|
677 *
|
Chris@0
|
678 * @return array
|
Chris@0
|
679 * An array of arrays, each containing the input parameters for
|
Chris@0
|
680 * DateTimePlusTest::testInvalidDateDiff().
|
Chris@0
|
681 *
|
Chris@0
|
682 * @see DateTimePlusTest::testInvalidDateDiff()
|
Chris@0
|
683 */
|
Chris@0
|
684 public function providerTestInvalidDateDiff() {
|
Chris@0
|
685 return [
|
Chris@0
|
686 [
|
Chris@0
|
687 'input1' => DateTimePlus::createFromFormat('U', 3600),
|
Chris@0
|
688 'input2' => '1970-01-01 00:00:00',
|
Chris@0
|
689 'absolute' => FALSE,
|
Chris@0
|
690 ],
|
Chris@0
|
691 [
|
Chris@0
|
692 'input1' => DateTimePlus::createFromFormat('U', 3600),
|
Chris@0
|
693 'input2' => NULL,
|
Chris@0
|
694 'absolute' => FALSE,
|
Chris@0
|
695 ],
|
Chris@0
|
696 ];
|
Chris@0
|
697 }
|
Chris@0
|
698
|
Chris@0
|
699 /**
|
Chris@0
|
700 * Tests invalid values passed to constructor.
|
Chris@0
|
701 *
|
Chris@0
|
702 * @param string $time
|
Chris@0
|
703 * A date/time string.
|
Chris@0
|
704 * @param string[] $errors
|
Chris@0
|
705 * An array of error messages.
|
Chris@0
|
706 *
|
Chris@0
|
707 * @covers ::__construct
|
Chris@0
|
708 *
|
Chris@0
|
709 * @dataProvider providerTestInvalidConstructor
|
Chris@0
|
710 */
|
Chris@0
|
711 public function testInvalidConstructor($time, array $errors) {
|
Chris@0
|
712 $date = new DateTimePlus($time);
|
Chris@0
|
713
|
Chris@0
|
714 $this->assertEquals(TRUE, $date->hasErrors());
|
Chris@0
|
715 $this->assertEquals($errors, $date->getErrors());
|
Chris@0
|
716 }
|
Chris@0
|
717
|
Chris@0
|
718 /**
|
Chris@0
|
719 * Provider for testInvalidConstructor().
|
Chris@0
|
720 *
|
Chris@0
|
721 * @return array
|
Chris@0
|
722 * An array of invalid date/time strings, and corresponding error messages.
|
Chris@0
|
723 */
|
Chris@0
|
724 public function providerTestInvalidConstructor() {
|
Chris@0
|
725 return [
|
Chris@0
|
726 [
|
Chris@0
|
727 'YYYY-MM-DD',
|
Chris@0
|
728 [
|
Chris@0
|
729 'The timezone could not be found in the database',
|
Chris@0
|
730 'Unexpected character',
|
Chris@0
|
731 'Double timezone specification',
|
Chris@0
|
732 ],
|
Chris@0
|
733 ],
|
Chris@0
|
734 [
|
Chris@0
|
735 '2017-MM-DD',
|
Chris@0
|
736 [
|
Chris@0
|
737 'Unexpected character',
|
Chris@0
|
738 'The timezone could not be found in the database',
|
Chris@0
|
739 ],
|
Chris@0
|
740 ],
|
Chris@0
|
741 [
|
Chris@0
|
742 'YYYY-03-DD',
|
Chris@0
|
743 [
|
Chris@0
|
744 'The timezone could not be found in the database',
|
Chris@0
|
745 'Unexpected character',
|
Chris@0
|
746 'Double timezone specification',
|
Chris@0
|
747 ],
|
Chris@0
|
748 ],
|
Chris@0
|
749 [
|
Chris@0
|
750 'YYYY-MM-07',
|
Chris@0
|
751 [
|
Chris@0
|
752 'The timezone could not be found in the database',
|
Chris@0
|
753 'Unexpected character',
|
Chris@0
|
754 'Double timezone specification',
|
Chris@0
|
755 ],
|
Chris@0
|
756 ],
|
Chris@0
|
757 [
|
Chris@0
|
758 '2017-13-55',
|
Chris@0
|
759 [
|
Chris@0
|
760 'Unexpected character',
|
Chris@0
|
761 ],
|
Chris@0
|
762 ],
|
Chris@0
|
763 [
|
Chris@0
|
764 'YYYY-MM-DD hh:mm:ss',
|
Chris@0
|
765 [
|
Chris@0
|
766 'The timezone could not be found in the database',
|
Chris@0
|
767 'Unexpected character',
|
Chris@0
|
768 'Double timezone specification',
|
Chris@0
|
769 ],
|
Chris@0
|
770 ],
|
Chris@0
|
771 [
|
Chris@0
|
772 '2017-03-07 25:70:80',
|
Chris@0
|
773 [
|
Chris@0
|
774 'Unexpected character',
|
Chris@0
|
775 'Double time specification',
|
Chris@0
|
776 ],
|
Chris@0
|
777 ],
|
Chris@0
|
778 [
|
Chris@0
|
779 'lorem ipsum dolor sit amet',
|
Chris@0
|
780 [
|
Chris@0
|
781 'The timezone could not be found in the database',
|
Chris@0
|
782 'Double timezone specification',
|
Chris@0
|
783 ],
|
Chris@0
|
784 ],
|
Chris@0
|
785 ];
|
Chris@0
|
786 }
|
Chris@0
|
787
|
Chris@0
|
788 /**
|
Chris@0
|
789 * Tests the $settings['validate_format'] parameter in ::createFromFormat().
|
Chris@0
|
790 */
|
Chris@0
|
791 public function testValidateFormat() {
|
Chris@0
|
792 // Check that an input that does not strictly follow the input format will
|
Chris@0
|
793 // produce the desired date. In this case the year string '11' doesn't
|
Chris@0
|
794 // precisely match the 'Y' formater parameter, but PHP will parse it
|
Chris@0
|
795 // regardless. However, when formatted with the same string, the year will
|
Chris@0
|
796 // be output with four digits. With the ['validate_format' => FALSE]
|
Chris@0
|
797 // $settings, this will not thrown an exception.
|
Chris@0
|
798 $date = DateTimePlus::createFromFormat('Y-m-d H:i:s', '11-03-31 17:44:00', 'UTC', ['validate_format' => FALSE]);
|
Chris@0
|
799 $this->assertEquals('0011-03-31 17:44:00', $date->format('Y-m-d H:i:s'));
|
Chris@0
|
800
|
Chris@0
|
801 // Parse the same date with ['validate_format' => TRUE] and make sure we
|
Chris@0
|
802 // get the expected exception.
|
Chris@0
|
803 $this->setExpectedException(\UnexpectedValueException::class);
|
Chris@0
|
804 $date = DateTimePlus::createFromFormat('Y-m-d H:i:s', '11-03-31 17:44:00', 'UTC', ['validate_format' => TRUE]);
|
Chris@0
|
805 }
|
Chris@0
|
806
|
Chris@0
|
807 /**
|
Chris@0
|
808 * Tests that object methods are chainable.
|
Chris@0
|
809 *
|
Chris@0
|
810 * @covers ::__call
|
Chris@0
|
811 */
|
Chris@0
|
812 public function testChainable() {
|
Chris@0
|
813 $date = new DateTimePlus('now', 'Australia/Sydney');
|
Chris@0
|
814
|
Chris@0
|
815 $date->setTimestamp(12345678);
|
Chris@0
|
816 $rendered = $date->render();
|
Chris@0
|
817 $this->assertEquals('1970-05-24 07:21:18 Australia/Sydney', $rendered);
|
Chris@0
|
818
|
Chris@0
|
819 $date->setTimestamp(23456789);
|
Chris@0
|
820 $rendered = $date->setTimezone(new \DateTimeZone('America/New_York'))->render();
|
Chris@0
|
821 $this->assertEquals('1970-09-29 07:46:29 America/New_York', $rendered);
|
Chris@0
|
822
|
Chris@0
|
823 $date = DateTimePlus::createFromFormat('Y-m-d H:i:s', '1970-05-24 07:21:18', new \DateTimeZone('Australia/Sydney'))
|
Chris@0
|
824 ->setTimezone(new \DateTimeZone('America/New_York'));
|
Chris@0
|
825 $rendered = $date->render();
|
Chris@0
|
826 $this->assertInstanceOf(DateTimePlus::class, $date);
|
Chris@0
|
827 $this->assertEquals(12345678, $date->getTimestamp());
|
Chris@0
|
828 $this->assertEquals('1970-05-23 17:21:18 America/New_York', $rendered);
|
Chris@0
|
829 }
|
Chris@0
|
830
|
Chris@0
|
831 /**
|
Chris@0
|
832 * Tests that non-chainable methods work.
|
Chris@0
|
833 *
|
Chris@0
|
834 * @covers ::__call
|
Chris@0
|
835 */
|
Chris@0
|
836 public function testChainableNonChainable() {
|
Chris@0
|
837 $datetime1 = new DateTimePlus('2009-10-11 12:00:00');
|
Chris@0
|
838 $datetime2 = new DateTimePlus('2009-10-13 12:00:00');
|
Chris@0
|
839 $interval = $datetime1->diff($datetime2);
|
Chris@0
|
840 $this->assertInstanceOf(\DateInterval::class, $interval);
|
Chris@0
|
841 $this->assertEquals('+2 days', $interval->format('%R%a days'));
|
Chris@0
|
842 }
|
Chris@0
|
843
|
Chris@0
|
844 /**
|
Chris@0
|
845 * Tests that chained calls to non-existent functions throw an exception.
|
Chris@0
|
846 *
|
Chris@0
|
847 * @covers ::__call
|
Chris@0
|
848 */
|
Chris@0
|
849 public function testChainableNonCallable() {
|
Chris@0
|
850 $this->setExpectedException(\BadMethodCallException::class, 'Call to undefined method Drupal\Component\Datetime\DateTimePlus::nonexistent()');
|
Chris@0
|
851 $date = new DateTimePlus('now', 'Australia/Sydney');
|
Chris@0
|
852 $date->setTimezone(new \DateTimeZone('America/New_York'))->nonexistent();
|
Chris@0
|
853 }
|
Chris@0
|
854
|
Chris@0
|
855 }
|