summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/SemanticDataSerializerDeserializerRoundtripTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/SemanticDataSerializerDeserializerRoundtripTest.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/SemanticDataSerializerDeserializerRoundtripTest.php196
1 files changed, 196 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/SemanticDataSerializerDeserializerRoundtripTest.php b/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/SemanticDataSerializerDeserializerRoundtripTest.php
new file mode 100644
index 00000000..9e13a517
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/SemanticDataSerializerDeserializerRoundtripTest.php
@@ -0,0 +1,196 @@
+<?php
+
+namespace SMW\Tests\Integration;
+
+use ReflectionClass;
+use SMW\ApplicationFactory;
+use SMW\DataValueFactory;
+use SMW\Deserializers\SemanticDataDeserializer;
+use SMW\DIWikiPage;
+use SMW\SemanticData;
+use SMW\Serializers\SemanticDataSerializer;
+use SMW\Subobject;
+
+/**
+ * @group semantic-mediawiki
+ *
+ * @license GNU GPL v2+
+ * @since 1.9
+ *
+ * @author mwjames
+ */
+class SemanticDataSerializerDeserializerRoundtripTest extends \PHPUnit_Framework_TestCase {
+
+ private function newSerializerInstance() {
+ return new SemanticDataSerializer();
+ }
+
+ private function newDeserializerInstance() {
+ return new SemanticDataDeserializer();
+ }
+
+ /**
+ * @dataProvider semanticDataProvider
+ */
+ public function testSerializerDeserializerRountrip( $data ) {
+
+ $serialized = $this->newSerializerInstance()->serialize( $data );
+
+ $this->assertEquals(
+ $serialized,
+ $this->newSerializerInstance()->serialize( $this->newDeserializerInstance()->deserialize( $serialized ) )
+ );
+
+
+ $this->assertEquals(
+ $data->getHash(),
+ $this->newDeserializerInstance()->deserialize( $serialized )->getHash()
+ );
+ }
+
+ /**
+ * @dataProvider incompleteSubobjectDataProvider
+ */
+ public function testSerializerDeserializerWithIncompleteSubobjectData( $data ) {
+
+ $serialized = $this->newSerializerInstance()->serialize( $data );
+
+ $this->assertInstanceOf(
+ 'SMW\SemanticData',
+ $this->newDeserializerInstance()->deserialize( $serialized )
+ );
+ }
+
+ /**
+ * @dataProvider typeChangeSemanticDataProvider
+ */
+ public function testForcedTypeErrorDuringRountrip( $data, $type ) {
+
+ $serialized = $this->newSerializerInstance()->serialize( $data );
+ $deserializer = $this->newDeserializerInstance();
+
+ // Injects a different type to cause an error (this would normally
+ // happen when a property definition is changed such as page -> text
+ // etc.)
+ $reflector = new ReflectionClass( '\SMW\Deserializers\SemanticDataDeserializer' );
+ $property = $reflector->getProperty( 'dataItemTypeIdCache' );
+ $property->setAccessible( true );
+ $property->setValue( $deserializer, [ $type => 2 ] );
+
+ $deserialized = $deserializer->deserialize( $serialized );
+
+ $this->assertInstanceOf(
+ 'SMW\SemanticData',
+ $deserialized
+ );
+
+ $this->assertNotEmpty(
+ $deserialized->getErrors()
+ );
+ }
+
+ public function semanticDataProvider() {
+
+ ApplicationFactory::clear();
+
+ $provider = [];
+ $title = \Title::newFromText( __METHOD__ );
+
+ // #0 Empty container
+ $foo = new SemanticData( DIWikiPage::newFromTitle( $title ) );
+ $provider[] = [ $foo ];
+
+ // #1 Single entry
+ $foo = new SemanticData( DIWikiPage::newFromTitle( $title ) );
+ $foo->addDataValue( DataValueFactory::getInstance()->newDataValueByText( 'Has fooQuex', 'Bar' ) );
+ $provider[] = [ $foo ];
+
+ // #2 Single + single subobject entry
+ $foo = new SemanticData( DIWikiPage::newFromTitle( $title ) );
+ $foo->addDataValue( DataValueFactory::getInstance()->newDataValueByText( 'Has fooQuex', 'Bar' ) );
+
+ $subobject = new Subobject( $title );
+ $subobject->setSemanticData( 'Foo' );
+ $subobject->addDataValue( DataValueFactory::getInstance()->newDataValueByText( 'Has subobjects', 'Bam' ) );
+
+ $foo->addPropertyObjectValue( $subobject->getProperty(), $subobject->getContainer() );
+
+ $provider[] = [ $foo ];
+
+ // #3 Multiple entries
+ $foo = new SemanticData( DIWikiPage::newFromTitle( $title ) );
+ $foo->addDataValue( DataValueFactory::getInstance()->newDataValueByText( 'Has fooQuex', 'Bar' ) );
+ $foo->addDataValue( DataValueFactory::getInstance()->newDataValueByText( 'Has queez', 'Xeey' ) );
+
+ $subobject = new Subobject( $title );
+ $subobject->setSemanticData( 'Foo' );
+ $subobject->addDataValue( DataValueFactory::getInstance()->newDataValueByText( 'Has subobjects', 'Bam' ) );
+ $subobject->addDataValue( DataValueFactory::getInstance()->newDataValueByText( 'Has fooQuex', 'Fuz' ) );
+
+ $subobject->setSemanticData( 'Bar' );
+ $subobject->addDataValue( DataValueFactory::getInstance()->newDataValueByText( 'Has fooQuex', 'Fuz' ) );
+
+ $foo->addPropertyObjectValue( $subobject->getProperty(), $subobject->getContainer() );
+
+ $provider[] = [ $foo ];
+
+ return $provider;
+ }
+
+ /**
+ * @return array
+ */
+ public function incompleteSubobjectDataProvider() {
+
+ $provider = [];
+
+ $title = \Title::newFromText( __METHOD__ );
+
+ $subobject = new Subobject( $title );
+ $subobject->setSemanticData( 'Foo' );
+
+ $foo = new SemanticData( DIWikiPage::newFromTitle( $title ) );
+ $foo->addDataValue( DataValueFactory::getInstance()->newDataValueByText( 'Has fooQuex', 'Bar' ) );
+ $foo->addPropertyObjectValue( $subobject->getProperty(), $subobject->getSemanticData()->getSubject() );
+
+ $provider[] = [ $foo ];
+
+ return $provider;
+ }
+
+ /**
+ * @return array
+ */
+ public function typeChangeSemanticDataProvider() {
+
+ $provider = [];
+ $title = \Title::newFromText( __METHOD__ );
+
+ // #0 Single entry
+ $foo = new SemanticData( DIWikiPage::newFromTitle( $title ) );
+ $foo->addDataValue( DataValueFactory::getInstance()->newDataValueByText( 'Has fooQuex', 'Bar' ) );
+
+ $provider[] = [ $foo, 'Has_fooQuex' ];
+
+ // #1 Single subobject entry
+ $foo = new SemanticData( DIWikiPage::newFromTitle( $title ) );
+
+ $subobject = new Subobject( $title );
+ $subobject->setSemanticData( 'Foo' );
+ $subobject->addDataValue( DataValueFactory::getInstance()->newDataValueByText( 'Has fomQuex', 'Bam' ) );
+
+ $foo->addPropertyObjectValue( $subobject->getProperty(), $subobject->getContainer() );
+
+ $provider[] = [ $foo, 'Has_fomQuex' ];
+
+ // #2 Combined
+ $foo = new SemanticData( DIWikiPage::newFromTitle( $title ) );
+ $foo->addDataValue( DataValueFactory::getInstance()->newDataValueByText( 'Has fooQuex', 'Bar' ) );
+ $foo->addPropertyObjectValue( $subobject->getProperty(), $subobject->getContainer() );
+
+ $provider[] = [ $foo, 'Has_fomQuex' ];
+
+ return $provider;
+ }
+
+}