AutorÃa | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://moodle.org///// Moodle is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// Moodle is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with Moodle. If not, see <http://www.gnu.org/licenses/>.namespace core_calendar\output;use DateTime;/*** Tests for humantimeperiod_test class.** @covers \core_calendar\output\humantimeperiod* @package core_calendar* @category test* @copyright 2025 Sara Arjona <sara@moodle.com>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/final class humantimeperiod_test extends \advanced_testcase {/*** Test format_period() method.** @dataProvider provider_format_period* @param int|null $addsecondsend The number of seconds to add to the current time for the end date.* @param bool $expectedendnull Whether the end date is null.*/public function test_format_period(?int $addsecondsend,bool $expectedendnull,): void {$this->resetAfterTest();// 26 February 2025 15:30:00 (GMT).$clock = $this->mock_clock_with_frozen(1740583800);$timestampstart = $clock->time();$timestampend = is_null($addsecondsend) ? null : $clock->time() + $addsecondsend;$humandateend = null;if (!$expectedendnull) {$humandateend = humandate::create_from_timestamp(timestamp: $timestampend,timeonly: (abs($addsecondsend) < 1800),);}$expected = ['startdate' => humandate::create_from_timestamp($timestampstart),'enddate' => $humandateend,];$humantimeperiod = humantimeperiod::create_from_timestamp($timestampstart, $timestampend);$reflection = new \ReflectionClass($humantimeperiod);$method = $reflection->getMethod('format_period');$method->setAccessible(true);$result = $method->invoke($humantimeperiod);$this->compare_output($expected, $result);}/*** Data provider.** @return array*/public static function provider_format_period(): array {return ['Same start and end' => ['addsecondsend' => 0,'expectedendnull' => true,],'Null end date' => ['addsecondsend' => null,'expectedendnull' => true,],'1 day ahead' => ['addsecondsend' => 87000,'expectedendnull' => false,],'1 day behind' => ['addsecondsend' => -87000,'expectedendnull' => false,],'29 minutes ahead' => ['addsecondsend' => 1799,'expectedendnull' => false,],'30 minutes ahead (Midnight)' => ['addsecondsend' => 1800,'expectedendnull' => false,],'31 minutes ahead (Midnight)' => ['addsecondsend' => 1801,'expectedendnull' => false,],];}/*** Test create_from_timestamp.*/public function test_create_from_timestamp(): void {$this->resetAfterTest();$clock = \core\di::get(\core\clock::class);$timestamp = $clock->time();$humantimeperiod = humantimeperiod::create_from_timestamp($timestamp, $timestamp + 3600);$this->assertInstanceOf(humantimeperiod::class, $humantimeperiod);}/*** Test create_from_timestamp with enddatetime null.*/public function test_create_from_timestamp_endnull(): void {$this->resetAfterTest();$clock = $this->mock_clock_with_frozen();$timestamp = $clock->time();$humantimeperiod = humantimeperiod::create_from_timestamp($timestamp, null);$this->assertInstanceOf(humantimeperiod::class, $humantimeperiod);}/*** Test create_from_datetime.*/public function test_create_from_datetime(): void {$this->resetAfterTest();$humantimeperiod = humantimeperiod::create_from_datetime(new DateTime(), new DateTime('+1 hour'));$this->assertInstanceOf(humantimeperiod::class, $humantimeperiod);}/*** Test create_from_datetime with enddatetime null.*/public function test_create_from_datetime_endnull(): void {$this->resetAfterTest();$humantimeperiod = humantimeperiod::create_from_datetime(new DateTime(), null);$this->assertInstanceOf(humantimeperiod::class, $humantimeperiod);}/*** Compare humantimeperiod output.** @param array $expected The expected output.* @param array $actual The actual output.*/protected function compare_output(array $expected,array $actual,): void {$fields = ['startdate', 'enddate'];foreach ($fields as $field) {$this->assertEquals($expected[$field], $actual[$field], "Field $field does not match");}}}