3 namespace Drupal\Tests\Core\Asset;
5 use Drupal\Core\Asset\LibraryDependencyResolver;
6 use Drupal\Tests\UnitTestCase;
9 * @coversDefaultClass \Drupal\Core\Asset\LibraryDependencyResolver
12 class LibraryDependencyResolverTest extends UnitTestCase {
15 * The tested library dependency resolver.
17 * @var \Drupal\Core\Asset\LibraryDependencyResolver
19 protected $libraryDependencyResolver;
22 * The mocked library discovery service.
24 * @var \Drupal\Core\Asset\LibraryDiscoveryInterface|\PHPUnit_Framework_MockObject_MockObject
26 protected $libraryDiscovery;
29 * The mocked module handler.
31 * @var \Drupal\Core\Extension\ModuleHandlerInterface|\PHPUnit_Framework_MockObject_MockObject
33 protected $moduleHandler;
40 protected $libraryData = [
41 'no_deps_a' => ['js' => [], 'css' => []],
42 'no_deps_b' => ['js' => [], 'css' => []],
43 'no_deps_c' => ['js' => [], 'css' => []],
44 'deps_a' => ['js' => [], 'css' => [], 'dependencies' => ['test/no_deps_a']],
45 'deps_b' => ['js' => [], 'css' => [], 'dependencies' => ['test/no_deps_a', 'test/no_deps_b']],
46 'deps_c' => ['js' => [], 'css' => [], 'dependencies' => ['test/no_deps_b', 'test/no_deps_a']],
47 'nested_deps_a' => ['js' => [], 'css' => [], 'dependencies' => ['test/deps_a']],
48 'nested_deps_b' => ['js' => [], 'css' => [], 'dependencies' => ['test/nested_deps_a']],
49 'nested_deps_c' => ['js' => [], 'css' => [], 'dependencies' => ['test/nested_deps_b']],
55 protected function setUp() {
56 $this->libraryDiscovery = $this->getMockBuilder('Drupal\Core\Asset\LibraryDiscovery')
57 ->disableOriginalConstructor()
58 ->setMethods(['getLibrariesByExtension'])
60 $this->libraryDiscovery->expects($this->any())
61 ->method('getLibrariesByExtension')
63 ->will($this->returnValue($this->libraryData));
64 $this->libraryDependencyResolver = new LibraryDependencyResolver($this->libraryDiscovery);
69 * Provides test data for ::testGetLibrariesWithDependencies().
71 public function providerTestGetLibrariesWithDependencies() {
73 // Empty list of libraries.
75 // Without dependencies.
76 [['test/no_deps_a'], ['test/no_deps_a']],
77 [['test/no_deps_a', 'test/no_deps_b'], ['test/no_deps_a', 'test/no_deps_b']],
78 [['test/no_deps_b', 'test/no_deps_a'], ['test/no_deps_b', 'test/no_deps_a']],
79 // Single-level (direct) dependencies.
80 [['test/deps_a'], ['test/no_deps_a', 'test/deps_a']],
81 [['test/deps_b'], ['test/no_deps_a', 'test/no_deps_b', 'test/deps_b']],
82 [['test/deps_c'], ['test/no_deps_b', 'test/no_deps_a', 'test/deps_c']],
83 [['test/deps_a', 'test/deps_b'], ['test/no_deps_a', 'test/deps_a', 'test/no_deps_b', 'test/deps_b']],
84 [['test/deps_a', 'test/deps_c'], ['test/no_deps_a', 'test/deps_a', 'test/no_deps_b', 'test/deps_c']],
85 [['test/deps_a', 'test/deps_b', 'test/deps_c'], ['test/no_deps_a', 'test/deps_a', 'test/no_deps_b', 'test/deps_b', 'test/deps_c']],
86 [['test/deps_b', 'test/deps_a'], ['test/no_deps_a', 'test/no_deps_b', 'test/deps_b', 'test/deps_a']],
87 [['test/deps_b', 'test/deps_c'], ['test/no_deps_a', 'test/no_deps_b', 'test/deps_b', 'test/deps_c']],
88 [['test/deps_c', 'test/deps_b'], ['test/no_deps_b', 'test/no_deps_a', 'test/deps_c', 'test/deps_b']],
89 // Multi-level (indirect) dependencies.
90 [['test/nested_deps_a'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a']],
91 [['test/nested_deps_b'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b']],
92 [['test/nested_deps_c'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b', 'test/nested_deps_c']],
93 [['test/nested_deps_a', 'test/nested_deps_b'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b']],
94 [['test/nested_deps_b', 'test/nested_deps_a'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b']],
95 [['test/nested_deps_a', 'test/nested_deps_c'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b', 'test/nested_deps_c']],
96 [['test/nested_deps_b', 'test/nested_deps_c'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b', 'test/nested_deps_c']],
97 [['test/nested_deps_c', 'test/nested_deps_a'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b', 'test/nested_deps_c']],
98 [['test/nested_deps_a', 'test/nested_deps_b', 'test/nested_deps_c'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b', 'test/nested_deps_c']],
99 [['test/nested_deps_a', 'test/nested_deps_c', 'test/nested_deps_b'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b', 'test/nested_deps_c']],
100 [['test/nested_deps_b', 'test/nested_deps_a', 'test/nested_deps_c'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b', 'test/nested_deps_c']],
101 [['test/nested_deps_b', 'test/nested_deps_c', 'test/nested_deps_a'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b', 'test/nested_deps_c']],
102 [['test/nested_deps_c', 'test/nested_deps_a', 'test/nested_deps_b'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b', 'test/nested_deps_c']],
103 [['test/nested_deps_c', 'test/nested_deps_b', 'test/nested_deps_a'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b', 'test/nested_deps_c']],
104 // Complex dependencies, combining the above, with many intersections.
105 [['test/deps_c', 'test/nested_deps_b'], ['test/no_deps_b', 'test/no_deps_a', 'test/deps_c', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b']],
106 [['test/no_deps_a', 'test/deps_c', 'test/nested_deps_b'], ['test/no_deps_a', 'test/no_deps_b', 'test/deps_c', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b']],
107 [['test/nested_deps_b', 'test/deps_c', 'test/no_deps_c'], ['test/no_deps_a', 'test/deps_a', 'test/nested_deps_a', 'test/nested_deps_b', 'test/no_deps_b', 'test/deps_c', 'test/no_deps_c']],
112 * @covers ::getLibrariesWithDependencies
114 * @dataProvider providerTestGetLibrariesWithDependencies
116 public function testGetLibrariesWithDependencies(array $libraries, array $expected) {
117 $this->assertEquals($expected, $this->libraryDependencyResolver->getLibrariesWithDependencies($libraries));
121 * Provides test data for ::testGetMinimalRepresentativeSubset().
123 public function providerTestGetMinimalRepresentativeSubset() {
125 // Empty list of libraries.
127 // Without dependencies.
128 [['test/no_deps_a'], ['test/no_deps_a']],
129 [['test/no_deps_a', 'test/no_deps_b'], ['test/no_deps_a', 'test/no_deps_b']],
130 [['test/no_deps_b', 'test/no_deps_a'], ['test/no_deps_b', 'test/no_deps_a']],
131 // Single-level (direct) dependencies.
132 [['test/deps_a'], ['test/deps_a']],
133 [['test/deps_b'], ['test/deps_b']],
134 [['test/deps_c'], ['test/deps_c']],
135 [['test/deps_a', 'test/deps_b'], ['test/deps_a', 'test/deps_b']],
136 [['test/deps_a', 'test/deps_c'], ['test/deps_a', 'test/deps_c']],
137 [['test/deps_a', 'test/deps_b', 'test/deps_c'], ['test/deps_a', 'test/deps_b', 'test/deps_c']],
138 [['test/deps_b', 'test/deps_a'], ['test/deps_b', 'test/deps_a']],
139 [['test/deps_b', 'test/deps_c'], ['test/deps_b', 'test/deps_c']],
140 [['test/deps_c', 'test/deps_b'], ['test/deps_c', 'test/deps_b']],
141 // Multi-level (indirect) dependencies.
142 [['test/nested_deps_a'], ['test/nested_deps_a']],
143 [['test/nested_deps_b'], ['test/nested_deps_b']],
144 [['test/nested_deps_c'], ['test/nested_deps_c']],
145 [['test/nested_deps_a', 'test/nested_deps_b'], ['test/nested_deps_b']],
146 [['test/nested_deps_b', 'test/nested_deps_a'], ['test/nested_deps_b']],
147 [['test/nested_deps_a', 'test/nested_deps_c'], ['test/nested_deps_c']],
148 [['test/nested_deps_b', 'test/nested_deps_c'], ['test/nested_deps_c']],
149 [['test/nested_deps_c', 'test/nested_deps_a'], ['test/nested_deps_c']],
150 [['test/nested_deps_a', 'test/nested_deps_b', 'test/nested_deps_c'], ['test/nested_deps_c']],
151 [['test/nested_deps_a', 'test/nested_deps_c', 'test/nested_deps_b'], ['test/nested_deps_c']],
152 [['test/nested_deps_b', 'test/nested_deps_a', 'test/nested_deps_c'], ['test/nested_deps_c']],
153 [['test/nested_deps_b', 'test/nested_deps_c', 'test/nested_deps_a'], ['test/nested_deps_c']],
154 [['test/nested_deps_c', 'test/nested_deps_a', 'test/nested_deps_b'], ['test/nested_deps_c']],
155 [['test/nested_deps_c', 'test/nested_deps_b', 'test/nested_deps_a'], ['test/nested_deps_c']],
156 // Complex dependencies, combining the above, with many intersections.
157 [['test/deps_c', 'test/nested_deps_b'], ['test/deps_c', 'test/nested_deps_b']],
158 [['test/no_deps_a', 'test/deps_c', 'test/nested_deps_b'], ['test/deps_c', 'test/nested_deps_b']],
159 [['test/nested_deps_b', 'test/deps_c', 'test/no_deps_c'], ['test/nested_deps_b', 'test/deps_c', 'test/no_deps_c']],
164 * @covers ::getMinimalRepresentativeSubset
166 * @dataProvider providerTestGetMinimalRepresentativeSubset
168 public function testGetMinimalRepresentativeSubset(array $libraries, array $expected) {
169 $this->assertEquals($expected, $this->libraryDependencyResolver->getMinimalRepresentativeSubset($libraries));