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