Jeroen De Dauw has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/72547


Change subject: Added DispatchingDeserializer
......................................................................

Added DispatchingDeserializer

Change-Id: I53802bf1ebb98887b6fe9d37974d732196d00cdb
---
A Tests/Phpunit/Deserializers/DispatchingDeserializerTest.php
A includes/Ask/Deserializers/DispatchingDeserializer.php
M includes/Ask/Serializers/DispatchingSerializer.php
3 files changed, 198 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Ask 
refs/changes/47/72547/1

diff --git a/Tests/Phpunit/Deserializers/DispatchingDeserializerTest.php 
b/Tests/Phpunit/Deserializers/DispatchingDeserializerTest.php
new file mode 100644
index 0000000..ac31d7a
--- /dev/null
+++ b/Tests/Phpunit/Deserializers/DispatchingDeserializerTest.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace Ask\Tests\Phpunit\Deserializers;
+
+use Ask\Deserializers\DispatchingDeserializer;
+
+/**
+ * @covers Ask\Deserializers\DispatchingDeserializer
+ *
+ * @file
+ * @since 0.1
+ *
+ * @ingroup Ask
+ * @group Ask
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < [email protected] >
+ */
+class DispatchingDeserializerTest extends \PHPUnit_Framework_TestCase {
+
+       public function testCanConstructWithNoDeserializers() {
+               new DispatchingDeserializer( array() );
+               $this->assertTrue( true );
+       }
+
+       public function testCannotConstructWithNonDeserializers() {
+               $this->setExpectedException( 'InvalidArgumentException' );
+               new DispatchingDeserializer( array( 42, 'foobar' ) );
+       }
+
+       public function testCanDeserialize() {
+               $subDeserializer = $this->getMock( 
'Ask\Deserializers\Deserializer' );
+
+               $subDeserializer->expects( $this->exactly( 4 ) )
+                       ->method( 'canDeserialize' )
+                       ->will( $this->returnCallback( function( $value ) {
+                               return $value > 9000;
+                       } ) );
+
+               $serializer = new DispatchingDeserializer( array( 
$subDeserializer ) );
+
+               $this->assertFalse( $serializer->canDeserialize( 0 ) );
+               $this->assertFalse( $serializer->canDeserialize( 42 ) );
+               $this->assertTrue( $serializer->canDeserialize( 9001 ) );
+               $this->assertTrue( $serializer->canDeserialize( 31337 ) );
+       }
+
+       public function testDeserializeWithDeserializableValues() {
+               $subDeserializer = $this->getMock( 
'Ask\Deserializers\Deserializer' );
+
+               $subDeserializer->expects( $this->any() )
+                       ->method( 'canDeserialize' )
+                       ->will( $this->returnValue( true ) );
+
+               $subDeserializer->expects( $this->any() )
+                       ->method( 'deserialize' )
+                       ->will( $this->returnValue( 42 ) );
+
+               $serializer = new DispatchingDeserializer( array( 
$subDeserializer ) );
+
+               $this->assertEquals( 42, $serializer->deserialize( 'foo' ) );
+               $this->assertEquals( 42, $serializer->deserialize( null ) );
+       }
+
+       public function testSerializeWithUnserializableValue() {
+               $subDeserializer = $this->getMock( 
'Ask\Deserializers\Deserializer' );
+
+               $subDeserializer->expects( $this->once() )
+                       ->method( 'canDeserialize' )
+                       ->will( $this->returnValue( false ) );
+
+               $serializer = new DispatchingDeSerializer( array( 
$subDeserializer ) );
+
+               $this->setExpectedException( 
'Ask\Deserializers\Exceptions\DeserializationException' );
+               $serializer->deserialize( 0 );
+       }
+
+       public function testSerializeWithMultipleSubSerializers() {
+               $subDeserializer0 = $this->getMock( 
'Ask\Deserializers\Deserializer' );
+
+               $subDeserializer0->expects( $this->any() )
+                       ->method( 'canDeserialize' )
+                       ->will( $this->returnValue( true ) );
+
+               $subDeserializer0->expects( $this->any() )
+                       ->method( 'deserialize' )
+                       ->will( $this->returnValue( 42 ) );
+
+               $subDeserializer1 = $this->getMock( 
'Ask\Deserializers\Deserializer' );
+
+               $subDeserializer1->expects( $this->any() )
+                       ->method( 'canDeserialize' )
+                       ->will( $this->returnValue( false ) );
+
+               $subDeserializer2 = clone $subDeserializer1;
+
+               $serializer = new DispatchingDeserializer( array( 
$subDeserializer1, $subDeserializer0, $subDeserializer2 ) );
+
+               $this->assertEquals( 42, $serializer->deserialize( 'foo' ) );
+       }
+
+       public function testAddSerializer() {
+               $deserializer = new DispatchingDeserializer( array() );
+
+               $subDeserializer = $this->getMock( 
'Ask\Deserializers\Deserializer' );
+
+               $subDeserializer->expects( $this->any() )
+                       ->method( 'canDeserialize' )
+                       ->will( $this->returnValue( true ) );
+
+               $subDeserializer->expects( $this->any() )
+                       ->method( 'deserialize' )
+                       ->will( $this->returnValue( 42 ) );
+
+               $deserializer->addDeserializer( $subDeserializer );
+
+               $this->assertEquals(
+                       42,
+                       $deserializer->deserialize( null )
+               );
+       }
+
+}
diff --git a/includes/Ask/Deserializers/DispatchingDeserializer.php 
b/includes/Ask/Deserializers/DispatchingDeserializer.php
new file mode 100644
index 0000000..ca9f0e5
--- /dev/null
+++ b/includes/Ask/Deserializers/DispatchingDeserializer.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Ask\Deserializers;
+
+use Ask\Deserializers\Exceptions\DeserializationException;
+use InvalidArgumentException;
+
+/**
+ * @since 0.1
+ *
+ * @file
+ * @ingroup Ask
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < [email protected] >
+ */
+class DispatchingDeserializer implements Deserializer {
+
+       /**
+        * @var Deserializer[]
+        */
+       protected $deserializers;
+
+       /**
+        * @param Deserializer[] $deserializers
+        */
+       public function __construct( array $deserializers ) {
+               $this->assertAreDeserializers( $deserializers );
+               $this->deserializers = $deserializers;
+       }
+
+       protected function assertAreDeserializers( array $deserializers ) {
+               foreach ( $deserializers as $deserializer ) {
+                       if ( !is_object( $deserializer ) || !( $deserializer 
instanceof Deserializer ) ) {
+                               throw new InvalidArgumentException( 'All 
$deserializers need to implement the Deserializer interface' );
+                       }
+               }
+       }
+
+       public function deserialize( $serialization ) {
+               foreach ( $this->deserializers as $deserializer ) {
+                       if ( $deserializer->canDeserialize( $serialization ) ) {
+                               return $deserializer->deserialize( 
$serialization );
+                       }
+               }
+
+               throw new DeserializationException(
+                       $this,
+                       'None of the deserializers can deserialize the provided 
serialization'
+               );
+       }
+
+       public function canDeserialize( $serialization ) {
+               foreach ( $this->deserializers as $deserializer ) {
+                       if ( $deserializer->canDeserialize( $serialization ) ) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * @since 0.1
+        *
+        * @param Deserializer $serializer
+        */
+       public function addDeserializer( Deserializer $serializer ) {
+               $this->deserializers[] = $serializer;
+       }
+
+}
diff --git a/includes/Ask/Serializers/DispatchingSerializer.php 
b/includes/Ask/Serializers/DispatchingSerializer.php
index 81cf71e..db9a9ac 100644
--- a/includes/Ask/Serializers/DispatchingSerializer.php
+++ b/includes/Ask/Serializers/DispatchingSerializer.php
@@ -21,6 +21,9 @@
         */
        protected $serializers;
 
+       /**
+        * @param Serializer[] $serializers
+        */
        public function __construct( array $serializers = array() ) {
                $this->assertAreSerializers( $serializers );
                $this->serializers = $serializers;

-- 
To view, visit https://gerrit.wikimedia.org/r/72547
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I53802bf1ebb98887b6fe9d37974d732196d00cdb
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Ask
Gerrit-Branch: master
Gerrit-Owner: Jeroen De Dauw <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to