libreqr/vendor/dasprid/enum/test/EnumMapTest.php

244 lines
7.5 KiB
PHP

<?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);
}
}