annotate vendor/symfony/finder/Tests/FinderTest.php @ 12:7a779792577d

Update Drupal core to v8.4.5 (via Composer)
author Chris Cannam
date Fri, 23 Feb 2018 15:52:07 +0000
parents 4c8ae668cc8c
children 5fb285c0d0e3
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /*
Chris@0 4 * This file is part of the Symfony package.
Chris@0 5 *
Chris@0 6 * (c) Fabien Potencier <fabien@symfony.com>
Chris@0 7 *
Chris@0 8 * For the full copyright and license information, please view the LICENSE
Chris@0 9 * file that was distributed with this source code.
Chris@0 10 */
Chris@0 11
Chris@0 12 namespace Symfony\Component\Finder\Tests;
Chris@0 13
Chris@0 14 use Symfony\Component\Finder\Finder;
Chris@0 15
Chris@0 16 class FinderTest extends Iterator\RealIteratorTestCase
Chris@0 17 {
Chris@0 18 public function testCreate()
Chris@0 19 {
Chris@0 20 $this->assertInstanceOf('Symfony\Component\Finder\Finder', Finder::create());
Chris@0 21 }
Chris@0 22
Chris@0 23 public function testDirectories()
Chris@0 24 {
Chris@0 25 $finder = $this->buildFinder();
Chris@0 26 $this->assertSame($finder, $finder->directories());
Chris@0 27 $this->assertIterator($this->toAbsolute(array('foo', 'toto')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 28
Chris@0 29 $finder = $this->buildFinder();
Chris@0 30 $finder->directories();
Chris@0 31 $finder->files();
Chris@0 32 $finder->directories();
Chris@0 33 $this->assertIterator($this->toAbsolute(array('foo', 'toto')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 34 }
Chris@0 35
Chris@0 36 public function testFiles()
Chris@0 37 {
Chris@0 38 $finder = $this->buildFinder();
Chris@0 39 $this->assertSame($finder, $finder->files());
Chris@0 40 $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php', 'test.py', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 41
Chris@0 42 $finder = $this->buildFinder();
Chris@0 43 $finder->files();
Chris@0 44 $finder->directories();
Chris@0 45 $finder->files();
Chris@0 46 $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php', 'test.py', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 47 }
Chris@0 48
Chris@0 49 public function testDepth()
Chris@0 50 {
Chris@0 51 $finder = $this->buildFinder();
Chris@0 52 $this->assertSame($finder, $finder->depth('< 1'));
Chris@0 53 $this->assertIterator($this->toAbsolute(array('foo', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 54
Chris@0 55 $finder = $this->buildFinder();
Chris@0 56 $this->assertSame($finder, $finder->depth('<= 0'));
Chris@0 57 $this->assertIterator($this->toAbsolute(array('foo', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 58
Chris@0 59 $finder = $this->buildFinder();
Chris@0 60 $this->assertSame($finder, $finder->depth('>= 1'));
Chris@0 61 $this->assertIterator($this->toAbsolute(array('foo/bar.tmp')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 62
Chris@0 63 $finder = $this->buildFinder();
Chris@0 64 $finder->depth('< 1')->depth('>= 1');
Chris@0 65 $this->assertIterator(array(), $finder->in(self::$tmpDir)->getIterator());
Chris@0 66 }
Chris@0 67
Chris@0 68 public function testName()
Chris@0 69 {
Chris@0 70 $finder = $this->buildFinder();
Chris@0 71 $this->assertSame($finder, $finder->name('*.php'));
Chris@0 72 $this->assertIterator($this->toAbsolute(array('test.php')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 73
Chris@0 74 $finder = $this->buildFinder();
Chris@0 75 $finder->name('test.ph*');
Chris@0 76 $finder->name('test.py');
Chris@0 77 $this->assertIterator($this->toAbsolute(array('test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 78
Chris@0 79 $finder = $this->buildFinder();
Chris@0 80 $finder->name('~^test~i');
Chris@0 81 $this->assertIterator($this->toAbsolute(array('test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 82
Chris@0 83 $finder = $this->buildFinder();
Chris@0 84 $finder->name('~\\.php$~i');
Chris@0 85 $this->assertIterator($this->toAbsolute(array('test.php')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 86
Chris@0 87 $finder = $this->buildFinder();
Chris@0 88 $finder->name('test.p{hp,y}');
Chris@0 89 $this->assertIterator($this->toAbsolute(array('test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 90 }
Chris@0 91
Chris@0 92 public function testNotName()
Chris@0 93 {
Chris@0 94 $finder = $this->buildFinder();
Chris@0 95 $this->assertSame($finder, $finder->notName('*.php'));
Chris@0 96 $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 97
Chris@0 98 $finder = $this->buildFinder();
Chris@0 99 $finder->notName('*.php');
Chris@0 100 $finder->notName('*.py');
Chris@0 101 $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 102
Chris@0 103 $finder = $this->buildFinder();
Chris@0 104 $finder->name('test.ph*');
Chris@0 105 $finder->name('test.py');
Chris@0 106 $finder->notName('*.php');
Chris@0 107 $finder->notName('*.py');
Chris@0 108 $this->assertIterator(array(), $finder->in(self::$tmpDir)->getIterator());
Chris@0 109
Chris@0 110 $finder = $this->buildFinder();
Chris@0 111 $finder->name('test.ph*');
Chris@0 112 $finder->name('test.py');
Chris@0 113 $finder->notName('*.p{hp,y}');
Chris@0 114 $this->assertIterator(array(), $finder->in(self::$tmpDir)->getIterator());
Chris@0 115 }
Chris@0 116
Chris@0 117 /**
Chris@0 118 * @dataProvider getRegexNameTestData
Chris@0 119 */
Chris@0 120 public function testRegexName($regex)
Chris@0 121 {
Chris@0 122 $finder = $this->buildFinder();
Chris@0 123 $finder->name($regex);
Chris@0 124 $this->assertIterator($this->toAbsolute(array('test.py', 'test.php')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 125 }
Chris@0 126
Chris@0 127 public function testSize()
Chris@0 128 {
Chris@0 129 $finder = $this->buildFinder();
Chris@0 130 $this->assertSame($finder, $finder->files()->size('< 1K')->size('> 500'));
Chris@0 131 $this->assertIterator($this->toAbsolute(array('test.php')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 132 }
Chris@0 133
Chris@0 134 public function testDate()
Chris@0 135 {
Chris@0 136 $finder = $this->buildFinder();
Chris@0 137 $this->assertSame($finder, $finder->files()->date('until last month'));
Chris@0 138 $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 139 }
Chris@0 140
Chris@0 141 public function testExclude()
Chris@0 142 {
Chris@0 143 $finder = $this->buildFinder();
Chris@0 144 $this->assertSame($finder, $finder->exclude('foo'));
Chris@0 145 $this->assertIterator($this->toAbsolute(array('test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 146 }
Chris@0 147
Chris@0 148 public function testIgnoreVCS()
Chris@0 149 {
Chris@0 150 $finder = $this->buildFinder();
Chris@0 151 $this->assertSame($finder, $finder->ignoreVCS(false)->ignoreDotFiles(false));
Chris@0 152 $this->assertIterator($this->toAbsolute(array('.git', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'toto/.git', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 153
Chris@0 154 $finder = $this->buildFinder();
Chris@0 155 $finder->ignoreVCS(false)->ignoreVCS(false)->ignoreDotFiles(false);
Chris@0 156 $this->assertIterator($this->toAbsolute(array('.git', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'toto/.git', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 157
Chris@0 158 $finder = $this->buildFinder();
Chris@0 159 $this->assertSame($finder, $finder->ignoreVCS(true)->ignoreDotFiles(false));
Chris@0 160 $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 161 }
Chris@0 162
Chris@0 163 public function testIgnoreDotFiles()
Chris@0 164 {
Chris@0 165 $finder = $this->buildFinder();
Chris@0 166 $this->assertSame($finder, $finder->ignoreDotFiles(false)->ignoreVCS(false));
Chris@0 167 $this->assertIterator($this->toAbsolute(array('.git', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'toto/.git', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 168
Chris@0 169 $finder = $this->buildFinder();
Chris@0 170 $finder->ignoreDotFiles(false)->ignoreDotFiles(false)->ignoreVCS(false);
Chris@0 171 $this->assertIterator($this->toAbsolute(array('.git', '.bar', '.foo', '.foo/.bar', '.foo/bar', 'foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'toto/.git', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 172
Chris@0 173 $finder = $this->buildFinder();
Chris@0 174 $this->assertSame($finder, $finder->ignoreDotFiles(true)->ignoreVCS(false));
Chris@0 175 $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 176 }
Chris@0 177
Chris@0 178 public function testSortByName()
Chris@0 179 {
Chris@0 180 $finder = $this->buildFinder();
Chris@0 181 $this->assertSame($finder, $finder->sortByName());
Chris@0 182 $this->assertIterator($this->toAbsolute(array('foo', 'foo bar', 'foo/bar.tmp', 'test.php', 'test.py', 'toto')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 183 }
Chris@0 184
Chris@0 185 public function testSortByType()
Chris@0 186 {
Chris@0 187 $finder = $this->buildFinder();
Chris@0 188 $this->assertSame($finder, $finder->sortByType());
Chris@0 189 $this->assertIterator($this->toAbsolute(array('foo', 'foo bar', 'toto', 'foo/bar.tmp', 'test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 190 }
Chris@0 191
Chris@0 192 public function testSortByAccessedTime()
Chris@0 193 {
Chris@0 194 $finder = $this->buildFinder();
Chris@0 195 $this->assertSame($finder, $finder->sortByAccessedTime());
Chris@0 196 $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php', 'toto', 'test.py', 'foo', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 197 }
Chris@0 198
Chris@0 199 public function testSortByChangedTime()
Chris@0 200 {
Chris@0 201 $finder = $this->buildFinder();
Chris@0 202 $this->assertSame($finder, $finder->sortByChangedTime());
Chris@0 203 $this->assertIterator($this->toAbsolute(array('toto', 'test.py', 'test.php', 'foo/bar.tmp', 'foo', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 204 }
Chris@0 205
Chris@0 206 public function testSortByModifiedTime()
Chris@0 207 {
Chris@0 208 $finder = $this->buildFinder();
Chris@0 209 $this->assertSame($finder, $finder->sortByModifiedTime());
Chris@0 210 $this->assertIterator($this->toAbsolute(array('foo/bar.tmp', 'test.php', 'toto', 'test.py', 'foo', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 211 }
Chris@0 212
Chris@0 213 public function testSort()
Chris@0 214 {
Chris@0 215 $finder = $this->buildFinder();
Chris@0 216 $this->assertSame($finder, $finder->sort(function (\SplFileInfo $a, \SplFileInfo $b) { return strcmp($a->getRealPath(), $b->getRealPath()); }));
Chris@0 217 $this->assertIterator($this->toAbsolute(array('foo', 'foo bar', 'foo/bar.tmp', 'test.php', 'test.py', 'toto')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 218 }
Chris@0 219
Chris@0 220 public function testFilter()
Chris@0 221 {
Chris@0 222 $finder = $this->buildFinder();
Chris@0 223 $this->assertSame($finder, $finder->filter(function (\SplFileInfo $f) { return false !== strpos($f, 'test'); }));
Chris@0 224 $this->assertIterator($this->toAbsolute(array('test.php', 'test.py')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 225 }
Chris@0 226
Chris@0 227 public function testFollowLinks()
Chris@0 228 {
Chris@0 229 if ('\\' == DIRECTORY_SEPARATOR) {
Chris@0 230 $this->markTestSkipped('symlinks are not supported on Windows');
Chris@0 231 }
Chris@0 232
Chris@0 233 $finder = $this->buildFinder();
Chris@0 234 $this->assertSame($finder, $finder->followLinks());
Chris@0 235 $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'test.php', 'test.py', 'toto', 'foo bar')), $finder->in(self::$tmpDir)->getIterator());
Chris@0 236 }
Chris@0 237
Chris@0 238 public function testIn()
Chris@0 239 {
Chris@0 240 $finder = $this->buildFinder();
Chris@0 241 $iterator = $finder->files()->name('*.php')->depth('< 1')->in(array(self::$tmpDir, __DIR__))->getIterator();
Chris@0 242
Chris@0 243 $expected = array(
Chris@0 244 self::$tmpDir.DIRECTORY_SEPARATOR.'test.php',
Chris@0 245 __DIR__.DIRECTORY_SEPARATOR.'FinderTest.php',
Chris@0 246 __DIR__.DIRECTORY_SEPARATOR.'GlobTest.php',
Chris@0 247 );
Chris@0 248
Chris@0 249 $this->assertIterator($expected, $iterator);
Chris@0 250 }
Chris@0 251
Chris@0 252 /**
Chris@0 253 * @expectedException \InvalidArgumentException
Chris@0 254 */
Chris@0 255 public function testInWithNonExistentDirectory()
Chris@0 256 {
Chris@0 257 $finder = new Finder();
Chris@0 258 $finder->in('foobar');
Chris@0 259 }
Chris@0 260
Chris@0 261 public function testInWithGlob()
Chris@0 262 {
Chris@0 263 $finder = $this->buildFinder();
Chris@0 264 $finder->in(array(__DIR__.'/Fixtures/*/B/C', __DIR__.'/Fixtures/*/*/B/C'))->getIterator();
Chris@0 265
Chris@0 266 $this->assertIterator($this->toAbsoluteFixtures(array('A/B/C/abc.dat', 'copy/A/B/C/abc.dat.copy')), $finder);
Chris@0 267 }
Chris@0 268
Chris@0 269 /**
Chris@0 270 * @expectedException \InvalidArgumentException
Chris@0 271 */
Chris@0 272 public function testInWithNonDirectoryGlob()
Chris@0 273 {
Chris@0 274 $finder = new Finder();
Chris@0 275 $finder->in(__DIR__.'/Fixtures/A/a*');
Chris@0 276 }
Chris@0 277
Chris@0 278 public function testInWithGlobBrace()
Chris@0 279 {
Chris@0 280 $finder = $this->buildFinder();
Chris@0 281 $finder->in(array(__DIR__.'/Fixtures/{A,copy/A}/B/C'))->getIterator();
Chris@0 282
Chris@0 283 $this->assertIterator($this->toAbsoluteFixtures(array('A/B/C/abc.dat', 'copy/A/B/C/abc.dat.copy')), $finder);
Chris@0 284 }
Chris@0 285
Chris@0 286 /**
Chris@0 287 * @expectedException \LogicException
Chris@0 288 */
Chris@0 289 public function testGetIteratorWithoutIn()
Chris@0 290 {
Chris@0 291 $finder = Finder::create();
Chris@0 292 $finder->getIterator();
Chris@0 293 }
Chris@0 294
Chris@0 295 public function testGetIterator()
Chris@0 296 {
Chris@0 297 $finder = $this->buildFinder();
Chris@0 298 $dirs = array();
Chris@0 299 foreach ($finder->directories()->in(self::$tmpDir) as $dir) {
Chris@0 300 $dirs[] = (string) $dir;
Chris@0 301 }
Chris@0 302
Chris@0 303 $expected = $this->toAbsolute(array('foo', 'toto'));
Chris@0 304
Chris@0 305 sort($dirs);
Chris@0 306 sort($expected);
Chris@0 307
Chris@0 308 $this->assertEquals($expected, $dirs, 'implements the \IteratorAggregate interface');
Chris@0 309
Chris@0 310 $finder = $this->buildFinder();
Chris@0 311 $this->assertEquals(2, iterator_count($finder->directories()->in(self::$tmpDir)), 'implements the \IteratorAggregate interface');
Chris@0 312
Chris@0 313 $finder = $this->buildFinder();
Chris@0 314 $a = iterator_to_array($finder->directories()->in(self::$tmpDir));
Chris@0 315 $a = array_values(array_map('strval', $a));
Chris@0 316 sort($a);
Chris@0 317 $this->assertEquals($expected, $a, 'implements the \IteratorAggregate interface');
Chris@0 318 }
Chris@0 319
Chris@0 320 public function testRelativePath()
Chris@0 321 {
Chris@0 322 $finder = $this->buildFinder()->in(self::$tmpDir);
Chris@0 323
Chris@0 324 $paths = array();
Chris@0 325
Chris@0 326 foreach ($finder as $file) {
Chris@0 327 $paths[] = $file->getRelativePath();
Chris@0 328 }
Chris@0 329
Chris@0 330 $ref = array('', '', '', '', 'foo', '');
Chris@0 331
Chris@0 332 sort($ref);
Chris@0 333 sort($paths);
Chris@0 334
Chris@0 335 $this->assertEquals($ref, $paths);
Chris@0 336 }
Chris@0 337
Chris@0 338 public function testRelativePathname()
Chris@0 339 {
Chris@0 340 $finder = $this->buildFinder()->in(self::$tmpDir)->sortByName();
Chris@0 341
Chris@0 342 $paths = array();
Chris@0 343
Chris@0 344 foreach ($finder as $file) {
Chris@0 345 $paths[] = $file->getRelativePathname();
Chris@0 346 }
Chris@0 347
Chris@0 348 $ref = array('test.php', 'toto', 'test.py', 'foo', 'foo'.DIRECTORY_SEPARATOR.'bar.tmp', 'foo bar');
Chris@0 349
Chris@0 350 sort($paths);
Chris@0 351 sort($ref);
Chris@0 352
Chris@0 353 $this->assertEquals($ref, $paths);
Chris@0 354 }
Chris@0 355
Chris@0 356 public function testAppendWithAFinder()
Chris@0 357 {
Chris@0 358 $finder = $this->buildFinder();
Chris@0 359 $finder->files()->in(self::$tmpDir.DIRECTORY_SEPARATOR.'foo');
Chris@0 360
Chris@0 361 $finder1 = $this->buildFinder();
Chris@0 362 $finder1->directories()->in(self::$tmpDir);
Chris@0 363
Chris@0 364 $finder = $finder->append($finder1);
Chris@0 365
Chris@0 366 $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'toto')), $finder->getIterator());
Chris@0 367 }
Chris@0 368
Chris@0 369 public function testAppendWithAnArray()
Chris@0 370 {
Chris@0 371 $finder = $this->buildFinder();
Chris@0 372 $finder->files()->in(self::$tmpDir.DIRECTORY_SEPARATOR.'foo');
Chris@0 373
Chris@0 374 $finder->append($this->toAbsolute(array('foo', 'toto')));
Chris@0 375
Chris@0 376 $this->assertIterator($this->toAbsolute(array('foo', 'foo/bar.tmp', 'toto')), $finder->getIterator());
Chris@0 377 }
Chris@0 378
Chris@0 379 public function testAppendReturnsAFinder()
Chris@0 380 {
Chris@0 381 $this->assertInstanceOf('Symfony\\Component\\Finder\\Finder', Finder::create()->append(array()));
Chris@0 382 }
Chris@0 383
Chris@0 384 public function testAppendDoesNotRequireIn()
Chris@0 385 {
Chris@0 386 $finder = $this->buildFinder();
Chris@0 387 $finder->in(self::$tmpDir.DIRECTORY_SEPARATOR.'foo');
Chris@0 388
Chris@0 389 $finder1 = Finder::create()->append($finder);
Chris@0 390
Chris@0 391 $this->assertIterator(iterator_to_array($finder->getIterator()), $finder1->getIterator());
Chris@0 392 }
Chris@0 393
Chris@0 394 public function testCountDirectories()
Chris@0 395 {
Chris@0 396 $directory = Finder::create()->directories()->in(self::$tmpDir);
Chris@0 397 $i = 0;
Chris@0 398
Chris@0 399 foreach ($directory as $dir) {
Chris@0 400 ++$i;
Chris@0 401 }
Chris@0 402
Chris@0 403 $this->assertCount($i, $directory);
Chris@0 404 }
Chris@0 405
Chris@0 406 public function testCountFiles()
Chris@0 407 {
Chris@0 408 $files = Finder::create()->files()->in(__DIR__.DIRECTORY_SEPARATOR.'Fixtures');
Chris@0 409 $i = 0;
Chris@0 410
Chris@0 411 foreach ($files as $file) {
Chris@0 412 ++$i;
Chris@0 413 }
Chris@0 414
Chris@0 415 $this->assertCount($i, $files);
Chris@0 416 }
Chris@0 417
Chris@0 418 /**
Chris@0 419 * @expectedException \LogicException
Chris@0 420 */
Chris@0 421 public function testCountWithoutIn()
Chris@0 422 {
Chris@0 423 $finder = Finder::create()->files();
Chris@0 424 count($finder);
Chris@0 425 }
Chris@0 426
Chris@12 427 public function testHasResults()
Chris@12 428 {
Chris@12 429 $finder = $this->buildFinder();
Chris@12 430 $finder->in(__DIR__);
Chris@12 431 $this->assertTrue($finder->hasResults());
Chris@12 432 }
Chris@12 433
Chris@12 434 public function testNoResults()
Chris@12 435 {
Chris@12 436 $finder = $this->buildFinder();
Chris@12 437 $finder->in(__DIR__)->name('DoesNotExist');
Chris@12 438 $this->assertFalse($finder->hasResults());
Chris@12 439 }
Chris@12 440
Chris@0 441 /**
Chris@0 442 * @dataProvider getContainsTestData
Chris@0 443 */
Chris@0 444 public function testContains($matchPatterns, $noMatchPatterns, $expected)
Chris@0 445 {
Chris@0 446 $finder = $this->buildFinder();
Chris@0 447 $finder->in(__DIR__.DIRECTORY_SEPARATOR.'Fixtures')
Chris@0 448 ->name('*.txt')->sortByName()
Chris@0 449 ->contains($matchPatterns)
Chris@0 450 ->notContains($noMatchPatterns);
Chris@0 451
Chris@0 452 $this->assertIterator($this->toAbsoluteFixtures($expected), $finder);
Chris@0 453 }
Chris@0 454
Chris@0 455 public function testContainsOnDirectory()
Chris@0 456 {
Chris@0 457 $finder = $this->buildFinder();
Chris@0 458 $finder->in(__DIR__)
Chris@0 459 ->directories()
Chris@0 460 ->name('Fixtures')
Chris@0 461 ->contains('abc');
Chris@0 462 $this->assertIterator(array(), $finder);
Chris@0 463 }
Chris@0 464
Chris@0 465 public function testNotContainsOnDirectory()
Chris@0 466 {
Chris@0 467 $finder = $this->buildFinder();
Chris@0 468 $finder->in(__DIR__)
Chris@0 469 ->directories()
Chris@0 470 ->name('Fixtures')
Chris@0 471 ->notContains('abc');
Chris@0 472 $this->assertIterator(array(), $finder);
Chris@0 473 }
Chris@0 474
Chris@0 475 /**
Chris@0 476 * Searching in multiple locations involves AppendIterator which does an unnecessary rewind which leaves FilterIterator
Chris@0 477 * with inner FilesystemIterator in an invalid state.
Chris@0 478 *
Chris@0 479 * @see https://bugs.php.net/68557
Chris@0 480 */
Chris@0 481 public function testMultipleLocations()
Chris@0 482 {
Chris@0 483 $locations = array(
Chris@0 484 self::$tmpDir.'/',
Chris@0 485 self::$tmpDir.'/toto/',
Chris@0 486 );
Chris@0 487
Chris@0 488 // it is expected that there are test.py test.php in the tmpDir
Chris@0 489 $finder = new Finder();
Chris@0 490 $finder->in($locations)
Chris@0 491 // the default flag IGNORE_DOT_FILES fixes the problem indirectly
Chris@0 492 // so we set it to false for better isolation
Chris@0 493 ->ignoreDotFiles(false)
Chris@0 494 ->depth('< 1')->name('test.php');
Chris@0 495
Chris@0 496 $this->assertCount(1, $finder);
Chris@0 497 }
Chris@0 498
Chris@0 499 /**
Chris@0 500 * Searching in multiple locations with sub directories involves
Chris@0 501 * AppendIterator which does an unnecessary rewind which leaves
Chris@0 502 * FilterIterator with inner FilesystemIterator in an invalid state.
Chris@0 503 *
Chris@0 504 * @see https://bugs.php.net/68557
Chris@0 505 */
Chris@0 506 public function testMultipleLocationsWithSubDirectories()
Chris@0 507 {
Chris@0 508 $locations = array(
Chris@0 509 __DIR__.'/Fixtures/one',
Chris@0 510 self::$tmpDir.DIRECTORY_SEPARATOR.'toto',
Chris@0 511 );
Chris@0 512
Chris@0 513 $finder = $this->buildFinder();
Chris@0 514 $finder->in($locations)->depth('< 10')->name('*.neon');
Chris@0 515
Chris@0 516 $expected = array(
Chris@0 517 __DIR__.'/Fixtures/one'.DIRECTORY_SEPARATOR.'b'.DIRECTORY_SEPARATOR.'c.neon',
Chris@0 518 __DIR__.'/Fixtures/one'.DIRECTORY_SEPARATOR.'b'.DIRECTORY_SEPARATOR.'d.neon',
Chris@0 519 );
Chris@0 520
Chris@0 521 $this->assertIterator($expected, $finder);
Chris@0 522 $this->assertIteratorInForeach($expected, $finder);
Chris@0 523 }
Chris@0 524
Chris@0 525 /**
Chris@0 526 * Iterator keys must be the file pathname.
Chris@0 527 */
Chris@0 528 public function testIteratorKeys()
Chris@0 529 {
Chris@0 530 $finder = $this->buildFinder()->in(self::$tmpDir);
Chris@0 531 foreach ($finder as $key => $file) {
Chris@0 532 $this->assertEquals($file->getPathname(), $key);
Chris@0 533 }
Chris@0 534 }
Chris@0 535
Chris@0 536 public function testRegexSpecialCharsLocationWithPathRestrictionContainingStartFlag()
Chris@0 537 {
Chris@0 538 $finder = $this->buildFinder();
Chris@0 539 $finder->in(__DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'r+e.gex[c]a(r)s')
Chris@0 540 ->path('/^dir/');
Chris@0 541
Chris@0 542 $expected = array('r+e.gex[c]a(r)s'.DIRECTORY_SEPARATOR.'dir', 'r+e.gex[c]a(r)s'.DIRECTORY_SEPARATOR.'dir'.DIRECTORY_SEPARATOR.'bar.dat');
Chris@0 543 $this->assertIterator($this->toAbsoluteFixtures($expected), $finder);
Chris@0 544 }
Chris@0 545
Chris@0 546 public function getContainsTestData()
Chris@0 547 {
Chris@0 548 return array(
Chris@0 549 array('', '', array()),
Chris@0 550 array('foo', 'bar', array()),
Chris@0 551 array('', 'foobar', array('dolor.txt', 'ipsum.txt', 'lorem.txt')),
Chris@0 552 array('lorem ipsum dolor sit amet', 'foobar', array('lorem.txt')),
Chris@0 553 array('sit', 'bar', array('dolor.txt', 'ipsum.txt', 'lorem.txt')),
Chris@0 554 array('dolor sit amet', '@^L@m', array('dolor.txt', 'ipsum.txt')),
Chris@0 555 array('/^lorem ipsum dolor sit amet$/m', 'foobar', array('lorem.txt')),
Chris@0 556 array('lorem', 'foobar', array('lorem.txt')),
Chris@0 557 array('', 'lorem', array('dolor.txt', 'ipsum.txt')),
Chris@0 558 array('ipsum dolor sit amet', '/^IPSUM/m', array('lorem.txt')),
Chris@0 559 );
Chris@0 560 }
Chris@0 561
Chris@0 562 public function getRegexNameTestData()
Chris@0 563 {
Chris@0 564 return array(
Chris@0 565 array('~.+\\.p.+~i'),
Chris@0 566 array('~t.*s~i'),
Chris@0 567 );
Chris@0 568 }
Chris@0 569
Chris@0 570 /**
Chris@0 571 * @dataProvider getTestPathData
Chris@0 572 */
Chris@0 573 public function testPath($matchPatterns, $noMatchPatterns, array $expected)
Chris@0 574 {
Chris@0 575 $finder = $this->buildFinder();
Chris@0 576 $finder->in(__DIR__.DIRECTORY_SEPARATOR.'Fixtures')
Chris@0 577 ->path($matchPatterns)
Chris@0 578 ->notPath($noMatchPatterns);
Chris@0 579
Chris@0 580 $this->assertIterator($this->toAbsoluteFixtures($expected), $finder);
Chris@0 581 }
Chris@0 582
Chris@0 583 public function getTestPathData()
Chris@0 584 {
Chris@0 585 return array(
Chris@0 586 array('', '', array()),
Chris@0 587 array('/^A\/B\/C/', '/C$/',
Chris@0 588 array('A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat'),
Chris@0 589 ),
Chris@0 590 array('/^A\/B/', 'foobar',
Chris@0 591 array(
Chris@0 592 'A'.DIRECTORY_SEPARATOR.'B',
Chris@0 593 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C',
Chris@0 594 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'ab.dat',
Chris@0 595 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat',
Chris@0 596 ),
Chris@0 597 ),
Chris@0 598 array('A/B/C', 'foobar',
Chris@0 599 array(
Chris@0 600 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C',
Chris@0 601 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat',
Chris@0 602 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C',
Chris@0 603 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat.copy',
Chris@0 604 ),
Chris@0 605 ),
Chris@0 606 array('A/B', 'foobar',
Chris@0 607 array(
Chris@0 608 //dirs
Chris@0 609 'A'.DIRECTORY_SEPARATOR.'B',
Chris@0 610 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C',
Chris@0 611 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B',
Chris@0 612 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C',
Chris@0 613 //files
Chris@0 614 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'ab.dat',
Chris@0 615 'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat',
Chris@0 616 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'ab.dat.copy',
Chris@0 617 'copy'.DIRECTORY_SEPARATOR.'A'.DIRECTORY_SEPARATOR.'B'.DIRECTORY_SEPARATOR.'C'.DIRECTORY_SEPARATOR.'abc.dat.copy',
Chris@0 618 ),
Chris@0 619 ),
Chris@0 620 array('/^with space\//', 'foobar',
Chris@0 621 array(
Chris@0 622 'with space'.DIRECTORY_SEPARATOR.'foo.txt',
Chris@0 623 ),
Chris@0 624 ),
Chris@0 625 );
Chris@0 626 }
Chris@0 627
Chris@0 628 public function testAccessDeniedException()
Chris@0 629 {
Chris@0 630 if ('\\' === DIRECTORY_SEPARATOR) {
Chris@0 631 $this->markTestSkipped('chmod is not supported on Windows');
Chris@0 632 }
Chris@0 633
Chris@0 634 $finder = $this->buildFinder();
Chris@0 635 $finder->files()->in(self::$tmpDir);
Chris@0 636
Chris@0 637 // make 'foo' directory non-readable
Chris@0 638 $testDir = self::$tmpDir.DIRECTORY_SEPARATOR.'foo';
Chris@0 639 chmod($testDir, 0333);
Chris@0 640
Chris@0 641 if (false === $couldRead = is_readable($testDir)) {
Chris@0 642 try {
Chris@0 643 $this->assertIterator($this->toAbsolute(array('foo bar', 'test.php', 'test.py')), $finder->getIterator());
Chris@0 644 $this->fail('Finder should throw an exception when opening a non-readable directory.');
Chris@0 645 } catch (\Exception $e) {
Chris@0 646 $expectedExceptionClass = 'Symfony\\Component\\Finder\\Exception\\AccessDeniedException';
Chris@0 647 if ($e instanceof \PHPUnit_Framework_ExpectationFailedException) {
Chris@0 648 $this->fail(sprintf("Expected exception:\n%s\nGot:\n%s\nWith comparison failure:\n%s", $expectedExceptionClass, 'PHPUnit_Framework_ExpectationFailedException', $e->getComparisonFailure()->getExpectedAsString()));
Chris@0 649 }
Chris@0 650
Chris@0 651 if ($e instanceof \PHPUnit\Framework\ExpectationFailedException) {
Chris@0 652 $this->fail(sprintf("Expected exception:\n%s\nGot:\n%s\nWith comparison failure:\n%s", $expectedExceptionClass, '\PHPUnit\Framework\ExpectationFailedException', $e->getComparisonFailure()->getExpectedAsString()));
Chris@0 653 }
Chris@0 654
Chris@0 655 $this->assertInstanceOf($expectedExceptionClass, $e);
Chris@0 656 }
Chris@0 657 }
Chris@0 658
Chris@0 659 // restore original permissions
Chris@0 660 chmod($testDir, 0777);
Chris@0 661 clearstatcache($testDir);
Chris@0 662
Chris@0 663 if ($couldRead) {
Chris@0 664 $this->markTestSkipped('could read test files while test requires unreadable');
Chris@0 665 }
Chris@0 666 }
Chris@0 667
Chris@0 668 public function testIgnoredAccessDeniedException()
Chris@0 669 {
Chris@0 670 if ('\\' === DIRECTORY_SEPARATOR) {
Chris@0 671 $this->markTestSkipped('chmod is not supported on Windows');
Chris@0 672 }
Chris@0 673
Chris@0 674 $finder = $this->buildFinder();
Chris@0 675 $finder->files()->ignoreUnreadableDirs()->in(self::$tmpDir);
Chris@0 676
Chris@0 677 // make 'foo' directory non-readable
Chris@0 678 $testDir = self::$tmpDir.DIRECTORY_SEPARATOR.'foo';
Chris@0 679 chmod($testDir, 0333);
Chris@0 680
Chris@0 681 if (false === ($couldRead = is_readable($testDir))) {
Chris@0 682 $this->assertIterator($this->toAbsolute(array('foo bar', 'test.php', 'test.py')), $finder->getIterator());
Chris@0 683 }
Chris@0 684
Chris@0 685 // restore original permissions
Chris@0 686 chmod($testDir, 0777);
Chris@0 687 clearstatcache($testDir);
Chris@0 688
Chris@0 689 if ($couldRead) {
Chris@0 690 $this->markTestSkipped('could read test files while test requires unreadable');
Chris@0 691 }
Chris@0 692 }
Chris@0 693
Chris@0 694 protected function buildFinder()
Chris@0 695 {
Chris@0 696 return Finder::create();
Chris@0 697 }
Chris@0 698 }