Add Composer autoloading functions and PHPStan for testing

This commit is contained in:
Alex Cabal 2019-02-26 13:03:45 -06:00
parent e198c4db65
commit f5d7d4e02a
1518 changed files with 169063 additions and 30 deletions

View file

@ -0,0 +1,65 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Comparator;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Finder\Comparator\Comparator;
class ComparatorTest extends TestCase
{
public function testGetSetOperator()
{
$comparator = new Comparator();
try {
$comparator->setOperator('foo');
$this->fail('->setOperator() throws an \InvalidArgumentException if the operator is not valid.');
} catch (\Exception $e) {
$this->assertInstanceOf('InvalidArgumentException', $e, '->setOperator() throws an \InvalidArgumentException if the operator is not valid.');
}
$comparator = new Comparator();
$comparator->setOperator('>');
$this->assertEquals('>', $comparator->getOperator(), '->getOperator() returns the current operator');
}
public function testGetSetTarget()
{
$comparator = new Comparator();
$comparator->setTarget(8);
$this->assertEquals(8, $comparator->getTarget(), '->getTarget() returns the target');
}
/**
* @dataProvider getTestData
*/
public function testTest($operator, $target, $match, $noMatch)
{
$c = new Comparator();
$c->setOperator($operator);
$c->setTarget($target);
foreach ($match as $m) {
$this->assertTrue($c->test($m), '->test() tests a string against the expression');
}
foreach ($noMatch as $m) {
$this->assertFalse($c->test($m), '->test() tests a string against the expression');
}
}
public function getTestData()
{
return [
['<', '1000', ['500', '999'], ['1000', '1500']],
];
}
}

View file

@ -0,0 +1,64 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Comparator;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Finder\Comparator\DateComparator;
class DateComparatorTest extends TestCase
{
public function testConstructor()
{
try {
new DateComparator('foobar');
$this->fail('__construct() throws an \InvalidArgumentException if the test expression is not valid.');
} catch (\Exception $e) {
$this->assertInstanceOf('InvalidArgumentException', $e, '__construct() throws an \InvalidArgumentException if the test expression is not valid.');
}
try {
new DateComparator('');
$this->fail('__construct() throws an \InvalidArgumentException if the test expression is not valid.');
} catch (\Exception $e) {
$this->assertInstanceOf('InvalidArgumentException', $e, '__construct() throws an \InvalidArgumentException if the test expression is not valid.');
}
}
/**
* @dataProvider getTestData
*/
public function testTest($test, $match, $noMatch)
{
$c = new DateComparator($test);
foreach ($match as $m) {
$this->assertTrue($c->test($m), '->test() tests a string against the expression');
}
foreach ($noMatch as $m) {
$this->assertFalse($c->test($m), '->test() tests a string against the expression');
}
}
public function getTestData()
{
return [
['< 2005-10-10', [strtotime('2005-10-09')], [strtotime('2005-10-15')]],
['until 2005-10-10', [strtotime('2005-10-09')], [strtotime('2005-10-15')]],
['before 2005-10-10', [strtotime('2005-10-09')], [strtotime('2005-10-15')]],
['> 2005-10-10', [strtotime('2005-10-15')], [strtotime('2005-10-09')]],
['after 2005-10-10', [strtotime('2005-10-15')], [strtotime('2005-10-09')]],
['since 2005-10-10', [strtotime('2005-10-15')], [strtotime('2005-10-09')]],
['!= 2005-10-10', [strtotime('2005-10-11')], [strtotime('2005-10-10')]],
];
}
}

View file

@ -0,0 +1,108 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Comparator;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Finder\Comparator\NumberComparator;
class NumberComparatorTest extends TestCase
{
/**
* @dataProvider getConstructorTestData
*/
public function testConstructor($successes, $failures)
{
foreach ($successes as $s) {
new NumberComparator($s);
}
foreach ($failures as $f) {
try {
new NumberComparator($f);
$this->fail('__construct() throws an \InvalidArgumentException if the test expression is not valid.');
} catch (\Exception $e) {
$this->assertInstanceOf('InvalidArgumentException', $e, '__construct() throws an \InvalidArgumentException if the test expression is not valid.');
}
}
}
/**
* @dataProvider getTestData
*/
public function testTest($test, $match, $noMatch)
{
$c = new NumberComparator($test);
foreach ($match as $m) {
$this->assertTrue($c->test($m), '->test() tests a string against the expression');
}
foreach ($noMatch as $m) {
$this->assertFalse($c->test($m), '->test() tests a string against the expression');
}
}
public function getTestData()
{
return [
['< 1000', ['500', '999'], ['1000', '1500']],
['< 1K', ['500', '999'], ['1000', '1500']],
['<1k', ['500', '999'], ['1000', '1500']],
[' < 1 K ', ['500', '999'], ['1000', '1500']],
['<= 1K', ['1000'], ['1001']],
['> 1K', ['1001'], ['1000']],
['>= 1K', ['1000'], ['999']],
['< 1KI', ['500', '1023'], ['1024', '1500']],
['<= 1KI', ['1024'], ['1025']],
['> 1KI', ['1025'], ['1024']],
['>= 1KI', ['1024'], ['1023']],
['1KI', ['1024'], ['1023', '1025']],
['==1KI', ['1024'], ['1023', '1025']],
['==1m', ['1000000'], ['999999', '1000001']],
['==1mi', [1024 * 1024], [1024 * 1024 - 1, 1024 * 1024 + 1]],
['==1g', ['1000000000'], ['999999999', '1000000001']],
['==1gi', [1024 * 1024 * 1024], [1024 * 1024 * 1024 - 1, 1024 * 1024 * 1024 + 1]],
['!= 1000', ['500', '999'], ['1000']],
];
}
public function getConstructorTestData()
{
return [
[
[
'1', '0',
'3.5', '33.55', '123.456', '123456.78',
'.1', '.123',
'.0', '0.0',
'1.', '0.', '123.',
'==1', '!=1', '<1', '>1', '<=1', '>=1',
'==1k', '==1ki', '==1m', '==1mi', '==1g', '==1gi',
'1k', '1ki', '1m', '1mi', '1g', '1gi',
],
[
false, null, '',
' ', 'foobar',
'=1', '===1',
'0 . 1', '123 .45', '234. 567',
'..', '.0.', '0.1.2',
],
],
];
}
}

