From 1f9348d9a8466c4b1d99bceda0bb756b6ab1e212 Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Thu, 22 Sep 2016 21:16:43 +0200 Subject: [PATCH] PHP7 Decorator --- Structural/Decorator/Decorator.php | 31 --------- Structural/Decorator/JsonRenderer.php | 11 ++++ Structural/Decorator/README.rst | 16 ++--- Structural/Decorator/RenderInJson.php | 16 ----- Structural/Decorator/RenderInXml.php | 24 ------- Structural/Decorator/RenderableInterface.php | 8 +++ Structural/Decorator/RendererDecorator.php | 24 +++++++ Structural/Decorator/RendererInterface.php | 13 ---- Structural/Decorator/Tests/DecoratorTest.php | 68 +++----------------- Structural/Decorator/Webservice.php | 16 ++--- Structural/Decorator/XmlRenderer.php | 15 +++++ 11 files changed, 81 insertions(+), 161 deletions(-) delete mode 100644 Structural/Decorator/Decorator.php create mode 100644 Structural/Decorator/JsonRenderer.php delete mode 100644 Structural/Decorator/RenderInJson.php delete mode 100644 Structural/Decorator/RenderInXml.php create mode 100644 Structural/Decorator/RenderableInterface.php create mode 100644 Structural/Decorator/RendererDecorator.php delete mode 100644 Structural/Decorator/RendererInterface.php create mode 100644 Structural/Decorator/XmlRenderer.php diff --git a/Structural/Decorator/Decorator.php b/Structural/Decorator/Decorator.php deleted file mode 100644 index 0b8fde3..0000000 --- a/Structural/Decorator/Decorator.php +++ /dev/null @@ -1,31 +0,0 @@ -wrapped = $wrappable; - } -} diff --git a/Structural/Decorator/JsonRenderer.php b/Structural/Decorator/JsonRenderer.php new file mode 100644 index 0000000..9cc4066 --- /dev/null +++ b/Structural/Decorator/JsonRenderer.php @@ -0,0 +1,11 @@ +wrapped->renderData()); + } +} diff --git a/Structural/Decorator/README.rst b/Structural/Decorator/README.rst index b57a608..c854787 100644 --- a/Structural/Decorator/README.rst +++ b/Structural/Decorator/README.rst @@ -25,9 +25,9 @@ Code You can also find these code on `GitHub`_ -RendererInterface.php +RenderableInterface.php -.. literalinclude:: RendererInterface.php +.. literalinclude:: RenderableInterface.php :language: php :linenos: @@ -37,21 +37,21 @@ Webservice.php :language: php :linenos: -Decorator.php +RendererDecorator.php -.. literalinclude:: Decorator.php +.. literalinclude:: RendererDecorator.php :language: php :linenos: -RenderInXml.php +XmlRenderer.php -.. literalinclude:: RenderInXml.php +.. literalinclude:: XmlRenderer.php :language: php :linenos: -RenderInJson.php +JsonRenderer.php -.. literalinclude:: RenderInJson.php +.. literalinclude:: JsonRenderer.php :language: php :linenos: diff --git a/Structural/Decorator/RenderInJson.php b/Structural/Decorator/RenderInJson.php deleted file mode 100644 index e950e28..0000000 --- a/Structural/Decorator/RenderInJson.php +++ /dev/null @@ -1,16 +0,0 @@ -wrapped->renderData()); - } -} diff --git a/Structural/Decorator/RenderInXml.php b/Structural/Decorator/RenderInXml.php deleted file mode 100644 index 5afffda..0000000 --- a/Structural/Decorator/RenderInXml.php +++ /dev/null @@ -1,24 +0,0 @@ -wrapped->renderData() as $key => $val) { - $doc->appendChild($doc->createElement($key, $val)); - } - - return $doc->saveXML(); - } -} diff --git a/Structural/Decorator/RenderableInterface.php b/Structural/Decorator/RenderableInterface.php new file mode 100644 index 0000000..07e11d1 --- /dev/null +++ b/Structural/Decorator/RenderableInterface.php @@ -0,0 +1,8 @@ +wrapped = $renderer; + } +} diff --git a/Structural/Decorator/RendererInterface.php b/Structural/Decorator/RendererInterface.php deleted file mode 100644 index e7b95eb..0000000 --- a/Structural/Decorator/RendererInterface.php +++ /dev/null @@ -1,13 +0,0 @@ -service = new Decorator\Webservice(array('foo' => 'bar')); + $this->service = new Decorator\Webservice('foobar'); } public function testJsonDecorator() { - // Wrap service with a JSON decorator for renderers - $service = new Decorator\RenderInJson($this->service); - // Our Renderer will now output JSON instead of an array - $this->assertEquals('{"foo":"bar"}', $service->renderData()); + $service = new Decorator\JsonRenderer($this->service); + + $this->assertEquals('"foobar"', $service->renderData()); } public function testXmlDecorator() { - // Wrap service with a XML decorator for renderers - $service = new Decorator\RenderInXml($this->service); - // Our Renderer will now output XML instead of an array - $xml = 'bar'; - $this->assertXmlStringEqualsXmlString($xml, $service->renderData()); - } + $service = new Decorator\XmlRenderer($this->service); - /** - * The first key-point of this pattern :. - */ - public function testDecoratorMustImplementsRenderer() - { - $className = 'DesignPatterns\Structural\Decorator\Decorator'; - $interfaceName = 'DesignPatterns\Structural\Decorator\RendererInterface'; - $this->assertTrue(is_subclass_of($className, $interfaceName)); - } - - /** - * Second key-point of this pattern : the decorator is type-hinted. - * - * @expectedException \PHPUnit_Framework_Error - */ - public function testDecoratorTypeHinted() - { - if (version_compare(PHP_VERSION, '7', '>=')) { - throw new \PHPUnit_Framework_Error('Skip test for PHP 7', 0, __FILE__, __LINE__); - } - - $this->getMockForAbstractClass('DesignPatterns\Structural\Decorator\Decorator', array(new \stdClass())); - } - - /** - * Second key-point of this pattern : the decorator is type-hinted. - * - * @requires PHP 7 - * @expectedException TypeError - */ - public function testDecoratorTypeHintedForPhp7() - { - $this->getMockForAbstractClass('DesignPatterns\Structural\Decorator\Decorator', array(new \stdClass())); - } - - /** - * The decorator implements and wraps the same interface. - */ - public function testDecoratorOnlyAcceptRenderer() - { - $mock = $this->createMock('DesignPatterns\Structural\Decorator\RendererInterface'); - $dec = $this->getMockForAbstractClass('DesignPatterns\Structural\Decorator\Decorator', array($mock)); - $this->assertNotNull($dec); + $this->assertXmlStringEqualsXmlString('foobar', $service->renderData()); } } diff --git a/Structural/Decorator/Webservice.php b/Structural/Decorator/Webservice.php index 1151672..6715a22 100644 --- a/Structural/Decorator/Webservice.php +++ b/Structural/Decorator/Webservice.php @@ -2,25 +2,19 @@ namespace DesignPatterns\Structural\Decorator; -class Webservice implements RendererInterface +class Webservice implements RenderableInterface { /** - * @var mixed + * @var string */ - protected $data; + private $data; - /** - * @param mixed $data - */ - public function __construct($data) + public function __construct(string $data) { $this->data = $data; } - /** - * @return string - */ - public function renderData() + public function renderData(): string { return $this->data; } diff --git a/Structural/Decorator/XmlRenderer.php b/Structural/Decorator/XmlRenderer.php new file mode 100644 index 0000000..012da47 --- /dev/null +++ b/Structural/Decorator/XmlRenderer.php @@ -0,0 +1,15 @@ +wrapped->renderData(); + $doc->appendChild($doc->createElement('content', $data)); + + return $doc->saveXML(); + } +}