122 lines
3.7 KiB
PHP
122 lines
3.7 KiB
PHP
|
<?php
|
||
|
declare(strict_types = 1);
|
||
|
|
||
|
namespace DASPRiD\EnumTest;
|
||
|
|
||
|
use DASPRiD\Enum\AbstractEnum;
|
||
|
use DASPRiD\Enum\Exception\CloneNotSupportedException;
|
||
|
use DASPRiD\Enum\Exception\IllegalArgumentException;
|
||
|
use DASPRiD\Enum\Exception\MismatchException;
|
||
|
use DASPRiD\Enum\Exception\SerializeNotSupportedException;
|
||
|
use DASPRiD\Enum\Exception\UnserializeNotSupportedException;
|
||
|
use PHPUnit\Framework\TestCase;
|
||
|
use ReflectionClass;
|
||
|
|
||
|
final class AbstractEnumTest extends TestCase
|
||
|
{
|
||
|
public function setUp(): void
|
||
|
{
|
||
|
$reflectionClass = new ReflectionClass(AbstractEnum::class);
|
||
|
|
||
|
$constantsProperty = $reflectionClass->getProperty('constants');
|
||
|
$constantsProperty->setAccessible(true);
|
||
|
$constantsProperty->setValue([]);
|
||
|
|
||
|
$valuesProperty = $reflectionClass->getProperty('values');
|
||
|
$valuesProperty->setAccessible(true);
|
||
|
$valuesProperty->setValue([]);
|
||
|
|
||
|
$allValuesLoadedProperty = $reflectionClass->getProperty('allValuesLoaded');
|
||
|
$allValuesLoadedProperty->setAccessible(true);
|
||
|
$allValuesLoadedProperty->setValue([]);
|
||
|
}
|
||
|
|
||
|
public function testToString() : void
|
||
|
{
|
||
|
$weekday = WeekDay::FRIDAY();
|
||
|
self::assertSame('FRIDAY', (string) $weekday);
|
||
|
}
|
||
|
|
||
|
public function testName() : void
|
||
|
{
|
||
|
$this->assertSame('WEDNESDAY', WeekDay::WEDNESDAY()->name());
|
||
|
}
|
||
|
|
||
|
public function testOrdinal() : void
|
||
|
{
|
||
|
$this->assertSame(2, WeekDay::WEDNESDAY()->ordinal());
|
||
|
}
|
||
|
|
||
|
public function testSameInstanceIsReturned() : void
|
||
|
{
|
||
|
self::assertSame(WeekDay::FRIDAY(), WeekDay::FRIDAY());
|
||
|
}
|
||
|
|
||
|
public static function testValueOf() : void
|
||
|
{
|
||
|
self::assertSame(WeekDay::FRIDAY(), WeekDay::valueOf('FRIDAY'));
|
||
|
}
|
||
|
|
||
|
public function testValueOfInvalidConstant() : void
|
||
|
{
|
||
|
$this->expectException(IllegalArgumentException::class);
|
||
|
WeekDay::valueOf('CATURDAY');
|
||
|
}
|
||
|
|
||
|
public function testExceptionOnCloneAttempt() : void
|
||
|
{
|
||
|
$this->expectException(CloneNotSupportedException::class);
|
||
|
clone WeekDay::FRIDAY();
|
||
|
}
|
||
|
|
||
|
public function testExceptionOnSerializeAttempt() : void
|
||
|
{
|
||
|
$this->expectException(SerializeNotSupportedException::class);
|
||
|
serialize(WeekDay::FRIDAY());
|
||
|
}
|
||
|
|
||
|
public function testExceptionOnUnserializeAttempt() : void
|
||
|
{
|
||
|
$this->expectException(UnserializeNotSupportedException::class);
|
||
|
unserialize('O:24:"DASPRiD\\EnumTest\\WeekDay":0:{}');
|
||
|
}
|
||
|
|
||
|
public function testReturnValueOfValuesIsSortedByOrdinal() : void
|
||
|
{
|
||
|
// Initialize some week days out of order
|
||
|
WeekDay::SATURDAY();
|
||
|
WeekDay::TUESDAY();
|
||
|
|
||
|
$ordinals = array_values(array_map(function (WeekDay $weekDay) : int {
|
||
|
return $weekDay->ordinal();
|
||
|
}, WeekDay::values()));
|
||
|
|
||
|
self::assertSame([0, 1, 2, 3, 4, 5, 6], $ordinals);
|
||
|
|
||
|
$cachedOrdinals = array_values(array_map(function (WeekDay $weekDay) : int {
|
||
|
return $weekDay->ordinal();
|
||
|
}, WeekDay::values()));
|
||
|
$this->assertSame($ordinals, $cachedOrdinals);
|
||
|
}
|
||
|
|
||
|
public function testCompareTo() : void
|
||
|
{
|
||
|
$this->assertSame(-4, WeekDay::WEDNESDAY()->compareTo(WeekDay::SUNDAY()));
|
||
|
$this->assertSame(4, WeekDay::SUNDAY()->compareTo(WeekDay::WEDNESDAY()));
|
||
|
$this->assertSame(0, WeekDay::WEDNESDAY()->compareTo(WeekDay::WEDNESDAY()));
|
||
|
}
|
||
|
|
||
|
public function testCompareToWrongEnum() : void
|
||
|
{
|
||
|
$this->expectException(MismatchException::class);
|
||
|
WeekDay::MONDAY()->compareTo(Planet::EARTH());
|
||
|
}
|
||
|
|
||
|
public function testParameterizedEnum() : void
|
||
|
{
|
||
|
$planet = Planet::EARTH();
|
||
|
$this->assertSame(5.976e+24, $planet->mass());
|
||
|
$this->assertSame(6.37814e6, $planet->radius());
|
||
|
}
|
||
|
}
|