1280
vendor/symfony/finder/Tests/FinderTest.php vendored Normal file

File diff suppressed because it is too large Load diff

View file

View file

View file

View file

View file

View file

View file

View file

@ -0,0 +1,2 @@
dolor sit amet
DOLOR SIT AMET

View file

@ -0,0 +1,2 @@
ipsum dolor sit amet
IPSUM DOLOR SIT AMET

View file

@ -0,0 +1,2 @@
lorem ipsum dolor sit amet
LOREM IPSUM DOLOR SIT AMET

View file

@ -0,0 +1 @@
.dot

View file

View file

View file

View file

@ -0,0 +1,95 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Finder\Finder;
use Symfony\Component\Finder\Glob;
class GlobTest extends TestCase
{
public function testGlobToRegexDelimiters()
{
$this->assertEquals('#^(?=[^\.])\#$#', Glob::toRegex('#'));
$this->assertEquals('#^\.[^/]*$#', Glob::toRegex('.*'));
$this->assertEquals('^\.[^/]*$', Glob::toRegex('.*', true, true, ''));
$this->assertEquals('/^\.[^/]*$/', Glob::toRegex('.*', true, true, '/'));
}
public function testGlobToRegexDoubleStarStrictDots()
{
$finder = new Finder();
$finder->ignoreDotFiles(false);
$regex = Glob::toRegex('/**/*.neon');
foreach ($finder->in(__DIR__) as $k => $v) {
$k = str_replace(\DIRECTORY_SEPARATOR, '/', $k);
if (preg_match($regex, substr($k, \strlen(__DIR__)))) {
$match[] = substr($k, 10 + \strlen(__DIR__));
}
}
sort($match);
$this->assertSame(['one/b/c.neon', 'one/b/d.neon'], $match);
}
public function testGlobToRegexDoubleStarNonStrictDots()
{
$finder = new Finder();
$finder->ignoreDotFiles(false);
$regex = Glob::toRegex('/**/*.neon', false);
foreach ($finder->in(__DIR__) as $k => $v) {
$k = str_replace(\DIRECTORY_SEPARATOR, '/', $k);
if (preg_match($regex, substr($k, \strlen(__DIR__)))) {
$match[] = substr($k, 10 + \strlen(__DIR__));
}
}
sort($match);
$this->assertSame(['.dot/b/c.neon', '.dot/b/d.neon', 'one/b/c.neon', 'one/b/d.neon'], $match);
}
public function testGlobToRegexDoubleStarWithoutLeadingSlash()
{
$finder = new Finder();
$finder->ignoreDotFiles(false);
$regex = Glob::toRegex('/Fixtures/one/**');
foreach ($finder->in(__DIR__) as $k => $v) {
$k = str_replace(\DIRECTORY_SEPARATOR, '/', $k);
if (preg_match($regex, substr($k, \strlen(__DIR__)))) {
$match[] = substr($k, 10 + \strlen(__DIR__));
}
}
sort($match);
$this->assertSame(['one/a', 'one/b', 'one/b/c.neon', 'one/b/d.neon'], $match);
}
public function testGlobToRegexDoubleStarWithoutLeadingSlashNotStrictLeadingDot()
{
$finder = new Finder();
$finder->ignoreDotFiles(false);
$regex = Glob::toRegex('/Fixtures/one/**', false);
foreach ($finder->in(__DIR__) as $k => $v) {
$k = str_replace(\DIRECTORY_SEPARATOR, '/', $k);
if (preg_match($regex, substr($k, \strlen(__DIR__)))) {
$match[] = substr($k, 10 + \strlen(__DIR__));
}
}
sort($match);
$this->assertSame(['one/.dot', 'one/a', 'one/b', 'one/b/c.neon', 'one/b/d.neon'], $match);
}
}

View file

@ -0,0 +1,46 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use Symfony\Component\Finder\Iterator\CustomFilterIterator;
class CustomFilterIteratorTest extends IteratorTestCase
{
/**
* @expectedException \InvalidArgumentException
*/
public function testWithInvalidFilter()
{
new CustomFilterIterator(new Iterator(), ['foo']);
}
/**
* @dataProvider getAcceptData
*/
public function testAccept($filters, $expected)
{
$inner = new Iterator(['test.php', 'test.py', 'foo.php']);
$iterator = new CustomFilterIterator($inner, $filters);
$this->assertIterator($expected, $iterator);
}
public function getAcceptData()
{
return [
[[function (\SplFileInfo $fileinfo) { return false; }], []],
[[function (\SplFileInfo $fileinfo) { return 0 === strpos($fileinfo, 'test'); }], ['test.php', 'test.py']],
[['is_dir'], []],
];
}
}

