2 namespace TYPO3\CMS\Core\Tests\Unit\Package
;
5 * This file is part of the TYPO3 CMS project.
7 * It is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License, either version 2
9 * of the License, or any later version.
11 * For the full copyright and license information, please read the
12 * LICENSE.txt file that was distributed with this source code.
14 * The TYPO3 project - inspiring people to share!
17 use TYPO3\CMS\Core\Package\DependencyResolver
;
18 use TYPO3\CMS\Core\Service\DependencyOrderingService
;
19 use TYPO3\TestingFramework\Core\Unit\UnitTestCase
;
24 class DependencyResolverTest
extends UnitTestCase
28 * @param array $unsortedPackageStatesConfiguration
29 * @param array $frameworkPackageKeys
30 * @param array $expectedGraph
31 * @dataProvider buildDependencyGraphBuildsCorrectGraphDataProvider
33 public function buildDependencyGraphBuildsCorrectGraph(array $unsortedPackageStatesConfiguration, array $frameworkPackageKeys, array $expectedGraph)
35 /** @var DependencyResolver|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\TestingFramework\Core\AccessibleObjectInterface $dependencyResolver */
36 $dependencyResolver = $this->getAccessibleMock(DependencyResolver
::class, ['findFrameworkPackages']);
37 $dependencyResolver->injectDependencyOrderingService(new DependencyOrderingService());
38 $dependencyResolver->expects($this->any())->method('findFrameworkPackages')->willReturn($frameworkPackageKeys);
39 $dependencyGraph = $dependencyResolver->_call('buildDependencyGraph', $unsortedPackageStatesConfiguration);
41 $this->assertEquals($expectedGraph, $dependencyGraph);
46 * @dataProvider packageSortingDataProvider
47 * @param array $unsortedPackageStatesConfiguration
48 * @param array $frameworkPackageKeys
49 * @param array $expectedSortedPackageStatesConfiguration
51 public function sortPackageStatesConfigurationByDependencyMakesSureThatDependantPackagesAreStandingBeforeAPackageInTheInternalPackagesAndPackagesConfigurationArrays($unsortedPackageStatesConfiguration, $frameworkPackageKeys, $expectedSortedPackageKeys)
53 /** @var DependencyResolver|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\TestingFramework\Core\AccessibleObjectInterface $dependencyResolver */
54 $dependencyResolver = $this->getAccessibleMock(DependencyResolver
::class, ['findFrameworkPackages']);
55 $dependencyResolver->injectDependencyOrderingService(new DependencyOrderingService());
56 $dependencyResolver->expects($this->any())->method('findFrameworkPackages')->willReturn($frameworkPackageKeys);
57 $sortedPackageKeys = $dependencyResolver->_call('sortPackageStatesConfigurationByDependency', $unsortedPackageStatesConfiguration);
59 $this->assertEquals($expectedSortedPackageKeys, $sortedPackageKeys, 'The package states configurations have not been ordered according to their dependencies!');
65 public function sortPackageStatesConfigurationByDependencyThrowsExceptionWhenCycleDetected()
67 $unsortedPackageStatesConfiguration = [
69 'dependencies' => ['B'],
72 'dependencies' => ['A']
76 $this->expectException(\UnexpectedValueException
::class);
77 $this->expectExceptionCode(1381960494);
79 /** @var DependencyResolver|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\TestingFramework\Core\AccessibleObjectInterface $dependencyResolver */
80 $dependencyResolver = $this->getAccessibleMock(DependencyResolver
::class, ['findFrameworkPackages']);
81 $dependencyResolver->injectDependencyOrderingService(new DependencyOrderingService());
82 $dependencyResolver->expects($this->any())->method('findFrameworkPackages')->willReturn([]);
83 $dependencyResolver->_call('sortPackageStatesConfigurationByDependency', $unsortedPackageStatesConfiguration);
89 public function buildDependencyGraphBuildsCorrectGraphDataProvider()
92 'TYPO3 Flow Packages' => [
95 'dependencies' => ['Symfony.Component.Yaml', 'Doctrine.Common', 'Doctrine.DBAL', 'Doctrine.ORM']
98 'dependencies' => ['Doctrine.Common', 'Doctrine.DBAL']
100 'Doctrine.Common' => [
104 'dependencies' => ['Doctrine.Common']
106 'Symfony.Component.Yaml' => [
115 'TYPO3.Flow' => false,
116 'Doctrine.ORM' => true,
117 'Doctrine.Common' => true,
118 'Doctrine.DBAL' => true,
119 'Symfony.Component.Yaml' => true,
122 'TYPO3.Flow' => false,
123 'Doctrine.ORM' => false,
124 'Doctrine.Common' => true,
125 'Doctrine.DBAL' => true,
126 'Symfony.Component.Yaml' => false,
128 'Doctrine.Common' => [
129 'TYPO3.Flow' => false,
130 'Doctrine.ORM' => false,
131 'Doctrine.Common' => false,
132 'Doctrine.DBAL' => false,
133 'Symfony.Component.Yaml' => false,
136 'TYPO3.Flow' => false,
137 'Doctrine.ORM' => false,
138 'Doctrine.Common' => true,
139 'Doctrine.DBAL' => false,
140 'Symfony.Component.Yaml' => false,
142 'Symfony.Component.Yaml' => [
143 'TYPO3.Flow' => false,
144 'Doctrine.ORM' => false,
145 'Doctrine.Common' => true,
146 'Doctrine.DBAL' => false,
147 'Symfony.Component.Yaml' => false,
151 'TYPO3 CMS Extensions' => [
154 'dependencies' => [],
157 'dependencies' => ['core'],
160 'dependencies' => ['core', 'setup']
163 'dependencies' => ['extbase'],
166 'dependencies' => ['core'],
169 'dependencies' => ['extbase'],
172 'dependencies' => [],
188 'pt_extbase' => false,
197 'pt_extbase' => false,
206 'pt_extbase' => false,
215 'pt_extbase' => false,
224 'pt_extbase' => false,
233 'pt_extbase' => false,
242 'pt_extbase' => false,
247 'Dummy Packages' => [
250 'dependencies' => ['B', 'D', 'C'],
256 'dependencies' => ['E']
259 'dependencies' => ['E'],
262 'dependencies' => [],
265 'dependencies' => [],
330 public function packageSortingDataProvider()
333 'TYPO3 Flow Packages' => [
336 'dependencies' => ['Symfony.Component.Yaml', 'Doctrine.Common', 'Doctrine.DBAL', 'Doctrine.ORM']
339 'dependencies' => ['Doctrine.Common', 'Doctrine.DBAL']
341 'Doctrine.Common' => [
345 'dependencies' => ['Doctrine.Common']
347 'Symfony.Component.Yaml' => [
358 'Symfony.Component.Yaml',
362 'TYPO3 CMS Extensions' => [
365 'dependencies' => [],
368 'dependencies' => ['core'],
371 'dependencies' => ['core', 'setup']
374 'dependencies' => ['extbase'],
377 'dependencies' => ['core'],
380 'dependencies' => ['extbase'],
383 'dependencies' => [],
402 'Dummy Packages' => [
405 'dependencies' => ['B', 'D', 'C'],
411 'dependencies' => ['E']
414 'dependencies' => ['E'],
417 'dependencies' => [],
420 'dependencies' => [],