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