Browse Source

make SortIterator work with Chronos instances

breno 2 years ago
parent
commit
bf7009744d

+ 4 - 1
src/Collection/Iterator/SortIterator.php

@@ -16,6 +16,8 @@ declare(strict_types=1);
  */
 namespace Cake\Collection\Iterator;
 
+use Cake\Chronos\Chronos;
+use Cake\Chronos\ChronosDate;
 use Cake\Collection\Collection;
 use DateTimeInterface;
 use Iterator;
@@ -75,7 +77,8 @@ class SortIterator extends Collection
         $results = [];
         foreach ($items as $key => $val) {
             $val = $callback($val);
-            if ($val instanceof DateTimeInterface && $type === SORT_NUMERIC) {
+            $isDateTime = $val instanceof DateTimeInterface || $val instanceof Chronos || $val instanceof ChronosDate;
+            if ($isDateTime && $type === SORT_NUMERIC) {
                 $val = $val->format('U');
             }
             $results[$key] = $val;

+ 36 - 0
tests/TestCase/Collection/Iterator/SortIteratorTest.php

@@ -17,6 +17,8 @@ declare(strict_types=1);
 namespace Cake\Test\TestCase\Collection\Iterator;
 
 use ArrayObject;
+use Cake\Chronos\Chronos;
+use Cake\Chronos\ChronosDate;
 use Cake\Collection\Iterator\SortIterator;
 use Cake\TestSuite\TestCase;
 use DateInterval;
@@ -223,4 +225,38 @@ class SortIteratorTest extends TestCase
         ];
         $this->assertEquals($expected, $sorted->toList());
     }
+
+    /**
+     * Tests sorting with Chronos datetime
+     */
+    public function testSortWithChronosDateTime(): void
+    {
+        $items = new ArrayObject([
+            new Chronos('2014-07-21'),
+            new ChronosDate('2015-06-30'),
+            new DateTimeImmutable('2013-08-12'),
+        ]);
+        $callback = fn ($d) => $d;
+        $sorted = new SortIterator($items, $callback);
+        $expected = [
+            new ChronosDate('2015-06-30'),
+            new Chronos('2014-07-21'),
+            new DateTimeImmutable('2013-08-12'),
+        ];
+        $this->assertEquals($expected, $sorted->toList());
+
+        $items = new ArrayObject([
+            new Chronos('2014-07-21'),
+            new ChronosDate('2015-06-30'),
+            new DateTimeImmutable('2013-08-12'),
+        ]);
+
+        $sorted = new SortIterator($items, $callback, SORT_ASC);
+        $expected = [
+            new DateTimeImmutable('2013-08-12'),
+            new Chronos('2014-07-21'),
+            new ChronosDate('2015-06-30'),
+        ];
+        $this->assertEquals($expected, $sorted->toList());
+    }
 }