testEnvironment = new TestEnvironment();
$propertySpecificationLookup = $this->getMockBuilder( '\SMW\Property\SpecificationLookup' )
->disableOriginalConstructor()
->getMock();
$this->semanticDataValidator = $this->testEnvironment->getUtilityFactory()->newValidatorFactory()->newSemanticDataValidator();
$this->testEnvironment->registerObject( 'PropertySpecificationLookup', $propertySpecificationLookup );
}
public function testCanConstruct() {
$title = $this->getMockBuilder( '\MediaWiki\Title\Title' )
->disableOriginalConstructor()
->getMock();
$this->assertInstanceOf(
'\SMW\Subobject',
new Subobject( $title )
);
}
public function testSetSemanticWithInvalidIdThrowsException() {
$instance = new Subobject( MediaWikiServices::getInstance()->getTitleFactory()->newFromText( __METHOD__ ) );
$this->expectException( 'InvalidArgumentException' );
$instance->setSemanticData( '' );
}
public function testSetEmptySemanticData() {
$instance = new Subobject( MediaWikiServices::getInstance()->getTitleFactory()->newFromText( __METHOD__ ) );
$instance->setEmptyContainerForId( 'Foo' );
$this->assertInstanceOf(
'\Title',
$instance->getTitle()
);
$this->assertInstanceOf(
'\SMW\DataModel\ContainerSemanticData',
$instance->getSemanticData()
);
$this->assertEquals(
$instance->getSubobjectId(),
$instance->getSemanticData()->getSubject()->getSubobjectName()
);
}
/**
* @dataProvider getDataProvider
*/
public function testgetSubobjectId( array $parameters, array $expected ) {
$instance = $this->acquireInstanceForId(
MediaWikiServices::getInstance()->getTitleFactory()->newFromText( __METHOD__ ),
$parameters['identifier']
);
if ( $expected['identifier'] !== '_' ) {
return $this->assertEquals( $expected['identifier'], $instance->getSubobjectId() );
}
$this->assertEquals(
$expected['identifier'],
substr( $instance->getSubobjectId(), 0, 1 )
);
}
/**
* @dataProvider getDataProvider
*/
public function testGetProperty( array $parameters ) {
$instance = $this->acquireInstanceForId(
MediaWikiServices::getInstance()->getTitleFactory()->newFromText( __METHOD__ ),
$parameters['identifier']
);
$this->assertInstanceOf(
'\SMW\DIProperty',
$instance->getProperty()
);
}
/**
* @dataProvider getDataProvider
*/
public function testAddDataValue( array $parameters, array $expected ) {
$instance = $this->acquireInstanceForId(
MediaWikiServices::getInstance()->getTitleFactory()->newFromText( __METHOD__ ),
$parameters['identifier']
);
foreach ( $parameters['properties'] as $property => $value ) {
$dataValue = DataValueFactory::getInstance()->newDataValueByText(
$property,
$value
);
$instance->addDataValue( $dataValue );
}
$this->assertCount(
$expected['errors'],
$instance->getErrors()
);
$this->semanticDataValidator->assertThatPropertiesAreSet(
$expected,
$instance->getSemanticData()
);
}
/**
* @dataProvider newDataValueProvider
*/
public function testDataValueExaminer( array $parameters, array $expected ) {
$property = $this->getMockBuilder( '\SMW\DIProperty' )
->disableOriginalConstructor()
->getMock();
$property->expects( $this->atLeastOnce() )
->method( 'findPropertyTypeID' )
->willReturn( $parameters['property']['typeId'] );
$property->expects( $this->atLeastOnce() )
->method( 'getKey' )
->willReturn( $parameters['property']['key'] );
$property->expects( $this->atLeastOnce() )
->method( 'getLabel' )
->willReturn( $parameters['property']['label'] );
$dataValue = DataValueFactory::getInstance()->newDataValueByItem(
$parameters['dataItem'],
$property
);
$instance = $this->acquireInstanceForId(
Title::newFromText( __METHOD__ ),
'Foo'
);
$instance->addDataValue( $dataValue );
$this->assertCount( $expected['errors'], $instance->getErrors() );
$this->semanticDataValidator->assertThatPropertiesAreSet(
$expected,
$instance->getSemanticData()
);
}
public function testAddDataValueWithInvalidSemanticDataThrowsException() {
$dataValue = $this->getMockBuilder( '\SMWDataValue' )
->disableOriginalConstructor()
->getMockForAbstractClass();
$instance = new Subobject( MediaWikiServices::getInstance()->getTitleFactory()->newFromText( __METHOD__ ) );
$this->expectException( '\SMW\Exception\SubSemanticDataException' );
$instance->addDataValue( $dataValue );
}
public function testGetSemanticDataInvalidSemanticDataThrowsException() {
$instance = new Subobject( MediaWikiServices::getInstance()->getTitleFactory()->newFromText( __METHOD__ ) );
$this->expectException( '\SMW\Exception\SubSemanticDataException' );
$instance->getSemanticData();
}
/**
* @dataProvider errorProvider
*/
public function testErrorHandlingOnErrors( $errors, $expected ) {
$instance = new Subobject( MediaWikiServices::getInstance()->getTitleFactory()->newFromText( __METHOD__ ) );
foreach ( $errors as $error ) {
$instance->addError( $error );
}
$this->assertCount(
$expected,
$instance->getErrors()
);
}
/**
* @dataProvider getDataProvider
*/
public function testGetContainer( array $parameters ) {
$instance = $this->acquireInstanceForId(
MediaWikiServices::getInstance()->getTitleFactory()->newFromText( __METHOD__ ),
$parameters['identifier']
);
$this->assertInstanceOf(
'\SMWDIContainer',
$instance->getContainer()
);
}
public function getDataProvider() {
$provider = [];
// #0 / asserting conditions for a named identifier
$provider[] = [
[
'identifier' => 'Bar',
'properties' => [ 'Foo' => 'bar' ]
],
[
'errors' => 0,
'identifier' => 'Bar',
'propertyCount' => 1,
'propertyLabels' => 'Foo',
'propertyValues' => 'Bar',
]
];
// #1 / asserting conditions for an anon identifier
$provider[] = [
[
'identifier' => '',
'properties' => [ 'FooBar' => 'bar Foo' ]
],
[
'errors' => 0,
'identifier' => '_',
'propertyCount' => 1,
'propertyLabels' => 'FooBar',
'propertyValues' => 'Bar Foo',
]
];
// #2 / asserting conditions
$provider[] = [
[
'identifier' => 'foo',
'properties' => [ 9001 => 1001 ]
],
[
'errors' => 0,
'identifier' => 'foo',
'propertyCount' => 1,
'propertyLabels' => [ 9001 ],
'propertyValues' => [ 1001 ],
]
];
// #3
$provider[] = [
[
'identifier' => 'foo bar',
'properties' => [ 1001 => 9001, 'Foo' => 'Bar' ]
],
[
'errors' => 0,
'identifier' => 'foo bar',
'propertyCount' => 2,
'propertyLabels' => [ 1001, 'Foo' ],
'propertyValues' => [ 9001, 'Bar' ],
]
];
// #4 / asserting that a property with a leading underscore would produce an error
$provider[] = [
[
'identifier' => 'bar',
'properties' => [ '_FooBar' => 'bar Foo' ]
],
[
'errors' => 1,
'identifier' => 'bar',
'propertyCount' => 1,
'strictPropertyValueMatch' => false,
'propertyKeys' => [ '_ERRC' ]
]
];
// #5 / asserting that an inverse property would produce an error
$provider[] = [
[
'identifier' => 'bar',
'properties' => [ '-FooBar' => 'bar Foo' ]
],
[
'errors' => 1,
'identifier' => 'bar',
'propertyCount' => 1,
'strictPropertyValueMatch' => false,
'propertyKeys' => [ '_ERRC' ]
]
];
// #6 / asserting that an improper value for a _wpg property would add "Has improper value for"
$provider[] = [
[
'identifier' => 'bar',
'properties' => [ 'Foo' => '' ]
],
[
'identifier' => 'bar',
'errors' => 1,
'strictPropertyValueMatch' => false,
'propertyCount' => 1,
'propertyKeys' => [ '_ERRC' ]
]
];
return $provider;
}
/**
* Provides sample data for various dataItem/datValues
*
* @return array
*/
public function newDataValueProvider() {
$provider = [];
// #0 Bug 49530
$provider[] = [
[
'property' => [
'typeId' => '_txt',
'label' => 'Blob.example',
'key' => 'Blob.example'
],
'dataItem' => new SMWDIBlob( 'Example' )
],
[
'errors' => 0,
'propertyCount' => 1,
'propertyLabels' => 'Blob.example',
'propertyValues' => 'Example',
]
];
return $provider;
}
/**
* @return Subobject
*/
private function acquireInstanceForId( Title $title, $id = '' ) {
$instance = new Subobject( $title );
if ( $id === '' && $id !== null ) {
$id = '_abcdef';
}
$instance->setEmptyContainerForId( $id );
return $instance;
}
public function errorProvider() {
$provider = [];
# 0
$provider[] = [
[
'Foo',
'Foo'
],
1
];
# 1
$provider[] = [
[
'Foo',
'Bar'
],
2
];
# 2
$provider[] = [
[
[ 'Foo' => 'Bar' ],
[ 'Foo' => 'Bar' ],
],
1
];
# 3
$provider[] = [
[
[ 'Foo' => 'Bar' ],
[ 'Bar' => 'Foo' ],
],
2
];
return $provider;
}
}