View file

@ -0,0 +1,92 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use Symfony\Component\Finder\Comparator\DateComparator;
use Symfony\Component\Finder\Iterator\DateRangeFilterIterator;
class DateRangeFilterIteratorTest extends RealIteratorTestCase
{
/**
* @dataProvider getAcceptData
*/
public function testAccept($size, $expected)
{
$files = self::$files;
$files[] = self::toAbsolute('doesnotexist');
$inner = new Iterator($files);
$iterator = new DateRangeFilterIterator($inner, $size);
$this->assertIterator($expected, $iterator);
}
public function getAcceptData()
{
$since20YearsAgo = [
'.git',
'test.py',
'foo',
'foo/bar.tmp',
'test.php',
'toto',
'toto/.git',
'.bar',
'.foo',
'.foo/.bar',
'foo bar',
'.foo/bar',
'qux',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
];
$since2MonthsAgo = [
'.git',
'test.py',
'foo',
'toto',
'toto/.git',
'.bar',
'.foo',
'.foo/.bar',
'foo bar',
'.foo/bar',
'qux',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
];
$untilLastMonth = [
'foo/bar.tmp',
'test.php',
];
return [
[[new DateComparator('since 20 years ago')], $this->toAbsolute($since20YearsAgo)],
[[new DateComparator('since 2 months ago')], $this->toAbsolute($since2MonthsAgo)],
[[new DateComparator('until last month')], $this->toAbsolute($untilLastMonth)],
];
}
}

View file

@ -0,0 +1,103 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use Symfony\Component\Finder\Iterator\DepthRangeFilterIterator;
class DepthRangeFilterIteratorTest extends RealIteratorTestCase
{
/**
* @dataProvider getAcceptData
*/
public function testAccept($minDepth, $maxDepth, $expected)
{
$inner = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->toAbsolute(), \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST);
$iterator = new DepthRangeFilterIterator($inner, $minDepth, $maxDepth);
$actual = array_keys(iterator_to_array($iterator));
sort($expected);
sort($actual);
$this->assertEquals($expected, $actual);
}
public function getAcceptData()
{
$lessThan1 = [
'.git',
'test.py',
'foo',
'test.php',
'toto',
'.foo',
'.bar',
'foo bar',
'qux',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
];
$lessThanOrEqualTo1 = [
'.git',
'test.py',
'foo',
'foo/bar.tmp',
'test.php',
'toto',
'toto/.git',
'.foo',
'.foo/.bar',
'.bar',
'foo bar',
'.foo/bar',
'qux',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
];
$graterThanOrEqualTo1 = [
'toto/.git',
'foo/bar.tmp',
'.foo/.bar',
'.foo/bar',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
];
$equalTo1 = [
'toto/.git',
'foo/bar.tmp',
'.foo/.bar',
'.foo/bar',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
];
return [
[0, 0, $this->toAbsolute($lessThan1)],
[0, 1, $this->toAbsolute($lessThanOrEqualTo1)],
[2, PHP_INT_MAX, []],
[1, PHP_INT_MAX, $this->toAbsolute($graterThanOrEqualTo1)],
[1, 1, $this->toAbsolute($equalTo1)],
];
}
}

View file

@ -0,0 +1,107 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use Symfony\Component\Finder\Iterator\ExcludeDirectoryFilterIterator;
use Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator;
class ExcludeDirectoryFilterIteratorTest extends RealIteratorTestCase
{
/**
* @dataProvider getAcceptData
*/
public function testAccept($directories, $expected)
{
$inner = new \RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->toAbsolute(), \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST);
$iterator = new ExcludeDirectoryFilterIterator($inner, $directories);
$this->assertIterator($expected, $iterator);
}
public function getAcceptData()
{
$foo = [
'.bar',
'.foo',
'.foo/.bar',
'.foo/bar',
'.git',
'test.py',
'test.php',
'toto',
'toto/.git',
'foo bar',
'qux',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
];
$fo = [
'.bar',
'.foo',
'.foo/.bar',
'.foo/bar',
'.git',
'test.py',
'foo',
'foo/bar.tmp',
'test.php',
'toto',
'toto/.git',
'foo bar',
'qux',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
];
$toto = [
'.bar',
'.foo',
'.foo/.bar',
'.foo/bar',
'.git',
'test.py',
'foo',
'foo/bar.tmp',
'test.php',
'foo bar',
'qux',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
];
return [
[['foo'], $this->toAbsolute($foo)],
[['fo'], $this->toAbsolute($fo)],
[['toto/'], $this->toAbsolute($toto)],
];
}
}

View file

