3 namespace Drupal\Tests\Core\Datetime;
5 use Drupal\Core\Datetime\DrupalDateTime;
6 use Drupal\Tests\UnitTestCase;
9 * @coversDefaultClass \Drupal\Core\Datetime\DrupalDateTime
12 class DrupalDateTimeTest extends UnitTestCase {
17 * @param mixed $input1
18 * A DrupalDateTime object.
19 * @param mixed $input2
20 * Date argument for DrupalDateTime::diff method.
21 * @param bool $absolute
22 * Absolute flag for DrupalDateTime::diff method.
23 * @param \DateInterval $expected
24 * The expected result of the DrupalDateTime::diff operation.
26 * @dataProvider providerTestDateDiff
28 public function testDateDiff($input1, $input2, $absolute, \DateInterval $expected) {
29 $interval = $input1->diff($input2, $absolute);
30 $this->assertEquals($interval, $expected);
34 * Test date diff exception caused by invalid input.
36 * @param mixed $input1
37 * A DateTimePlus object.
38 * @param mixed $input2
39 * Date argument for DateTimePlus::diff method.
40 * @param bool $absolute
41 * Absolute flag for DateTimePlus::diff method.
43 * @dataProvider providerTestInvalidDateDiff
45 public function testInvalidDateDiff($input1, $input2, $absolute) {
46 $this->setExpectedException(\BadMethodCallException::class, 'Method Drupal\Component\Datetime\DateTimePlus::diff expects parameter 1 to be a \DateTime or \Drupal\Component\Datetime\DateTimePlus object');
47 $interval = $input1->diff($input2, $absolute);
51 * Provides data for date tests.
54 * An array of arrays, each containing the input parameters for
55 * DrupalDateTimeTest::testDateDiff().
57 * @see DrupalDateTimeTest::testDateDiff()
59 public function providerTestDateDiff() {
61 $settings = ['langcode' => 'en'];
63 $utc_tz = new \DateTimeZone('UTC');
65 $empty_interval = new \DateInterval('PT0S');
67 $positive_19_hours = new \DateInterval('PT19H');
69 $positive_18_hours = new \DateInterval('PT18H');
71 $positive_1_hour = new \DateInterval('PT1H');
73 $negative_1_hour = new \DateInterval('PT1H');
74 $negative_1_hour->invert = 1;
78 // There should be a 19 hour time interval between
79 // new years in Sydney and new years in LA in year 2000.
81 'input2' => DrupalDateTime::createFromFormat('Y-m-d H:i:s', '2000-01-01 00:00:00', new \DateTimeZone('Australia/Sydney'), $settings),
82 'input1' => DrupalDateTime::createFromFormat('Y-m-d H:i:s', '2000-01-01 00:00:00', new \DateTimeZone('America/Los_Angeles'), $settings),
84 'expected' => $positive_19_hours,
86 // In 1970 Sydney did not observe daylight savings time
87 // So there is only a 18 hour time interval.
89 'input2' => DrupalDateTime::createFromFormat('Y-m-d H:i:s', '1970-01-01 00:00:00', new \DateTimeZone('Australia/Sydney'), $settings),
90 'input1' => DrupalDateTime::createFromFormat('Y-m-d H:i:s', '1970-01-01 00:00:00', new \DateTimeZone('America/Los_Angeles'), $settings),
92 'expected' => $positive_18_hours,
95 'input1' => DrupalDateTime::createFromFormat('U', 3600, new \DateTimeZone('America/Los_Angeles'), $settings),
96 'input2' => DrupalDateTime::createFromFormat('U', 0, $utc_tz, $settings),
98 'expected' => $negative_1_hour,
101 'input1' => DrupalDateTime::createFromFormat('U', 3600, $utc_tz, $settings),
102 'input2' => DrupalDateTime::createFromFormat('U', 0, $utc_tz, $settings),
104 'expected' => $negative_1_hour,
107 'input1' => DrupalDateTime::createFromFormat('U', 3600, $utc_tz, $settings),
108 'input2' => \DateTime::createFromFormat('U', 0),
110 'expected' => $negative_1_hour,
113 'input1' => DrupalDateTime::createFromFormat('U', 3600, $utc_tz, $settings),
114 'input2' => DrupalDateTime::createFromFormat('U', 0, $utc_tz, $settings),
116 'expected' => $positive_1_hour,
119 'input1' => DrupalDateTime::createFromFormat('U', 3600, $utc_tz, $settings),
120 'input2' => \DateTime::createFromFormat('U', 0),
122 'expected' => $positive_1_hour,
125 'input1' => DrupalDateTime::createFromFormat('U', 0, $utc_tz, $settings),
126 'input2' => DrupalDateTime::createFromFormat('U', 0, $utc_tz, $settings),
128 'expected' => $empty_interval,
134 * Provides data for date tests.
137 * An array of arrays, each containing the input parameters for
138 * DateTimePlusTest::testInvalidDateDiff().
140 * @see DateTimePlusTest::testInvalidDateDiff()
142 public function providerTestInvalidDateDiff() {
143 $settings = ['langcode' => 'en'];
144 $utc_tz = new \DateTimeZone('UTC');
147 'input1' => DrupalDateTime::createFromFormat('U', 3600, $utc_tz, $settings),
148 'input2' => '1970-01-01 00:00:00',
152 'input1' => DrupalDateTime::createFromFormat('U', 3600, $utc_tz, $settings),
160 * Tests that object methods are chainable.
164 public function testChainable() {
165 $tz = new \DateTimeZone(date_default_timezone_get());
166 $date = new DrupalDateTime('now', $tz, ['langcode' => 'en']);
168 $date->setTimestamp(12345678);
169 $rendered = $date->render();
170 $this->assertEquals('1970-05-24 07:21:18 Australia/Sydney', $rendered);
172 $date->setTimestamp(23456789);
173 $rendered = $date->setTimezone(new \DateTimeZone('America/New_York'))->render();
174 $this->assertEquals('1970-09-29 07:46:29 America/New_York', $rendered);
178 * Tests that non-chainable methods work.
182 public function testChainableNonChainable() {
183 $tz = new \DateTimeZone(date_default_timezone_get());
184 $datetime1 = new DrupalDateTime('2009-10-11 12:00:00', $tz, ['langcode' => 'en']);
185 $datetime2 = new DrupalDateTime('2009-10-13 12:00:00', $tz, ['langcode' => 'en']);
186 $interval = $datetime1->diff($datetime2);
187 $this->assertInstanceOf(\DateInterval::class, $interval);
188 $this->assertEquals('+2 days', $interval->format('%R%a days'));
192 * Tests that chained calls to non-existent functions throw an exception.
196 public function testChainableNonCallable() {
197 $this->setExpectedException(\BadMethodCallException::class, 'Call to undefined method Drupal\Core\Datetime\DrupalDateTime::nonexistent()');
198 $tz = new \DateTimeZone(date_default_timezone_get());
199 $date = new DrupalDateTime('now', $tz, ['langcode' => 'en']);
200 $date->setTimezone(new \DateTimeZone('America/New_York'))->nonexistent();