Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
<?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 for \tool_langimport\locale class. < * < * @package tool_langimport < * @copyright 2018 Université Rennes 2 {@link https://www.univ-rennes2.fr} < * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later < */ < < defined('MOODLE_INTERNAL') || die();
> namespace tool_langimport;
/** * Tests for \tool_langimport\locale class. *
> * @package tool_langimport * @coversDefaultClass \tool_langimport\locale > * @category test
* @copyright 2018 Université Rennes 2 {@link https://www.univ-rennes2.fr} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */
< class locale_testcase extends \advanced_testcase {
> class locale_test extends \advanced_testcase {
/** * Test that \tool_langimport\locale::check_locale_availability() works as expected. * * @covers ::check_locale_availability * @return void */ public function test_check_locale_availability() { // Create a mock of set_locale() method to simulate : // - first setlocale() call which backup current locale // - second setlocale() call which try to set new 'es' locale // - third setlocale() call which restore locale.
< $mock = $this->getMockBuilder(\tool_langimport\locale::class) < ->setMethods(['set_locale'])
> $mock = $this->getMockBuilder(locale::class) > ->onlyMethods(['set_locale'])
->getMock(); $mock->method('set_locale')->will($this->onConsecutiveCalls('en', 'es', 'en')); // Test what happen when locale is available on system. $result = $mock->check_locale_availability('en'); $this->assertTrue($result); // Create a mock of set_locale() method to simulate : // - first setlocale() call which backup current locale // - second setlocale() call which fail to set new locale // - third setlocale() call which restore locale.
< $mock = $this->getMockBuilder(\tool_langimport\locale::class) < ->setMethods(['set_locale'])
> $mock = $this->getMockBuilder(locale::class) > ->onlyMethods(['set_locale'])
->getMock(); $mock->method('set_locale')->will($this->onConsecutiveCalls('en', false, 'en')); // Test what happen when locale is not available on system. $result = $mock->check_locale_availability('en'); $this->assertFalse($result); // Test an invalid parameter.
< $locale = new \tool_langimport\locale(); < $this->expectException(coding_exception::class);
> $locale = new locale(); > $this->expectException(\coding_exception::class);
$locale->check_locale_availability(''); } /** * Test \tool_langimport\locale::set_locale() own logic. * * We have to explicitly test set_locale() own logic and results, * that effectively sets the current locale, so we need to restore * the original locale after every test (ugly, from a purist unit test * point of view, but needed). * * @dataProvider set_locale_provider * @covers ::set_locale * * @param string $set locale string to be set. * @param string $ret expected results returned after setting the locale. */ public function test_set_locale(string $set, string $ret) { // Make set_locale() public.
< $loc = new \tool_langimport\locale(); < $rc = new \ReflectionClass(\tool_langimport\locale::class);
> $loc = new locale(); > $rc = new \ReflectionClass(locale::class);
$rm = $rc->getMethod('set_locale'); $rm->setAccessible(true); // Capture current locale for later restore (funnily, using the set_locale() method itself. $originallocale = $rm->invokeArgs($loc, [LC_ALL, 0]); // Assert we get the locale defined as expected. $this->assertEquals($ret, $rm->invokeArgs($loc, [LC_ALL, $set])); // We have finished, restore the original locale, so this doesn't affect other tests at distance. // (again, funnily, using the very same set_locale() method). $rm->invokeArgs($loc, [LC_ALL, $originallocale]); } /** * Data provider for test_set_locale(). * * Provides a locale to be set (as 'set') and a expected return value (as 'ret'). Note that * some of the locales are OS dependent, so only the ones matching the OS will be provided. * * We make extensive use of the en_AU.UTF-8/English_Australia.1252 locale that is mandatory to * be installed in any system running PHPUnit tests. */ public function set_locale_provider(): array { // Let's list the allowed categories by OS. $bsdallowed = ['LC_COLLATE', 'LC_CTYPE', 'LC_MESSAGES', 'LC_MONETARY', 'LC_NUMERIC', 'LC_TIME']; $winallowed = ['LC_COLLATE', 'LC_CTYPE', 'LC_MONETARY', 'LC_NUMERIC', 'LC_TIME']; $linuxallowed = [ 'LC_COLLATE', 'LC_CTYPE', 'LC_MESSAGES', 'LC_MONETARY', 'LC_NUMERIC', 'LC_TIME', 'LC_PAPER', 'LC_NAME', 'LC_ADDRESS', 'LC_TELEPHONE', 'LC_MEASUREMENT', 'LC_IDENTIFICATION' ]; // The base locale name is also OS dependent. $baselocale = get_string('locale', 'langconfig'); if (PHP_OS_FAMILY === 'Windows') { $baselocale = get_string('localewin', 'langconfig'); } // Here we'll go accumulating cases to be provided. $cases = []; // First, the simplest case, just pass a locale name, without categories. $cases['rawlocale'] = [ 'set' => $baselocale, 'ret' => $baselocale, ]; // Now, let's fill ALL LC categories, we should get back the locale name if all them are set with same value. // Note that this case is the one that, under Linux only, covers the changes performed to the set_locale() method. // Pick the correct categories depending on the OS. $oscategories = $bsdallowed; // Default to BSD/Dawrwin ones because they are the standard 6 supported by PHP. if (PHP_OS_FAMILY === 'Windows') { $oscategories = $winallowed; } else if (PHP_OS_FAMILY === 'Linux') { $oscategories = $linuxallowed; } $localestr = ''; foreach ($oscategories as $category) { // Format is different by OS too, so let build the string conditionally. if (PHP_OS_FAMILY === 'BSD' || PHP_OS_FAMILY === 'Darwin') { // BSD uses slashes (/) separated list of the 6 values in exact order. $localestr .= '/' . $baselocale; } else { // Linux/Windows use semicolon (;) separated list of category=value pairs. $localestr .= ';' . $category . '=' . $baselocale; } } $cases['allcategories'] = [ 'set' => trim($localestr, ';/'), 'ret' => $baselocale, ]; // Return all the built cases. return $cases; } }