FileFilterIteratorTest.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * This file is part of PHP CS Fixer.
  5. *
  6. * (c) Fabien Potencier <fabien@symfony.com>
  7. * Dariusz Rumiński <dariusz.ruminski@gmail.com>
  8. *
  9. * This source file is subject to the MIT license that is bundled
  10. * with this source code in the file LICENSE.
  11. */
  12. namespace PhpCsFixer\Tests\Runner;
  13. use PhpCsFixer\FixerFileProcessedEvent;
  14. use PhpCsFixer\Runner\FileFilterIterator;
  15. use PhpCsFixer\Tests\TestCase;
  16. use Symfony\Component\EventDispatcher\EventDispatcher;
  17. /**
  18. * @internal
  19. *
  20. * @covers \PhpCsFixer\Runner\FileFilterIterator
  21. */
  22. final class FileFilterIteratorTest extends TestCase
  23. {
  24. /**
  25. * @testWith [1]
  26. * [2]
  27. * [3]
  28. */
  29. public function testAccept(int $repeat): void
  30. {
  31. $file = __FILE__;
  32. $content = file_get_contents($file);
  33. $events = [];
  34. $eventDispatcher = new EventDispatcher();
  35. $eventDispatcher->addListener(
  36. FixerFileProcessedEvent::NAME,
  37. static function (FixerFileProcessedEvent $event) use (&$events): void {
  38. $events[] = $event;
  39. }
  40. );
  41. $cache = $this->prophesize(\PhpCsFixer\Cache\CacheManagerInterface::class);
  42. $cache->needFixing($file, $content)->willReturn(true);
  43. $fileInfo = new \SplFileInfo($file);
  44. $filter = new FileFilterIterator(
  45. new \ArrayIterator(array_fill(0, $repeat, $fileInfo)),
  46. $eventDispatcher,
  47. $cache->reveal()
  48. );
  49. self::assertCount(0, $events);
  50. $files = iterator_to_array($filter);
  51. self::assertCount(1, $files);
  52. self::assertSame($fileInfo, reset($files));
  53. }
  54. public function testEmitSkipEventWhenCacheNeedFixingFalse(): void
  55. {
  56. $file = __FILE__;
  57. $content = file_get_contents($file);
  58. $events = [];
  59. $eventDispatcher = new EventDispatcher();
  60. $eventDispatcher->addListener(
  61. FixerFileProcessedEvent::NAME,
  62. static function (FixerFileProcessedEvent $event) use (&$events): void {
  63. $events[] = $event;
  64. }
  65. );
  66. $cache = $this->prophesize(\PhpCsFixer\Cache\CacheManagerInterface::class);
  67. $cache->needFixing($file, $content)->willReturn(false);
  68. $filter = new FileFilterIterator(
  69. new \ArrayIterator([new \SplFileInfo($file)]),
  70. $eventDispatcher,
  71. $cache->reveal()
  72. );
  73. self::assertCount(0, $filter);
  74. self::assertCount(1, $events);
  75. /** @var FixerFileProcessedEvent $event */
  76. $event = reset($events);
  77. self::assertInstanceOf(\PhpCsFixer\FixerFileProcessedEvent::class, $event);
  78. self::assertSame(FixerFileProcessedEvent::STATUS_SKIPPED, $event->getStatus());
  79. }
  80. public function testIgnoreEmptyFile(): void
  81. {
  82. $file = __DIR__.'/../Fixtures/empty.php';
  83. $content = file_get_contents($file);
  84. $events = [];
  85. $eventDispatcher = new EventDispatcher();
  86. $eventDispatcher->addListener(
  87. FixerFileProcessedEvent::NAME,
  88. static function (FixerFileProcessedEvent $event) use (&$events): void {
  89. $events[] = $event;
  90. }
  91. );
  92. $cache = $this->prophesize(\PhpCsFixer\Cache\CacheManagerInterface::class);
  93. $cache->needFixing($file, $content)->willReturn(true);
  94. $filter = new FileFilterIterator(
  95. new \ArrayIterator([new \SplFileInfo($file)]),
  96. $eventDispatcher,
  97. $cache->reveal()
  98. );
  99. self::assertCount(0, $filter);
  100. self::assertCount(1, $events);
  101. /** @var FixerFileProcessedEvent $event */
  102. $event = reset($events);
  103. self::assertInstanceOf(\PhpCsFixer\FixerFileProcessedEvent::class, $event);
  104. self::assertSame(FixerFileProcessedEvent::STATUS_SKIPPED, $event->getStatus());
  105. }
  106. public function testIgnore(): void
  107. {
  108. $eventDispatcher = new EventDispatcher();
  109. $eventDispatcher->addListener(
  110. FixerFileProcessedEvent::NAME,
  111. static function (): void {
  112. throw new \Exception('No event expected.');
  113. }
  114. );
  115. $filter = new FileFilterIterator(
  116. new \ArrayIterator([
  117. new \SplFileInfo(__DIR__),
  118. new \SplFileInfo('__INVALID__'),
  119. ]),
  120. $eventDispatcher,
  121. $this->prophesize(\PhpCsFixer\Cache\CacheManagerInterface::class)->reveal()
  122. );
  123. self::assertCount(0, $filter);
  124. }
  125. public function testWithoutDispatcher(): void
  126. {
  127. $file = __FILE__;
  128. $content = file_get_contents($file);
  129. $cache = $this->prophesize(\PhpCsFixer\Cache\CacheManagerInterface::class);
  130. $cache->needFixing($file, $content)->willReturn(false);
  131. $filter = new FileFilterIterator(
  132. new \ArrayIterator([new \SplFileInfo($file)]),
  133. null,
  134. $cache->reveal()
  135. );
  136. self::assertCount(0, $filter);
  137. }
  138. public function testInvalidIterator(): void
  139. {
  140. $filter = new FileFilterIterator(
  141. new \ArrayIterator([__FILE__]), // @phpstan-ignore-line we want this check for contexts without static analysis
  142. null,
  143. $this->prophesize(\PhpCsFixer\Cache\CacheManagerInterface::class)->reveal()
  144. );
  145. $this->expectException(
  146. \RuntimeException::class
  147. );
  148. $this->expectExceptionMessageMatches(
  149. '#^Expected instance of "\\\SplFileInfo", got "string"\.$#'
  150. );
  151. iterator_to_array($filter);
  152. }
  153. /**
  154. * @requires OS Linux|Darwin
  155. */
  156. public function testFileIsAcceptedAfterFilteredAsSymlink(): void
  157. {
  158. $link = __DIR__.'/../Fixtures/Test/FileFilterIteratorTest/FileFilterIteratorTest.php.link';
  159. self::assertTrue(is_link($link), 'Fixture data is no longer correct for this test.');
  160. self::assertSame(__FILE__, realpath($link), 'Fixture data is no longer correct for this test.');
  161. $file = new \SplFileInfo(__FILE__);
  162. $link = new \SplFileInfo($link);
  163. $cache = $this->prophesize(\PhpCsFixer\Cache\CacheManagerInterface::class);
  164. $cache->needFixing(
  165. __FILE__,
  166. file_get_contents($file->getPathname())
  167. )->willReturn(true);
  168. $filter = new FileFilterIterator(
  169. new \ArrayIterator([$link, $file]),
  170. null,
  171. $cache->reveal()
  172. );
  173. $files = iterator_to_array($filter);
  174. self::assertCount(1, $files);
  175. self::assertSame($file, reset($files));
  176. }
  177. }