diff --git a/Behavioral/State/ContextOrder.php b/Behavioral/State/ContextOrder.php deleted file mode 100644 index b05537d..0000000 --- a/Behavioral/State/ContextOrder.php +++ /dev/null @@ -1,26 +0,0 @@ -done(); - } - - public function getStatus(): string - { - return static::$state->getStatus(); - } -} diff --git a/Behavioral/State/CreateOrder.php b/Behavioral/State/CreateOrder.php deleted file mode 100644 index 9c95b61..0000000 --- a/Behavioral/State/CreateOrder.php +++ /dev/null @@ -1,16 +0,0 @@ -setStatus('created'); - } - - protected function done() - { - static::$state = new ShippingOrder(); - } -} diff --git a/Behavioral/State/OrderContext.php b/Behavioral/State/OrderContext.php new file mode 100644 index 0000000..183ea98 --- /dev/null +++ b/Behavioral/State/OrderContext.php @@ -0,0 +1,34 @@ +state = new StateCreated(); + + return $order; + } + + public function setState(State $state) + { + $this->state = $state; + } + + public function proceedToNext() + { + $this->state->proceedToNext($this); + } + + public function toString() + { + return $this->state->toString(); + } +} diff --git a/Behavioral/State/README.rst b/Behavioral/State/README.rst index 85a6e76..dbbe5b0 100644 --- a/Behavioral/State/README.rst +++ b/Behavioral/State/README.rst @@ -20,27 +20,33 @@ Code You can also find this code on `GitHub`_ -ContextOrder.php +OrderContext.php -.. literalinclude:: ContextOrder.php +.. literalinclude:: OrderContext.php :language: php :linenos: -StateOrder.php +State.php -.. literalinclude:: StateOrder.php +.. literalinclude:: State.php :language: php :linenos: -ShippingOrder.php +StateCreated.php -.. literalinclude:: ShippingOrder.php +.. literalinclude:: StateCreated.php :language: php :linenos: -CreateOrder.php +StateShipped.php -.. literalinclude:: CreateOrder.php +.. literalinclude:: StateShipped.php + :language: php + :linenos: + +StateDone.php + +.. literalinclude:: StateDone.php :language: php :linenos: diff --git a/Behavioral/State/ShippingOrder.php b/Behavioral/State/ShippingOrder.php deleted file mode 100644 index 06032eb..0000000 --- a/Behavioral/State/ShippingOrder.php +++ /dev/null @@ -1,16 +0,0 @@ -setStatus('shipping'); - } - - protected function done() - { - $this->setStatus('completed'); - } -} diff --git a/Behavioral/State/State.php b/Behavioral/State/State.php new file mode 100644 index 0000000..a6d4218 --- /dev/null +++ b/Behavioral/State/State.php @@ -0,0 +1,10 @@ +setState(new StateShipped()); + } + + public function toString(): string + { + return 'created'; + } +} diff --git a/Behavioral/State/StateDone.php b/Behavioral/State/StateDone.php new file mode 100644 index 0000000..355aa7e --- /dev/null +++ b/Behavioral/State/StateDone.php @@ -0,0 +1,16 @@ +details['status'] = $status; - $this->details['updatedTime'] = time(); - } - - protected function getStatus(): string - { - return $this->details['status']; - } -} diff --git a/Behavioral/State/StateShipped.php b/Behavioral/State/StateShipped.php new file mode 100644 index 0000000..f891b00 --- /dev/null +++ b/Behavioral/State/StateShipped.php @@ -0,0 +1,16 @@ +setState(new StateDone()); + } + + public function toString(): string + { + return 'shipped'; + } +} diff --git a/Behavioral/State/Tests/StateTest.php b/Behavioral/State/Tests/StateTest.php index 834c02c..1bb36a7 100644 --- a/Behavioral/State/Tests/StateTest.php +++ b/Behavioral/State/Tests/StateTest.php @@ -2,30 +2,42 @@ namespace DesignPatterns\Behavioral\State\Tests; -use DesignPatterns\Behavioral\State\ContextOrder; -use DesignPatterns\Behavioral\State\CreateOrder; +use DesignPatterns\Behavioral\State\OrderContext; use PHPUnit\Framework\TestCase; class StateTest extends TestCase { - public function testCanShipCreatedOrder() + public function testIsCreatedWithStateCreated() { - $order = new CreateOrder(); - $contextOrder = new ContextOrder(); - $contextOrder->setState($order); - $contextOrder->done(); + $orderContext = OrderContext::create(); - $this->assertEquals('shipping', $contextOrder->getStatus()); + $this->assertEquals('created', $orderContext->toString()); } - public function testCanCompleteShippedOrder() + public function testCanProceedToStateShipped() { - $order = new CreateOrder(); - $contextOrder = new ContextOrder(); - $contextOrder->setState($order); - $contextOrder->done(); - $contextOrder->done(); + $contextOrder = OrderContext::create(); + $contextOrder->proceedToNext(); - $this->assertEquals('completed', $contextOrder->getStatus()); + $this->assertEquals('shipped', $contextOrder->toString()); + } + + public function testCanProceedToStateDone() + { + $contextOrder = OrderContext::create(); + $contextOrder->proceedToNext(); + $contextOrder->proceedToNext(); + + $this->assertEquals('done', $contextOrder->toString()); + } + + public function testStateDoneIsTheLastPossibleState() + { + $contextOrder = OrderContext::create(); + $contextOrder->proceedToNext(); + $contextOrder->proceedToNext(); + $contextOrder->proceedToNext(); + + $this->assertEquals('done', $contextOrder->toString()); } }