Skip to content

Commit e6b35c1

Browse files
committed
Add tests for preserve_keys flag and fallback
1 parent 04328a0 commit e6b35c1

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

src/IterableToArray.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,25 @@ public static function convert(iterable $iterable, bool $preserve_keys = true):
4343
}
4444

4545
// Fallback for supposedly impossible scenario
46+
return self::fallbackConvert($iterable, $preserve_keys);
47+
}
48+
49+
/**
50+
* Fallback to convert an iterable into an array
51+
*
52+
* This should, theoretically, never be used. However, for the sake of forward-compatibility, it exists and is
53+
* tested.
54+
*
55+
* It is extracted into its own private method to allow for unit testing.
56+
*
57+
* @template T
58+
* @param iterable<T> $iterable
59+
* @param bool $preserve_keys
60+
* @return array<T>
61+
*/
62+
#[Pure]
63+
private static function fallbackConvert(iterable $iterable, bool $preserve_keys): array
64+
{
4665
$result = [];
4766
foreach ($iterable as $key => $value) {
4867
if ($preserve_keys) {

tests/IterableToArrayTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
namespace Navarr\Utils;
1111

1212
use ArrayIterator;
13+
use PHPStan\BetterReflection\Reflection\Adapter\ReflectionClass;
1314
use PHPUnit\Framework\TestCase;
15+
use ReflectionMethod;
1416

1517
class IterableToArrayTest extends TestCase
1618
{
@@ -41,4 +43,42 @@ public function testConvertWithIteratorDoesNotPreserveKeys()
4143
$this->assertEquals(['b'], $result);
4244
$this->assertNotEquals(['a' => 'b'], $result);
4345
}
46+
47+
/**
48+
* @dataProvider fallbackDataProvider
49+
*/
50+
public function testFallback(iterable $iterator, bool $preserve_keys, array $expectedResult)
51+
{
52+
$reflectionMethod = new ReflectionMethod(IterableToArray::class, 'fallbackConvert');
53+
$reflectionMethod->setAccessible(true);
54+
$result = $reflectionMethod->invoke(null, $iterator, $preserve_keys);
55+
56+
$this->assertEquals($expectedResult, $result);
57+
}
58+
59+
public function fallbackDataProvider(): array
60+
{
61+
return [
62+
'Array w/ keys' => [
63+
['a' => 'b'],
64+
true,
65+
['a' => 'b'],
66+
],
67+
'Array w/out keys' => [
68+
['a', 'b'],
69+
false,
70+
['a', 'b'],
71+
],
72+
'Iterable w/ keys' => [
73+
new ArrayIterator(['a' => 'b']),
74+
true,
75+
['a' => 'b'],
76+
],
77+
'Iterable w/out keys' => [
78+
new ArrayIterator(['a', 'b']),
79+
false,
80+
['a', 'b'],
81+
],
82+
];
83+
}
4484
}

0 commit comments

Comments
 (0)