PageRenderTime 56ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/tests/date_test.php

http://github.com/moodle/moodle
PHP | 566 lines | 432 code | 91 blank | 43 comment | 6 complexity | 48537f6ae43749fd96f33e3b1b148359 MD5 | raw file
Possible License(s): MIT, AGPL-3.0, MPL-2.0-no-copyleft-exception, LGPL-3.0, GPL-3.0, Apache-2.0, LGPL-2.1, BSD-3-Clause
  1. <?php
  2. // This file is part of Moodle - http://moodle.org/
  3. //
  4. // Moodle is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // Moodle is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU General Public License
  15. // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
  16. /**
  17. * Tests core_date class.
  18. *
  19. * @package core
  20. * @copyright 2015 Totara Learning Solutions Ltd {@link http://www.totaralms.com/}
  21. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  22. * @author Petr Skoda <petr.skoda@totaralms.com>
  23. */
  24. defined('MOODLE_INTERNAL') || die();
  25. /**
  26. * Tests core_date class.
  27. *
  28. * @package core
  29. * @copyright 2015 Totara Learning Solutions Ltd {@link http://www.totaralms.com/}
  30. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  31. * @author Petr Skoda <petr.skoda@totaralms.com>
  32. */
  33. class core_date_testcase extends advanced_testcase {
  34. public function test_get_default_php_timezone() {
  35. $this->resetAfterTest();
  36. $origtz = core_date::get_default_php_timezone();
  37. $this->assertNotEmpty($origtz);
  38. $this->setTimezone('Pacific/Auckland', 'Europe/Prague');
  39. $this->assertSame('Europe/Prague', core_date::get_default_php_timezone());
  40. $this->setTimezone('Pacific/Auckland', 'UTC');
  41. $this->assertSame('UTC', core_date::get_default_php_timezone());
  42. $this->setTimezone('Pacific/Auckland', 'GMT');
  43. $this->assertSame('GMT', core_date::get_default_php_timezone());
  44. }
  45. public function test_normalise_timezone() {
  46. $this->resetAfterTest();
  47. $this->setTimezone('Pacific/Auckland');
  48. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone('Pacific/Auckland'));
  49. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone('99'));
  50. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(99));
  51. $this->assertSame('GMT', core_date::normalise_timezone('GMT'));
  52. $this->assertSame('UTC', core_date::normalise_timezone('UTC'));
  53. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone('xxxxxxxx'));
  54. $this->assertSame('Europe/Berlin', core_date::normalise_timezone('Central European Time'));
  55. $this->assertSame('Etc/GMT', core_date::normalise_timezone('0'));
  56. $this->assertSame('Etc/GMT', core_date::normalise_timezone('0.0'));
  57. $this->assertSame('Etc/GMT-2', core_date::normalise_timezone(2));
  58. $this->assertSame('Etc/GMT-2', core_date::normalise_timezone('2.0'));
  59. $this->assertSame('Etc/GMT+2', core_date::normalise_timezone(-2));
  60. $this->assertSame('Etc/GMT+2', core_date::normalise_timezone('-2.0'));
  61. $this->assertSame('Etc/GMT+4', core_date::normalise_timezone(-4));
  62. $this->assertSame('Etc/GMT-2', core_date::normalise_timezone('UTC+2'));
  63. $this->assertSame('Etc/GMT+2', core_date::normalise_timezone('UTC-2'));
  64. $this->assertSame('Etc/GMT-2', core_date::normalise_timezone('GMT+2'));
  65. $this->assertSame('Etc/GMT+2', core_date::normalise_timezone('GMT-2'));
  66. $this->assertSame('Etc/GMT+12', core_date::normalise_timezone(-12));
  67. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-13));
  68. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-14));
  69. $this->assertSame('Etc/GMT-12', core_date::normalise_timezone(12));
  70. $this->assertSame('Etc/GMT-13', core_date::normalise_timezone(13));
  71. $this->assertSame('Etc/GMT-14', core_date::normalise_timezone(14));
  72. $this->assertSame('Asia/Kabul', core_date::normalise_timezone(4.5));
  73. $this->assertSame('Asia/Kolkata', core_date::normalise_timezone(5.5));
  74. $this->assertSame('Asia/Rangoon', core_date::normalise_timezone(6.5));
  75. $this->assertSame('Australia/Darwin', core_date::normalise_timezone('9.5'));
  76. $this->setTimezone('99', 'Pacific/Auckland');
  77. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone('Pacific/Auckland'));
  78. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone('99'));
  79. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(99));
  80. $this->assertSame('GMT', core_date::normalise_timezone('GMT'));
  81. $this->assertSame('UTC', core_date::normalise_timezone('UTC'));
  82. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone('xxxxxxxx'));
  83. $this->assertSame('Europe/Berlin', core_date::normalise_timezone('Central European Time'));
  84. $this->assertSame('Etc/GMT', core_date::normalise_timezone('0'));
  85. $this->assertSame('Etc/GMT', core_date::normalise_timezone('0.0'));
  86. $this->assertSame('Etc/GMT-2', core_date::normalise_timezone(2));
  87. $this->assertSame('Etc/GMT-2', core_date::normalise_timezone('2.0'));
  88. $this->assertSame('Etc/GMT+2', core_date::normalise_timezone(-2));
  89. $this->assertSame('Etc/GMT+2', core_date::normalise_timezone('-2.0'));
  90. $this->assertSame('Etc/GMT-2', core_date::normalise_timezone('UTC+2'));
  91. $this->assertSame('Etc/GMT+2', core_date::normalise_timezone('UTC-2'));
  92. $this->assertSame('Etc/GMT-2', core_date::normalise_timezone('GMT+2'));
  93. $this->assertSame('Etc/GMT+2', core_date::normalise_timezone('GMT-2'));
  94. $this->assertSame('Etc/GMT+12', core_date::normalise_timezone(-12));
  95. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-13));
  96. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone(-14));
  97. $this->assertSame('Etc/GMT-12', core_date::normalise_timezone(12));
  98. $this->assertSame('Etc/GMT-13', core_date::normalise_timezone(13));
  99. $this->assertSame('Etc/GMT-14', core_date::normalise_timezone(14));
  100. $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
  101. $tz = new DateTimeZone('Pacific/Auckland');
  102. $this->assertSame('Pacific/Auckland', core_date::normalise_timezone($tz));
  103. }
  104. public function test_windows_conversion() {
  105. $file = __DIR__ . '/fixtures/timezonewindows.xml';
  106. $contents = file_get_contents($file);
  107. preg_match_all('/<mapZone other="([^"]+)" territory="001" type="([^"]+)"\/>/', $contents, $matches, PREG_SET_ORDER);
  108. $this->assertCount(104, $matches); // NOTE: If the file contents change edit the core_date class and update this.
  109. foreach ($matches as $match) {
  110. $result = core_date::normalise_timezone($match[1]);
  111. if ($result == $match[2]) {
  112. $this->assertSame($match[2], $result);
  113. } else {
  114. $data = new DateTime('now', new DateTimeZone($match[2]));
  115. $expectedoffset = $data->getOffset();
  116. $data = new DateTime('now', new DateTimeZone($result));
  117. $resultoffset = $data->getOffset();
  118. $this->assertSame($expectedoffset, $resultoffset, "$match[1] is expected to be converted to $match[2] not $result");
  119. }
  120. }
  121. }
  122. /**
  123. * Sanity test for PHP stuff.
  124. */
  125. public function test_php_gmt_offsets() {
  126. $this->resetAfterTest();
  127. $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
  128. for ($i = -12; $i < 0; $i++) {
  129. $date = new DateTime('now', new DateTimeZone("Etc/GMT{$i}"));
  130. $this->assertSame(- $i * 60 * 60, $date->getOffset());
  131. $date = new DateTime('now', new DateTimeZone(core_date::normalise_timezone("GMT{$i}")));
  132. $this->assertSame($i * 60 * 60, $date->getOffset());
  133. $date = new DateTime('now', new DateTimeZone(core_date::normalise_timezone("UTC{$i}")));
  134. $this->assertSame($i * 60 * 60, $date->getOffset());
  135. }
  136. $date = new DateTime('now', new DateTimeZone('Etc/GMT'));
  137. $this->assertSame(0, $date->getOffset());
  138. for ($i = 1; $i <= 12; $i++) {
  139. $date = new DateTime('now', new DateTimeZone("Etc/GMT+{$i}"));
  140. $this->assertSame(- $i * 60 * 60, $date->getOffset());
  141. $date = new DateTime('now', new DateTimeZone(core_date::normalise_timezone("GMT+{$i}")));
  142. $this->assertSame($i * 60 * 60, $date->getOffset());
  143. $date = new DateTime('now', new DateTimeZone(core_date::normalise_timezone("UTC+{$i}")));
  144. $this->assertSame($i * 60 * 60, $date->getOffset());
  145. }
  146. }
  147. public function test_timezone_lang_strings() {
  148. $phpzones = DateTimeZone::listIdentifiers();
  149. $manager = get_string_manager();
  150. foreach ($phpzones as $tz) {
  151. $this->assertTrue($manager->string_exists(strtolower($tz), 'core_timezones'));
  152. }
  153. }
  154. public function test_get_localised_timezone() {
  155. $this->resetAfterTest();
  156. $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
  157. $result = core_date::get_localised_timezone('Pacific/Auckland');
  158. $this->assertSame('Pacific/Auckland', $result);
  159. $result = core_date::get_localised_timezone('99');
  160. $this->assertSame('Server timezone (Pacific/Auckland)', $result);
  161. $result = core_date::get_localised_timezone(99);
  162. $this->assertSame('Server timezone (Pacific/Auckland)', $result);
  163. $result = core_date::get_localised_timezone('Etc/GMT-1');
  164. $this->assertSame('UTC+1', $result);
  165. $result = core_date::get_localised_timezone('Etc/GMT+2');
  166. $this->assertSame('UTC-2', $result);
  167. $result = core_date::get_localised_timezone('GMT');
  168. $this->assertSame('UTC', $result);
  169. $result = core_date::get_localised_timezone('Etc/GMT');
  170. $this->assertSame('UTC', $result);
  171. }
  172. public function test_get_list_of_timezones() {
  173. $this->resetAfterTest();
  174. $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
  175. $phpzones = DateTimeZone::listIdentifiers();
  176. $zones = core_date::get_list_of_timezones();
  177. $this->assertSame(count($phpzones), count($zones));
  178. foreach ($zones as $zone => $zonename) {
  179. $this->assertSame($zone, $zonename); // The same in English!
  180. $this->assertContains($zone, $phpzones); // No extras expected.
  181. }
  182. $this->assertSame($zones, core_date::get_list_of_timezones(null, false));
  183. $nnzones = core_date::get_list_of_timezones(null, true);
  184. $last = $nnzones['99'];
  185. $this->assertSame('Server timezone (Pacific/Auckland)', $last);
  186. unset($nnzones['99']);
  187. $this->assertSame($zones, $nnzones);
  188. $nnzones = core_date::get_list_of_timezones('99', false);
  189. $last = $nnzones['99'];
  190. $this->assertSame('Server timezone (Pacific/Auckland)', $last);
  191. unset($nnzones['99']);
  192. $this->assertSame($zones, $nnzones);
  193. $xxzones = core_date::get_list_of_timezones('xx', false);
  194. $xx = $xxzones['xx'];
  195. $this->assertSame('Invalid timezone "xx"', $xx);
  196. unset($xxzones['xx']);
  197. $this->assertSame($zones, $xxzones);
  198. $xxzones = core_date::get_list_of_timezones('1', false);
  199. $xx = $xxzones['1'];
  200. $this->assertSame('Invalid timezone "UTC+1.0"', $xx);
  201. unset($xxzones['1']);
  202. $this->assertSame($zones, $xxzones);
  203. $xxzones = core_date::get_list_of_timezones('-1.5', false);
  204. $xx = $xxzones['-1.5'];
  205. $this->assertSame('Invalid timezone "UTC-1.5"', $xx);
  206. unset($xxzones['-1.5']);
  207. $this->assertSame($zones, $xxzones);
  208. }
  209. public function test_get_server_timezone() {
  210. global $CFG;
  211. $this->resetAfterTest();
  212. $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
  213. $this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
  214. $this->setTimezone('Pacific/Auckland', 'Europe/Prague');
  215. $this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
  216. $this->setTimezone('99', 'Pacific/Auckland');
  217. $this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
  218. $this->setTimezone(99, 'Pacific/Auckland');
  219. $this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
  220. $this->setTimezone('Pacific/Auckland', 'Pacific/Auckland');
  221. unset($CFG->timezone);
  222. $this->assertSame('Pacific/Auckland', core_date::get_server_timezone());
  223. // Admin should fix the settings.
  224. $this->setTimezone('xxx/zzzz', 'Europe/Prague');
  225. $this->assertSame('Europe/Prague', core_date::get_server_timezone());
  226. }
  227. public function test_get_server_timezone_object() {
  228. $this->resetAfterTest();
  229. $zones = core_date::get_list_of_timezones();
  230. foreach ($zones as $zone) {
  231. $this->setTimezone($zone, 'Pacific/Auckland');
  232. $tz = core_date::get_server_timezone_object();
  233. $this->assertInstanceOf('DateTimeZone', $tz);
  234. $this->assertSame($zone, $tz->getName());
  235. }
  236. }
  237. public function test_set_default_server_timezone() {
  238. global $CFG;
  239. $this->resetAfterTest();
  240. $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
  241. unset($CFG->timezone);
  242. date_default_timezone_set('UTC');
  243. core_date::set_default_server_timezone();
  244. $this->assertSame('Pacific/Auckland', date_default_timezone_get());
  245. $this->setTimezone('', 'Pacific/Auckland');
  246. date_default_timezone_set('UTC');
  247. core_date::set_default_server_timezone();
  248. $this->assertSame('Pacific/Auckland', date_default_timezone_get());
  249. $this->setTimezone('99', 'Pacific/Auckland');
  250. date_default_timezone_set('UTC');
  251. core_date::set_default_server_timezone();
  252. $this->assertSame('Pacific/Auckland', date_default_timezone_get());
  253. $this->setTimezone(99, 'Pacific/Auckland');
  254. date_default_timezone_set('UTC');
  255. core_date::set_default_server_timezone();
  256. $this->assertSame('Pacific/Auckland', date_default_timezone_get());
  257. $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
  258. $CFG->timezone = 'UTC';
  259. core_date::set_default_server_timezone();
  260. $this->assertSame('UTC', date_default_timezone_get());
  261. $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
  262. $CFG->timezone = 'Australia/Perth';
  263. core_date::set_default_server_timezone();
  264. $this->assertSame('Australia/Perth', date_default_timezone_get());
  265. $this->setTimezone('0', 'Pacific/Auckland');
  266. date_default_timezone_set('UTC');
  267. core_date::set_default_server_timezone();
  268. $this->assertSame('Etc/GMT', date_default_timezone_get());
  269. $this->setTimezone('1', 'Pacific/Auckland');
  270. date_default_timezone_set('UTC');
  271. core_date::set_default_server_timezone();
  272. $this->assertSame('Etc/GMT-1', date_default_timezone_get());
  273. $this->setTimezone(1, 'Pacific/Auckland');
  274. date_default_timezone_set('UTC');
  275. core_date::set_default_server_timezone();
  276. $this->assertSame('Etc/GMT-1', date_default_timezone_get());
  277. $this->setTimezone('1.0', 'Pacific/Auckland');
  278. date_default_timezone_set('UTC');
  279. core_date::set_default_server_timezone();
  280. $this->assertSame('Etc/GMT-1', date_default_timezone_get());
  281. }
  282. public function legacyUserTimezoneProvider() {
  283. return [
  284. ['', 'Australia/Perth'], // Fallback on default timezone.
  285. ['-13.0', 'Australia/Perth'], // Fallback on default timezone.
  286. ['-12.5', 'Etc/GMT+12'],
  287. ['-12.0', 'Etc/GMT+12'],
  288. ['-11.5', 'Etc/GMT+11'],
  289. ['-11.0', 'Etc/GMT+11'],
  290. ['-10.5', 'Etc/GMT+10'],
  291. ['-10.0', 'Etc/GMT+10'],
  292. ['-9.5', 'Etc/GMT+9'],
  293. ['-9.0', 'Etc/GMT+9'],
  294. ['-8.5', 'Etc/GMT+8'],
  295. ['-8.0', 'Etc/GMT+8'],
  296. ['-7.5', 'Etc/GMT+7'],
  297. ['-7.0', 'Etc/GMT+7'],
  298. ['-6.5', 'Etc/GMT+6'],
  299. ['-6.0', 'Etc/GMT+6'],
  300. ['-5.5', 'Etc/GMT+5'],
  301. ['-5.0', 'Etc/GMT+5'],
  302. ['-4.5', 'Etc/GMT+4'],
  303. ['-4.0', 'Etc/GMT+4'],
  304. ['-3.5', 'Etc/GMT+3'],
  305. ['-3.0', 'Etc/GMT+3'],
  306. ['-2.5', 'Etc/GMT+2'],
  307. ['-2.0', 'Etc/GMT+2'],
  308. ['-1.5', 'Etc/GMT+1'],
  309. ['-1.0', 'Etc/GMT+1'],
  310. ['-0.5', 'Etc/GMT'],
  311. ['0', 'Etc/GMT'],
  312. ['0.0', 'Etc/GMT'],
  313. ['0.5', 'Etc/GMT'],
  314. ['1.0', 'Etc/GMT-1'],
  315. ['1.5', 'Etc/GMT-1'],
  316. ['2.0', 'Etc/GMT-2'],
  317. ['2.5', 'Etc/GMT-2'],
  318. ['3.0', 'Etc/GMT-3'],
  319. ['3.5', 'Etc/GMT-3'],
  320. ['4.0', 'Etc/GMT-4'],
  321. ['4.5', 'Asia/Kabul'],
  322. ['5.0', 'Etc/GMT-5'],
  323. ['5.5', 'Asia/Kolkata'],
  324. ['6.0', 'Etc/GMT-6'],
  325. ['6.5', 'Asia/Rangoon'],
  326. ['7.0', 'Etc/GMT-7'],
  327. ['7.5', 'Etc/GMT-7'],
  328. ['8.0', 'Etc/GMT-8'],
  329. ['8.5', 'Etc/GMT-8'],
  330. ['9.0', 'Etc/GMT-9'],
  331. ['9.5', 'Australia/Darwin'],
  332. ['10.0', 'Etc/GMT-10'],
  333. ['10.5', 'Etc/GMT-10'],
  334. ['11.0', 'Etc/GMT-11'],
  335. ['11.5', 'Etc/GMT-11'],
  336. ['12.0', 'Etc/GMT-12'],
  337. ['12.5', 'Etc/GMT-12'],
  338. ['13.0', 'Etc/GMT-13'],
  339. ];
  340. }
  341. /**
  342. * @dataProvider legacyUserTimezoneProvider
  343. * @param string $tz The legacy timezone.
  344. * @param string $expected The expected converted timezone.
  345. */
  346. public function test_get_legacy_user_timezone($tz, $expected) {
  347. $this->setTimezone('Australia/Perth', 'Australia/Perth');
  348. $this->assertEquals($expected, core_date::get_user_timezone($tz));
  349. }
  350. public function test_get_user_timezone() {
  351. global $CFG, $USER;
  352. $this->resetAfterTest();
  353. // Null parameter.
  354. $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
  355. $USER->timezone = 'Pacific/Auckland';
  356. $CFG->forcetimezone = '99';
  357. $this->assertSame('Pacific/Auckland', core_date::get_user_timezone(null));
  358. $this->assertSame('Pacific/Auckland', core_date::get_user_timezone());
  359. $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
  360. $USER->timezone = 'Pacific/Auckland';
  361. $CFG->forcetimezone = 'Europe/Berlin';
  362. $this->assertSame('Europe/Berlin', core_date::get_user_timezone(null));
  363. $this->assertSame('Europe/Berlin', core_date::get_user_timezone());
  364. $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
  365. $USER->timezone = 'Pacific/Auckland';
  366. $CFG->forcetimezone = 'xxx/yyy';
  367. $this->assertSame('Europe/Prague', core_date::get_user_timezone(null));
  368. $this->assertSame('Europe/Prague', core_date::get_user_timezone());
  369. $this->setTimezone('Europe/Prague', 'Pacific/Auckland');
  370. $USER->timezone = 'abc/def';
  371. $CFG->forcetimezone = '99';
  372. $this->assertSame('Europe/Prague', core_date::get_user_timezone(null));
  373. $this->assertSame('Europe/Prague', core_date::get_user_timezone());
  374. $this->setTimezone('xxx/yyy', 'Europe/London');
  375. $USER->timezone = 'abc/def';
  376. $CFG->forcetimezone = 'Europe/Berlin';
  377. $this->assertSame('Europe/Berlin', core_date::get_user_timezone(null));
  378. $this->assertSame('Europe/Berlin', core_date::get_user_timezone());
  379. $this->setTimezone('xxx/yyy', 'Europe/London');
  380. $USER->timezone = 'abc/def';
  381. $CFG->forcetimezone = 99;
  382. $this->assertSame('Europe/London', core_date::get_user_timezone(null));
  383. $this->assertSame('Europe/London', core_date::get_user_timezone());
  384. // User object parameter.
  385. $admin = get_admin();
  386. $this->setTimezone('Europe/London');
  387. $USER->timezone = 'Pacific/Auckland';
  388. $CFG->forcetimezone = '99';
  389. $admin->timezone = 'Australia/Perth';
  390. $this->assertSame('Australia/Perth', core_date::get_user_timezone($admin));
  391. $this->setTimezone('Europe/Prague');
  392. $USER->timezone = 'Pacific/Auckland';
  393. $CFG->forcetimezone = '99';
  394. $admin->timezone = '99';
  395. $this->assertSame('Europe/Prague', core_date::get_user_timezone($admin));
  396. $this->setTimezone('99', 'Europe/London');
  397. $USER->timezone = 'Pacific/Auckland';
  398. $CFG->forcetimezone = '99';
  399. $admin->timezone = '99';
  400. $this->assertSame('Europe/London', core_date::get_user_timezone($admin));
  401. $this->setTimezone('Europe/Prague');
  402. $USER->timezone = 'Pacific/Auckland';
  403. $CFG->forcetimezone = '99';
  404. $admin->timezone = 'xx/zz';
  405. $this->assertSame('Europe/Prague', core_date::get_user_timezone($admin));
  406. $this->setTimezone('Europe/Prague');
  407. $USER->timezone = 'Pacific/Auckland';
  408. $CFG->forcetimezone = '99';
  409. unset($admin->timezone);
  410. $this->assertSame('Europe/Prague', core_date::get_user_timezone($admin));
  411. $this->setTimezone('Europe/Prague');
  412. $USER->timezone = 'Pacific/Auckland';
  413. $CFG->forcetimezone = 'Europe/Berlin';
  414. $admin->timezone = 'Australia/Perth';
  415. $this->assertSame('Europe/Berlin', core_date::get_user_timezone($admin));
  416. // Other scalar parameter.
  417. $this->setTimezone('Europe/Prague');
  418. $CFG->forcetimezone = '99';
  419. $USER->timezone = 'Pacific/Auckland';
  420. $this->assertSame('Pacific/Auckland', core_date::get_user_timezone('99'));
  421. $this->assertSame('Etc/GMT-1', core_date::get_user_timezone('1'));
  422. $this->assertSame('Etc/GMT+1', core_date::get_user_timezone(-1));
  423. $this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
  424. $USER->timezone = '99';
  425. $this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
  426. $this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
  427. $this->assertSame('Europe/Prague', core_date::get_user_timezone('xxx/zzz'));
  428. $USER->timezone = 'xxz/zzz';
  429. $this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
  430. $this->setTimezone('99', 'Europe/Prague');
  431. $CFG->forcetimezone = '99';
  432. $USER->timezone = 'Pacific/Auckland';
  433. $this->assertSame('Pacific/Auckland', core_date::get_user_timezone('99'));
  434. $this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
  435. $USER->timezone = '99';
  436. $this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
  437. $this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
  438. $this->assertSame('Europe/Prague', core_date::get_user_timezone('xxx/zzz'));
  439. $USER->timezone = 99;
  440. $this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London'));
  441. $this->assertSame('Europe/Prague', core_date::get_user_timezone('xxx/zzz'));
  442. $USER->timezone = 'xxz/zzz';
  443. $this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
  444. $this->setTimezone('xxx', 'Europe/Prague');
  445. $CFG->forcetimezone = '99';
  446. $USER->timezone = 'xxx';
  447. $this->assertSame('Europe/Prague', core_date::get_user_timezone('99'));
  448. $this->assertSame('Europe/Prague', core_date::get_user_timezone(99));
  449. $this->assertSame('Etc/GMT-1', core_date::get_user_timezone(1));
  450. $this->setTimezone('Europe/Prague');
  451. $CFG->forcetimezone = 'Pacific/Auckland';
  452. $USER->timezone = 'Europe/London';
  453. $this->assertSame('Pacific/Auckland', core_date::get_user_timezone(99));
  454. $this->assertSame('Europe/Berlin', core_date::get_user_timezone('Europe/Berlin'));
  455. // TZ object param.
  456. $this->setTimezone('UTC');
  457. $USER->timezone = 'Europe/London';
  458. $CFG->forcetimezone = 99;
  459. $tz = new DateTimeZone('Pacific/Auckland');
  460. $this->assertSame('Pacific/Auckland', core_date::get_user_timezone($tz));
  461. }
  462. public function test_get_user_timezone_object() {
  463. global $CFG, $USER;
  464. $this->resetAfterTest();
  465. $this->setTimezone('Pacific/Auckland');
  466. $CFG->forcetimezone = '99';
  467. $zones = core_date::get_list_of_timezones();
  468. foreach ($zones as $zone) {
  469. $USER->timezone = $zone;
  470. $tz = core_date::get_user_timezone_object();
  471. $this->assertInstanceOf('DateTimeZone', $tz);
  472. $this->assertSame($zone, $tz->getName());
  473. }
  474. }
  475. }