diff --git a/core/metamodel.class.php b/core/metamodel.class.php
index 60afe675f..7b7143a42 100644
--- a/core/metamodel.class.php
+++ b/core/metamodel.class.php
@@ -7627,14 +7627,12 @@ abstract class MetaModel
// Build the list of available extensions
//
$aInterfaces = [
- 'iApplicationUIExtension',
- 'iPreferencesExtension',
- 'iApplicationObjectExtension',
'iLoginFSMExtension',
- 'iLoginUIExtension',
'iLogoutExtension',
- 'iQueryModifier',
- 'iOnClassInitialization',
+ 'iLoginUIExtension',
+ 'iPreferencesExtension',
+ 'iApplicationUIExtension',
+ 'iApplicationObjectExtension',
'iPopupMenuExtension',
'iPageUIExtension',
'iPageUIBlockExtension',
@@ -7648,10 +7646,12 @@ abstract class MetaModel
'iBackofficeDictEntriesExtension',
'iBackofficeDictEntriesPrefixesExtension',
'iPortalUIExtension',
- 'ModuleHandlerApiInterface',
- 'iNewsroomProvider',
+ 'iQueryModifier',
+ 'iOnClassInitialization',
'iModuleExtension',
'iKPILoggerExtension',
+ 'ModuleHandlerApiInterface',
+ 'iNewsroomProvider',
];
foreach ($aInterfaces as $sInterface) {
self::$m_aExtensionClassNames[$sInterface] = array();
diff --git a/tests/php-unit-tests/phpunit.xml.dist b/tests/php-unit-tests/phpunit.xml.dist
index 419e26538..70b3ba593 100644
--- a/tests/php-unit-tests/phpunit.xml.dist
+++ b/tests/php-unit-tests/phpunit.xml.dist
@@ -19,6 +19,10 @@
printerClass="\Sempro\PHPUnitPrettyPrinter\PrettyPrinterForPhpUnit9"
>
+
+
+
+
diff --git a/tests/php-unit-tests/postbuild_integration.xml.dist b/tests/php-unit-tests/postbuild_integration.xml.dist
index df0cee5e0..8cc2825cd 100644
--- a/tests/php-unit-tests/postbuild_integration.xml.dist
+++ b/tests/php-unit-tests/postbuild_integration.xml.dist
@@ -19,6 +19,10 @@
printerClass="\Sempro\PHPUnitPrettyPrinter\PrettyPrinterForPhpUnit9"
>
+
+
+
+
diff --git a/tests/php-unit-tests/unitary-tests/application/applicationextension/ApplicationExtensionTest.php b/tests/php-unit-tests/unitary-tests/application/applicationextension/ApplicationExtensionTest.php
new file mode 100644
index 000000000..58dc826df
--- /dev/null
+++ b/tests/php-unit-tests/unitary-tests/application/applicationextension/ApplicationExtensionTest.php
@@ -0,0 +1,164 @@
+assertGreaterThan(0, $iExtendingClassesCount, "Found no class extending the $sAPIFQCN API");
+ }
+
+ public function ExtensionAPIRegisteredAndCalledProvider(): array
+ {
+ // APIs not concerned by this test:
+ // * \iRestServiceProvider as it is discovered by iterating over declared classes directly
+ // * \iLoginUIExtension as it is not iterated directly, only its derived interfaces
+
+ return [
+ \iLoginFSMExtension::class => [
+ \iLoginFSMExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iLogoutExtension::class => [
+ \iLogoutExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iLoginUIExtension::class => [
+ \iLoginUIExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iPreferencesExtension::class => [
+ \iPreferencesExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iApplicationUIExtension::class => [
+ \iApplicationUIExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iApplicationObjectExtension::class => [
+ \iApplicationObjectExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iPopupMenuExtension::class => [
+ \iPopupMenuExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iPageUIExtension::class => [
+ \iPageUIExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iPageUIBlockExtension::class => [
+ \iPageUIBlockExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iBackofficeLinkedScriptsExtension::class => [
+ \iBackofficeLinkedScriptsExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iBackofficeEarlyScriptExtension::class => [
+ \iBackofficeEarlyScriptExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iBackofficeScriptExtension::class => [
+ \iBackofficeScriptExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iBackofficeInitScriptExtension::class => [
+ \iBackofficeInitScriptExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iBackofficeReadyScriptExtension::class => [
+ \iBackofficeReadyScriptExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iBackofficeLinkedStylesheetsExtension::class => [
+ \iBackofficeLinkedStylesheetsExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iBackofficeStyleExtension::class => [
+ \iBackofficeStyleExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iBackofficeDictEntriesExtension::class => [
+ \iBackofficeDictEntriesExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iBackofficeDictEntriesPrefixesExtension::class => [
+ \iBackofficeDictEntriesPrefixesExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iPortalUIExtension::class => [
+ \iPortalUIExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iQueryModifier::class => [
+ \iQueryModifier::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iOnClassInitialization::class => [
+ \iOnClassInitialization::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iModuleExtension::class => [
+ \iModuleExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iKPILoggerExtension::class => [
+ \iKPILoggerExtension::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \ModuleHandlerApiInterface::class => [
+ \ModuleHandlerApiInterface::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ \iNewsroomProvider::class => [
+ \iNewsroomProvider::class,
+ static::ENUM_API_CALL_METHOD_ENUMPLUGINS,
+ ],
+ ];
+ }
+}
diff --git a/tests/php-unit-tests/unitary-tests/application/applicationextension/Delta/application-extension-usages-in-snippets.xml b/tests/php-unit-tests/unitary-tests/application/applicationextension/Delta/application-extension-usages-in-snippets.xml
new file mode 100644
index 000000000..edbae0d0d
--- /dev/null
+++ b/tests/php-unit-tests/unitary-tests/application/applicationextension/Delta/application-extension-usages-in-snippets.xml
@@ -0,0 +1,384 @@
+
+
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+ 'Foo is first',
+ 'Foo:Second' => 'Foo is second',
+ ];
+ }
+}
+ ]]>
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+ core
+ 0
+
+
+
+
+ core
+ 0
+
+
+
+
+ core
+ 0
+
+
+
+
\ No newline at end of file