gplx/mediawiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/SemanticDataSerializerDeser...

191 lines
5.9 KiB
PHP

<?php
namespace SMW\Tests\Integration;
use MediaWiki\MediaWikiServices;
use ReflectionClass;
use SMW\DataValueFactory;
use SMW\Deserializers\SemanticDataDeserializer;
use SMW\DIWikiPage;
use SMW\SemanticData;
use SMW\Serializers\SemanticDataSerializer;
use SMW\Services\ServicesFactory as ApplicationFactory;
use SMW\Subobject;
/**
* @group semantic-mediawiki
*
* @license GPL-2.0-or-later
* @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 = MediaWikiServices::getInstance()->getTitleFactory()->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 = MediaWikiServices::getInstance()->getTitleFactory()->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 = MediaWikiServices::getInstance()->getTitleFactory()->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;
}
}