]> git.mxchange.org Git - friendica.git/commitdiff
Add chunk method to BaseCollection
authorHypolite Petovan <hypolite@mrpetovan.com>
Fri, 29 Sep 2023 07:07:38 +0000 (03:07 -0400)
committerHypolite Petovan <hypolite@mrpetovan.com>
Tue, 3 Oct 2023 23:58:52 +0000 (19:58 -0400)
- Add test for BaseCollection->chunk

src/BaseCollection.php
tests/src/BaseCollectionTest.php [new file with mode: 0644]

index 97e772f168b330bd2706eefc208d576153d764f1..f2a64151d8bd5b2583a774d97a6bb5512155200d 100644 (file)
@@ -129,6 +129,24 @@ class BaseCollection extends \ArrayIterator
                return new static(array_reverse($this->getArrayCopy()), $this->getTotalCount());
        }
 
+       /**
+        * Split the collection in smaller collections no bigger than the provided length
+        *
+        * @param int $length
+        * @return static[]
+        */
+       public function chunk(int $length): array
+       {
+               if ($length < 1) {
+                       throw new \RangeException('BaseCollection->chunk(): Size parameter expected to be greater than 0');
+               }
+
+               return array_map(function ($array) {
+                       return new static($array);
+               }, array_chunk($this->getArrayCopy(), $length));
+       }
+
+
        /**
         * @inheritDoc
         *
diff --git a/tests/src/BaseCollectionTest.php b/tests/src/BaseCollectionTest.php
new file mode 100644 (file)
index 0000000..ce7fb46
--- /dev/null
@@ -0,0 +1,66 @@
+<?php
+/**
+ * @copyright Copyright (C) 2010-2023, the Friendica project
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Friendica\Test\src;
+
+use Friendica\BaseCollection;
+use Friendica\BaseEntity;
+use Mockery\Mock;
+use PHPUnit\Framework\TestCase;
+
+class BaseCollectionTest extends TestCase
+{
+       public function testChunk()
+       {
+               $entity1 = \Mockery::mock(BaseEntity::class);
+               $entity2 = \Mockery::mock(BaseEntity::class);
+               $entity3 = \Mockery::mock(BaseEntity::class);
+               $entity4 = \Mockery::mock(BaseEntity::class);
+
+               $collection = new BaseCollection([$entity1, $entity2]);
+
+               $this->assertEquals([new BaseCollection([$entity1]), new BaseCollection([$entity2])], $collection->chunk(1));
+               $this->assertEquals([new BaseCollection([$entity1, $entity2])], $collection->chunk(2));
+
+               $collection = new BaseCollection([$entity1, $entity2, $entity3]);
+
+               $this->assertEquals([new BaseCollection([$entity1]), new BaseCollection([$entity2]), new BaseCollection([$entity3])], $collection->chunk(1));
+               $this->assertEquals([new BaseCollection([$entity1, $entity2]), new BaseCollection([$entity3])], $collection->chunk(2));
+               $this->assertEquals([new BaseCollection([$entity1, $entity2, $entity3])], $collection->chunk(3));
+
+               $collection = new BaseCollection([$entity1, $entity2, $entity3, $entity4]);
+
+               $this->assertEquals([new BaseCollection([$entity1, $entity2]), new BaseCollection([$entity3, $entity4])], $collection->chunk(2));
+               $this->assertEquals([new BaseCollection([$entity1, $entity2, $entity3]), new BaseCollection([$entity4])], $collection->chunk(3));
+               $this->assertEquals([new BaseCollection([$entity1, $entity2, $entity3, $entity4])], $collection->chunk(4));
+       }
+
+       public function testChunkLengthException()
+       {
+               $this->expectException(\RangeException::class);
+
+               $entity1 = \Mockery::mock(BaseEntity::class);
+
+               $collection = new BaseCollection([$entity1]);
+
+               $collection->chunk(0);
+       }
+}