mirror of
https://github.com/moodle/moodle.git
synced 2025-01-17 21:49:15 +01:00
1093256560
While this change is not 100% required now, it's good habit and we are checking for it since Moodle 4.4. All the changes in this commit have been applied automatically using the moodle.PHPUnit.TestReturnType sniff and are, exclusively adding the ": void" return types when missing.
670 lines
28 KiB
PHP
670 lines
28 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/>.
|
||
|
||
/**
|
||
* Tests core_date class.
|
||
*
|
||
* @package core
|
||
* @copyright 2015 Totara Learning Solutions Ltd {@link http://www.totaralms.com/}
|
||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||
* @author Petr Skoda <petr.skoda@totaralms.com>
|
||
*/
|
||
|
||
defined('MOODLE_INTERNAL') || die();
|
||
|
||
/**
|
||
* Tests core_date class.
|
||
*
|
||
* @package core
|
||
* @copyright 2015 Totara Learning Solutions Ltd {@link http://www.totaralms.com/}
|
||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||
* @author Petr Skoda <petr.skoda@totaralms.com>
|
||
* @covers \core_date
|
||
* @coversDefaultClass \core_date
|
||
*/
|
||
class date_test extends advanced_testcase {
|
||
/**
|
||
* @covers ::get_default_php_timezone
|
||
*/
|
||
public function test_get_default_php_timezone(): void {
|
||
$this->resetAfterTest();
|
||
|
||
$origtz = core_date::get_default_php_timezone();
|
||
$this->assertNotEmpty($origtz);
|
||
|
||
$this->setTimezone('Pacific/Auckland', 'Europe/Prague');
|
||
$this->assertSame('Europe/Prague', core_date::get_default_php_timezone());
|
||
|
||
$this->setTimezone('Pacific/Auckland', 'UTC');
|
||
$this->assertSame('UTC', core_date::get_default_php_timezone());
|
||
|
||
$this->setTimezone('Pacific/Auckland', 'GMT');
|
||
$this->assertSame('GMT', core_date::get_default_php_timezone());
|
||
}
|
||
|
||
/**
|
||
* @covers ::normalise_timezone
|
||
*/
|
||
public function test_normalise_timezone(): void {
|
||
$this->resetAfterTest();
|
||
|
||
$this->setTimezone('Pacific/Auckland');
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone('Pacific/Auckland'));
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone('99'));
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone(99));
|
||
$this->assertSame('GMT', core_date::normalise_timezone('GMT'));
|
||
$this->assertSame('UTC', core_date::normalise_timezone('UTC'));
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone('xxxxxxxx'));
|
||
$this->assertSame('Europe/Berlin', core_date::normalise_timezone('Central European Time'));
|
||
$this->assertSame('Etc/GMT', core_date::normalise_timezone('0'));
|
||
$this->assertSame('Etc/GMT', core_date::normalise_timezone('0.0'));
|
||
$this->assertSame('Etc/GMT-2', core_date::normalise_timezone(2));
|
||
$this->assertSame('Etc/GMT-2', core_date::normalise_timezone('2.0'));
|
||
$this->assertSame('Etc/GMT+2', core_date::normalise_timezone(-2));
|
||
$this->assertSame('Etc/GMT+2', core_date::normalise_timezone('-2.0'));
|
||
$this->assertSame('Etc/GMT+4', core_date::normalise_timezone(-4));
|
||
$this->assertSame('Etc/GMT-2', core_date::normalise_timezone('UTC+2'));
|
||
$this->assertSame('Etc/GMT+2', core_date::normalise_timezone('UTC-2'));
|
||
$this->assertSame('Etc/GMT-2', core_date::normalise_timezone('GMT+2'));
|
||
$this->assertSame('Etc/GMT+2', core_date::normalise_timezone('GMT-2'));
|
||
$this->assertSame('Etc/GMT+12', core_date::normalise_timezone(-12));
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-13));
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-14));
|
||
$this->assertSame('Etc/GMT-12', core_date::normalise_timezone(12));
|
||
$this->assertSame('Etc/GMT-13', core_date::normalise_timezone(13));
|
||
$this->assertSame('Etc/GMT-14', core_date::normalise_timezone(14));
|
||
|
||
$this->assertSame('Asia/Kabul', core_date::normalise_timezone(4.5));
|
||
$this->assertSame('Asia/Kolkata', core_date::normalise_timezone(5.5));
|
||
$this->assertSame('Asia/Rangoon', core_date::normalise_timezone(6.5));
|
||
$this->assertSame('Australia/Darwin', core_date::normalise_timezone('9.5'));
|
||
|
||
$this->setTimezone('99', 'Pacific/Auckland');
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone('Pacific/Auckland'));
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone('99'));
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone(99));
|
||
$this->assertSame('GMT', core_date::normalise_timezone('GMT'));
|
||
$this->assertSame('UTC', core_date::normalise_timezone('UTC'));
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone('xxxxxxxx'));
|
||
$this->assertSame('Europe/Berlin', core_date::normalise_timezone('Central European Time'));
|
||
$this->assertSame('Etc/GMT', core_date::normalise_timezone('0'));
|
||
$this->assertSame('Etc/GMT', core_date::normalise_timezone('0.0'));
|
||
$this->assertSame('Etc/GMT-2', core_date::normalise_timezone(2));
|
||
$this->assertSame('Etc/GMT-2', core_date::normalise_timezone('2.0'));
|
||
$this->assertSame('Etc/GMT+2', core_date::normalise_timezone(-2));
|
||
$this->assertSame('Etc/GMT+2', core_date::normalise_timezone('-2.0'));
|
||
$this->assertSame('Etc/GMT-2', core_date::normalise_timezone('UTC+2'));
|
||
$this->assertSame('Etc/GMT+2', core_date::normalise_timezone('UTC-2'));
|
||
$this->assertSame('Etc/GMT-2', core_date::normalise_timezone('GMT+2'));
|
||
$this->assertSame('Etc/GMT+2', core_date::normalise_timezone('GMT-2'));
|
||
$this->assertSame('Etc/GMT+12', core_date::normalise_timezone(-12));
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-13));
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-14));
|
||
$this->assertSame('Etc/GMT-12', core_date::normalise_timezone(12));
|
||
$this->assertSame('Etc/GMT-13', core_date::normalise_timezone(13));
|
||
$this->assertSame('Etc/GMT-14', core_date::normalise_timezone(14));
|
||
|
||
$this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
|
||
$tz = new DateTimeZone('Pacific/Auckland');
|
||
$this->assertSame('Pacific/Auckland', core_date::normalise_timezone($tz));
|
||
}
|
||
|
||
/**
|
||
* @covers ::normalise_timezone
|
||
*/
|
||
public function test_windows_conversion(): void {
|
||
$file = __DIR__ . '/fixtures/timezonewindows.xml';
|
||
|
||
$contents = file_get_contents($file);
|
||
preg_match_all('/<mapZone other="([^"]+)" territory="001" type="([^"]+)"\/>/', $contents, $matches, PREG_SET_ORDER);
|
||
|
||
$this->assertCount(104, $matches); // NOTE: If the file contents change edit the core_date class and update this.
|
||
|
||
foreach ($matches as $match) {
|
||
$result = core_date::normalise_timezone($match[1]);
|
||
if ($result == $match[2]) {
|
||
$this->assertSame($match[2], $result);
|
||
} else {
|
||
$data = new DateTime('now', new DateTimeZone($match[2]));
|
||
$expectedoffset = $data->getOffset();
|
||
$data = new DateTime('now', new DateTimeZone($result));
|
||
$resultoffset = $data->getOffset();
|
||
$this->assertSame($expectedoffset, $resultoffset, "$match[1] is expected to be converted to $match[2] not $result");
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Sanity test for PHP stuff.
|
||
*/
|
||
public function test_php_gmt_offsets(): void {
|
||
$this->resetAfterTest();
|
||
|
||
$this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
|
||
|
||
for ($i = -12; $i < 0; $i++) {
|
||
$date = new DateTime('now', new DateTimeZone("Etc/GMT{$i}"));
|
||
$this->assertSame(- $i * 60 * 60, $date->getOffset());
|
||
$date = new DateTime('now', new DateTimeZone(core_date::normalise_timezone("GMT{$i}")));
|
||
$this->assertSame($i * 60 * 60, $date->getOffset());
|
||
$date = new DateTime('now', new DateTimeZone(core_date::normalise_timezone("UTC{$i}")));
|
||
$this->assertSame($i * 60 * 60, $date->getOffset());
|
||
}
|
||
|
||
$date = new DateTime('now', new DateTimeZone('Etc/GMT'));
|
||
$this->assertSame(0, $date->getOffset());
|
||
|
||
for ($i = 1; $i <= 12; $i++) {
|
||
$date = new DateTime('now', new DateTimeZone("Etc/GMT+{$i}"));
|
||
$this->assertSame(- $i * 60 * 60, $date->getOffset());
|
||
$date = new DateTime('now', new DateTimeZone(core_date::normalise_timezone("GMT+{$i}")));
|
||
$this->assertSame($i * 60 * 60, $date->getOffset());
|
||
$date = new DateTime('now', new DateTimeZone(core_date::normalise_timezone("UTC+{$i}")));
|
||
$this->assertSame($i * 60 * 60, $date->getOffset());
|
||
}
|
||
}
|
||
|
||
/**
|
||
* We are only checking lang strings existence here, not code.
|
||
*
|
||
* @coversNothing
|
||
*/
|
||
public function test_timezone_all_lang_strings(): void {
|
||
// We only run this test when PHPUNIT_LONGTEST is enabled, test_get_localised_timezone()
|
||
// is already checking the names of a few, hopefully stable enough to be run always.
|
||
if (!PHPUNIT_LONGTEST) {
|
||
$this->markTestSkipped('PHPUNIT_LONGTEST is not defined');
|
||
}
|
||
|
||
$phpzones = DateTimeZone::listIdentifiers();
|
||
$manager = get_string_manager();
|
||
foreach ($phpzones as $tz) {
|
||
$this->assertTrue($manager->string_exists(strtolower($tz), 'core_timezones'),
|
||
'String for timezone ' . strtolower($tz) . ' not found.');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @covers ::get_localised_timezone
|
||
*/
|
||
public function test_get_localised_timezone(): void {
|
||
$this->resetAfterTest();
|
||
|
||
$this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
|
||
|
||
$result = core_date::get_localised_timezone('Pacific/Auckland');
|
||
$this->assertSame('Pacific/Auckland', $result);
|
||
|
||
$result = core_date::get_localised_timezone('Europe/Madrid');
|
||
$this->assertSame('Europe/Madrid', $result);
|
||
|
||
$result = core_date::get_localised_timezone('America/New_York');
|
||
$this->assertSame('America/New_York', $result);
|
||
|
||
$result = core_date::get_localised_timezone('99');
|
||
$this->assertSame('Server timezone (Pacific/Auckland)', $result);
|
||
|
||
$result = core_date::get_localised_timezone(99);
|
||
$this->assertSame('Server timezone (Pacific/Auckland)', $result);
|
||
|
||
$result = core_date::get_localised_timezone('Etc/GMT-1');
|
||
$this->assertSame('UTC+1', $result);
|
||
|
||
$result = core_date::get_localised_timezone('Etc/GMT+2');
|
||
$this->assertSame('UTC-2', $result);
|
||
|
||
$result = core_date::get_localised_timezone('GMT');
|
||
$this->assertSame('UTC', $result);
|
||
|
||
$result = core_date::get_localised_timezone('Etc/GMT');
|
||
$this->assertSame('UTC', $result);
|
||
}
|
||
|
||
/**
|
||
* @covers ::get_list_of_timezones
|
||
*/
|
||
public function test_get_list_of_timezones(): void {
|
||
$this->resetAfterTest();
|
||
|
||
$this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
|
||
|
||
$phpzones = DateTimeZone::listIdentifiers();
|
||
|
||
$zones = core_date::get_list_of_timezones();
|
||
$this->assertSame(count($phpzones), count($zones));
|
||
foreach ($zones as $zone => $zonename) {
|
||
$this->assertSame($zone, $zonename); // The same in English!
|
||
$this->assertContains($zone, $phpzones); // No extras expected.
|
||
}
|
||
|
||
$this->assertSame($zones, core_date::get_list_of_timezones(null, false));
|
||
|
||
$nnzones = core_date::get_list_of_timezones(null, true);
|
||
$last = $nnzones['99'];
|
||
$this->assertSame('Server timezone (Pacific/Auckland)', $last);
|
||
unset($nnzones['99']);
|
||
$this->assertSame($zones, $nnzones);
|
||
|
||
$nnzones = core_date::get_list_of_timezones('99', false);
|
||
$last = $nnzones['99'];
|
||
$this->assertSame('Server timezone (Pacific/Auckland)', $last);
|
||
unset($nnzones['99']);
|
||
$this->assertSame($zones, $nnzones);
|
||
|
||
$xxzones = core_date::get_list_of_timezones('xx', false);
|
||
$xx = $xxzones['xx'];
|
||
$this->assertSame('Invalid timezone "xx"', $xx);
|
||
unset($xxzones['xx']);
|
||
$this->assertSame($zones, $xxzones);
|
||
|
||
$xxzones = core_date::get_list_of_timezones('1', false);
|
||
$xx = $xxzones['1'];
|
||
$this->assertSame('Invalid timezone "UTC+1.0"', $xx);
|
||
unset($xxzones['1']);
|
||
$this->assertSame($zones, $xxzones);
|
||
|
||
$xxzones = core_date::get_list_of_timezones('-1.5', false);
|
||
$xx = $xxzones['-1.5'];
|
||
$this->assertSame('Invalid timezone "UTC-1.5"', $xx);
|
||
unset($xxzones['-1.5']);
|
||
$this->assertSame($zones, $xxzones);
|
||
|
||
}
|
||
|
||
/**
|
||
* @covers ::get_server_timezone
|
||
*/
|
||
public function test_get_server_timezone(): void {
|
||
global $CFG;
|
||
$this->resetAfterTest();
|
||
|
||
$this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
|
||
$this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
|
||
|
||
$this->setTimezone('Pacific/Auckland', 'Europe/Prague');
|
||
$this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
|
||
|
||
$this->setTimezone('99', 'Pacific/Auckland');
|
||
$this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
|
||
|
||
$this->setTimezone(99, 'Pacific/Auckland');
|
||
$this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
|
||
|
||
$this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
|
||
unset($CFG->timezone);
|
||
$this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
|
||
|
||
// Admin should fix the settings.
|
||
$this->setTimezone('xxx/zzzz', 'Europe/Prague');
|
||
$this->assertSame('Europe/Prague', core_date::get_server_timezone());
|
||
}
|
||
|
||
/**
|
||
* @covers ::get_server_timezone_object
|
||
*/
|
||
public function test_get_server_timezone_object(): void {
|
||
$this->resetAfterTest();
|
||
|
||
$zones = core_date::get_list_of_timezones();
|
||
foreach ($zones as $zone) {
|
||
$this->setTimezone($zone, 'Pacific/Auckland');
|
||
$tz = core_date::get_server_timezone_object();
|
||
$this->assertInstanceOf('DateTimeZone', $tz);
|
||
$this->assertSame($zone, $tz->getName());
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @covers ::set_default_server_timezone
|
||
*/
|
||
public function test_set_default_server_timezone(): void {
|
||
global $CFG;
|
||
$this->resetAfterTest();
|
||
|
||
$this->setTimezone('Europe/Prague', 'Pacific/Auckland');
|
||
unset($CFG->timezone);
|
||
date_default_timezone_set('UTC');
|
||
core_date::set_default_server_timezone();
|
||
$this->assertSame('Pacific/Auckland', date_default_timezone_get());
|
||
|
||
$this->setTimezone('', 'Pacific/Auckland');
|
||
date_default_timezone_set('UTC');
|
||
core_date::set_default_server_timezone();
|
||
$this->assertSame('Pacific/Auckland', date_default_timezone_get());
|
||
|
||
$this->setTimezone('99', 'Pacific/Auckland');
|
||
date_default_timezone_set('UTC');
|
||
core_date::set_default_server_timezone();
|
||
$this->assertSame('Pacific/Auckland', date_default_timezone_get());
|
||
|
||
$this->setTimezone(99, 'Pacific/Auckland');
|
||
date_default_timezone_set('UTC');
|
||
core_date::set_default_server_timezone();
|
||
$this->assertSame('Pacific/Auckland', date_default_timezone_get());
|
||
|
||
$this->setTimezone('Europe/Prague', 'Pacific/Auckland');
|
||
$CFG->timezone = 'UTC';
|
||
core_date::set_default_server_timezone();
|
||
$this->assertSame('UTC', date_default_timezone_get());
|
||
|
||
$this->setTimezone('Europe/Prague', 'Pacific/Auckland');
|
||
$CFG->timezone = 'Australia/Perth';
|
||
core_date::set_default_server_timezone();
|
||
$this->assertSame('Australia/Perth', date_default_timezone_get());
|
||
|
||
$this->setTimezone('0', 'Pacific/Auckland');
|
||
date_default_timezone_set('UTC');
|
||
core_date::set_default_server_timezone();
|
||
$this->assertSame('Etc/GMT', date_default_timezone_get());
|
||
|
||
$this->setTimezone('1', 'Pacific/Auckland');
|
||
date_default_timezone_set('UTC');
|
||
core_date::set_default_server_timezone();
|
||
$this->assertSame('Etc/GMT-1', date_default_timezone_get());
|
||
|
||
$this->setTimezone(1, 'Pacific/Auckland');
|
||
date_default_timezone_set('UTC');
|
||
core_date::set_default_server_timezone();
|
||
$this->assertSame('Etc/GMT-1', date_default_timezone_get());
|
||
|
||
$this->setTimezone('1.0', 'Pacific/Auckland');
|
||
date_default_timezone_set('UTC');
|
||
core_date::set_default_server_timezone();
|
||
$this->assertSame('Etc/GMT-1', date_default_timezone_get());
|
||
}
|
||
|
||
public function legacyUserTimezoneProvider() {
|
||
return [
|
||
['', 'Australia/Perth'], // Fallback on default timezone.
|
||
['-13.0', 'Australia/Perth'], // Fallback on default timezone.
|
||
['-12.5', 'Etc/GMT+12'],
|
||
['-12.0', 'Etc/GMT+12'],
|
||
['-11.5', 'Etc/GMT+11'],
|
||
['-11.0', 'Etc/GMT+11'],
|
||
['-10.5', 'Etc/GMT+10'],
|
||
['-10.0', 'Etc/GMT+10'],
|
||
['-9.5', 'Etc/GMT+9'],
|
||
['-9.0', 'Etc/GMT+9'],
|
||
['-8.5', 'Etc/GMT+8'],
|
||
['-8.0', 'Etc/GMT+8'],
|
||
['-7.5', 'Etc/GMT+7'],
|
||
['-7.0', 'Etc/GMT+7'],
|
||
['-6.5', 'Etc/GMT+6'],
|
||
['-6.0', 'Etc/GMT+6'],
|
||
['-5.5', 'Etc/GMT+5'],
|
||
['-5.0', 'Etc/GMT+5'],
|
||
['-4.5', 'Etc/GMT+4'],
|
||
['-4.0', 'Etc/GMT+4'],
|
||
['-3.5', 'Etc/GMT+3'],
|
||
['-3.0', 'Etc/GMT+3'],
|
||
['-2.5', 'Etc/GMT+2'],
|
||
['-2.0', 'Etc/GMT+2'],
|
||
['-1.5', 'Etc/GMT+1'],
|
||
['-1.0', 'Etc/GMT+1'],
|
||
['-0.5', 'Etc/GMT'],
|
||
['0', 'Etc/GMT'],
|
||
['0.0', 'Etc/GMT'],
|
||
['0.5', 'Etc/GMT'],
|
||
['1.0', 'Etc/GMT-1'],
|
||
['1.5', 'Etc/GMT-1'],
|
||
['2.0', 'Etc/GMT-2'],
|
||
['2.5', 'Etc/GMT-2'],
|
||
['3.0', 'Etc/GMT-3'],
|
||
['3.5', 'Etc/GMT-3'],
|
||
['4.0', 'Etc/GMT-4'],
|
||
['4.5', 'Asia/Kabul'],
|
||
['5.0', 'Etc/GMT-5'],
|
||
['5.5', 'Asia/Kolkata'],
|
||
['6.0', 'Etc/GMT-6'],
|
||
['6.5', 'Asia/Rangoon'],
|
||
['7.0', 'Etc/GMT-7'],
|
||
['7.5', 'Etc/GMT-7'],
|
||
['8.0', 'Etc/GMT-8'],
|
||
['8.5', 'Etc/GMT-8'],
|
||
['9.0', 'Etc/GMT-9'],
|
||
['9.5', 'Australia/Darwin'],
|
||
['10.0', 'Etc/GMT-10'],
|
||
['10.5', 'Etc/GMT-10'],
|
||
['11.0', 'Etc/GMT-11'],
|
||
['11.5', 'Etc/GMT-11'],
|
||
['12.0', 'Etc/GMT-12'],
|
||
['12.5', 'Etc/GMT-12'],
|
||
['13.0', 'Etc/GMT-13'],
|
||
];
|
||
}
|
||
|
||
/**
|
||
* @dataProvider legacyUserTimezoneProvider
|
||
* @covers ::get_user_timezone
|
||
* @param string $tz The legacy timezone.
|
||
* @param string $expected The expected converted timezone.
|
||
*/
|
||
public function test_get_legacy_user_timezone($tz, $expected): void {
|
||
$this->setTimezone('Australia/Perth', 'Australia/Perth');
|
||
$this->assertEquals($expected, core_date::get_user_timezone($tz));
|
||
}
|
||
|
||
/**
|
||
* @covers ::get_user_timezone
|
||
*/
|
||
public function test_get_user_timezone(): void {
|
||
global $CFG, $USER;
|
||
$this->resetAfterTest();
|
||
|
||
// Null parameter.
|
||
|
||
$this->setTimezone('Europe/Prague', 'Pacific/Auckland');
|
||
$USER->timezone = 'Pacific/Auckland';
|
||
$CFG->forcetimezone = '99';
|
||
$this->assertSame('Pacific/Auckland', core_date::get_user_timezone(null));
|
||
$this->assertSame('Pacific/Auckland', core_date::get_user_timezone());
|
||
|
||
$this->setTimezone('Europe/Prague', 'Pacific/Auckland');
|
||
$USER->timezone = 'Pacific/Auckland';
|
||
$CFG->forcetimezone = 'Europe/Berlin';
|
||
$this->assertSame('Europe/Berlin', core_date::get_user_timezone(null));
|
||
$this->assertSame('Europe/Berlin', core_date::get_user_timezone());
|
||
|
||
$this->setTimezone('Europe/Prague', 'Pacific/Auckland');
|
||
$USER->timezone = 'Pacific/Auckland';
|
||
$CFG->forcetimezone = 'xxx/yyy';
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone(null));
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone());
|
||
|
||
$this->setTimezone('Europe/Prague', 'Pacific/Auckland');
|
||
$USER->timezone = 'abc/def';
|
||
$CFG->forcetimezone = '99';
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone(null));
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone());
|
||
|
||
$this->setTimezone('xxx/yyy', 'Europe/London');
|
||
$USER->timezone = 'abc/def';
|
||
$CFG->forcetimezone = 'Europe/Berlin';
|
||
$this->assertSame('Europe/Berlin', core_date::get_user_timezone(null));
|
||
$this->assertSame('Europe/Berlin', core_date::get_user_timezone());
|
||
|
||
$this->setTimezone('xxx/yyy', 'Europe/London');
|
||
$USER->timezone = 'abc/def';
|
||
$CFG->forcetimezone = 99;
|
||
$this->assertSame('Europe/London', core_date::get_user_timezone(null));
|
||
$this->assertSame('Europe/London', core_date::get_user_timezone());
|
||
|
||
// User object parameter.
|
||
$admin = get_admin();
|
||
|
||
$this->setTimezone('Europe/London');
|
||
$USER->timezone = 'Pacific/Auckland';
|
||
$CFG->forcetimezone = '99';
|
||
$admin->timezone = 'Australia/Perth';
|
||
$this->assertSame('Australia/Perth', core_date::get_user_timezone($admin));
|
||
|
||
$this->setTimezone('Europe/Prague');
|
||
$USER->timezone = 'Pacific/Auckland';
|
||
$CFG->forcetimezone = '99';
|
||
$admin->timezone = '99';
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone($admin));
|
||
|
||
$this->setTimezone('99', 'Europe/London');
|
||
$USER->timezone = 'Pacific/Auckland';
|
||
$CFG->forcetimezone = '99';
|
||
$admin->timezone = '99';
|
||
$this->assertSame('Europe/London', core_date::get_user_timezone($admin));
|
||
|
||
$this->setTimezone('Europe/Prague');
|
||
$USER->timezone = 'Pacific/Auckland';
|
||
$CFG->forcetimezone = '99';
|
||
$admin->timezone = 'xx/zz';
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone($admin));
|
||
|
||
$this->setTimezone('Europe/Prague');
|
||
$USER->timezone = 'Pacific/Auckland';
|
||
$CFG->forcetimezone = '99';
|
||
unset($admin->timezone);
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone($admin));
|
||
|
||
$this->setTimezone('Europe/Prague');
|
||
$USER->timezone = 'Pacific/Auckland';
|
||
$CFG->forcetimezone = 'Europe/Berlin';
|
||
$admin->timezone = 'Australia/Perth';
|
||
$this->assertSame('Europe/Berlin', core_date::get_user_timezone($admin));
|
||
|
||
// Other scalar parameter.
|
||
|
||
$this->setTimezone('Europe/Prague');
|
||
$CFG->forcetimezone = '99';
|
||
|
||
$USER->timezone = 'Pacific/Auckland';
|
||
$this->assertSame('Pacific/Auckland', core_date::get_user_timezone('99'));
|
||
$this->assertSame('Etc/GMT-1', core_date::get_user_timezone('1'));
|
||
$this->assertSame('Etc/GMT+1', core_date::get_user_timezone(-1));
|
||
$this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
|
||
$USER->timezone = '99';
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
|
||
$this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone('xxx/zzz'));
|
||
$USER->timezone = 'xxz/zzz';
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
|
||
|
||
$this->setTimezone('99', 'Europe/Prague');
|
||
$CFG->forcetimezone = '99';
|
||
|
||
$USER->timezone = 'Pacific/Auckland';
|
||
$this->assertSame('Pacific/Auckland', core_date::get_user_timezone('99'));
|
||
$this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
|
||
$USER->timezone = '99';
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
|
||
$this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone('xxx/zzz'));
|
||
$USER->timezone = 99;
|
||
$this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone('xxx/zzz'));
|
||
$USER->timezone = 'xxz/zzz';
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
|
||
|
||
$this->setTimezone('xxx', 'Europe/Prague');
|
||
$CFG->forcetimezone = '99';
|
||
$USER->timezone = 'xxx';
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
|
||
$this->assertSame('Europe/Prague', core_date::get_user_timezone(99));
|
||
$this->assertSame('Etc/GMT-1', core_date::get_user_timezone(1));
|
||
|
||
$this->setTimezone('Europe/Prague');
|
||
$CFG->forcetimezone = 'Pacific/Auckland';
|
||
$USER->timezone = 'Europe/London';
|
||
$this->assertSame('Pacific/Auckland', core_date::get_user_timezone(99));
|
||
$this->assertSame('Europe/Berlin', core_date::get_user_timezone('Europe/Berlin'));
|
||
|
||
// TZ object param.
|
||
|
||
$this->setTimezone('UTC');
|
||
$USER->timezone = 'Europe/London';
|
||
$CFG->forcetimezone = 99;
|
||
$tz = new DateTimeZone('Pacific/Auckland');
|
||
$this->assertSame('Pacific/Auckland', core_date::get_user_timezone($tz));
|
||
}
|
||
|
||
/**
|
||
* @covers ::get_user_timezone_object
|
||
*/
|
||
public function test_get_user_timezone_object(): void {
|
||
global $CFG, $USER;
|
||
$this->resetAfterTest();
|
||
|
||
$this->setTimezone('Pacific/Auckland');
|
||
$CFG->forcetimezone = '99';
|
||
|
||
$zones = core_date::get_list_of_timezones();
|
||
foreach ($zones as $zone) {
|
||
$USER->timezone = $zone;
|
||
$tz = core_date::get_user_timezone_object();
|
||
$this->assertInstanceOf('DateTimeZone', $tz);
|
||
$this->assertSame($zone, $tz->getName());
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Data provider for the values for test_core_strftime().
|
||
*
|
||
* @return array
|
||
*/
|
||
public static function get_strftime_provider(): array {
|
||
return [
|
||
'string_c' => [
|
||
"1708405742",
|
||
"%c",
|
||
"20 February 2024 at 1:09 pm",
|
||
],
|
||
'numeric_c' => [
|
||
1708405742,
|
||
"%c",
|
||
"20 February 2024 at 1:09 pm",
|
||
],
|
||
'string_strftimedatetime' => [
|
||
"1708405742",
|
||
get_string("strftimedatetime", 'langconfig'),
|
||
"20 February 2024, 01:09 PM",
|
||
],
|
||
'numeric_strftimedatetime' => [
|
||
1708405742,
|
||
get_string("strftimedatetime", 'langconfig'),
|
||
"20 February 2024, 01:09 PM",
|
||
],
|
||
'string_strftimedatetimeshortaccurate' => [
|
||
"1708405742",
|
||
get_string("strftimedatetimeshortaccurate", 'langconfig'),
|
||
"20/02/24, 13:09:02",
|
||
],
|
||
'numeric_strftimedatetimeshortaccurate' => [
|
||
1708405742,
|
||
get_string("strftimedatetimeshortaccurate", 'langconfig'),
|
||
"20/02/24, 13:09:02",
|
||
],
|
||
];
|
||
}
|
||
|
||
/**
|
||
* Test \core_date::strftime function.
|
||
*
|
||
* @dataProvider get_strftime_provider
|
||
* @param mixed $input Input passed to strftime
|
||
* @param string $format The date format to pass to strftime, falls back to '%c' if null
|
||
* @param string $expected The output generated by strftime
|
||
*/
|
||
public function test_strftime(mixed $input, string $format, string $expected): void {
|
||
$this->assertEqualsIgnoringWhitespace($expected, core_date::strftime($format, $input));
|
||
}
|
||
}
|