diff options
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Unit/Query/Language/SomePropertyTest.php')
-rw-r--r-- | www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Unit/Query/Language/SomePropertyTest.php | 506 |
1 files changed, 506 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Unit/Query/Language/SomePropertyTest.php b/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Unit/Query/Language/SomePropertyTest.php new file mode 100644 index 00000000..0c3974f9 --- /dev/null +++ b/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Unit/Query/Language/SomePropertyTest.php @@ -0,0 +1,506 @@ +<?php + +namespace SMW\Tests\Query\Language; + +use SMW\DIProperty; +use SMW\DIWikiPage; +use SMW\Query\Language\NamespaceDescription; +use SMW\Query\Language\SomeProperty; +use SMW\Query\Language\ThingDescription; +use SMW\Query\Language\ValueDescription; + +/** + * @covers \SMW\Query\Language\SomeProperty + * @group semantic-mediawiki + * + * @license GNU GPL v2+ + * @since 2.1 + * + * @author mwjames + */ +class SomePropertyTest extends \PHPUnit_Framework_TestCase { + + public function testCanConstruct() { + + $property = $this->getMockBuilder( '\SMW\DIProperty' ) + ->disableOriginalConstructor() + ->getMock(); + + $description = $this->getMockBuilder( '\SMW\Query\Language\Description' ) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->assertInstanceOf( + 'SMW\Query\Language\SomeProperty', + new SomeProperty( $property, $description ) + ); + + // Legacy + $this->assertInstanceOf( + 'SMW\Query\Language\SomeProperty', + new \SMWSomeProperty( $property, $description ) + ); + } + + /** + * @dataProvider somePropertyProvider + */ + public function testCommonMethods( $property, $description, $expected ) { + + $instance = new SomeProperty( $property, $description ); + + $this->assertEquals( + $expected['property'], + $instance->getProperty() + ); + + $this->assertEquals( + $expected['description'], + $instance->getDescription() + ); + + $this->assertEquals( + $expected['queryString'], + $instance->getQueryString() + ); + + $this->assertEquals( + $expected['queryStringAsValue'], + $instance->getQueryString( true ) + ); + + $this->assertEquals( + $expected['isSingleton'], + $instance->isSingleton() + ); + + $this->assertEquals( + [], + $instance->getPrintRequests() + ); + + $this->assertEquals( + $expected['size'], + $instance->getSize() + ); + + $this->assertEquals( + $expected['depth'], + $instance->getDepth() + ); + + $this->assertEquals( + $expected['queryFeatures'], + $instance->getQueryFeatures() + ); + } + + /** + * @dataProvider comparativeHashProvider + */ + public function testGetFingerprint( $description, $compareTo, $expected ) { + + $this->assertEquals( + $expected, + $description->getFingerprint() === $compareTo->getFingerprint() + ); + } + + public function somePropertyProvider() { + + #0 + $property = new DIProperty( 'Foo' ); + + $description = new ValueDescription( + new DIWikiPage( 'Bar', NS_MAIN ), + $property + ); + + $provider[] = [ + $property, + $description, + [ + 'property' => $property, + 'description' => $description, + 'queryString' => "[[Foo::Bar]]", + 'queryStringAsValue' => "<q>[[Foo::Bar]]</q>", + 'isSingleton' => false, + 'queryFeatures' => 1, + 'size' => 2, + 'depth' => 1 + ] + ]; + + #1 + $property = new DIProperty( 'Foo' ); + + $description = new SomeProperty( + new DIProperty( 'Yui' ), + new ValueDescription( new DIWikiPage( 'Bar', NS_MAIN ), null ) + ); + + $provider[] = [ + $property, + $description, + [ + 'property' => $property, + 'description' => $description, + 'queryString' => "[[Foo.Yui::Bar]]", + 'queryStringAsValue' => "<q>[[Foo.Yui::Bar]]</q>", + 'isSingleton' => false, + 'queryFeatures' => 1, + 'size' => 3, + 'depth' => 2 + ] + ]; + + #2 + $property = new DIProperty( 'Foo' ); + + $description = new SomeProperty( + new DIProperty( 'Yui' ), + new NamespaceDescription( NS_MAIN ) + ); + + $provider[] = [ + $property, + $description, + [ + 'property' => $property, + 'description' => $description, + 'queryString' => "[[Foo.Yui:: <q>[[:+]]</q> ]]", + 'queryStringAsValue' => "<q>[[Foo.Yui:: <q>[[:+]]</q> ]]</q>", + 'isSingleton' => false, + 'queryFeatures' => 9, + 'size' => 3, + 'depth' => 2 + ] + ]; + + #3, 1096 + $property = new DIProperty( 'Foo' ); + + $description = new SomeProperty( + new DIProperty( 'Yui' ), + new SomeProperty( + new DIProperty( 'Bar', true ), + new NamespaceDescription( NS_MAIN ) + ) + ); + + $provider[] = [ + $property, + $description, + [ + 'property' => $property, + 'description' => $description, + 'queryString' => "[[Foo.Yui.-Bar:: <q>[[:+]]</q> ]]", + 'queryStringAsValue' => "<q>[[Foo.Yui.-Bar:: <q>[[:+]]</q> ]]</q>", + 'isSingleton' => false, + 'queryFeatures' => 9, + 'size' => 4, + 'depth' => 3 + ] + ]; + + #4, 1096 + $property = new DIProperty( 'Foo' ); + + $description = new SomeProperty( + new DIProperty( 'Yui' ), + new SomeProperty( + new DIProperty( '_SOBJ', true ), + new NamespaceDescription( NS_MAIN ) + ) + ); + + $provider[] = [ + $property, + $description, + [ + 'property' => $property, + 'description' => $description, + 'queryString' => "[[Foo.Yui.-Has subobject:: <q>[[:+]]</q> ]]", + 'queryStringAsValue' => "<q>[[Foo.Yui.-Has subobject:: <q>[[:+]]</q> ]]</q>", + 'isSingleton' => false, + 'queryFeatures' => 9, + 'size' => 4, + 'depth' => 3 + ] + ]; + + return $provider; + } + + public function testPrune() { + + $property = new DIProperty( 'Foo' ); + + $description = new ValueDescription( + new DIWikiPage( 'Bar', NS_MAIN ), + $property + ); + + $instance = new SomeProperty( $property, $description ); + + $maxsize = 2; + $maxDepth = 2; + $log = []; + + $this->assertEquals( + $instance, + $instance->prune( $maxsize, $maxDepth, $log ) + ); + + $this->assertEquals( 0, $maxsize ); + $this->assertEquals( 1, $maxDepth ); + + $maxsize = 0; + $maxDepth = 1; + $log = []; + + $this->assertEquals( + new ThingDescription(), + $instance->prune( $maxsize, $maxDepth, $log ) + ); + } + + public function testStableFingerprint() { + + $property = new DIProperty( 'Foo' ); + + $description = new ValueDescription( + new DIWikiPage( 'Bar', NS_MAIN ), + $property + ); + + $instance = new SomeProperty( + $property, + $description + ); + + $this->assertSame( + 'S:8c2cab8d14dcd45d49aadb7fb5ab44a7', + $instance->getFingerprint() + ); + } + + public function testHierarchyDepthToBeCeiledOnMaxQSubpropertyDepthSetting() { + + $property = new DIProperty( 'Foo' ); + + $description = new ValueDescription( + new DIWikiPage( 'Bar', NS_MAIN ), + $property + ); + + $instance = new SomeProperty( + $property, + $description + ); + + $instance->setHierarchyDepth( 9999999 ); + + $this->assertSame( + $GLOBALS['smwgQSubpropertyDepth'], + $instance->getHierarchyDepth() + ); + } + + public function testGetQueryStringWithHierarchyDepth() { + + $property = new DIProperty( 'Foo' ); + + $description = new ValueDescription( + new DIWikiPage( 'Bar', NS_MAIN ), + $property + ); + + $instance = new SomeProperty( + $property, + $description + ); + + $instance->setHierarchyDepth( 1 ); + + $this->assertSame( + "[[Foo::Bar|+depth=1]]", + $instance->getQueryString() + ); + } + + public function testVaryingHierarchyDepthCausesDifferentFingerprint() { + + $property = new DIProperty( 'Foo' ); + + $description = new ValueDescription( + new DIWikiPage( 'Bar', NS_MAIN ), + $property + ); + + $instance = new SomeProperty( + $property, + $description + ); + + $instance->setHierarchyDepth( 9999 ); + $expected = $instance->getFingerprint(); + + $instance = new SomeProperty( + $property, + $description + ); + + $this->assertNotSame( + $expected, + $instance->getFingerprint() + ); + } + + public function comparativeHashProvider() { + + // Same property, different description === different hash + $provider[] = [ + new SomeProperty( + new DIProperty( 'Foo' ), + new NamespaceDescription( NS_HELP ) + ), + new SomeProperty( + new DIProperty( 'Foo' ), + new NamespaceDescription( NS_MAIN ) + ), + false + ]; + + // Inverse property, same description === different hash + $provider[] = [ + new SomeProperty( + new DIProperty( 'Foo', true ), + new NamespaceDescription( NS_MAIN ) + ), + new SomeProperty( + new DIProperty( 'Foo' ), + new NamespaceDescription( NS_MAIN ) + ), + false + ]; + + // Same property, different description === different hash + $provider[] = [ + new SomeProperty( + new DIProperty( 'Foo', true ), + new NamespaceDescription( NS_MAIN ) + ), + new SomeProperty( + new DIProperty( 'Foo' ), + new ThingDescription() + ), + false + ]; + + // Property.chain, different description === different hash + $provider[] = [ + new SomeProperty( + new DIProperty( 'Foo', true ), + new ThingDescription() + ), + new SomeProperty( + new DIProperty( 'Foo' ), + new SomeProperty( + new DIProperty( 'Foo' ), + new ThingDescription() + ) + ), + false + ]; + + // Property.chain, same description === same hash + $provider[] = [ + new SomeProperty( + new DIProperty( 'Foo' ), + new SomeProperty( + new DIProperty( 'Foo' ), + new ThingDescription() + ) + ), + new SomeProperty( + new DIProperty( 'Foo' ), + new SomeProperty( + new DIProperty( 'Foo' ), + new ThingDescription() + ) + ), + true + ]; + + // Property.chain, different description (inverse prop) === different hash + $provider[] = [ + new SomeProperty( + new DIProperty( 'Foo' ), + new SomeProperty( + new DIProperty( 'Foo' ), + new ThingDescription() + ) + ), + new SomeProperty( + new DIProperty( 'Foo' ), + new SomeProperty( + new DIProperty( 'Foo', true ), + new ThingDescription() + ) + ), + false + ]; + + // Property.chain, different description === different hash + $provider[] = [ + new SomeProperty( + new DIProperty( 'Foo' ), + new ThingDescription() + ), + new SomeProperty( + new DIProperty( 'Foo' ), + new SomeProperty( + new DIProperty( 'Foo' ), + new SomeProperty( + new DIProperty( 'Foo' ), + new ThingDescription() + ) + ) + ), + false + ]; + + // Property.chain, different description === different hash + // "[[Foo.Foo::Foo]]" !== "[[Foo.Foo.Foo::Foo]]" + $provider[] = [ + new SomeProperty( + new DIProperty( 'Foo' ), + new SomeProperty( + new DIProperty( 'Foo' ), + new SomeProperty( + new DIProperty( 'Foo' ), + new ValueDescription( new DIWikiPage( 'Foo', NS_MAIN ) ) + ) + ) + ), + new SomeProperty( + new DIProperty( 'Foo' ), + new SomeProperty( + new DIProperty( 'Foo' ), + new SomeProperty( + new DIProperty( 'Foo' ), + new SomeProperty( + new DIProperty( 'Foo' ), + new ValueDescription( new DIWikiPage( 'Foo', NS_MAIN ) ) + ) + ) + ) + ), + false + ]; + + return $provider; + } + +} |