summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Unit/Elastic/QueryEngine/DescriptionInterpreters/SomeValueInterpreterTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Unit/Elastic/QueryEngine/DescriptionInterpreters/SomeValueInterpreterTest.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Unit/Elastic/QueryEngine/DescriptionInterpreters/SomeValueInterpreterTest.php369
1 files changed, 369 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Unit/Elastic/QueryEngine/DescriptionInterpreters/SomeValueInterpreterTest.php b/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Unit/Elastic/QueryEngine/DescriptionInterpreters/SomeValueInterpreterTest.php
new file mode 100644
index 00000000..7dff7713
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Unit/Elastic/QueryEngine/DescriptionInterpreters/SomeValueInterpreterTest.php
@@ -0,0 +1,369 @@
+<?php
+
+namespace SMW\Tests\Elastic\QueryEngine\DescriptionInterpreters;
+
+use SMW\Elastic\QueryEngine\DescriptionInterpreters\SomeValueInterpreter;
+use SMW\DIWikiPage;
+use SMW\Options;
+use SMW\Query\DescriptionFactory;
+use SMW\DataItemFactory;
+use SMW\Tests\PHPUnitCompat;
+
+/**
+ * @covers \SMW\Elastic\QueryEngine\DescriptionInterpreters\SomeValueInterpreter
+ * @group semantic-mediawiki
+ *
+ * @license GNU GPL v2+
+ * @since 3.0
+ *
+ * @author mwjames
+ */
+class SomeValueInterpreterTest extends \PHPUnit_Framework_TestCase {
+
+ use PHPUnitCompat;
+
+ private $conditionBuilder;
+ private $descriptionFactory;
+ private $dataItemFactory;
+
+ public function setUp() {
+
+ $this->descriptionFactory = new DescriptionFactory();
+ $this->dataItemFactory = new DataItemFactory();
+
+ $this->conditionBuilder = $this->getMockBuilder( '\SMW\Elastic\QueryEngine\ConditionBuilder' )
+ ->disableOriginalConstructor()
+ ->setMethods( [ 'getID' ] )
+ ->getMock();
+ }
+
+ public function testCanConstruct() {
+
+ $this->assertInstanceOf(
+ SomeValueInterpreter::class,
+ new SomeValueInterpreter( $this->conditionBuilder )
+ );
+ }
+
+ public function testInterpretDescription_MissingPropertyThrowsException() {
+
+ $instance = new SomeValueInterpreter(
+ $this->conditionBuilder
+ );
+
+ $options = [];
+
+ $description = $this->descriptionFactory->newValueDescription(
+ $this->dataItemFactory->newDIWikiPage( 'Foo' )
+ );
+
+ $this->setExpectedException( '\RuntimeException' );
+ $instance->interpretDescription( $description, $options );
+ }
+
+ public function testInterpretDescription_MissingPIDThrowsException() {
+
+ $instance = new SomeValueInterpreter(
+ $this->conditionBuilder
+ );
+
+ $options = [
+ 'property' => $this->dataItemFactory->newDIProperty( 'Bar' )
+ ];
+
+ $description = $this->descriptionFactory->newValueDescription(
+ $this->dataItemFactory->newDIWikiPage( 'Foo' )
+ );
+
+ $this->setExpectedException( '\RuntimeException' );
+ $instance->interpretDescription( $description, $options );
+ }
+
+ /**
+ * @dataProvider numberValueProvider
+ */
+ public function testInterpretDescription_NumberValue( $dataItem, $comparator, $options, $expected ) {
+
+ $instance = new SomeValueInterpreter(
+ $this->conditionBuilder
+ );
+
+ $description = $this->descriptionFactory->newValueDescription(
+ $dataItem,
+ null,
+ $comparator
+ );
+
+ $condition = $instance->interpretDescription(
+ $description,
+ $options
+ );
+
+ $this->assertEquals(
+ $expected,
+ (string)$condition
+ );
+ }
+
+ /**
+ * @dataProvider timeValueProvider
+ */
+ public function testInterpretDescription_TimeValue( $dataItem, $comparator, $options, $expected ) {
+
+ $instance = new SomeValueInterpreter(
+ $this->conditionBuilder
+ );
+
+ $description = $this->descriptionFactory->newValueDescription(
+ $dataItem,
+ null,
+ $comparator
+ );
+
+ $condition = $instance->interpretDescription(
+ $description,
+ $options
+ );
+
+ $this->assertEquals(
+ $expected,
+ (string)$condition
+ );
+ }
+
+ /**
+ * @dataProvider textValueProvider
+ */
+ public function testInterpretDescription_TextValue( $dataItem, $comparator, $options, $expected ) {
+
+ $instance = new SomeValueInterpreter(
+ $this->conditionBuilder
+ );
+
+ $description = $this->descriptionFactory->newValueDescription(
+ $dataItem,
+ null,
+ $comparator
+ );
+
+ $condition = $instance->interpretDescription(
+ $description,
+ $options
+ );
+
+ $this->assertEquals(
+ $expected,
+ (string)$condition
+ );
+ }
+
+ /**
+ * @dataProvider pageValueProvider
+ */
+ public function testInterpretDescription_PageValue( $dataItem, $comparator, $options, $expected ) {
+
+ $this->conditionBuilder->expects( $this->any() )
+ ->method( 'getID' )
+ ->will( $this->onConsecutiveCalls( 42, 1001, 9000, 110001 ) );
+
+ $this->conditionBuilder->setOptions( new Options(
+ [
+ 'cjk.best.effort.proximity.match' => true
+ ]
+ ) );
+
+ $instance = new SomeValueInterpreter(
+ $this->conditionBuilder
+ );
+
+ $description = $this->descriptionFactory->newValueDescription(
+ $dataItem,
+ null,
+ $comparator
+ );
+
+ $condition = $instance->interpretDescription(
+ $description,
+ $options
+ );
+
+ $this->assertEquals(
+ $expected,
+ (string)$condition
+ );
+ }
+
+ public function numberValueProvider() {
+
+ $dataItemFactory = new DataItemFactory();
+
+ $options = [
+ 'property' => $dataItemFactory->newDIProperty( 'Bar' ),
+ 'pid' => 'P:42',
+ 'field' => 'numField',
+ 'type' => 'must'
+ ];
+
+ $dataItem = $dataItemFactory->newDINumber( 123 );
+
+ yield [
+ $dataItem,
+ SMW_CMP_EQ,
+ $options,
+ '{"bool":{"filter":{"term":{"P:42.numField":123}}}}'
+ ];
+
+ yield [
+ $dataItem,
+ SMW_CMP_NEQ,
+ $options,
+ '{"bool":{"must_not":{"term":{"P:42.numField":123}}}}'
+ ];
+
+ yield [
+ $dataItem,
+ SMW_CMP_LESS,
+ $options,
+ '{"bool":{"must":[{"range":{"P:42.numField":{"lt":123}}}]}}'
+ ];
+
+ yield [
+ $dataItem,
+ SMW_CMP_GRTR,
+ $options,
+ '{"bool":{"must":[{"range":{"P:42.numField":{"gt":123}}}]}}'
+ ];
+
+ yield [
+ $dataItem,
+ SMW_CMP_LEQ,
+ $options,
+ '{"bool":{"must":[{"range":{"P:42.numField":{"lte":123}}}]}}'
+ ];
+
+ yield [
+ $dataItem,
+ SMW_CMP_GEQ,
+ $options,
+ '{"bool":{"must":[{"range":{"P:42.numField":{"gte":123}}}]}}'
+ ];
+
+ // This form is actually handled differently using a compound
+ // [[Has number::~123]] -> [[Has number:: <q>[[≥0]] [[≤123]]</q> ]]
+ yield [
+ $dataItem,
+ SMW_CMP_LIKE,
+ $options,
+ '{"bool":{"must":[{"match":{"P:42.numField":{"query":123,"operator":"and"}}}]}}'
+ ];
+
+ yield [
+ $dataItem,
+ SMW_CMP_NLKE,
+ $options,
+ '{"bool":{"must_not":[{"match":{"P:42.numField":{"query":123,"operator":"and"}}}]}}'
+ ];
+ }
+
+ public function timeValueProvider() {
+
+ $dataItemFactory = new DataItemFactory();
+
+ $options = [
+ 'property' => $dataItemFactory->newDIProperty( 'Bar' ),
+ 'pid' => 'P:42',
+ 'field' => 'datField',
+ 'type' => 'must'
+ ];
+
+ $dataItem = $dataItemFactory->newDITime( 1, 1970, 12, 12, 12, 12, 12 );
+
+ yield [
+ $dataItem,
+ SMW_CMP_EQ,
+ $options,
+ '{"bool":{"filter":{"term":{"P:42.datField":2440933.0084722}}}}'
+ ];
+
+ yield [
+ $dataItem,
+ SMW_CMP_NEQ,
+ $options,
+ '{"bool":{"must_not":{"term":{"P:42.datField":2440933.0084722}}}}'
+ ];
+ }
+
+ public function textValueProvider() {
+
+ $dataItemFactory = new DataItemFactory();
+
+ $options = [
+ 'property' => $dataItemFactory->newDIProperty( 'Bar' ),
+ 'pid' => 'P:42',
+ 'field' => 'txtField',
+ 'type' => 'must'
+ ];
+
+ $dataItem = $dataItemFactory->newDIBlob( '*test*' );
+
+ yield [
+ $dataItem,
+ SMW_CMP_EQ,
+ $options,
+ '{"bool":{"filter":{"term":{"P:42.txtField.keyword":"*test*"}}}}'
+ ];
+
+ yield [
+ $dataItem,
+ SMW_CMP_LIKE,
+ $options,
+ '{"bool":{"must":{"query_string":{"fields":["P:42.txtField","P:42.txtField.keyword"],"query":"*test*"}}}}'
+ ];
+ }
+
+ public function pageValueProvider() {
+
+ $dataItemFactory = new DataItemFactory();
+
+ $options = [
+ 'property' => $dataItemFactory->newDIProperty( 'Bar' ),
+ 'pid' => 'P:42',
+ 'field' => 'wpgID',
+ 'type' => 'must'
+ ];
+
+ $dataItem = $dataItemFactory->newDIWikiPage( 'test' );
+
+ yield [
+ $dataItem,
+ SMW_CMP_EQ,
+ $options,
+ '{"bool":{"filter":{"term":{"P:42.wpgID":42}}}}'
+ ];
+
+ $options = [
+ 'property' => $dataItemFactory->newDIProperty( 'Bar' ),
+ 'pid' => 'P:42',
+ 'field' => 'wpgField',
+ 'type' => 'must'
+ ];
+
+ yield [
+ $dataItem,
+ SMW_CMP_LIKE,
+ $options,
+ '{"bool":{"must":{"query_string":{"fields":["P:42.wpgField"],"query":"+test"}}}}'
+ ];
+
+ $dataItem = $dataItemFactory->newDIWikiPage( '*テスト*' );
+
+ yield [
+ $dataItem,
+ SMW_CMP_LIKE,
+ $options,
+ '{"bool":{"must":[{"match_phrase":{"P:42.wpgField":"テスト"}}]}}'
+ ];
+
+ }
+
+}