mirrored from git://git.moodle.org/moodle.git
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MDL-69215 output: Correct use of icon_system::instance
- Loading branch information
1 parent
4a4a367
commit 6f5f08a
Showing
3 changed files
with
264 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,248 @@ | ||
<?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/>. | ||
|
||
/** | ||
* Unit tests for lib/outputcomponents.php. | ||
* | ||
* @package core | ||
* @category test | ||
* @copyright 2011 David Mudrak <david@moodle.com> | ||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | ||
*/ | ||
|
||
namespace core\output; | ||
|
||
use advanced_testcase; | ||
use coding_exception; | ||
|
||
/** | ||
* Unit tests for the `icon_system` class. | ||
* | ||
* @coversDefaultClass core\output\icon_system | ||
*/ | ||
class icon_system_test extends advanced_testcase { | ||
/** | ||
* Check whether the supplied classes are valid icon subsystems of the supplied one. | ||
* | ||
* @covers ::is_valid_system | ||
* @dataProvider is_valid_subsystem_provider | ||
* @param string $parent The class to call ::is_valid_system() on | ||
* @param string $system The class to request | ||
* @param bool $expected Whether the supplied relationship is valid | ||
*/ | ||
public function test_is_valid_subsystem(string $parent, string $system, bool $expected): void { | ||
$this->assertEquals($expected, $parent::is_valid_system($system)); | ||
} | ||
|
||
/** | ||
* Ensure that the ::instance() function throws an appropriate Exception when an inappropriate relationship is | ||
* specified. | ||
* | ||
* @covers ::instance | ||
* @dataProvider invalid_instance_provider | ||
* @param string $parent The class to call ::instance() on | ||
* @param string $system The class to request | ||
*/ | ||
public function test_invalid_instance(string $parent, string $system): void { | ||
$this->expectException(coding_exception::class); | ||
$this->expectExceptionMessage("Invalid icon system requested '{$system}'"); | ||
|
||
$parent::instance($system); | ||
} | ||
|
||
/** | ||
* Ensure that the ::instance() function returns an instance of the supplied system for a valid icon system | ||
* relationship. | ||
* | ||
* @covers ::instance | ||
* @dataProvider valid_instance_provider | ||
* @param string $parent The class to call ::instance() on | ||
* @param string $system The class to request | ||
*/ | ||
public function test_valid_instance(string $parent, string $system): void { | ||
$instance = $parent::instance($system); | ||
$this->assertInstanceOf($parent, $instance); | ||
$this->assertInstanceOf($system, $instance); | ||
} | ||
|
||
/** | ||
* Ensure that subsequent calls without arguments to ::instance() return the exact same instance. | ||
* | ||
* @covers ::instance | ||
*/ | ||
public function test_instance_singleton(): void { | ||
$singleton = icon_system::instance(); | ||
|
||
// Calling instance() again returns the same singleton. | ||
$this->assertSame($singleton, icon_system::instance()); | ||
} | ||
|
||
/** | ||
* Ensure thaat subsequent calls with an argument to ::instance() return the exact same instance. | ||
* | ||
* @covers ::instance | ||
*/ | ||
public function test_instance_singleton_named_default(): void { | ||
global $PAGE; | ||
$singleton = icon_system::instance(); | ||
|
||
$defaultsystem = $PAGE->theme->get_icon_system(); | ||
$this->assertSame($singleton, icon_system::instance($defaultsystem)); | ||
} | ||
|
||
/** | ||
* Ensure that ::instance() returns an instance of the correct icon system when requested on the core icon_system | ||
* class. | ||
* | ||
* @covers ::instance | ||
* @dataProvider valid_instance_provider | ||
* @param string $parent The class to call ::instance() on | ||
* @param string $child The class to request | ||
*/ | ||
public function test_instance_singleton_named(string $parent, string $child): void { | ||
$iconsystem = icon_system::instance($child); | ||
$this->assertInstanceOf($child, $iconsystem); | ||
} | ||
|
||
/** | ||
* Ensure that ::instance() returns an instance of the correct icon system when called on a named parent class. | ||
* | ||
* @covers ::instance | ||
* @dataProvider valid_instance_provider | ||
* @param string $parent The class to call ::instance() on | ||
* @param string $child The class to request | ||
*/ | ||
public function test_instance_singleton_named_child(string $parent, string $child): void { | ||
$iconsystem = $parent::instance($child); | ||
$this->assertInstanceOf($parent, $iconsystem); | ||
$this->assertInstanceOf($child, $iconsystem); | ||
} | ||
|
||
/** | ||
* Ensure that the ::reset_caches() function resets the stored instance such that ::instance() returns a new | ||
* instance in subsequent calls. | ||
* | ||
* @covers ::instance | ||
* @covers ::reset_caches | ||
*/ | ||
public function test_instance_singleton_reset(): void { | ||
$singleton = icon_system::instance(); | ||
|
||
// Reset the cache. | ||
icon_system::reset_caches(); | ||
|
||
// Calling instance() again returns a new singleton. | ||
$newsingleton = icon_system::instance(); | ||
$this->assertNotSame($singleton, $newsingleton); | ||
|
||
// Calling it again gets the new singleton. | ||
$this->assertSame($newsingleton, icon_system::instance()); | ||
} | ||
|
||
/** | ||
* Returns data for data providers containing: | ||
* - parent icon system | ||
* - child icon system | ||
* - whether it is a valid child | ||
* | ||
* @return array | ||
*/ | ||
public function icon_system_provider(): array { | ||
return [ | ||
'icon_system => icon_system_standard' => [ | ||
icon_system::class, | ||
icon_system_standard::class, | ||
true, | ||
], | ||
'icon_system => icon_system_fontawesome' => [ | ||
icon_system::class, | ||
icon_system_fontawesome::class, | ||
true, | ||
], | ||
'icon_system => \theme_classic\output\icon_system_fontawesome' => [ | ||
icon_system::class, | ||
\theme_classic\output\icon_system_fontawesome::class, | ||
true, | ||
], | ||
'icon_system => notification' => [ | ||
icon_system::class, | ||
notification::class, | ||
false, | ||
], | ||
|
||
'icon_system_standard => icon_system_standard' => [ | ||
icon_system_standard::class, | ||
icon_system_standard::class, | ||
true, | ||
], | ||
'icon_system_standard => icon_system_fontawesome' => [ | ||
icon_system_standard::class, | ||
icon_system_fontawesome::class, | ||
false, | ||
], | ||
'icon_system_standard => \theme_classic\output\icon_system_fontawesome' => [ | ||
icon_system_standard::class, | ||
\theme_classic\output\icon_system_fontawesome::class, | ||
false, | ||
], | ||
'icon_system_fontawesome => icon_system_standard' => [ | ||
icon_system_fontawesome::class, | ||
icon_system_standard::class, | ||
false, | ||
], | ||
]; | ||
} | ||
|
||
/** | ||
* Data provider for tests of `is_valid`. | ||
* | ||
* @return array | ||
*/ | ||
public function is_valid_subsystem_provider(): array { | ||
return $this->icon_system_provider(); | ||
} | ||
|
||
/** | ||
* Data provider for tests of `instance` containing only invalid tests. | ||
* | ||
* @return array | ||
*/ | ||
public function invalid_instance_provider(): array { | ||
return array_filter( | ||
$this->icon_system_provider(), | ||
function($data) { | ||
return !$data[2]; | ||
}, | ||
ARRAY_FILTER_USE_BOTH | ||
); | ||
} | ||
|
||
/** | ||
* Data provider for tests of `instance` containing only valid tests. | ||
* | ||
* @return array | ||
*/ | ||
public function valid_instance_provider(): array { | ||
return array_filter( | ||
$this->icon_system_provider(), | ||
function($data) { | ||
return $data[2]; | ||
}, | ||
ARRAY_FILTER_USE_BOTH | ||
); | ||
} | ||
|
||
} |