@ -0,0 +1,82 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use Symfony\Component\Finder\Iterator\FileTypeFilterIterator;
class FileTypeFilterIteratorTest extends RealIteratorTestCase
{
/**
* @dataProvider getAcceptData
*/
public function testAccept($mode, $expected)
{
$inner = new InnerTypeIterator(self::$files);
$iterator = new FileTypeFilterIterator($inner, $mode);
$this->assertIterator($expected, $iterator);
}
public function getAcceptData()
{
$onlyFiles = [
'test.py',
'foo/bar.tmp',
'test.php',
'.bar',
'.foo/.bar',
'.foo/bar',
'foo bar',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
];
$onlyDirectories = [
'.git',
'foo',
'qux',
'toto',
'toto/.git',
'.foo',
];
return [
[FileTypeFilterIterator::ONLY_FILES, $this->toAbsolute($onlyFiles)],
[FileTypeFilterIterator::ONLY_DIRECTORIES, $this->toAbsolute($onlyDirectories)],
];
}
}
class InnerTypeIterator extends \ArrayIterator
{
public function current()
{
return new \SplFileInfo(parent::current());
}
public function isFile()
{
return $this->current()->isFile();
}
public function isDir()
{
return $this->current()->isDir();
}
}

View file

@ -0,0 +1,86 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use Symfony\Component\Finder\Iterator\FilecontentFilterIterator;
class FilecontentFilterIteratorTest extends IteratorTestCase
{
public function testAccept()
{
$inner = new MockFileListIterator(['test.txt']);
$iterator = new FilecontentFilterIterator($inner, [], []);
$this->assertIterator(['test.txt'], $iterator);
}
public function testDirectory()
{
$inner = new MockFileListIterator(['directory']);
$iterator = new FilecontentFilterIterator($inner, ['directory'], []);
$this->assertIterator([], $iterator);
}
public function testUnreadableFile()
{
$inner = new MockFileListIterator(['file r-']);
$iterator = new FilecontentFilterIterator($inner, ['file r-'], []);
$this->assertIterator([], $iterator);
}
/**
* @dataProvider getTestFilterData
*/
public function testFilter(\Iterator $inner, array $matchPatterns, array $noMatchPatterns, array $resultArray)
{
$iterator = new FilecontentFilterIterator($inner, $matchPatterns, $noMatchPatterns);
$this->assertIterator($resultArray, $iterator);
}
public function getTestFilterData()
{
$inner = new MockFileListIterator();
$inner[] = new MockSplFileInfo([
'name' => 'a.txt',
'contents' => 'Lorem ipsum...',
'type' => 'file',
'mode' => 'r+', ]
);
$inner[] = new MockSplFileInfo([
'name' => 'b.yml',
'contents' => 'dolor sit...',
'type' => 'file',
'mode' => 'r+', ]
);
$inner[] = new MockSplFileInfo([
'name' => 'some/other/dir/third.php',
'contents' => 'amet...',
'type' => 'file',
'mode' => 'r+', ]
);
$inner[] = new MockSplFileInfo([
'name' => 'unreadable-file.txt',
'contents' => false,
'type' => 'file',
'mode' => 'r+', ]
);
return [
[$inner, ['.'], [], ['a.txt', 'b.yml', 'some/other/dir/third.php']],
[$inner, ['ipsum'], [], ['a.txt']],
[$inner, ['i', 'amet'], ['Lorem', 'amet'], ['b.yml']],
];
}
}

View file

@ -0,0 +1,54 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use Symfony\Component\Finder\Iterator\FilenameFilterIterator;
class FilenameFilterIteratorTest extends IteratorTestCase
{
/**
* @dataProvider getAcceptData
*/
public function testAccept($matchPatterns, $noMatchPatterns, $expected)
{
$inner = new InnerNameIterator(['test.php', 'test.py', 'foo.php']);
$iterator = new FilenameFilterIterator($inner, $matchPatterns, $noMatchPatterns);
$this->assertIterator($expected, $iterator);
}
public function getAcceptData()
{
return [
[['test.*'], [], ['test.php', 'test.py']],
[[], ['test.*'], ['foo.php']],
[['*.php'], ['test.*'], ['foo.php']],
[['*.php', '*.py'], ['foo.*'], ['test.php', 'test.py']],
[['/\.php$/'], [], ['test.php', 'foo.php']],
[[], ['/\.php$/'], ['test.py']],
];
}
}
class InnerNameIterator extends \ArrayIterator
{
public function current()
{
return new \SplFileInfo(parent::current());
}
public function getFilename()
{
return parent::current();
}
}

View file

@ -0,0 +1,55 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
class Iterator implements \Iterator
{
protected $values = [];
public function __construct(array $values = [])
{
foreach ($values as $value) {
$this->attach(new \SplFileInfo($value));
}
$this->rewind();
}
public function attach(\SplFileInfo $fileinfo)
{
$this->values[] = $fileinfo;
}
public function rewind()
{
reset($this->values);
}
public function valid()
{
return false !== $this->current();
}
public function next()
{
next($this->values);
}
public function current()
{
return current($this->values);
}
public function key()
{
return key($this->values);
}
}

View file

