You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
244 lines
7.5 KiB
244 lines
7.5 KiB
12 months ago
|
<?php
|
||
|
declare(strict_types = 1);
|
||
|
|
||
|
namespace DASPRiD\EnumTest;
|
||
|
|
||
|
use DASPRiD\Enum\EnumMap;
|
||
|
use DASPRiD\Enum\Exception\ExpectationException;
|
||
|
use DASPRiD\Enum\Exception\IllegalArgumentException;
|
||
|
use PHPUnit\Framework\TestCase;
|
||
|
use stdClass;
|
||
|
|
||
|
final class EnumMapTest extends TestCase
|
||
|
{
|
||
|
public function testConstructionWithInvalidEnumType() : void
|
||
|
{
|
||
|
$this->expectException(IllegalArgumentException::class);
|
||
|
new EnumMap(stdClass::class, 'string', false);
|
||
|
}
|
||
|
|
||
|
public function testUnexpectedKeyType() : void
|
||
|
{
|
||
|
$this->expectException(ExpectationException::class);
|
||
|
$map = new EnumMap(WeekDay::class, 'string', false);
|
||
|
$map->expect(Planet::class, 'string', false);
|
||
|
}
|
||
|
|
||
|
public function testUnexpectedValueType() : void
|
||
|
{
|
||
|
$this->expectException(ExpectationException::class);
|
||
|
$map = new EnumMap(WeekDay::class, 'string', false);
|
||
|
$map->expect(WeekDay::class, 'int', false);
|
||
|
}
|
||
|
|
||
|
public function testUnexpectedNullableValueType() : void
|
||
|
{
|
||
|
$this->expectException(ExpectationException::class);
|
||
|
$map = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$map->expect(WeekDay::class, 'string', false);
|
||
|
}
|
||
|
|
||
|
public function testExpectedTypes() : void
|
||
|
{
|
||
|
$map = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$map->expect(WeekDay::class, 'string', true);
|
||
|
$this->addToAssertionCount(1);
|
||
|
}
|
||
|
|
||
|
public function testSize() : void
|
||
|
{
|
||
|
$map = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$this->assertSame(0, $map->size());
|
||
|
$map->put(WeekDay::MONDAY(), 'foo');
|
||
|
$this->assertSame(1, $map->size());
|
||
|
}
|
||
|
|
||
|
public function testContainsValue() : void
|
||
|
{
|
||
|
$map = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$this->assertFalse($map->containsValue('foo'));
|
||
|
$map->put(WeekDay::TUESDAY(), 'foo');
|
||
|
$this->assertTrue($map->containsValue('foo'));
|
||
|
$this->assertFalse($map->containsValue(null));
|
||
|
$map->put(WeekDay::WEDNESDAY(), null);
|
||
|
$this->assertTrue($map->containsValue(null));
|
||
|
}
|
||
|
|
||
|
public function testContainsKey() : void
|
||
|
{
|
||
|
$map = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$this->assertFalse($map->containsKey(WeekDay::TUESDAY()));
|
||
|
$map->put(WeekDay::TUESDAY(), 'foo');
|
||
|
$this->assertTrue($map->containsKey(WeekDay::TUESDAY()));
|
||
|
$map->put(WeekDay::WEDNESDAY(), null);
|
||
|
$this->assertTrue($map->containsKey(WeekDay::WEDNESDAY()));
|
||
|
}
|
||
|
|
||
|
public function testPutAndGet() : void
|
||
|
{
|
||
|
$map = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$map->put(WeekDay::TUESDAY(), 'foo');
|
||
|
$map->put(WeekDay::FRIDAY(), null);
|
||
|
$this->assertSame('foo', $map->get(WeekDay::TUESDAY()));
|
||
|
$this->assertSame(null, $map->get(WeekDay::WEDNESDAY()));
|
||
|
$this->assertSame(null, $map->get(WeekDay::FRIDAY()));
|
||
|
}
|
||
|
|
||
|
public function testPutInvalidKey() : void
|
||
|
{
|
||
|
$this->expectException(IllegalArgumentException::class);
|
||
|
$map = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$map->put(Planet::MARS(), 'foo');
|
||
|
}
|
||
|
|
||
|
public function invalidValues() : array
|
||
|
{
|
||
|
return [
|
||
|
['bool', null, false],
|
||
|
['bool', 0],
|
||
|
['boolean', 0],
|
||
|
['int', 2.4],
|
||
|
['integer', 5.3],
|
||
|
['float', 3],
|
||
|
['double', 7],
|
||
|
['string', 1],
|
||
|
['object', 1],
|
||
|
['array', 1],
|
||
|
[stdClass::class, 1],
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dataProvider invalidValues
|
||
|
* @param mixed $value
|
||
|
*/
|
||
|
public function testPutInvalidValue(string $valueType, $value, bool $allowNull = true) : void
|
||
|
{
|
||
|
$this->expectException(IllegalArgumentException::class);
|
||
|
$map = new EnumMap(WeekDay::class, $valueType, $allowNull);
|
||
|
$map->put(WeekDay::TUESDAY(), $value);
|
||
|
}
|
||
|
|
||
|
public function validValues() : array
|
||
|
{
|
||
|
return [
|
||
|
['bool', null],
|
||
|
['mixed', 'foo'],
|
||
|
['mixed', 1],
|
||
|
['mixed', new stdClass()],
|
||
|
['bool', true],
|
||
|
['boolean', false],
|
||
|
['int', 1],
|
||
|
['integer', 4],
|
||
|
['float', 2.5],
|
||
|
['double', 6.4],
|
||
|
['string', 'foo'],
|
||
|
['object', new stdClass()],
|
||
|
['array', ['foo']],
|
||
|
[stdClass::class, new stdClass()],
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @dataProvider validValues
|
||
|
* @param mixed $value
|
||
|
*/
|
||
|
public function testPutValidValue(string $valueType, $value, bool $allowNull = true) : void
|
||
|
{
|
||
|
$map = new EnumMap(WeekDay::class, $valueType, $allowNull);
|
||
|
$map->put(WeekDay::TUESDAY(), $value);
|
||
|
$this->addToAssertionCount(1);
|
||
|
}
|
||
|
|
||
|
public function testRemove() : void
|
||
|
{
|
||
|
$map = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$map->put(WeekDay::TUESDAY(), 'foo');
|
||
|
$map->remove(WeekDay::TUESDAY());
|
||
|
$map->remove(WeekDay::WEDNESDAY());
|
||
|
$this->assertSame(null, $map->get(WeekDay::TUESDAY()));
|
||
|
$this->assertSame(0, $map->size());
|
||
|
}
|
||
|
|
||
|
public function testClear() : void
|
||
|
{
|
||
|
$map = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$map->put(WeekDay::TUESDAY(), 'foo');
|
||
|
$map->clear();
|
||
|
$this->assertSame(null, $map->get(WeekDay::TUESDAY()));
|
||
|
$this->assertSame(0, $map->size());
|
||
|
}
|
||
|
|
||
|
public function testEqualsWithSameInstance() : void
|
||
|
{
|
||
|
$map = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$this->assertTrue($map->equals($map));
|
||
|
}
|
||
|
|
||
|
public function testEqualsWithDifferentSize() : void
|
||
|
{
|
||
|
$mapA = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$mapB = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$mapB->put(WeekDay::MONDAY(), 'foo');
|
||
|
|
||
|
$this->assertFalse($mapA->equals($mapB));
|
||
|
}
|
||
|
|
||
|
public function testEqualsWithDifferentValues() : void
|
||
|
{
|
||
|
$mapA = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$mapA->put(WeekDay::MONDAY(), 'foo');
|
||
|
$mapB = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$mapB->put(WeekDay::MONDAY(), 'bar');
|
||
|
|
||
|
$this->assertFalse($mapA->equals($mapB));
|
||
|
}
|
||
|
|
||
|
public function testEqualsWithDifferentConstants() : void
|
||
|
{
|
||
|
$mapA = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$mapA->put(WeekDay::MONDAY(), 'foo');
|
||
|
$mapB = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$mapB->put(WeekDay::TUESDAY(), 'foo');
|
||
|
|
||
|
$this->assertFalse($mapA->equals($mapB));
|
||
|
}
|
||
|
|
||
|
public function testValues() : void
|
||
|
{
|
||
|
$map = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$this->assertSame([], $map->values());
|
||
|
|
||
|
$map->put(WeekDay::FRIDAY(), 'foo');
|
||
|
$map->put(WeekDay::TUESDAY(), 'bar');
|
||
|
$map->put(WeekDay::SUNDAY(), null);
|
||
|
|
||
|
$this->assertSame(['bar', 'foo', null], $map->values());
|
||
|
}
|
||
|
|
||
|
public function testSerializeAndUnserialize() : void
|
||
|
{
|
||
|
$mapA = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$mapA->put(WeekDay::MONDAY(), 'foo');
|
||
|
$mapB = unserialize(serialize($mapA));
|
||
|
|
||
|
$this->assertTrue($mapA->equals($mapB));
|
||
|
}
|
||
|
|
||
|
public function testIterator() : void
|
||
|
{
|
||
|
$map = new EnumMap(WeekDay::class, 'string', true);
|
||
|
$map->put(WeekDay::FRIDAY(), 'foo');
|
||
|
$map->put(WeekDay::TUESDAY(), 'bar');
|
||
|
$map->put(WeekDay::SUNDAY(), null);
|
||
|
|
||
|
$result = [];
|
||
|
|
||
|
foreach ($map as $key => $value) {
|
||
|
$result[$key->ordinal()] = $value;
|
||
|
}
|
||
|
|
||
|
$this->assertSame([1 => 'bar', 4 => 'foo', 6 => null], $result);
|
||
|
}
|
||
|
}
|