Skip to content

Commit

Permalink
refactor: associative array should use mixed for values, like generic…
Browse files Browse the repository at this point in the history
… array
  • Loading branch information
ramsey committed Dec 31, 2022
1 parent fbd3bc1 commit b084714
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 30 deletions.
3 changes: 1 addition & 2 deletions src/Map/AssociativeArrayMap.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@
/**
* `AssociativeArrayMap` represents a standard associative array object.
*
* @template T
* @extends AbstractMap<string, T>
* @extends AbstractMap<string, mixed>
*/
class AssociativeArrayMap extends AbstractMap
{
Expand Down
15 changes: 3 additions & 12 deletions tests/Map/AssociativeArrayMapTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ class AssociativeArrayMapTest extends TestCase
{
public function testOffsetSetWithEmptyOffsetThrowsException(): void
{
/** @var AssociativeArrayMap<int> $associativeArrayMapObject */
$associativeArrayMapObject = new AssociativeArrayMap();

$this->expectException(InvalidArgumentException::class);
Expand All @@ -36,7 +35,6 @@ public function testOffsetSetWithEmptyOffsetThrowsException(): void

public function testOffsetSetWithValidKey(): void
{
/** @var AssociativeArrayMap<int> $associativeArrayMapObject */
$associativeArrayMapObject = new AssociativeArrayMap();
$associativeArrayMapObject['foo'] = 123;

Expand All @@ -45,7 +43,6 @@ public function testOffsetSetWithValidKey(): void

public function testContainsKey(): void
{
/** @var AssociativeArrayMap<int | null> $associativeArrayMapObject */
$associativeArrayMapObject = new AssociativeArrayMap();
$associativeArrayMapObject['foo'] = null;
$associativeArrayMapObject['bar'] = 123;
Expand All @@ -58,7 +55,6 @@ public function testContainsKey(): void

public function testKeys(): void
{
/** @var AssociativeArrayMap<int | null> $associativeArrayMapObject */
$associativeArrayMapObject = new AssociativeArrayMap();

// empty map returns empty array
Expand All @@ -74,7 +70,6 @@ public function testContainsValue(): void
{
$foo = new Foo();

/** @var AssociativeArrayMap<int | Foo | null> $associativeArrayMapObject */
$associativeArrayMapObject = new AssociativeArrayMap();
$associativeArrayMapObject['foo'] = null;
$associativeArrayMapObject['bar'] = 123;
Expand All @@ -89,7 +84,6 @@ public function testContainsValue(): void
public function testGet(): void
{
$data = ['foo' => 123];
/** @var AssociativeArrayMap<int> $associativeArrayMapObject */
$associativeArrayMapObject = new AssociativeArrayMap($data);

$this->assertSame($data['foo'], $associativeArrayMapObject->get('foo'));
Expand All @@ -98,7 +92,6 @@ public function testGet(): void

public function testPut(): void
{
/** @var AssociativeArrayMap<int> $associativeArrayMapObject */
$associativeArrayMapObject = new AssociativeArrayMap();
$previousValue = $associativeArrayMapObject->put('foo', 123);

Expand All @@ -115,7 +108,6 @@ public function testPut(): void

public function testPutIfAbsent(): void
{
/** @var AssociativeArrayMap<int> $associativeArrayMapObject */
$associativeArrayMapObject = new AssociativeArrayMap();
$currentValue = $associativeArrayMapObject->putIfAbsent('foo', 123);

Expand All @@ -134,12 +126,12 @@ public function testRemove(): void
{
$data = ['foo' => 123];

/** @var AssociativeArrayMap<int> $associativeArrayMapObject */
$associativeArrayMapObject = new AssociativeArrayMap($data);
$previousValue = $associativeArrayMapObject->remove('foo');

$this->assertSame($data['foo'], $previousValue);

/** @var mixed $previousValue */
$previousValue = $associativeArrayMapObject->remove('foo');

$this->assertNull($previousValue);
Expand All @@ -150,7 +142,6 @@ public function testRemoveIf(): void
{
$data = ['foo' => 123];

/** @var AssociativeArrayMap<int> $associativeArrayMapObject */
$associativeArrayMapObject = new AssociativeArrayMap($data);

$this->assertFalse($associativeArrayMapObject->removeIf('foo', 456));
Expand All @@ -163,15 +154,16 @@ public function testReplace(): void
{
$data = ['foo' => 123];

/** @var AssociativeArrayMap<int> $associativeArrayMapObject */
$associativeArrayMapObject = new AssociativeArrayMap($data);

$previousValue = $associativeArrayMapObject->replace('foo', 456);

$this->assertSame($data['foo'], $previousValue);
$this->assertSame(456, $associativeArrayMapObject->get('foo'));

/** @var mixed $previousValue */
$previousValue = $associativeArrayMapObject->replace('bar', 789);

$this->assertNull($previousValue);
$this->assertFalse($associativeArrayMapObject->containsKey('bar'));
}
Expand All @@ -180,7 +172,6 @@ public function testReplaceIf(): void
{
$data = ['foo' => 123];

/** @var AssociativeArrayMap<int> $associativeArrayMapObject */
$associativeArrayMapObject = new AssociativeArrayMap($data);

$this->assertFalse($associativeArrayMapObject->replaceIf('foo', 456, 789));
Expand Down
32 changes: 16 additions & 16 deletions tests/types/maps.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,36 +13,36 @@
use Ramsey\Collection\Test\Mock\Person;
use function PHPStan\Testing\assertType;

/** @var AssociativeArrayMap<scalar> $associativeArray */
$associativeArray = new AssociativeArrayMap([
'foo' => 1,
'bar' => 'something',
'baz' => false,
'qux' => 23.3,
]);

assertType('Ramsey\Collection\Map\AssociativeArrayMap<bool|float|int|string>', $associativeArray);
assertType('Ramsey\Collection\Map\AssociativeArrayMap', $associativeArray);

assertType('bool|float|int|string', $associativeArray['foo']);
assertType('bool|float|int|string', $associativeArray['bar']);
assertType('bool|float|int|string', $associativeArray['baz']);
assertType('bool|float|int|string', $associativeArray['qux']);
assertType('bool|float|int|string', $associativeArray->offsetGet('foo'));
assertType('array<string, bool|float|int|string>', $associativeArray->toArray());
assertType('array<string, bool|float|int|string>', $associativeArray->__serialize());
assertType('Traversable<string, bool|float|int|string>', $associativeArray->getIterator());
assertType('mixed', $associativeArray['foo']);
assertType('mixed', $associativeArray['bar']);
assertType('mixed', $associativeArray['baz']);
assertType('mixed', $associativeArray['qux']);
assertType('mixed', $associativeArray->offsetGet('foo'));
assertType('array<string, mixed>', $associativeArray->toArray());
assertType('array<string, mixed>', $associativeArray->__serialize());
assertType('Traversable<string, mixed>', $associativeArray->getIterator());

/** @psalm-suppress MixedAssignment */
foreach ($associativeArray as $key => $value) {
assertType('string', $key);
assertType('bool|float|int|string', $value);
assertType('mixed', $value);
}

assertType('array<int, string>', $associativeArray->keys());
assertType('bool|float|int|string|null', $associativeArray->get('foo'));
assertType('bool|float|int|string|null', $associativeArray->put('foo', 'hello'));
assertType('bool|float|int|string|null', $associativeArray->putIfAbsent('foo', 'hello'));
assertType('bool|float|int|string|null', $associativeArray->remove('foo'));
assertType('bool|float|int|string|null', $associativeArray->replace('foo', 'hello'));
assertType('mixed', $associativeArray->get('foo'));
assertType('mixed', $associativeArray->put('foo', 'hello'));
assertType('mixed', $associativeArray->putIfAbsent('foo', 'hello'));
assertType('mixed', $associativeArray->remove('foo'));
assertType('mixed', $associativeArray->replace('foo', 'hello'));

$namedParameterMap = new NamedParameterMap(
[
Expand Down

0 comments on commit b084714

Please sign in to comment.