@ -0,0 +1,100 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use PHPUnit\Framework\TestCase;
abstract class IteratorTestCase extends TestCase
{
protected function assertIterator($expected, \Traversable $iterator)
{
// set iterator_to_array $use_key to false to avoid values merge
// this made FinderTest::testAppendWithAnArray() fail with GnuFinderAdapter
$values = array_map(function (\SplFileInfo $fileinfo) { return str_replace('/', \DIRECTORY_SEPARATOR, $fileinfo->getPathname()); }, iterator_to_array($iterator, false));
$expected = array_map(function ($path) { return str_replace('/', \DIRECTORY_SEPARATOR, $path); }, $expected);
sort($values);
sort($expected);
$this->assertEquals($expected, array_values($values));
}
protected function assertOrderedIterator($expected, \Traversable $iterator)
{
$values = array_map(function (\SplFileInfo $fileinfo) { return $fileinfo->getPathname(); }, iterator_to_array($iterator));
$this->assertEquals($expected, array_values($values));
}
/**
* Same as assertOrderedIterator, but checks the order of groups of
* array elements.
*
* @param array $expected - an array of arrays. For any two subarrays
* $a and $b such that $a goes before $b in $expected, the method
* asserts that any element of $a goes before any element of $b
* in the sequence generated by $iterator
* @param \Traversable $iterator
*/
protected function assertOrderedIteratorForGroups($expected, \Traversable $iterator)
{
$values = array_values(array_map(function (\SplFileInfo $fileinfo) { return $fileinfo->getPathname(); }, iterator_to_array($iterator)));
foreach ($expected as $subarray) {
$temp = [];
while (\count($values) && \count($temp) < \count($subarray)) {
$temp[] = array_shift($values);
}
sort($temp);
sort($subarray);
$this->assertEquals($subarray, $temp);
}
}
/**
* Same as IteratorTestCase::assertIterator with foreach usage.
*
* @param array $expected
* @param \Traversable $iterator
*/
protected function assertIteratorInForeach($expected, \Traversable $iterator)
{
$values = [];
foreach ($iterator as $file) {
$this->assertInstanceOf('Symfony\\Component\\Finder\\SplFileInfo', $file);
$values[] = $file->getPathname();
}
sort($values);
sort($expected);
$this->assertEquals($expected, array_values($values));
}
/**
* Same as IteratorTestCase::assertOrderedIterator with foreach usage.
*
* @param array $expected
* @param \Traversable $iterator
*/
protected function assertOrderedIteratorInForeach($expected, \Traversable $iterator)
{
$values = [];
foreach ($iterator as $file) {
$this->assertInstanceOf('Symfony\\Component\\Finder\\SplFileInfo', $file);
$values[] = $file->getPathname();
}
$this->assertEquals($expected, array_values($values));
}
}

View file

@ -0,0 +1,21 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
class MockFileListIterator extends \ArrayIterator
{
public function __construct(array $filesArray = [])
{
$files = array_map(function ($file) { return new MockSplFileInfo($file); }, $filesArray);
parent::__construct($files);
}
}

View file

@ -0,0 +1,132 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
class MockSplFileInfo extends \SplFileInfo
{
const TYPE_DIRECTORY = 1;
const TYPE_FILE = 2;
const TYPE_UNKNOWN = 3;
private $contents = null;
private $mode = null;
private $type = null;
private $relativePath = null;
private $relativePathname = null;
public function __construct($param)
{
if (\is_string($param)) {
parent::__construct($param);
} elseif (\is_array($param)) {
$defaults = [
'name' => 'file.txt',
'contents' => null,
'mode' => null,
'type' => null,
'relativePath' => null,
'relativePathname' => null,
];
$defaults = array_merge($defaults, $param);
parent::__construct($defaults['name']);
$this->setContents($defaults['contents']);
$this->setMode($defaults['mode']);
$this->setType($defaults['type']);
$this->setRelativePath($defaults['relativePath']);
$this->setRelativePathname($defaults['relativePathname']);
} else {
throw new \RuntimeException(sprintf('Incorrect parameter "%s"', $param));
}
}
public function isFile()
{
if (null === $this->type) {
return false !== strpos($this->getFilename(), 'file');
}
return self::TYPE_FILE === $this->type;
}
public function isDir()
{
if (null === $this->type) {
return false !== strpos($this->getFilename(), 'directory');
}
return self::TYPE_DIRECTORY === $this->type;
}
public function isReadable()
{
if (null === $this->mode) {
return preg_match('/r\+/', $this->getFilename());
}
return preg_match('/r\+/', $this->mode);
}
public function getContents()
{
return $this->contents;
}
public function setContents($contents)
{
$this->contents = $contents;
}
public function setMode($mode)
{
$this->mode = $mode;
}
public function setType($type)
{
if (\is_string($type)) {
switch ($type) {
case 'directory':
case 'd':
$this->type = self::TYPE_DIRECTORY;
break;
case 'file':
case 'f':
$this->type = self::TYPE_FILE;
break;
default:
$this->type = self::TYPE_UNKNOWN;
}
} else {
$this->type = $type;
}
}
public function setRelativePath($relativePath)
{
$this->relativePath = $relativePath;
}
public function setRelativePathname($relativePathname)
{
$this->relativePathname = $relativePathname;
}
public function getRelativePath()
{
return $this->relativePath;
}
public function getRelativePathname()
{
return $this->relativePathname;
}
}

View file

