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
