--TEST-- PluginManager: tracks loaded plugins, deduplicate loads, respects scope --FILE-- getLoadedPlugins()) . "\n"; echo count($pm->getGlobalPlugins()) . "\n"; echo ($pm->isLoaded('languages') ? 'yes' : 'no') . "\n"; echo ($pm->getPluginInfo('languages') ?? 'null') . "\n"; // loadPagePlugins with null — no-op $pm->loadPagePlugins(null); echo count($pm->getLoadedPlugins()) . "\n"; // loadPagePlugins with no plugins key — no-op $pm->loadPagePlugins(['title' => 'My Page']); echo count($pm->getLoadedPlugins()) . "\n"; // loadGlobalPlugins with no enabled key — no-op $pm->loadGlobalPlugins(['other' => 'stuff']); echo count($pm->getLoadedPlugins()) . "\n"; // Load the built-in languages plugin via global config $pm->loadGlobalPlugins(['plugins' => ['enabled' => 'languages']]); echo ($pm->isLoaded('languages') ? 'yes' : 'no') . "\n"; echo count($pm->getGlobalPlugins()) . "\n"; echo in_array('languages', $pm->getGlobalPlugins()) ? 'in global' : 'not in global'; echo "\n"; // Loading again is a no-op (deduplication) $pm->loadGlobalPlugins(['plugins' => ['enabled' => 'languages']]); echo count($pm->getLoadedPlugins()) . "\n"; // getPluginInfo returns path and scope $info = $pm->getPluginInfo('languages'); echo ($info['scope'] === 'global' ? 'scope ok' : 'scope wrong') . "\n"; echo (str_ends_with($info['path'], 'languages.php') ? 'path ok' : 'path wrong') . "\n"; ?> --EXPECT-- 0 0 no null 0 0 0 yes 1 in global 1 scope ok path ok