@ -0,0 +1,71 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Finder\Iterator\MultiplePcreFilterIterator;
class MultiplePcreFilterIteratorTest extends TestCase
{
/**
* @dataProvider getIsRegexFixtures
*/
public function testIsRegex($string, $isRegex, $message)
{
$testIterator = new TestMultiplePcreFilterIterator();
$this->assertEquals($isRegex, $testIterator->isRegex($string), $message);
}
public function getIsRegexFixtures()
{
return [
['foo', false, 'string'],
[' foo ', false, '" " is not a valid delimiter'],
['\\foo\\', false, '"\\" is not a valid delimiter'],
['afooa', false, '"a" is not a valid delimiter'],
['//', false, 'the pattern should contain at least 1 character'],
['/a/', true, 'valid regex'],
['/foo/', true, 'valid regex'],
['/foo/i', true, 'valid regex with a single modifier'],
['/foo/imsxu', true, 'valid regex with multiple modifiers'],
['#foo#', true, '"#" is a valid delimiter'],
['{foo}', true, '"{,}" is a valid delimiter pair'],
['[foo]', true, '"[,]" is a valid delimiter pair'],
['(foo)', true, '"(,)" is a valid delimiter pair'],
['<foo>', true, '"<,>" is a valid delimiter pair'],
['*foo.*', false, '"*" is not considered as a valid delimiter'],
['?foo.?', false, '"?" is not considered as a valid delimiter'],
];
}
}
class TestMultiplePcreFilterIterator extends MultiplePcreFilterIterator
{
public function __construct()
{
}
public function accept()
{
throw new \BadFunctionCallException('Not implemented');
}
public function isRegex($str)
{
return parent::isRegex($str);
}
public function toRegex($str)
{
throw new \BadFunctionCallException('Not implemented');
}
}

View file

@ -0,0 +1,82 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use Symfony\Component\Finder\Iterator\PathFilterIterator;
class PathFilterIteratorTest extends IteratorTestCase
{
/**
* @dataProvider getTestFilterData
*/
public function testFilter(\Iterator $inner, array $matchPatterns, array $noMatchPatterns, array $resultArray)
{
$iterator = new PathFilterIterator($inner, $matchPatterns, $noMatchPatterns);
$this->assertIterator($resultArray, $iterator);
}
public function getTestFilterData()
{
$inner = new MockFileListIterator();
//PATH: A/B/C/abc.dat
$inner[] = new MockSplFileInfo([
'name' => 'abc.dat',
'relativePathname' => 'A'.\DIRECTORY_SEPARATOR.'B'.\DIRECTORY_SEPARATOR.'C'.\DIRECTORY_SEPARATOR.'abc.dat',
]);
//PATH: A/B/ab.dat
$inner[] = new MockSplFileInfo([
'name' => 'ab.dat',
'relativePathname' => 'A'.\DIRECTORY_SEPARATOR.'B'.\DIRECTORY_SEPARATOR.'ab.dat',
]);
//PATH: A/a.dat
$inner[] = new MockSplFileInfo([
'name' => 'a.dat',
'relativePathname' => 'A'.\DIRECTORY_SEPARATOR.'a.dat',
]);
//PATH: copy/A/B/C/abc.dat.copy
$inner[] = new MockSplFileInfo([
'name' => 'abc.dat.copy',
'relativePathname' => 'copy'.\DIRECTORY_SEPARATOR.'A'.\DIRECTORY_SEPARATOR.'B'.\DIRECTORY_SEPARATOR.'C'.\DIRECTORY_SEPARATOR.'abc.dat',
]);
//PATH: copy/A/B/ab.dat.copy
$inner[] = new MockSplFileInfo([
'name' => 'ab.dat.copy',
'relativePathname' => 'copy'.\DIRECTORY_SEPARATOR.'A'.\DIRECTORY_SEPARATOR.'B'.\DIRECTORY_SEPARATOR.'ab.dat',
]);
//PATH: copy/A/a.dat.copy
$inner[] = new MockSplFileInfo([
'name' => 'a.dat.copy',
'relativePathname' => 'copy'.\DIRECTORY_SEPARATOR.'A'.\DIRECTORY_SEPARATOR.'a.dat',
]);
return [
[$inner, ['/^A/'], [], ['abc.dat', 'ab.dat', 'a.dat']],
[$inner, ['/^A\/B/'], [], ['abc.dat', 'ab.dat']],
[$inner, ['/^A\/B\/C/'], [], ['abc.dat']],
[$inner, ['/A\/B\/C/'], [], ['abc.dat', 'abc.dat.copy']],
[$inner, ['A'], [], ['abc.dat', 'ab.dat', 'a.dat', 'abc.dat.copy', 'ab.dat.copy', 'a.dat.copy']],
[$inner, ['A/B'], [], ['abc.dat', 'ab.dat', 'abc.dat.copy', 'ab.dat.copy']],
[$inner, ['A/B/C'], [], ['abc.dat', 'abc.dat.copy']],
[$inner, ['copy/A'], [], ['abc.dat.copy', 'ab.dat.copy', 'a.dat.copy']],
[$inner, ['copy/A/B'], [], ['abc.dat.copy', 'ab.dat.copy']],
[$inner, ['copy/A/B/C'], [], ['abc.dat.copy']],
];
}
}

View file

