mirror of
https://github.com/moodle/moodle.git
synced 2025-06-01 13:46:35 +02:00
This commit adds the PSR-20 ClockInterface to core, with a moodle-specific extension to the Interface at `\core\clock`, and a standard clock at `\core\system_clock`. Further clocks are provided as `\incrementing_clock` and `\frozen_clock` which are available to unit tests using: - `$this->mock_clock_with_incrementing(?int $starttime = null);` - `$this->mock_clock_with_frozen(?int $time = null);` For the incrementing clock, every call to fetch the time will bump the current time by one second. For the frozen clock the time will not change, but can be modified with: - `$clock->set_to(int $time);`; and - `$clock->bump(int $seconds = 1);`
70 lines
2.0 KiB
PHP
70 lines
2.0 KiB
PHP
<?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/>.
|
|
|
|
/**
|
|
* Frozen clock for testing purposes.
|
|
*
|
|
* @package core
|
|
* @copyright 2024 Andrew Lyons <andrew@nicols.co.uk>
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
* @property-read \DateTimeImmutable $time The current time of the clock
|
|
*/
|
|
class frozen_clock implements \core\clock {
|
|
/** @var DateTimeImmutable The next time of the clock */
|
|
public DateTimeImmutable $time;
|
|
|
|
/**
|
|
* Create a new instance of the frozen clock.
|
|
*
|
|
* @param null|int $time The initial time to use. If not specified, the current time is used.
|
|
*/
|
|
public function __construct(
|
|
?int $time = null,
|
|
) {
|
|
if ($time) {
|
|
$this->time = new \DateTimeImmutable("@{$time}");
|
|
} else {
|
|
$this->time = new \DateTimeImmutable();
|
|
}
|
|
}
|
|
|
|
public function now(): \DateTimeImmutable {
|
|
return $this->time;
|
|
}
|
|
|
|
public function time(): int {
|
|
return $this->time->getTimestamp();
|
|
}
|
|
|
|
/**
|
|
* Set the time of the clock.
|
|
*
|
|
* @param int $time
|
|
*/
|
|
public function set_to(int $time): void {
|
|
$this->time = new \DateTimeImmutable("@{$time}");
|
|
}
|
|
|
|
/**
|
|
* Bump the time by a number of seconds.
|
|
*
|
|
* @param int $seconds
|
|
*/
|
|
public function bump(int $seconds = 1): void {
|
|
$this->time = $this->time->modify("+{$seconds} seconds");
|
|
}
|
|
}
|