Browse Source

fix SortIterator for Chronos instances

breno 2 years ago
parent
commit
ec3152e820

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

@@ -18,6 +18,7 @@ namespace Cake\Collection\Iterator;
 
 use Cake\Chronos\Chronos;
 use Cake\Chronos\ChronosDate;
+use Cake\Chronos\ChronosTime;
 use Cake\Collection\Collection;
 use DateTimeInterface;
 use Iterator;
@@ -77,7 +78,11 @@ class SortIterator extends Collection
         $results = [];
         foreach ($items as $key => $val) {
             $val = $callback($val);
-            $isDateTime = $val instanceof DateTimeInterface || $val instanceof Chronos || $val instanceof ChronosDate;
+            $isDateTime =
+                $val instanceof DateTimeInterface ||
+                $val instanceof Chronos ||
+                $val instanceof ChronosDate ||
+                $val instanceof ChronosTime;
             if ($isDateTime && $type === SORT_NUMERIC) {
                 $val = $val->format('U');
             }

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

@@ -19,6 +19,7 @@ namespace Cake\Test\TestCase\Collection\Iterator;
 use ArrayObject;
 use Cake\Chronos\Chronos;
 use Cake\Chronos\ChronosDate;
+use Cake\Chronos\ChronosTime;
 use Cake\Collection\Iterator\SortIterator;
 use Cake\TestSuite\TestCase;
 use DateInterval;
@@ -259,4 +260,38 @@ class SortIteratorTest extends TestCase
         ];
         $this->assertEquals($expected, $sorted->toList());
     }
+
+    /**
+     * Tests sorting with Chronos time instances
+     */
+    public function testSortWithChronosTime(): void
+    {
+        $items = new ArrayObject([
+            new ChronosTime('12:00:00'),
+            new ChronosTime('10:00:01'),
+            new ChronosTime('11:00:00'),
+        ]);
+        $callback = fn ($d) => $d;
+        $sorted = new SortIterator($items, $callback);
+        $expected = [
+            new ChronosTime('12:00:00'),
+            new ChronosTime('11:00:00'),
+            new ChronosTime('10:00:01'),
+        ];
+        $this->assertEquals($expected, $sorted->toList());
+
+        $items = new ArrayObject([
+            new ChronosTime('12:00:00'),
+            new ChronosTime('10:00:01'),
+            new ChronosTime('11:00:00'),
+        ]);
+
+        $sorted = new SortIterator($items, $callback, SORT_ASC);
+        $expected = [
+            new ChronosTime('10:00:01'),
+            new ChronosTime('11:00:00'),
+            new ChronosTime('12:00:00'),
+        ];
+        $this->assertEquals($expected, $sorted->toList());
+    }
 }