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