From b965fa23a69825d8b703fb6f6778746e6d238e1f Mon Sep 17 00:00:00 2001 From: prophet777 Date: Sat, 3 May 2014 16:09:46 +0200 Subject: [PATCH] [WIP][Finder] Fix wrong implementation on sortable callback comparator --- .../Finder/Iterator/SortableIterator.php | 12 ++-- .../Tests/Iterator/SortableIteratorTest.php | 65 +++++++++++++++++++ 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Component/Finder/Iterator/SortableIterator.php b/src/Symfony/Component/Finder/Iterator/SortableIterator.php index 3bf5034d14..b32ac8d6df 100644 --- a/src/Symfony/Component/Finder/Iterator/SortableIterator.php +++ b/src/Symfony/Component/Finder/Iterator/SortableIterator.php @@ -30,8 +30,8 @@ class SortableIterator implements \IteratorAggregate /** * Constructor. * - * @param \Traversable $iterator The Iterator to filter - * @param int|callback $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback) + * @param \Traversable $iterator The Iterator to filter + * @param int|callable $sort The sort type (SORT_BY_NAME, SORT_BY_TYPE, or a PHP callback) * * @throws \InvalidArgumentException */ @@ -55,20 +55,20 @@ class SortableIterator implements \IteratorAggregate }; } elseif (self::SORT_BY_ACCESSED_TIME === $sort) { $this->sort = function ($a, $b) { - return ($a->getATime() > $b->getATime()); + return ($a->getATime() - $b->getATime()); }; } elseif (self::SORT_BY_CHANGED_TIME === $sort) { $this->sort = function ($a, $b) { - return ($a->getCTime() > $b->getCTime()); + return ($a->getCTime() - $b->getCTime()); }; } elseif (self::SORT_BY_MODIFIED_TIME === $sort) { $this->sort = function ($a, $b) { - return ($a->getMTime() > $b->getMTime()); + return ($a->getMTime() - $b->getMTime()); }; } elseif (is_callable($sort)) { $this->sort = $sort; } else { - throw new \InvalidArgumentException('The SortableIterator takes a PHP callback or a valid built-in sort algorithm as an argument.'); + throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.'); } } diff --git a/src/Symfony/Component/Finder/Tests/Iterator/SortableIteratorTest.php b/src/Symfony/Component/Finder/Tests/Iterator/SortableIteratorTest.php index 64e1e3e7b4..a2ca6ef376 100644 --- a/src/Symfony/Component/Finder/Tests/Iterator/SortableIteratorTest.php +++ b/src/Symfony/Component/Finder/Tests/Iterator/SortableIteratorTest.php @@ -30,6 +30,26 @@ class SortableIteratorTest extends RealIteratorTestCase */ public function testAccept($mode, $expected) { + if (!is_callable($mode)) { + switch ($mode) { + case SortableIterator::SORT_BY_ACCESSED_TIME : + 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); @@ -82,9 +102,54 @@ class SortableIteratorTest extends RealIteratorTestCase 'toto', ); + $sortByAccessedTime = array( + 'foo/bar.tmp', + 'test.php', + 'toto', + 'foo bar', + 'foo', + 'test.py', + '.foo', + '.foo/.bar', + '.foo/bar', + '.git', + '.bar' + ); + + $sortByChangedTime = array( + 'foo', + 'foo/bar.tmp', + 'toto', + '.git', + '.bar', + '.foo', + 'foo bar', + '.foo/.bar', + '.foo/bar', + 'test.php', + 'test.py' + ); + + $sortByModifiedTime = array( + 'foo/bar.tmp', + 'foo', + 'toto', + '.git', + '.bar', + '.foo', + 'foo bar', + '.foo/.bar', + '.foo/bar', + 'test.php', + 'test.py' + ); + return array( array(SortableIterator::SORT_BY_NAME, $this->toAbsolute($sortByName)), array(SortableIterator::SORT_BY_TYPE, $this->toAbsolute($sortByType)), + array(SortableIterator::SORT_BY_ACCESSED_TIME, $this->toAbsolute($sortByAccessedTime)), + array(SortableIterator::SORT_BY_CHANGED_TIME, $this->toAbsolute($sortByChangedTime)), + array(SortableIterator::SORT_BY_MODIFIED_TIME, $this->toAbsolute($sortByModifiedTime)), array(function (\SplFileInfo $a, \SplFileInfo $b) { return strcmp($a->getRealpath(), $b->getRealpath()); }, $this->toAbsolute($customComparison)), ); }