22 public function testCircularDependencies()
24 $objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
27 $validationStateMock = $this->createMock(\
Magento\Framework\
Config\ValidationStateInterface::class);
28 $validationStateMock->method(
'isValidationRequired')
30 $domFactoryMock = $this->createMock(\
Magento\Framework\
Config\DomFactory::class);
31 $domFactoryMock->expects($this->any())
34 function (
$arguments) use ($validationStateMock) {
35 return new \Magento\Framework\Config\Dom(
46 foreach ($declaredLanguages as $language) {
51 'domFactory' => $domFactoryMock
54 $this->packs[$languageConfig->getVendor()][$languageConfig->getPackage()] = $languageConfig;
55 $packs[] = $languageConfig;
59 foreach ($packs as $languageConfig) {
62 foreach ($this->collectCircularInheritance($languageConfig) as
$config) {
65 if (!empty($languages)) {
66 $this->fail(
"Circular dependency detected:\n" . implode(
' -> ', $languages));
77 private function collectCircularInheritance(
Config $languageConfig, &$languageList = [], &$isCircular =
false)
80 if (isset($languageList[$packKey])) {
83 $languageList[$packKey] = $languageConfig;
84 foreach ($languageConfig->
getUses() as $reuse) {
85 if (isset($this->packs[$reuse[
'vendor']][$reuse[
'package']])) {
86 $this->collectCircularInheritance(
87 $this->packs[$reuse[
'vendor']][$reuse[
'package']],
94 return $isCircular ? $languageList : [];