Finder.basic.phpt 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?php
  2. /**
  3. * Test: Nette\Utils\Finder basic usage.
  4. */
  5. declare(strict_types=1);
  6. use Nette\Utils\FileSystem;
  7. use Nette\Utils\Finder;
  8. use Tester\Assert;
  9. require __DIR__ . '/../bootstrap.php';
  10. function export($iterator, bool $sort = true)
  11. {
  12. $arr = [];
  13. foreach ($iterator as $key => $value) {
  14. $arr[] = FileSystem::unixSlashes($key);
  15. }
  16. if ($sort) {
  17. sort($arr);
  18. }
  19. return $arr;
  20. }
  21. test('empty search', function () {
  22. $finder = (new Finder)->in('fixtures.finder');
  23. Assert::same([], export($finder));
  24. $finder = (new Finder)->from('fixtures.finder');
  25. Assert::same([], export($finder));
  26. Assert::exception(
  27. fn() => Finder::findFiles(''),
  28. Nette\InvalidArgumentException::class,
  29. );
  30. });
  31. test('default mask', function () {
  32. $finder = Finder::find()->in('fixtures.finder');
  33. Assert::same(['fixtures.finder/file.txt', 'fixtures.finder/images', 'fixtures.finder/subdir'], export($finder));
  34. $finder = Finder::findFiles()->in('fixtures.finder');
  35. Assert::same(['fixtures.finder/file.txt'], export($finder));
  36. $finder = Finder::findDirectories()->in('fixtures.finder');
  37. Assert::same(['fixtures.finder/images', 'fixtures.finder/subdir'], export($finder));
  38. $finder = (new Finder)->files()->in('fixtures.finder');
  39. Assert::same(['fixtures.finder/file.txt'], export($finder));
  40. $finder = (new Finder)->directories()->in('fixtures.finder');
  41. Assert::same(['fixtures.finder/images', 'fixtures.finder/subdir'], export($finder));
  42. });
  43. test('current dir', function () {
  44. $finder = Finder::findFiles('fixtures.finder/*.txt');
  45. Assert::same(['fixtures.finder/file.txt'], export($finder));
  46. });
  47. test('non-recursive file search', function () {
  48. $finder = Finder::findFiles('file.txt')->in('fixtures.finder');
  49. Assert::same(['fixtures.finder/file.txt'], export($finder));
  50. });
  51. test('non-recursive file search alt', function () {
  52. $finder = (new Finder)->files('file.txt')->in('fixtures.finder');
  53. Assert::same(['fixtures.finder/file.txt'], export($finder));
  54. });
  55. test('recursive file search', function () {
  56. $finder = Finder::findFiles('file.txt')->from('fixtures.finder');
  57. Assert::same([
  58. 'fixtures.finder/file.txt',
  59. 'fixtures.finder/subdir/file.txt',
  60. 'fixtures.finder/subdir/subdir2/file.txt',
  61. ], export($finder));
  62. });
  63. test('recursive file search with depth limit', function () {
  64. $finder = Finder::findFiles('file.txt')->from('fixtures.finder')->limitDepth(1);
  65. Assert::same([
  66. 'fixtures.finder/file.txt',
  67. 'fixtures.finder/subdir/file.txt',
  68. ], export($finder));
  69. });
  70. test('non-recursive file & directory search', function () {
  71. $finder = Finder::find('file.txt')->in('fixtures.finder');
  72. Assert::same([
  73. 'fixtures.finder/file.txt',
  74. ], export($finder));
  75. });
  76. test('recursive file & directory search', function () {
  77. $finder = Finder::find('file.txt')->from('fixtures.finder');
  78. Assert::same([
  79. 'fixtures.finder/file.txt',
  80. 'fixtures.finder/subdir/file.txt',
  81. 'fixtures.finder/subdir/subdir2/file.txt',
  82. ], export($finder));
  83. });
  84. test('recursive file & directory search in child-first order', function () {
  85. $finder = Finder::find('subdir*')->from('fixtures.finder')->childFirst();
  86. Assert::same([
  87. 'fixtures.finder/subdir/subdir2',
  88. 'fixtures.finder/subdir',
  89. ], export($finder, sort: false));
  90. });
  91. test('recursive file & directory search excluding folders', function () {
  92. $finder = Finder::find('file.txt')->from('fixtures.finder')->exclude('images')->exclude('subdir2');
  93. Assert::same([
  94. 'fixtures.finder/file.txt',
  95. 'fixtures.finder/subdir/file.txt',
  96. ], export($finder));
  97. });
  98. test('non-recursive directory search', function () {
  99. $finder = Finder::findDirectories('subdir*')->in('fixtures.finder');
  100. Assert::same([
  101. 'fixtures.finder/subdir',
  102. ], export($finder));
  103. });
  104. test('non-recursive directory search alt', function () {
  105. $finder = (new Finder)->directories('subdir*')->in('fixtures.finder');
  106. Assert::same([
  107. 'fixtures.finder/subdir',
  108. ], export($finder));
  109. });
  110. test('recursive directory search', function () {
  111. $finder = Finder::findDirectories('subdir*')->from('fixtures.finder');
  112. Assert::same([
  113. 'fixtures.finder/subdir',
  114. 'fixtures.finder/subdir/subdir2',
  115. ], export($finder));
  116. });
  117. test('absolute path', function () {
  118. $finder = Finder::find('fixtures.finder/im*')->in(__DIR__);
  119. Assert::same([
  120. FileSystem::unixSlashes(__DIR__) . '/fixtures.finder/images',
  121. ], export($finder));
  122. });
  123. test('absolute path in mask', function () { // will not work if there are characters [] in the path!!!
  124. $finder = Finder::findDirectories(__DIR__);
  125. Assert::same([
  126. FileSystem::unixSlashes(__DIR__),
  127. ], export($finder));
  128. });
  129. test('symlink to file', function () {
  130. $finder = Finder::find('subdir/*.txt')->in('fixtures.finder3');
  131. Assert::same([
  132. 'fixtures.finder3/subdir/file.txt',
  133. ], export($finder));
  134. });
  135. test('symlink to directory', function () {
  136. $finder = Finder::findDirectories()->in('fixtures.finder3/another_subdir');
  137. Assert::same([
  138. 'fixtures.finder3/another_subdir/subdir',
  139. ], export($finder));
  140. });
  141. test('symlink to file in symlinked directory', function () {
  142. $finder = Finder::find('subdir/*.txt')->in('fixtures.finder3/another_subdir');
  143. Assert::same([
  144. 'fixtures.finder3/another_subdir/subdir/file.txt',
  145. ], export($finder));
  146. });