@ -0,0 +1,128 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
abstract class RealIteratorTestCase extends IteratorTestCase
{
protected static $tmpDir;
protected static $files;
public static function setUpBeforeClass()
{
self::$tmpDir = realpath(sys_get_temp_dir()).\DIRECTORY_SEPARATOR.'symfony_finder';
self::$files = [
'.git/',
'.foo/',
'.foo/.bar',
'.foo/bar',
'.bar',
'test.py',
'foo/',
'foo/bar.tmp',
'test.php',
'toto/',
'toto/.git/',
'foo bar',
'qux_0_1.php',
'qux_2_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux/',
'qux/baz_1_2.py',
'qux/baz_100_1.py',
];
self::$files = self::toAbsolute(self::$files);
if (is_dir(self::$tmpDir)) {
self::tearDownAfterClass();
} else {
mkdir(self::$tmpDir);
}
foreach (self::$files as $file) {
if (\DIRECTORY_SEPARATOR === $file[\strlen($file) - 1]) {
mkdir($file);
} else {
touch($file);
}
}
file_put_contents(self::toAbsolute('test.php'), str_repeat(' ', 800));
file_put_contents(self::toAbsolute('test.py'), str_repeat(' ', 2000));
touch(self::toAbsolute('foo/bar.tmp'), strtotime('2005-10-15'));
touch(self::toAbsolute('test.php'), strtotime('2005-10-15'));
}
public static function tearDownAfterClass()
{
$paths = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator(self::$tmpDir, \RecursiveDirectoryIterator::SKIP_DOTS),
\RecursiveIteratorIterator::CHILD_FIRST
);
foreach ($paths as $path) {
if ($path->isDir()) {
if ($path->isLink()) {
@unlink($path);
} else {
@rmdir($path);
}
} else {
@unlink($path);
}
}
}
protected static function toAbsolute($files = null)
{
/*
* Without the call to setUpBeforeClass() property can be null.
*/
if (!self::$tmpDir) {
self::$tmpDir = realpath(sys_get_temp_dir()).\DIRECTORY_SEPARATOR.'symfony_finder';
}
if (\is_array($files)) {
$f = [];
foreach ($files as $file) {
if (\is_array($file)) {
$f[] = self::toAbsolute($file);
} else {
$f[] = self::$tmpDir.\DIRECTORY_SEPARATOR.str_replace('/', \DIRECTORY_SEPARATOR, $file);
}
}
return $f;
}
if (\is_string($files)) {
return self::$tmpDir.\DIRECTORY_SEPARATOR.str_replace('/', \DIRECTORY_SEPARATOR, $files);
}
return self::$tmpDir;
}
protected static function toAbsoluteFixtures($files)
{
$f = [];
foreach ($files as $file) {
$f[] = realpath(__DIR__.\DIRECTORY_SEPARATOR.'..'.\DIRECTORY_SEPARATOR.'Fixtures'.\DIRECTORY_SEPARATOR.$file);
}
return $f;
}
}

View file

@ -0,0 +1,59 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use Symfony\Component\Finder\Iterator\RecursiveDirectoryIterator;
class RecursiveDirectoryIteratorTest extends IteratorTestCase
{
/**
* @group network
*/
public function testRewindOnFtp()
{
try {
$i = new RecursiveDirectoryIterator('ftp://speedtest.tele2.net/', \RecursiveDirectoryIterator::SKIP_DOTS);
} catch (\UnexpectedValueException $e) {
$this->markTestSkipped('Unsupported stream "ftp".');
}
$i->rewind();
$this->assertTrue(true);
}
/**
* @group network
*/
public function testSeekOnFtp()
{
try {
$i = new RecursiveDirectoryIterator('ftp://speedtest.tele2.net/', \RecursiveDirectoryIterator::SKIP_DOTS);
} catch (\UnexpectedValueException $e) {
$this->markTestSkipped('Unsupported stream "ftp".');
}
$contains = [
'ftp://speedtest.tele2.net'.\DIRECTORY_SEPARATOR.'1000GB.zip',
'ftp://speedtest.tele2.net'.\DIRECTORY_SEPARATOR.'100GB.zip',
];
$actual = [];
$i->seek(0);
$actual[] = $i->getPathname();
$i->seek(1);
$actual[] = $i->getPathname();
$this->assertEquals($contains, $actual);
}
}

View file

@ -0,0 +1,70 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use Symfony\Component\Finder\Comparator\NumberComparator;
use Symfony\Component\Finder\Iterator\SizeRangeFilterIterator;
class SizeRangeFilterIteratorTest extends RealIteratorTestCase
{
/**
* @dataProvider getAcceptData
*/
public function testAccept($size, $expected)
{
$inner = new InnerSizeIterator(self::$files);
$iterator = new SizeRangeFilterIterator($inner, $size);
$this->assertIterator($expected, $iterator);
}
public function getAcceptData()
{
$lessThan1KGreaterThan05K = [
'.foo',
'.git',
'foo',
'qux',
'test.php',
'toto',
'toto/.git',
];
return [
[[new NumberComparator('< 1K'), new NumberComparator('> 0.5K')], $this->toAbsolute($lessThan1KGreaterThan05K)],
];
}
}
class InnerSizeIterator extends \ArrayIterator
{
public function current()
{
return new \SplFileInfo(parent::current());
}
public function getFilename()
{
return parent::current();
}
public function isFile()
{
return $this->current()->isFile();
}
public function getSize()
{
return $this->current()->getSize();
}
}

View file

