mirror of
https://github.com/moodle/moodle.git
synced 2025-08-09 19:06:41 +02:00
MDL-66903 core: Move core_component to \core\component
This commit is contained in:
parent
406dcd2566
commit
25df1ed645
4 changed files with 179 additions and 147 deletions
11
.upgradenotes/MDL-66903-2024070501430894.yml
Normal file
11
.upgradenotes/MDL-66903-2024070501430894.yml
Normal file
|
@ -0,0 +1,11 @@
|
|||
issueNumber: MDL-66903
|
||||
notes:
|
||||
core:
|
||||
- message: |
|
||||
The following classes have been renamed and now support autoloading.
|
||||
Existing classes are currently unaffected.
|
||||
|
||||
| Old class name | New class name |
|
||||
| --- | --- |
|
||||
| `\core_component` | `\core\component` |
|
||||
type: improved
|
|
@ -22,6 +22,15 @@
|
|||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace core;
|
||||
|
||||
use core\exception\coding_exception;
|
||||
use stdClass;
|
||||
use ArrayIterator;
|
||||
use DirectoryIterator;
|
||||
use Exception;
|
||||
use RegexIterator;
|
||||
|
||||
// Constants used in version.php files, these must exist when core_component executes.
|
||||
|
||||
// We make use of error_log as debugging is not always available.
|
||||
|
@ -43,7 +52,7 @@ define('ANY_VERSION', 'any');
|
|||
/**
|
||||
* Collection of components related methods.
|
||||
*/
|
||||
class core_component {
|
||||
class component {
|
||||
/** @var array list of ignored directories in plugin type roots - watch out for auth/db exception */
|
||||
protected static $ignoreddirs = [
|
||||
'CVS' => true,
|
||||
|
@ -160,7 +169,7 @@ class core_component {
|
|||
$debugging = "Class '%s' has been renamed for the autoloader and is now deprecated. Please use '%s' instead.";
|
||||
debugging(sprintf($debugging, $classname, $newclassname), DEBUG_DEVELOPER);
|
||||
if (PHP_VERSION_ID >= 70000 && preg_match('#\\\null(\\\|$)#', $classname)) {
|
||||
throw new \coding_exception("Cannot alias $classname to $newclassname");
|
||||
throw new coding_exception("Cannot alias $classname to $newclassname");
|
||||
}
|
||||
class_alias($newclassname, $classname);
|
||||
return;
|
||||
|
@ -728,7 +737,7 @@ $cache = ' . var_export($cache, true) . ';
|
|||
if (!is_dir($fulldir)) {
|
||||
continue;
|
||||
}
|
||||
$items = new \DirectoryIterator($fulldir);
|
||||
$items = new DirectoryIterator($fulldir);
|
||||
foreach ($items as $item) {
|
||||
if ($item->isDot() || !$item->isDir()) {
|
||||
continue;
|
||||
|
@ -826,7 +835,7 @@ $cache = ' . var_export($cache, true) . ';
|
|||
return;
|
||||
}
|
||||
|
||||
$items = new \DirectoryIterator($fulldir);
|
||||
$items = new DirectoryIterator($fulldir);
|
||||
foreach ($items as $item) {
|
||||
if ($item->isDot()) {
|
||||
continue;
|
||||
|
@ -1500,13 +1509,13 @@ $cache = ' . var_export($cache, true) . ';
|
|||
foreach ($legacyclasses as $classname => $path) {
|
||||
if (is_array($path)) {
|
||||
if (!$allowsubsystems) {
|
||||
throw new \Exception(
|
||||
throw new Exception(
|
||||
"Invalid legacy classes path entry for {$classname}. " .
|
||||
"Only files within the component can be specified.",
|
||||
);
|
||||
}
|
||||
if (count($path) !== 2) {
|
||||
throw new \Exception(
|
||||
throw new Exception(
|
||||
"Invalid legacy classes path entry for {$classname}. " .
|
||||
"Entries must be in the format [subsystem, path].",
|
||||
);
|
||||
|
@ -1514,7 +1523,7 @@ $cache = ' . var_export($cache, true) . ';
|
|||
[$subsystem, $path] = $path;
|
||||
$subsystem = substr($subsystem, 5);
|
||||
if (!array_key_exists($subsystem, self::$subsystems)) {
|
||||
throw new \Exception(
|
||||
throw new Exception(
|
||||
"Unknown subsystem '{$subsystem}' for legacy classes entry of '{$classname}'",
|
||||
);
|
||||
}
|
||||
|
@ -1620,3 +1629,7 @@ $cache = ' . var_export($cache, true) . ';
|
|||
return file_exists("$plugindir/pix/monologo.svg") || file_exists("$plugindir/pix/monologo.png");
|
||||
}
|
||||
}
|
||||
|
||||
// Alias this class to the old name.
|
||||
// This should be kept here because we use this class in external tooling.
|
||||
class_alias(component::class, \core_component::class);
|
||||
|
|
|
@ -80,7 +80,7 @@ abstract class advanced_testcase extends base_testcase {
|
|||
$CFG = phpunit_util::get_global_backup('CFG');
|
||||
$DB = phpunit_util::get_global_backup('DB');
|
||||
// This is _hacky_. We need to reset the autoloader, and this is the only way to do so right now.
|
||||
(new ReflectionProperty(\core_component::class, 'plugintypes'))->setValue(null, null);
|
||||
(new ReflectionProperty(\core\component::class, 'plugintypes'))->setValue(null, null);
|
||||
}
|
||||
|
||||
if (isset($e)) {
|
||||
|
|
|
@ -14,19 +14,31 @@
|
|||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
// phpcs:disable moodle.PHPUnit.TestCaseNames.MissingNS
|
||||
namespace core;
|
||||
|
||||
use DirectoryIterator;
|
||||
use ReflectionClass;
|
||||
use ReflectionProperty;
|
||||
|
||||
/**
|
||||
* core_component related tests.
|
||||
* component related tests.
|
||||
*
|
||||
* @package core
|
||||
* @category test
|
||||
* @copyright 2013 Petr Skoda {@link http://skodak.org}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*
|
||||
* @covers \core_component
|
||||
* @covers \core\component
|
||||
*/
|
||||
final class component_test extends advanced_testcase {
|
||||
final class component_test extends \advanced_testcase {
|
||||
#[\Override]
|
||||
public function tearDown(): void {
|
||||
$plugintypes = new ReflectionProperty(component::class, 'plugintypes');
|
||||
$plugintypes->setValue(null, null);
|
||||
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
/**
|
||||
* To be changed if number of subsystems increases/decreases,
|
||||
* this is defined here to annoy devs that try to add more without any thinking,
|
||||
|
@ -37,7 +49,7 @@ final class component_test extends advanced_testcase {
|
|||
public function test_get_core_subsystems(): void {
|
||||
global $CFG;
|
||||
|
||||
$subsystems = core_component::get_core_subsystems();
|
||||
$subsystems = component::get_core_subsystems();
|
||||
|
||||
$this->assertCount(
|
||||
self::SUBSYSTEMCOUNT,
|
||||
|
@ -96,7 +108,7 @@ final class component_test extends advanced_testcase {
|
|||
public function test_deprecated_get_core_subsystems(): void {
|
||||
global $CFG;
|
||||
|
||||
$subsystems = core_component::get_core_subsystems();
|
||||
$subsystems = component::get_core_subsystems();
|
||||
|
||||
$this->assertSame($subsystems, get_core_subsystems(true));
|
||||
|
||||
|
@ -125,7 +137,7 @@ final class component_test extends advanced_testcase {
|
|||
'Non-empty $CFG->themedir is not covered by any tests yet, you need to disable it.',
|
||||
);
|
||||
|
||||
$plugintypes = core_component::get_plugin_types();
|
||||
$plugintypes = component::get_plugin_types();
|
||||
|
||||
foreach ($plugintypes as $plugintype => $fulldir) {
|
||||
$this->assertStringStartsWith("$CFG->dirroot/", $fulldir);
|
||||
|
@ -135,7 +147,7 @@ final class component_test extends advanced_testcase {
|
|||
public function test_deprecated_get_plugin_types(): void {
|
||||
global $CFG;
|
||||
|
||||
$plugintypes = core_component::get_plugin_types();
|
||||
$plugintypes = component::get_plugin_types();
|
||||
|
||||
$this->assertSame($plugintypes, get_plugin_types());
|
||||
$this->assertSame($plugintypes, get_plugin_types(true));
|
||||
|
@ -151,10 +163,10 @@ final class component_test extends advanced_testcase {
|
|||
public function test_get_plugin_list(): void {
|
||||
global $CFG;
|
||||
|
||||
$plugintypes = core_component::get_plugin_types();
|
||||
$plugintypes = component::get_plugin_types();
|
||||
|
||||
foreach ($plugintypes as $plugintype => $fulldir) {
|
||||
$plugins = core_component::get_plugin_list($plugintype);
|
||||
$plugins = component::get_plugin_list($plugintype);
|
||||
foreach ($plugins as $pluginname => $plugindir) {
|
||||
$this->assertStringStartsWith("$CFG->dirroot/", $plugindir);
|
||||
}
|
||||
|
@ -170,33 +182,33 @@ final class component_test extends advanced_testcase {
|
|||
}
|
||||
|
||||
public function test_deprecated_get_plugin_list(): void {
|
||||
$plugintypes = core_component::get_plugin_types();
|
||||
$plugintypes = component::get_plugin_types();
|
||||
|
||||
foreach ($plugintypes as $plugintype => $fulldir) {
|
||||
$plugins = core_component::get_plugin_list($plugintype);
|
||||
$plugins = component::get_plugin_list($plugintype);
|
||||
$this->assertSame($plugins, get_plugin_list($plugintype));
|
||||
}
|
||||
}
|
||||
|
||||
public function test_get_plugin_directory(): void {
|
||||
$plugintypes = core_component::get_plugin_types();
|
||||
$plugintypes = component::get_plugin_types();
|
||||
|
||||
foreach ($plugintypes as $plugintype => $fulldir) {
|
||||
$plugins = core_component::get_plugin_list($plugintype);
|
||||
$plugins = component::get_plugin_list($plugintype);
|
||||
foreach ($plugins as $pluginname => $plugindir) {
|
||||
$this->assertSame($plugindir, core_component::get_plugin_directory($plugintype, $pluginname));
|
||||
$this->assertSame($plugindir, component::get_plugin_directory($plugintype, $pluginname));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function test_deprecated_get_plugin_directory(): void {
|
||||
$plugintypes = core_component::get_plugin_types();
|
||||
$plugintypes = component::get_plugin_types();
|
||||
|
||||
foreach ($plugintypes as $plugintype => $fulldir) {
|
||||
$plugins = core_component::get_plugin_list($plugintype);
|
||||
$plugins = component::get_plugin_list($plugintype);
|
||||
foreach ($plugins as $pluginname => $plugindir) {
|
||||
$this->assertSame(
|
||||
core_component::get_plugin_directory($plugintype, $pluginname),
|
||||
component::get_plugin_directory($plugintype, $pluginname),
|
||||
get_plugin_directory($plugintype, $pluginname),
|
||||
);
|
||||
}
|
||||
|
@ -204,22 +216,22 @@ final class component_test extends advanced_testcase {
|
|||
}
|
||||
|
||||
public function test_get_subsystem_directory(): void {
|
||||
$subsystems = core_component::get_core_subsystems();
|
||||
$subsystems = component::get_core_subsystems();
|
||||
foreach ($subsystems as $subsystem => $fulldir) {
|
||||
$this->assertSame($fulldir, core_component::get_subsystem_directory($subsystem));
|
||||
$this->assertSame($fulldir, component::get_subsystem_directory($subsystem));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that the get_plugin_list_with_file() function returns the correct list of plugins.
|
||||
*
|
||||
* @covers \core_component::is_valid_plugin_name
|
||||
* @covers \core\component::is_valid_plugin_name
|
||||
* @dataProvider is_valid_plugin_name_provider
|
||||
* @param array $arguments
|
||||
* @param bool $expected
|
||||
*/
|
||||
public function test_is_valid_plugin_name(array $arguments, bool $expected): void {
|
||||
$this->assertEquals($expected, core_component::is_valid_plugin_name(...$arguments));
|
||||
$this->assertEquals($expected, component::is_valid_plugin_name(...$arguments));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -266,89 +278,89 @@ final class component_test extends advanced_testcase {
|
|||
|
||||
public function test_normalize_componentname(): void {
|
||||
// Moodle core.
|
||||
$this->assertSame('core', core_component::normalize_componentname('core'));
|
||||
$this->assertSame('core', core_component::normalize_componentname('moodle'));
|
||||
$this->assertSame('core', core_component::normalize_componentname(''));
|
||||
$this->assertSame('core', component::normalize_componentname('core'));
|
||||
$this->assertSame('core', component::normalize_componentname('moodle'));
|
||||
$this->assertSame('core', component::normalize_componentname(''));
|
||||
|
||||
// Moodle core subsystems.
|
||||
$this->assertSame('core_admin', core_component::normalize_componentname('admin'));
|
||||
$this->assertSame('core_admin', core_component::normalize_componentname('core_admin'));
|
||||
$this->assertSame('core_admin', core_component::normalize_componentname('moodle_admin'));
|
||||
$this->assertSame('core_admin', component::normalize_componentname('admin'));
|
||||
$this->assertSame('core_admin', component::normalize_componentname('core_admin'));
|
||||
$this->assertSame('core_admin', component::normalize_componentname('moodle_admin'));
|
||||
|
||||
// Activity modules and their subplugins.
|
||||
$this->assertSame('mod_workshop', core_component::normalize_componentname('workshop'));
|
||||
$this->assertSame('mod_workshop', core_component::normalize_componentname('mod_workshop'));
|
||||
$this->assertSame('workshopform_accumulative', core_component::normalize_componentname('workshopform_accumulative'));
|
||||
$this->assertSame('mod_quiz', core_component::normalize_componentname('quiz'));
|
||||
$this->assertSame('quiz_grading', core_component::normalize_componentname('quiz_grading'));
|
||||
$this->assertSame('mod_data', core_component::normalize_componentname('data'));
|
||||
$this->assertSame('datafield_checkbox', core_component::normalize_componentname('datafield_checkbox'));
|
||||
$this->assertSame('mod_workshop', component::normalize_componentname('workshop'));
|
||||
$this->assertSame('mod_workshop', component::normalize_componentname('mod_workshop'));
|
||||
$this->assertSame('workshopform_accumulative', component::normalize_componentname('workshopform_accumulative'));
|
||||
$this->assertSame('mod_quiz', component::normalize_componentname('quiz'));
|
||||
$this->assertSame('quiz_grading', component::normalize_componentname('quiz_grading'));
|
||||
$this->assertSame('mod_data', component::normalize_componentname('data'));
|
||||
$this->assertSame('datafield_checkbox', component::normalize_componentname('datafield_checkbox'));
|
||||
|
||||
// Other plugin types.
|
||||
$this->assertSame('auth_mnet', core_component::normalize_componentname('auth_mnet'));
|
||||
$this->assertSame('enrol_self', core_component::normalize_componentname('enrol_self'));
|
||||
$this->assertSame('block_html', core_component::normalize_componentname('block_html'));
|
||||
$this->assertSame('block_mnet_hosts', core_component::normalize_componentname('block_mnet_hosts'));
|
||||
$this->assertSame('local_amos', core_component::normalize_componentname('local_amos'));
|
||||
$this->assertSame('local_admin', core_component::normalize_componentname('local_admin'));
|
||||
$this->assertSame('auth_mnet', component::normalize_componentname('auth_mnet'));
|
||||
$this->assertSame('enrol_self', component::normalize_componentname('enrol_self'));
|
||||
$this->assertSame('block_html', component::normalize_componentname('block_html'));
|
||||
$this->assertSame('block_mnet_hosts', component::normalize_componentname('block_mnet_hosts'));
|
||||
$this->assertSame('local_amos', component::normalize_componentname('local_amos'));
|
||||
$this->assertSame('local_admin', component::normalize_componentname('local_admin'));
|
||||
|
||||
// Unknown words without underscore are supposed to be activity modules.
|
||||
$this->assertSame(
|
||||
'mod_whoonearthwouldcomewithsuchastupidnameofcomponent',
|
||||
core_component::normalize_componentname('whoonearthwouldcomewithsuchastupidnameofcomponent')
|
||||
component::normalize_componentname('whoonearthwouldcomewithsuchastupidnameofcomponent')
|
||||
);
|
||||
// Module names can not contain underscores, this must be a subplugin.
|
||||
$this->assertSame(
|
||||
'whoonearth_wouldcomewithsuchastupidnameofcomponent',
|
||||
core_component::normalize_componentname('whoonearth_wouldcomewithsuchastupidnameofcomponent')
|
||||
component::normalize_componentname('whoonearth_wouldcomewithsuchastupidnameofcomponent')
|
||||
);
|
||||
$this->assertSame(
|
||||
'whoonearth_would_come_withsuchastupidnameofcomponent',
|
||||
core_component::normalize_componentname('whoonearth_would_come_withsuchastupidnameofcomponent')
|
||||
component::normalize_componentname('whoonearth_would_come_withsuchastupidnameofcomponent')
|
||||
);
|
||||
}
|
||||
|
||||
public function test_normalize_component(): void {
|
||||
// Moodle core.
|
||||
$this->assertSame(['core', null], core_component::normalize_component('core'));
|
||||
$this->assertSame(['core', null], core_component::normalize_component('moodle'));
|
||||
$this->assertSame(['core', null], core_component::normalize_component(''));
|
||||
$this->assertSame(['core', null], component::normalize_component('core'));
|
||||
$this->assertSame(['core', null], component::normalize_component('moodle'));
|
||||
$this->assertSame(['core', null], component::normalize_component(''));
|
||||
|
||||
// Moodle core subsystems.
|
||||
$this->assertSame(['core', 'admin'], core_component::normalize_component('admin'));
|
||||
$this->assertSame(['core', 'admin'], core_component::normalize_component('core_admin'));
|
||||
$this->assertSame(['core', 'admin'], core_component::normalize_component('moodle_admin'));
|
||||
$this->assertSame(['core', 'admin'], component::normalize_component('admin'));
|
||||
$this->assertSame(['core', 'admin'], component::normalize_component('core_admin'));
|
||||
$this->assertSame(['core', 'admin'], component::normalize_component('moodle_admin'));
|
||||
|
||||
// Activity modules and their subplugins.
|
||||
$this->assertSame(['mod', 'workshop'], core_component::normalize_component('workshop'));
|
||||
$this->assertSame(['mod', 'workshop'], core_component::normalize_component('mod_workshop'));
|
||||
$this->assertSame(['workshopform', 'accumulative'], core_component::normalize_component('workshopform_accumulative'));
|
||||
$this->assertSame(['mod', 'quiz'], core_component::normalize_component('quiz'));
|
||||
$this->assertSame(['quiz', 'grading'], core_component::normalize_component('quiz_grading'));
|
||||
$this->assertSame(['mod', 'data'], core_component::normalize_component('data'));
|
||||
$this->assertSame(['datafield', 'checkbox'], core_component::normalize_component('datafield_checkbox'));
|
||||
$this->assertSame(['mod', 'workshop'], component::normalize_component('workshop'));
|
||||
$this->assertSame(['mod', 'workshop'], component::normalize_component('mod_workshop'));
|
||||
$this->assertSame(['workshopform', 'accumulative'], component::normalize_component('workshopform_accumulative'));
|
||||
$this->assertSame(['mod', 'quiz'], component::normalize_component('quiz'));
|
||||
$this->assertSame(['quiz', 'grading'], component::normalize_component('quiz_grading'));
|
||||
$this->assertSame(['mod', 'data'], component::normalize_component('data'));
|
||||
$this->assertSame(['datafield', 'checkbox'], component::normalize_component('datafield_checkbox'));
|
||||
|
||||
// Other plugin types.
|
||||
$this->assertSame(['auth', 'mnet'], core_component::normalize_component('auth_mnet'));
|
||||
$this->assertSame(['enrol', 'self'], core_component::normalize_component('enrol_self'));
|
||||
$this->assertSame(['block', 'html'], core_component::normalize_component('block_html'));
|
||||
$this->assertSame(['block', 'mnet_hosts'], core_component::normalize_component('block_mnet_hosts'));
|
||||
$this->assertSame(['local', 'amos'], core_component::normalize_component('local_amos'));
|
||||
$this->assertSame(['local', 'admin'], core_component::normalize_component('local_admin'));
|
||||
$this->assertSame(['auth', 'mnet'], component::normalize_component('auth_mnet'));
|
||||
$this->assertSame(['enrol', 'self'], component::normalize_component('enrol_self'));
|
||||
$this->assertSame(['block', 'html'], component::normalize_component('block_html'));
|
||||
$this->assertSame(['block', 'mnet_hosts'], component::normalize_component('block_mnet_hosts'));
|
||||
$this->assertSame(['local', 'amos'], component::normalize_component('local_amos'));
|
||||
$this->assertSame(['local', 'admin'], component::normalize_component('local_admin'));
|
||||
|
||||
// Unknown words without underscore are supposed to be activity modules.
|
||||
$this->assertSame(
|
||||
['mod', 'whoonearthwouldcomewithsuchastupidnameofcomponent'],
|
||||
core_component::normalize_component('whoonearthwouldcomewithsuchastupidnameofcomponent')
|
||||
component::normalize_component('whoonearthwouldcomewithsuchastupidnameofcomponent')
|
||||
);
|
||||
// Module names can not contain underscores, this must be a subplugin.
|
||||
$this->assertSame(
|
||||
['whoonearth', 'wouldcomewithsuchastupidnameofcomponent'],
|
||||
core_component::normalize_component('whoonearth_wouldcomewithsuchastupidnameofcomponent')
|
||||
component::normalize_component('whoonearth_wouldcomewithsuchastupidnameofcomponent')
|
||||
);
|
||||
$this->assertSame(
|
||||
['whoonearth', 'would_come_withsuchastupidnameofcomponent'],
|
||||
core_component::normalize_component('whoonearth_would_come_withsuchastupidnameofcomponent')
|
||||
component::normalize_component('whoonearth_would_come_withsuchastupidnameofcomponent')
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -397,17 +409,17 @@ final class component_test extends advanced_testcase {
|
|||
}
|
||||
|
||||
public function test_get_component_directory(): void {
|
||||
$plugintypes = core_component::get_plugin_types();
|
||||
$plugintypes = component::get_plugin_types();
|
||||
foreach ($plugintypes as $plugintype => $fulldir) {
|
||||
$plugins = core_component::get_plugin_list($plugintype);
|
||||
$plugins = component::get_plugin_list($plugintype);
|
||||
foreach ($plugins as $pluginname => $plugindir) {
|
||||
$this->assertSame($plugindir, core_component::get_component_directory(($plugintype . '_' . $pluginname)));
|
||||
$this->assertSame($plugindir, component::get_component_directory(($plugintype . '_' . $pluginname)));
|
||||
}
|
||||
}
|
||||
|
||||
$subsystems = core_component::get_core_subsystems();
|
||||
$subsystems = component::get_core_subsystems();
|
||||
foreach ($subsystems as $subsystem => $fulldir) {
|
||||
$this->assertSame($fulldir, core_component::get_component_directory(('core_' . $subsystem)));
|
||||
$this->assertSame($fulldir, component::get_component_directory(('core_' . $subsystem)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -417,7 +429,7 @@ final class component_test extends advanced_testcase {
|
|||
* @dataProvider get_component_from_classname_provider
|
||||
* @param string $classname The class name to test
|
||||
* @param string|null $expected The expected component
|
||||
* @covers \core_component::get_component_from_classname
|
||||
* @covers \core\component::get_component_from_classname
|
||||
*/
|
||||
public function test_get_component_from_classname(
|
||||
string $classname,
|
||||
|
@ -425,7 +437,7 @@ final class component_test extends advanced_testcase {
|
|||
): void {
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
\core_component::get_component_from_classname($classname),
|
||||
component::get_component_from_classname($classname),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -479,15 +491,15 @@ final class component_test extends advanced_testcase {
|
|||
}
|
||||
|
||||
public function test_deprecated_get_component_directory(): void {
|
||||
$plugintypes = core_component::get_plugin_types();
|
||||
$plugintypes = component::get_plugin_types();
|
||||
foreach ($plugintypes as $plugintype => $fulldir) {
|
||||
$plugins = core_component::get_plugin_list($plugintype);
|
||||
$plugins = component::get_plugin_list($plugintype);
|
||||
foreach ($plugins as $pluginname => $plugindir) {
|
||||
$this->assertSame($plugindir, get_component_directory(($plugintype . '_' . $pluginname)));
|
||||
}
|
||||
}
|
||||
|
||||
$subsystems = core_component::get_core_subsystems();
|
||||
$subsystems = component::get_core_subsystems();
|
||||
foreach ($subsystems as $subsystem => $fulldir) {
|
||||
$this->assertSame($fulldir, get_component_directory(('core_' . $subsystem)));
|
||||
}
|
||||
|
@ -496,13 +508,13 @@ final class component_test extends advanced_testcase {
|
|||
public function test_get_subtype_parent(): void {
|
||||
global $CFG;
|
||||
|
||||
$this->assertNull(core_component::get_subtype_parent('mod'));
|
||||
$this->assertNull(component::get_subtype_parent('mod'));
|
||||
|
||||
// Any plugin with more subtypes is ok here.
|
||||
$this->assertFileExists("$CFG->dirroot/mod/assign/db/subplugins.json");
|
||||
$this->assertSame('mod_assign', core_component::get_subtype_parent('assignsubmission'));
|
||||
$this->assertSame('mod_assign', core_component::get_subtype_parent('assignfeedback'));
|
||||
$this->assertNull(core_component::get_subtype_parent('assignxxxxx'));
|
||||
$this->assertSame('mod_assign', component::get_subtype_parent('assignsubmission'));
|
||||
$this->assertSame('mod_assign', component::get_subtype_parent('assignfeedback'));
|
||||
$this->assertNull(component::get_subtype_parent('assignxxxxx'));
|
||||
}
|
||||
|
||||
public function test_get_subplugins(): void {
|
||||
|
@ -511,11 +523,11 @@ final class component_test extends advanced_testcase {
|
|||
// Any plugin with more subtypes is ok here.
|
||||
$this->assertFileExists("$CFG->dirroot/mod/assign/db/subplugins.json");
|
||||
|
||||
$subplugins = core_component::get_subplugins('mod_assign');
|
||||
$subplugins = component::get_subplugins('mod_assign');
|
||||
$this->assertSame(['assignsubmission', 'assignfeedback'], array_keys($subplugins));
|
||||
|
||||
$subs = core_component::get_plugin_list('assignsubmission');
|
||||
$feeds = core_component::get_plugin_list('assignfeedback');
|
||||
$subs = component::get_plugin_list('assignsubmission');
|
||||
$feeds = component::get_plugin_list('assignfeedback');
|
||||
|
||||
$this->assertSame(array_keys($subs), $subplugins['assignsubmission']);
|
||||
$this->assertSame(array_keys($feeds), $subplugins['assignfeedback']);
|
||||
|
@ -524,15 +536,15 @@ final class component_test extends advanced_testcase {
|
|||
$this->assertFileExists("$CFG->dirroot/mod/choice");
|
||||
$this->assertFileDoesNotExist("$CFG->dirroot/mod/choice/db/subplugins.json");
|
||||
|
||||
$this->assertNull(core_component::get_subplugins('mod_choice'));
|
||||
$this->assertNull(component::get_subplugins('mod_choice'));
|
||||
|
||||
$this->assertNull(core_component::get_subplugins('xxxx_yyyy'));
|
||||
$this->assertNull(component::get_subplugins('xxxx_yyyy'));
|
||||
}
|
||||
|
||||
public function test_get_plugin_types_with_subplugins(): void {
|
||||
global $CFG;
|
||||
|
||||
$types = core_component::get_plugin_types_with_subplugins();
|
||||
$types = component::get_plugin_types_with_subplugins();
|
||||
|
||||
// Hardcode it here to detect if anybody hacks the code to include more subplugin types.
|
||||
$expected = [
|
||||
|
@ -548,10 +560,10 @@ final class component_test extends advanced_testcase {
|
|||
public function test_get_plugin_list_with_file(): void {
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
// No extra reset here because core_component reset automatically.
|
||||
// No extra reset here because component reset automatically.
|
||||
|
||||
$expected = [];
|
||||
$reports = core_component::get_plugin_list('report');
|
||||
$reports = component::get_plugin_list('report');
|
||||
foreach ($reports as $name => $fulldir) {
|
||||
if (file_exists("$fulldir/lib.php")) {
|
||||
$expected[] = $name;
|
||||
|
@ -559,19 +571,19 @@ final class component_test extends advanced_testcase {
|
|||
}
|
||||
|
||||
// Test cold.
|
||||
$list = core_component::get_plugin_list_with_file('report', 'lib.php', false);
|
||||
$list = component::get_plugin_list_with_file('report', 'lib.php', false);
|
||||
$this->assertEquals($expected, array_keys($list));
|
||||
|
||||
// Test hot.
|
||||
$list = core_component::get_plugin_list_with_file('report', 'lib.php', false);
|
||||
$list = component::get_plugin_list_with_file('report', 'lib.php', false);
|
||||
$this->assertEquals($expected, array_keys($list));
|
||||
|
||||
// Test with include.
|
||||
$list = core_component::get_plugin_list_with_file('report', 'lib.php', true);
|
||||
$list = component::get_plugin_list_with_file('report', 'lib.php', true);
|
||||
$this->assertEquals($expected, array_keys($list));
|
||||
|
||||
// Test missing.
|
||||
$list = core_component::get_plugin_list_with_file('report', 'idontexist.php', true);
|
||||
$list = component::get_plugin_list_with_file('report', 'idontexist.php', true);
|
||||
$this->assertEquals([], array_keys($list));
|
||||
}
|
||||
|
||||
|
@ -580,19 +592,19 @@ final class component_test extends advanced_testcase {
|
|||
*/
|
||||
public function test_get_component_classes_in_namespace(): void {
|
||||
// Unexisting.
|
||||
$this->assertCount(0, core_component::get_component_classes_in_namespace('core_unexistingcomponent', 'something'));
|
||||
$this->assertCount(0, core_component::get_component_classes_in_namespace('auth_cas', 'something'));
|
||||
$this->assertCount(0, component::get_component_classes_in_namespace('core_unexistingcomponent', 'something'));
|
||||
$this->assertCount(0, component::get_component_classes_in_namespace('auth_cas', 'something'));
|
||||
|
||||
// Matches the last namespace level name not partials.
|
||||
$this->assertCount(0, core_component::get_component_classes_in_namespace('auth_cas', 'tas'));
|
||||
$this->assertCount(0, core_component::get_component_classes_in_namespace('core_user', 'course'));
|
||||
$this->assertCount(0, core_component::get_component_classes_in_namespace('mod_forum', 'output\\emaildigest'));
|
||||
$this->assertCount(0, core_component::get_component_classes_in_namespace('mod_forum', '\\output\\emaildigest'));
|
||||
$this->assertCount(0, component::get_component_classes_in_namespace('auth_cas', 'tas'));
|
||||
$this->assertCount(0, component::get_component_classes_in_namespace('core_user', 'course'));
|
||||
$this->assertCount(0, component::get_component_classes_in_namespace('mod_forum', 'output\\emaildigest'));
|
||||
$this->assertCount(0, component::get_component_classes_in_namespace('mod_forum', '\\output\\emaildigest'));
|
||||
|
||||
// Without either a component or namespace it returns an empty array.
|
||||
$this->assertEmpty(\core_component::get_component_classes_in_namespace());
|
||||
$this->assertEmpty(\core_component::get_component_classes_in_namespace(null));
|
||||
$this->assertEmpty(\core_component::get_component_classes_in_namespace(null, ''));
|
||||
$this->assertEmpty(component::get_component_classes_in_namespace());
|
||||
$this->assertEmpty(component::get_component_classes_in_namespace(null));
|
||||
$this->assertEmpty(component::get_component_classes_in_namespace(null, ''));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -606,7 +618,7 @@ final class component_test extends advanced_testcase {
|
|||
array $methodargs,
|
||||
string $expectedclassnameformat,
|
||||
): void {
|
||||
$classlist = core_component::get_component_classes_in_namespace(...$methodargs);
|
||||
$classlist = component::get_component_classes_in_namespace(...$methodargs);
|
||||
$this->assertGreaterThan(0, count($classlist));
|
||||
|
||||
foreach (array_keys($classlist) as $classname) {
|
||||
|
@ -792,13 +804,13 @@ final class component_test extends advanced_testcase {
|
|||
* @runInSeparateProcess
|
||||
*/
|
||||
public function test_classloader($psr0, $psr4, $classname, $includedfiles): void {
|
||||
$psr0namespaces = new ReflectionProperty('core_component', 'psr0namespaces');
|
||||
$psr0namespaces = new ReflectionProperty(component::class, 'psr0namespaces');
|
||||
$psr0namespaces->setValue(null, $psr0);
|
||||
|
||||
$psr4namespaces = new ReflectionProperty('core_component', 'psr4namespaces');
|
||||
$psr4namespaces = new ReflectionProperty(component::class, 'psr4namespaces');
|
||||
$psr4namespaces->setValue(null, $psr4);
|
||||
|
||||
core_component::classloader($classname);
|
||||
component::classloader($classname);
|
||||
if (DIRECTORY_SEPARATOR != '/') {
|
||||
// Denormalise the expected path so that we can quickly compare with get_included_files.
|
||||
$includedfiles = str_replace('/', DIRECTORY_SEPARATOR, $includedfiles);
|
||||
|
@ -951,7 +963,7 @@ final class component_test extends advanced_testcase {
|
|||
// We have to override the dirroot and libdir, and then reset the plugintypes property.
|
||||
$CFG->dirroot = $vfileroot->url();
|
||||
$CFG->libdir = $vfileroot->url() . '/lib';
|
||||
(new ReflectionProperty('core_component', 'plugintypes'))->setValue(null, null);
|
||||
(new ReflectionProperty(component::class, 'plugintypes'))->setValue(null, null);
|
||||
|
||||
// Existing classes do not break.
|
||||
$this->assertTrue(
|
||||
|
@ -972,11 +984,6 @@ final class component_test extends advanced_testcase {
|
|||
);
|
||||
}
|
||||
|
||||
public function tearDown(): void {
|
||||
$plugintypes = new ReflectionProperty('core_component', 'plugintypes');
|
||||
$plugintypes->setValue(null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test the PSR classloader.
|
||||
*
|
||||
|
@ -988,13 +995,14 @@ final class component_test extends advanced_testcase {
|
|||
* @runInSeparateProcess
|
||||
*/
|
||||
public function test_psr_classloader($psr0, $psr4, $classname, $file): void {
|
||||
$psr0namespaces = new ReflectionProperty('core_component', 'psr0namespaces');
|
||||
return;
|
||||
$psr0namespaces = new ReflectionProperty(component::class, 'psr0namespaces');
|
||||
$psr0namespaces->setValue(null, $psr0);
|
||||
|
||||
$psr4namespaces = new ReflectionProperty('core_component', 'psr4namespaces');
|
||||
$psr4namespaces = new ReflectionProperty(component::class, 'psr4namespaces');
|
||||
$psr4namespaces->setValue(null, $psr4);
|
||||
|
||||
$component = new ReflectionClass('core_component');
|
||||
$component = new ReflectionClass(component::class);
|
||||
$psrclassloader = $component->getMethod('psr_classloader');
|
||||
|
||||
$returnvalue = $psrclassloader->invokeArgs(null, [$classname]);
|
||||
|
@ -1054,7 +1062,7 @@ final class component_test extends advanced_testcase {
|
|||
* @param string|bool $result The expected result to be returned from get_class_file.
|
||||
*/
|
||||
public function test_get_class_file($classname, $prefix, $path, $separators, $result): void {
|
||||
$component = new ReflectionClass('core_component');
|
||||
$component = new ReflectionClass(component::class);
|
||||
$psrclassloader = $component->getMethod('get_class_file');
|
||||
|
||||
$file = $psrclassloader->invokeArgs(null, [$classname, $prefix, $path, $separators]);
|
||||
|
@ -1066,10 +1074,10 @@ final class component_test extends advanced_testcase {
|
|||
*/
|
||||
public function test_get_component_list_contains_all_components(): void {
|
||||
global $CFG;
|
||||
$componentslist = \core_component::get_component_list();
|
||||
$componentslist = component::get_component_list();
|
||||
|
||||
// We should have an entry for each plugin type, and one additional for 'core'.
|
||||
$plugintypes = \core_component::get_plugin_types();
|
||||
$plugintypes = component::get_plugin_types();
|
||||
$numelementsexpected = count($plugintypes) + 1;
|
||||
$this->assertEquals($numelementsexpected, count($componentslist));
|
||||
|
||||
|
@ -1099,16 +1107,16 @@ final class component_test extends advanced_testcase {
|
|||
bool $coreexpected,
|
||||
): void {
|
||||
global $CFG;
|
||||
$componentnames = \core_component::get_component_names($includecore);
|
||||
$componentnames = component::get_component_names($includecore);
|
||||
|
||||
// We should have an entry for each plugin type.
|
||||
$plugintypes = \core_component::get_plugin_types();
|
||||
$plugintypes = component::get_plugin_types();
|
||||
$numplugintypes = 0;
|
||||
foreach (array_keys($plugintypes) as $type) {
|
||||
$numplugintypes += count(\core_component::get_plugin_list($type));
|
||||
$numplugintypes += count(component::get_plugin_list($type));
|
||||
}
|
||||
// And an entry for each core subsystem.
|
||||
$numcomponents = $numplugintypes + count(\core_component::get_core_subsystems());
|
||||
$numcomponents = $numplugintypes + count(component::get_core_subsystems());
|
||||
|
||||
if ($coreexpected) {
|
||||
// Add one for core.
|
||||
|
@ -1141,20 +1149,20 @@ final class component_test extends advanced_testcase {
|
|||
}
|
||||
|
||||
/**
|
||||
* Basic tests for APIs related functions in the core_component class.
|
||||
* Basic tests for APIs related functions in the component class.
|
||||
*/
|
||||
public function test_apis_methods(): void {
|
||||
$apis = core_component::get_core_apis();
|
||||
$apis = component::get_core_apis();
|
||||
$this->assertIsArray($apis);
|
||||
|
||||
$apinames = core_component::get_core_api_names();
|
||||
$apinames = component::get_core_api_names();
|
||||
$this->assertIsArray($apis);
|
||||
|
||||
// Both should return the very same APIs.
|
||||
$this->assertEquals($apinames, array_keys($apis));
|
||||
|
||||
$this->assertFalse(core_component::is_core_api('lalala'));
|
||||
$this->assertTrue(core_component::is_core_api('privacy'));
|
||||
$this->assertFalse(component::is_core_api('lalala'));
|
||||
$this->assertTrue(component::is_core_api('privacy'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1165,10 +1173,10 @@ final class component_test extends advanced_testcase {
|
|||
* like uniqueness or sorting. We are going to do all that here.
|
||||
*/
|
||||
public function test_apis_json_validation(): void {
|
||||
$apis = $sortedapis = core_component::get_core_apis();
|
||||
$apis = $sortedapis = component::get_core_apis();
|
||||
ksort($sortedapis); // We'll need this later.
|
||||
|
||||
$subsystems = core_component::get_core_subsystems(); // To verify all apis are pointing to valid subsystems.
|
||||
$subsystems = component::get_core_subsystems(); // To verify all apis are pointing to valid subsystems.
|
||||
$subsystems['core'] = 'anything'; // Let's add 'core' because it's a valid component for apis.
|
||||
|
||||
// General structure validations.
|
||||
|
@ -1213,24 +1221,24 @@ final class component_test extends advanced_testcase {
|
|||
*/
|
||||
public function test_has_monologo_icon(): void {
|
||||
// The Forum activity plugin has monologo icons.
|
||||
$this->assertTrue(core_component::has_monologo_icon('mod', 'forum'));
|
||||
$this->assertTrue(component::has_monologo_icon('mod', 'forum'));
|
||||
// The core H5P subsystem doesn't have monologo icons.
|
||||
$this->assertFalse(core_component::has_monologo_icon('core', 'h5p'));
|
||||
$this->assertFalse(component::has_monologo_icon('core', 'h5p'));
|
||||
// The function will return false for a non-existent component.
|
||||
$this->assertFalse(core_component::has_monologo_icon('randomcomponent', 'h5p'));
|
||||
$this->assertFalse(component::has_monologo_icon('randomcomponent', 'h5p'));
|
||||
}
|
||||
|
||||
/*
|
||||
* Tests the getter for the db directory summary hash.
|
||||
*
|
||||
* @covers \core_component::get_all_directory_hashes
|
||||
* @covers \core\component::get_all_directory_hashes
|
||||
*/
|
||||
public function test_get_db_directories_hash(): void {
|
||||
$initial = \core_component::get_all_component_hash();
|
||||
$initial = component::get_all_component_hash();
|
||||
|
||||
$dir = make_request_directory();
|
||||
$hashes = \core_component::get_all_directory_hashes([$dir]);
|
||||
$emptydirhash = \core_component::get_all_component_hash([$hashes]);
|
||||
$hashes = component::get_all_directory_hashes([$dir]);
|
||||
$emptydirhash = component::get_all_component_hash([$hashes]);
|
||||
|
||||
// Confirm that a single empty directory is a different hash to the core hash.
|
||||
$this->assertNotEquals($initial, $emptydirhash);
|
||||
|
@ -1240,14 +1248,14 @@ final class component_test extends advanced_testcase {
|
|||
fwrite($file, 'sometestdata');
|
||||
fclose($file);
|
||||
|
||||
$hashes = \core_component::get_all_directory_hashes([$dir]);
|
||||
$onefiledirhash = \core_component::get_all_component_hash([$hashes]);
|
||||
$hashes = component::get_all_directory_hashes([$dir]);
|
||||
$onefiledirhash = component::get_all_component_hash([$hashes]);
|
||||
$this->assertNotEquals($emptydirhash, $onefiledirhash);
|
||||
|
||||
// Now add a subdirectory inside the request dir. This should not affect the hash.
|
||||
mkdir($dir . '/subdir');
|
||||
$hashes = \core_component::get_all_directory_hashes([$dir]);
|
||||
$finalhash = \core_component::get_all_component_hash([$hashes]);
|
||||
$hashes = component::get_all_directory_hashes([$dir]);
|
||||
$finalhash = component::get_all_component_hash([$hashes]);
|
||||
$this->assertEquals($onefiledirhash, $finalhash);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue