Initial commit

This commit is contained in:
Christopher Vagnetoft
2026-01-07 01:24:40 +01:00
commit 3d276060ec
14 changed files with 2258 additions and 0 deletions

18
tests/OrderState.php Normal file
View File

@@ -0,0 +1,18 @@
<?php
namespace NoccyLabs\StateMachine;
use NoccyLabs\StateMachine\StateTrait;
use NoccyLabs\StateMachine\Attributes\ValidTransitions;
enum OrderState {
use StateTrait;
#[ValidTransitions([OrderState::PROCESSING])]
case PENDING;
#[ValidTransitions([OrderState::PROCESSED,OrderState::PENDING])]
case PROCESSING;
#[ValidTransitions([OrderState::SHIPPED])]
case PROCESSED;
#[NoValidTransitions]
case SHIPPED;
}

View File

@@ -0,0 +1,26 @@
<?php
namespace NoccyLabs\StateMachine;
use NoccyLabs\StateMachine\StateMachineTrait;
use NoccyLabs\StateMachine\StateTrait;
use NoccyLabs\StateMachine\Attributes\ValidTransitions;
require_once __DIR__."/OrderState.php";
#[\PHPUnit\Framework\Attributes\CoversClass(StateMachineTrait::class)]
class StateMachineTraitTest extends \PHPUnit\Framework\TestCase
{
use StateMachineTrait;
private OrderState $state = OrderState::PENDING;
public function testValidTransitions()
{
$this->tryTransition($this->state, OrderState::PROCESSING);
$this->expectException(\Exception::class);
$this->tryTransition($this->state, OrderState::SHIPPED);
}
}

30
tests/StateTraitTest.php Normal file
View File

@@ -0,0 +1,30 @@
<?php
namespace NoccyLabs\StateMachine;
use NoccyLabs\StateMachine\StateMachineTrait;
use NoccyLabs\StateMachine\StateTrait;
use NoccyLabs\StateMachine\Attributes\ValidTransitions;
require_once __DIR__."/OrderState.php";
#[\PHPUnit\Framework\Attributes\CoversClass(StateTrait::class)]
class StateTraitTest extends \PHPUnit\Framework\TestCase
{
public function testValidTransitions()
{
$os = OrderState::PENDING;
$this->assertTrue($os->canTransitionTo(OrderState::PROCESSING));
$this->assertFalse($os->canTransitionTo(OrderState::PROCESSED));
$os = OrderState::PROCESSING;
$this->assertTrue($os->canTransitionTo(OrderState::PENDING));
$this->assertTrue($os->canTransitionTo(OrderState::PROCESSED));
$this->assertFalse($os->canTransitionTo(OrderState::SHIPPED));
$os = OrderState::SHIPPED;
$this->assertFalse($os->canTransitionTo(OrderState::PENDING));
$this->assertFalse($os->canTransitionTo(OrderState::PROCESSED));
$this->assertFalse($os->canTransitionTo(OrderState::SHIPPED));
}
}