@ -0,0 +1,262 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Finder\Tests\Iterator;
use Symfony\Component\Finder\Iterator\SortableIterator;
class SortableIteratorTest extends RealIteratorTestCase
{
public function testConstructor()
{
try {
new SortableIterator(new Iterator([]), 'foobar');
$this->fail('__construct() throws an \InvalidArgumentException exception if the mode is not valid');
} catch (\Exception $e) {
$this->assertInstanceOf('InvalidArgumentException', $e, '__construct() throws an \InvalidArgumentException exception if the mode is not valid');
}
}
/**
* @dataProvider getAcceptData
*/
public function testAccept($mode, $expected)
{
if (!\is_callable($mode)) {
switch ($mode) {
case SortableIterator::SORT_BY_ACCESSED_TIME:
if ('\\' === \DIRECTORY_SEPARATOR) {
touch(self::toAbsolute('.git'));
} else {
file_get_contents(self::toAbsolute('.git'));
}
sleep(1);
file_get_contents(self::toAbsolute('.bar'));
break;
case SortableIterator::SORT_BY_CHANGED_TIME:
file_put_contents(self::toAbsolute('test.php'), 'foo');
sleep(1);
file_put_contents(self::toAbsolute('test.py'), 'foo');
break;
case SortableIterator::SORT_BY_MODIFIED_TIME:
file_put_contents(self::toAbsolute('test.php'), 'foo');
sleep(1);
file_put_contents(self::toAbsolute('test.py'), 'foo');
break;
}
}
$inner = new Iterator(self::$files);
$iterator = new SortableIterator($inner, $mode);
if (SortableIterator::SORT_BY_ACCESSED_TIME === $mode
|| SortableIterator::SORT_BY_CHANGED_TIME === $mode
|| SortableIterator::SORT_BY_MODIFIED_TIME === $mode
) {
if ('\\' === \DIRECTORY_SEPARATOR && SortableIterator::SORT_BY_MODIFIED_TIME !== $mode) {
$this->markTestSkipped('Sorting by atime or ctime is not supported on Windows');
}
$this->assertOrderedIteratorForGroups($expected, $iterator);
} else {
$this->assertOrderedIterator($expected, $iterator);
}
}
public function getAcceptData()
{
$sortByName = [
'.bar',
'.foo',
'.foo/.bar',
'.foo/bar',
'.git',
'foo',
'foo bar',
'foo/bar.tmp',
'qux',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
'test.php',
'test.py',
'toto',
'toto/.git',
];
$sortByType = [
'.foo',
'.git',
'foo',
'qux',
'toto',
'toto/.git',
'.bar',
'.foo/.bar',
'.foo/bar',
'foo bar',
'foo/bar.tmp',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
'test.php',
'test.py',
];
$sortByAccessedTime = [
// For these two files the access time was set to 2005-10-15
['foo/bar.tmp', 'test.php'],
// These files were created more or less at the same time
[
'.git',
'.foo',
'.foo/.bar',
'.foo/bar',
'test.py',
'foo',
'toto',
'toto/.git',
'foo bar',
'qux',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
],
// This file was accessed after sleeping for 1 sec
['.bar'],
];
$sortByChangedTime = [
[
'.git',
'.foo',
'.foo/.bar',
'.foo/bar',
'.bar',
'foo',
'foo/bar.tmp',
'toto',
'toto/.git',
'foo bar',
'qux',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
],
['test.php'],
['test.py'],
];
$sortByModifiedTime = [
[
'.git',
'.foo',
'.foo/.bar',
'.foo/bar',
'.bar',
'foo',
'foo/bar.tmp',
'toto',
'toto/.git',
'foo bar',
'qux',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
],
['test.php'],
['test.py'],
];
$sortByNameNatural = [
'.bar',
'.foo',
'.foo/.bar',
'.foo/bar',
'.git',
'foo',
'foo/bar.tmp',
'foo bar',
'qux',
'qux/baz_1_2.py',
'qux/baz_100_1.py',
'qux_0_1.php',
'qux_2_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_1000_1.php',
'qux_1002_0.php',
'test.php',
'test.py',
'toto',
'toto/.git',
];
$customComparison = [
'.bar',
'.foo',
'.foo/.bar',
'.foo/bar',
'.git',
'foo',
'foo bar',
'foo/bar.tmp',
'qux',
'qux/baz_100_1.py',
'qux/baz_1_2.py',
'qux_0_1.php',
'qux_1000_1.php',
'qux_1002_0.php',
'qux_10_2.php',
'qux_12_0.php',
'qux_2_0.php',
'test.php',
'test.py',
'toto',
'toto/.git',
];
return [
[SortableIterator::SORT_BY_NAME, $this->toAbsolute($sortByName)],
[SortableIterator::SORT_BY_TYPE, $this->toAbsolute($sortByType)],
[SortableIterator::SORT_BY_ACCESSED_TIME, $this->toAbsolute($sortByAccessedTime)],
[SortableIterator::SORT_BY_CHANGED_TIME, $this->toAbsolute($sortByChangedTime)],
[SortableIterator::SORT_BY_MODIFIED_TIME, $this->toAbsolute($sortByModifiedTime)],
[SortableIterator::SORT_BY_NAME_NATURAL, $this->toAbsolute($sortByNameNatural)],
[function (\SplFileInfo $a, \SplFileInfo $b) { return strcmp($a->getRealPath(), $b->getRealPath()); }, $this->toAbsolute($customComparison)],
];
}
}