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