jenkins-bot has submitted this change and it was merged.

Change subject: Roundtrip tests for Lib\Serializers vs. DataModelSerialization
......................................................................


Roundtrip tests for Lib\Serializers vs. DataModelSerialization

This is still missing the options the new serializer needs to
support. But I would like to do this in separate patches.

Change-Id: I10ed6aef22f48f1a44efe9e79cc2d3a47889ca91
---
M composer.json
A lib/tests/phpunit/serializers/DataModelSerializationRoundtripTest.php
2 files changed, 220 insertions(+), 0 deletions(-)

Approvals:
  WikidataJenkins: Verified
  Jeroen De Dauw: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/composer.json b/composer.json
index 94b013b..a6254a8 100644
--- a/composer.json
+++ b/composer.json
@@ -37,6 +37,7 @@
 
                "wikibase/data-model": "~0.8.1",
                "wikibase/data-model-javascript": "~0.3.0",
+               "wikibase/data-model-serialization": "~1.0.1",
                "wikibase/internal-serialization": "~1.1",
                "wikibase/serialization-javascript": "~1.1.1",
 
diff --git 
a/lib/tests/phpunit/serializers/DataModelSerializationRoundtripTest.php 
b/lib/tests/phpunit/serializers/DataModelSerializationRoundtripTest.php
new file mode 100644
index 0000000..faa0142
--- /dev/null
+++ b/lib/tests/phpunit/serializers/DataModelSerializationRoundtripTest.php
@@ -0,0 +1,219 @@
+<?php
+
+namespace Tests\Wikibase\DataModel;
+
+use DataValues\Deserializers\DataValueDeserializer;
+use DataValues\Serializers\DataValueSerializer;
+use DataValues\StringValue;
+use Wikibase\DataModel\Claim\Claim;
+use Wikibase\DataModel\Entity\BasicEntityIdParser;
+use Wikibase\DataModel\Entity\Entity;
+use Wikibase\DataModel\Entity\Item;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Entity\Property;
+use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\DataModel\SiteLink;
+use Wikibase\DataModel\Snak\PropertyNoValueSnak;
+use Wikibase\DataModel\Snak\PropertySomeValueSnak;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\DataModel\Snak\Snak;
+use Wikibase\Lib\Serializers\SerializationOptions;
+
+/**
+ * @todo Add tests with $options->setIndexTags( true ).
+ *
+ * @licence GNU GPL v2+
+ * @author Thiemo Mättig
+ */
+class DataModelSerializationRoundtripTest extends \PHPUnit_Framework_TestCase {
+
+       private $guidCounter = 0;
+
+       /**
+        * @dataProvider entityProvider
+        */
+       public function testLegacySerializerRoundtrip( Entity $expectedEntity ) 
{
+               $legacySerializer = $this->getLegacySerializer( $expectedEntity 
);
+               $deserializer = $this->getDeserializer();
+
+               // Old encoder -> new decoder
+               $serialization = $legacySerializer->getSerialized( 
$expectedEntity );
+               $actualEntity = $deserializer->deserialize( $serialization );
+
+               $this->assertSymmetric( $expectedEntity, $actualEntity );
+       }
+
+       /**
+        * @dataProvider entityProvider
+        */
+       public function testLegacyUnserializerRoundtrip( Entity $expectedEntity 
) {
+               $legacyUnserializer = $this->getLegacyUnserializer( 
$expectedEntity );
+               $serializer = $this->getSerializer();
+
+               // New encoder -> old decoder
+               $serialization = $serializer->serialize( $expectedEntity );
+               $actualEntity = $legacyUnserializer->newFromSerialization( 
$serialization );
+
+               $this->assertSymmetric( $expectedEntity, $actualEntity );
+       }
+
+       /**
+        * @dataProvider entityProvider
+        */
+       public function testFullLegacySerializerLegacyUnserializerRoundtrip( 
Entity $expectedEntity ) {
+               $legacySerializer = $this->getLegacySerializer( $expectedEntity 
);
+               $legacyUnserializer = $this->getLegacyUnserializer( 
$expectedEntity );
+               $serializer = $this->getSerializer();
+               $deserializer = $this->getDeserializer();
+
+               // Old encoder -> new decoder -> new encoder -> old decoder
+               $serialization = $legacySerializer->getSerialized( 
$expectedEntity );
+               $entity = $deserializer->deserialize( $serialization );
+               $serialization = $serializer->serialize( $entity );
+               $actualEntity = $legacyUnserializer->newFromSerialization( 
$serialization );
+
+               $this->assertSymmetric( $expectedEntity, $actualEntity );
+       }
+
+       /**
+        * @dataProvider entityProvider
+        */
+       public function testFullLegacyUnserializerLegacySerializerRoundtrip( 
Entity $expectedEntity ) {
+               $legacySerializer = $this->getLegacySerializer( $expectedEntity 
);
+               $legacyUnserializer = $this->getLegacyUnserializer( 
$expectedEntity );
+               $serializer = $this->getSerializer();
+               $deserializer = $this->getDeserializer();
+
+               // New encoder -> old decoder -> old encoder -> new decoder
+               $serialization = $serializer->serialize( $expectedEntity );
+               $entity = $legacyUnserializer->newFromSerialization( 
$serialization );
+               $serialization = $legacySerializer->getSerialized( $entity );
+               $actualEntity = $deserializer->deserialize( $serialization );
+
+               $this->assertSymmetric( $expectedEntity, $actualEntity );
+       }
+
+       public function entityProvider() {
+               $tests = array();
+
+               foreach ( $this->getEntities() as $entity ) {
+                       $tests[] = array( $entity );
+               }
+
+               return $tests;
+       }
+
+       private function getEntities() {
+               $entities = array();
+
+               $property = Property::newFromType( 'string' );
+               $property->setId( new PropertyId( 'P1' ) );
+               $entities[] = $property;
+
+               $property = Property::newFromType( 'INVALID' );
+               $property->setId( new PropertyId( 'P999999999999' ) );
+               $entities[] = $property;
+
+               $item = Item::newEmpty();
+               $item->setId( new ItemId( 'Q1' ) );
+               $entities[] = $item;
+
+               $item = Item::newEmpty();
+               $item->setId( new ItemId( 'Q2' ) );
+               $this->addFingerprint( $item );
+               $entities[] = $item;
+
+               $item = Item::newEmpty();
+               $item->setId( new ItemId( 'Q3' ) );
+               $this->addSiteLinks( $item );
+               $entities[] = $item;
+
+               $item = Item::newEmpty();
+               $item->setId( new ItemId( 'Q4' ) );
+               $this->addClaims( $item );
+               $entities[] = $item;
+
+               return $entities;
+       }
+
+       private function addFingerprint( Entity $entity ) {
+               $entity->setLabel( 'de', 'de-label' );
+               $entity->setLabel( 'en', 'en-label' );
+
+               $entity->setDescription( 'de', 'de-description' );
+               $entity->setDescription( 'en', 'en-description' );
+
+               $entity->addAliases( 'de', array( 'de-alias1', 'de-alias2' ) );
+               $entity->addAliases( 'en', array( 'en-alias1', 'en-alias2' ) );
+       }
+
+       private function addSiteLinks( Item $item ) {
+               $badges = array(
+                       new ItemId( 'Q301' ),
+                       new ItemId( 'Q302' ),
+               );
+
+               $item->addSiteLink( new SiteLink( 'dewiki', 'dewiki-pagename' ) 
);
+               $item->addSiteLink( new SiteLink( 'enwiki', 'enwiki-pagename', 
$badges ) );
+       }
+
+       private function addClaims( Item $item ) {
+               $this->addClaim( $item, new PropertyNoValueSnak(
+                       new PropertyId( 'P401' )
+               ) );
+               $this->addClaim( $item, new PropertySomeValueSnak(
+                       new PropertyId( 'P402' )
+               ) );
+               $this->addClaim( $item, new PropertyValueSnak(
+                       new PropertyId( 'P403' ),
+                       new StringValue( 'stringvalue' )
+               ) );
+       }
+
+       private function addClaim( Item $item, Snak $mainSnak ) {
+               $claim = new Claim( $mainSnak );
+
+               $claim->setGuid( 'DataModelSerializationRoundtripTest$' . 
$this->guidCounter );
+               $this->guidCounter++;
+
+               $item->addClaim( $claim );
+       }
+
+       private function getLegacySerializer( Entity $entity ) {
+               $options = new SerializationOptions();
+
+               $legacySerializerFactory = new 
\Wikibase\Lib\Serializers\SerializerFactory();
+               $entityType = $entity->getType();
+               return $legacySerializerFactory->newSerializerForEntity( 
$entityType, $options );
+       }
+
+       private function getLegacyUnserializer( Entity $entity ) {
+               $options = new SerializationOptions();
+
+               $legacySerializerFactory = new 
\Wikibase\Lib\Serializers\SerializerFactory();
+               $entityType = $entity->getType();
+               return $legacySerializerFactory->newUnserializerForEntity( 
$entityType, $options );
+       }
+
+       private function getSerializer() {
+               $dataValueSerializer = new DataValueSerializer();
+               $serializerFactory = new \Wikibase\DataModel\SerializerFactory( 
$dataValueSerializer );
+               return $serializerFactory->newEntitySerializer();
+       }
+
+       private function getDeserializer() {
+               $dataValueDeserializer = new DataValueDeserializer( array(
+                       'string' => 'DataValues\StringValue',
+               ) );
+               $entityIdParser = new BasicEntityIdParser();
+               $deserializerFactory = new 
\Wikibase\DataModel\DeserializerFactory( $dataValueDeserializer, 
$entityIdParser );
+               return $deserializerFactory->newEntityDeserializer();
+       }
+
+       private function assertSymmetric( Entity $a, Entity $b ) {
+               // Comparing both directions looks awkward but is crucial to 
makes sure it's symmetric.
+               $this->assertTrue( $a->equals( $b ) );
+               $this->assertTrue( $b->equals( $a ) );
+       }
+
+}

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I10ed6aef22f48f1a44efe9e79cc2d3a47889ca91
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: Aude <[email protected]>
Gerrit-Reviewer: Jeroen De Dauw <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: Tobias Gritschacher <[email protected]>
Gerrit-Reviewer: WikidataJenkins <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to