108 lines
2.7 KiB
PHP
108 lines
2.7 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tez\Utils\Tests\Enum;
|
|
|
|
use PHPUnit\Framework\TestCase;
|
|
use Tez\Utils\Enum\EnumTrait;
|
|
use Tez\Utils\Enum\StepTrait;
|
|
|
|
enum OrderStatus
|
|
{
|
|
use EnumTrait;
|
|
use StepTrait;
|
|
|
|
case Draft;
|
|
case Pending;
|
|
case Shipped;
|
|
case Delivered;
|
|
case Cancelled;
|
|
}
|
|
|
|
final class StepTraitTest extends TestCase
|
|
{
|
|
// -------------------------------------------------------------------------
|
|
// next()
|
|
// -------------------------------------------------------------------------
|
|
|
|
public function testNextReturnsFollowingCase(): void
|
|
{
|
|
self::assertSame(OrderStatus::Shipped, OrderStatus::Pending->next());
|
|
}
|
|
|
|
public function testNextFromFirstReturnsSecond(): void
|
|
{
|
|
self::assertSame(OrderStatus::Pending, OrderStatus::Draft->next());
|
|
}
|
|
|
|
public function testNextFromLastReturnsNull(): void
|
|
{
|
|
self::assertNull(OrderStatus::Cancelled->next());
|
|
}
|
|
|
|
public function testNextFromSecondToLastReturnsLast(): void
|
|
{
|
|
self::assertSame(OrderStatus::Cancelled, OrderStatus::Delivered->next());
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
// prev()
|
|
// -------------------------------------------------------------------------
|
|
|
|
public function testPrevReturnsPrecedingCase(): void
|
|
{
|
|
self::assertSame(OrderStatus::Draft, OrderStatus::Pending->prev());
|
|
}
|
|
|
|
public function testPrevFromLastReturnsPenultimate(): void
|
|
{
|
|
self::assertSame(OrderStatus::Delivered, OrderStatus::Cancelled->prev());
|
|
}
|
|
|
|
public function testPrevFromFirstReturnsNull(): void
|
|
{
|
|
self::assertNull(OrderStatus::Draft->prev());
|
|
}
|
|
|
|
public function testPrevFromSecondReturnsFirst(): void
|
|
{
|
|
self::assertSame(OrderStatus::Draft, OrderStatus::Pending->prev());
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Chaining
|
|
// -------------------------------------------------------------------------
|
|
|
|
public function testNextThenPrevReturnsSameCase(): void
|
|
{
|
|
$case = OrderStatus::Pending;
|
|
|
|
self::assertSame($case, $case->next()?->prev());
|
|
}
|
|
|
|
public function testPrevThenNextReturnsSameCase(): void
|
|
{
|
|
$case = OrderStatus::Shipped;
|
|
|
|
self::assertSame($case, $case->prev()?->next());
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Single-case enum edge case
|
|
// -------------------------------------------------------------------------
|
|
|
|
public function testNextAndPrevReturnNullForOnlyCase(): void
|
|
{
|
|
self::assertNull(Alone::Only->next());
|
|
self::assertNull(Alone::Only->prev());
|
|
}
|
|
}
|
|
|
|
enum Alone
|
|
{
|
|
use StepTrait;
|
|
|
|
case Only;
|
|
}
|