diff --git a/.upgradenotes/MDL-66903-2024070501430894.yml b/.upgradenotes/MDL-66903-2024070501430894.yml new file mode 100644 index 00000000000..ce397c67d00 --- /dev/null +++ b/.upgradenotes/MDL-66903-2024070501430894.yml @@ -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 diff --git a/lib/classes/component.php b/lib/classes/component.php index a33117f09f9..76b74213498 100644 --- a/lib/classes/component.php +++ b/lib/classes/component.php @@ -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); diff --git a/lib/phpunit/classes/advanced_testcase.php b/lib/phpunit/classes/advanced_testcase.php index 000e07a4c31..fed9d37ba26 100644 --- a/lib/phpunit/classes/advanced_testcase.php +++ b/lib/phpunit/classes/advanced_testcase.php @@ -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)) { diff --git a/lib/tests/component_test.php b/lib/tests/component_test.php index 894a3e05227..c1fa9a44cbc 100644 --- a/lib/tests/component_test.php +++ b/lib/tests/component_test.php @@ -14,19 +14,31 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -// 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); } }