jenkins-bot has submitted this change and it was merged.
Change subject: \SMW\AggregatablePrinter use an explicit indicator to aggregate
numbers
......................................................................
\SMW\AggregatablePrinter use an explicit indicator to aggregate numbers
We do not assume a specific grouping preference, rather expect an explicit
decision on how numbers should be aggregated.
## Parameter
|aggregation=property (subject by default) to determine grouping preference
Change-Id: I6cce1067cc3db5892d007cf170bd60d6d6927bdf
---
M includes/queryprinters/AggregatablePrinter.php
M tests/phpunit/MockObjectRepository.php
M tests/phpunit/includes/queryprinters/AggregatablePrinterTest.php
3 files changed, 196 insertions(+), 38 deletions(-)
Approvals:
Mwjames: Looks good to me, approved
jenkins-bot: Verified
diff --git a/includes/queryprinters/AggregatablePrinter.php
b/includes/queryprinters/AggregatablePrinter.php
index 2428f67..cc4a442 100644
--- a/includes/queryprinters/AggregatablePrinter.php
+++ b/includes/queryprinters/AggregatablePrinter.php
@@ -173,10 +173,15 @@
foreach ( $subject as $field ) {
+ // Use the aggregation parameter to
determine the source of
+ // the number composition
+ if ( $this->params['aggregation'] ===
'property' ) {
+ $name =
$field->getPrintRequest()->getLabel();
+ }
+
// Aggregated array key depends on the
mainlabel which is
// either the subject or a printout
property
if ( $this->params['mainlabel'] === '-'
) {
- $name =
$field->getPrintRequest()->getLabel();
// In case of '-',
getNextDataValue() already shifted the
// array forward which means
the first column
@@ -262,6 +267,12 @@
'lowerbound' => 1,
);
+ $definitions['aggregation'] = array(
+ 'message' => 'smw-paramdesc-aggregation',
+ 'default' => 'subject',
+ 'values' => array( 'property', 'subject' ),
+ );
+
return $definitions;
}
diff --git a/tests/phpunit/MockObjectRepository.php
b/tests/phpunit/MockObjectRepository.php
index 99f7261..1729ddf 100644
--- a/tests/phpunit/MockObjectRepository.php
+++ b/tests/phpunit/MockObjectRepository.php
@@ -1046,6 +1046,10 @@
->will( $this->returnValue( $this->builder->setValue(
'getText', $this->builder->newRandomString( 10, 'Auto-printRequest' ) ) ) );
$printRequest->expects( $this->any() )
+ ->method( 'getLabel' )
+ ->will( $this->returnValue( $this->builder->setValue(
'getLabel' ) ) );
+
+ $printRequest->expects( $this->any() )
->method( 'getMode' )
->will( $this->returnValue( $this->builder->setValue(
'getMode', SMWPrintRequest::PRINT_THIS ) ) );
diff --git a/tests/phpunit/includes/queryprinters/AggregatablePrinterTest.php
b/tests/phpunit/includes/queryprinters/AggregatablePrinterTest.php
index df98934..c50512e 100644
--- a/tests/phpunit/includes/queryprinters/AggregatablePrinterTest.php
+++ b/tests/phpunit/includes/queryprinters/AggregatablePrinterTest.php
@@ -5,8 +5,6 @@
use SMWDataItem;
use SMWDINumber;
-use ReflectionClass;
-
/**
* Tests for the AggregatablePrinter class
*
@@ -38,57 +36,35 @@
}
/**
- * Helper method that returns a SMWQueryResult object
- *
- * @since 1.9
- *
- * @return SMWQueryResult
- */
- private function getMockQueryResult( $error = 'Bar' ) {
-
- $queryResult = $this->getMockBuilder( 'SMWQueryResult' )
- ->disableOriginalConstructor()
- ->getMock();
-
- $queryResult->expects( $this->any() )
- ->method( 'getErrors' )
- ->will( $this->returnValue( array( $error ) ) );
-
- return $queryResult;
- }
-
- /**
* Helper method that returns a AggregatablePrinter object
*
* @return AggregatablePrinter
*/
- private function getInstance( $parameters = array() ) {
- return $this->getMockForAbstractClass( $this->getClass(),
array( 'table' ) );
+ private function newInstance( $parameters = array() ) {
+ return $this->setParameters( $this->getMockForAbstractClass(
$this->getClass(), array( 'table' ) ), $parameters );
}
/**
* @test AggregatablePrinter::getResultText
+ * @dataProvider errorMessageProvider
*
* @since 1.9
*/
- public function testGetResultTextErrorMessage() {
+ public function testGetResultTextErrorMessage( $setup, $expected ) {
- $expectedMessage = wfMessage( 'smw-qp-aggregatable-empty-data'
)->inContentLanguage()->text();
+ $instance = $this->newInstance( $setup['parameters'] );
+ $queryResult = $setup['queryResult'];
- $queryResult = $this->getMockQueryResult( $expectedMessage );
-
- // Make protected method accessible
- $reflection = new ReflectionClass( $this->getClass() );
+ $reflection = $this->newReflector();
$method = $reflection->getMethod( 'getResultText' );
$method->setAccessible( true );
- // Invoke the instance
- $result = $method->invoke( $this->getInstance(), $queryResult,
SMW_OUTPUT_HTML );
+ $result = $method->invoke( $instance, $queryResult,
SMW_OUTPUT_HTML );
$this->assertEmpty( $result );
foreach( $queryResult->getErrors() as $error ) {
- $this->assertEquals( $expectedMessage, $error );
+ $this->assertEquals( $expected['message'], $error );
}
}
@@ -103,9 +79,8 @@
$expected = array();
$keys = array( 'test', 'foo', 'bar' );
- // Make protected method accessible
- $reflection = new ReflectionClass( $this->getClass() );
- $method = $reflection->getMethod( 'addNumbersForDataItem' );
+ $reflector = $this->newReflector();
+ $method = $reflector->getMethod( 'addNumbersForDataItem' );
$method->setAccessible( true );
for ( $i = 1; $i <= 10; $i++ ) {
@@ -124,10 +99,178 @@
$this->assertEquals( SMWDataItem::TYPE_NUMBER,
$dataItem->getDIType() );
// Invoke the instance
- $result = $method->invokeArgs( $this->getInstance(),
array( $dataItem, &$values, $name ) );
+ $result = $method->invokeArgs( $this->newInstance(),
array( $dataItem, &$values, $name ) );
$this->assertInternalType( 'integer', $values[$name] );
$this->assertEquals( $expected[$name], $values[$name] );
}
}
+
+ /**
+ * @test AggregatablePrinter::getNumericResults
+ * @dataProvider numberDataProvider
+ *
+ * @since 1.9
+ */
+ public function testGetNumericResults( $setup, $expected ) {
+
+ $instance = $this->newInstance( $setup['parameters'] );
+
+ $reflector = $this->newReflector();
+ $method = $reflector->getMethod( 'getNumericResults' );
+ $method->setAccessible( true );
+
+ $result = $method->invoke( $instance, $setup['queryResult'],
SMW_OUTPUT_HTML );
+
+ $this->assertInternalType(
+ 'array',
+ $result,
+ 'Asserts that getNumericResults() returns an array'
+ );
+
+ $this->assertEquals(
+ $expected['result'],
+ $result,
+ 'Asserts that the getNumericResults() output matches
the expected result'
+ );
+
+ }
+
+ /**
+ * @return array
+ */
+ public function errorMessageProvider() {
+
+ $message = wfMessage( 'smw-qp-aggregatable-empty-data'
)->inContentLanguage()->text();
+
+ $provider = array();
+
+ // #0
+ $queryResult = $this->newMockBuilder()->newObject(
'QueryResult', array(
+ 'getErrors' => array( $message )
+ ) );
+
+ $provider[] = array(
+ array(
+ 'parameters' => array( 'distribution' => true
),
+ 'queryResult' => $queryResult
+ ),
+ array(
+ 'message' => $message
+ )
+ );
+
+ // #1
+ $provider[] = array(
+ array(
+ 'parameters' => array( 'distribution' => false
),
+ 'queryResult' => $queryResult
+ ),
+ array(
+ 'message' => $message
+ )
+ );
+ return $provider;
+ }
+
+ /**
+ * @return array
+ */
+ public function numberDataProvider() {
+
+ $provider = array();
+
+ $setup = array(
+ array( 'printRequest' => 'Foo', 'number' => 10,
'dataValue' => 'Quuey' ),
+ array( 'printRequest' => 'Bar', 'number' => 20,
'dataValue' => 'Quuey' ),
+ array( 'printRequest' => 'Bar', 'number' => 20,
'dataValue' => 'Xuuey' )
+ );
+
+ // #0 aggregation = subject
+ $parameters = array(
+ 'headers' => SMW_HEADERS_PLAIN,
+ 'offset' => 0,
+ 'aggregation' => 'subject',
+ 'mainlabel' => ''
+ );
+
+ $provider[] = array(
+ array(
+ 'parameters' => $parameters,
+ 'queryResult' => $this->buildMockQueryResult(
$setup )
+ ),
+ array(
+ 'result' => array( 'Quuey' => 50 )
+ )
+ );
+
+ // #1 aggregation = property
+ $parameters = array(
+ 'headers' => SMW_HEADERS_PLAIN,
+ 'offset' => 0,
+ 'aggregation' => 'property',
+ 'mainlabel' => ''
+ );
+
+ $provider[] = array(
+ array(
+ 'parameters' => $parameters,
+ 'queryResult' => $this->buildMockQueryResult(
$setup )
+ ),
+ array(
+ 'result' => array( 'Foo' => 10, 'Bar' =>
40 )
+ )
+ );
+
+ return $provider;
+ }
+
+ /**
+ * @return QueryResult
+ */
+ private function buildMockQueryResult( $setup ) {
+
+ $printRequests = array();
+ $resultArray = array();
+
+ foreach ( $setup as $value ) {
+
+ $printRequest = $this->newMockBuilder()->newObject(
'PrintRequest', array(
+ 'getText' => $value['printRequest'],
+ 'getLabel' => $value['printRequest']
+ ) );
+
+ $printRequests[] = $printRequest;
+
+ $dataItem = $this->newMockBuilder()->newObject(
'DataItem', array(
+ 'getDIType' => SMWDataItem::TYPE_NUMBER,
+ 'getNumber' => $value['number']
+ ) );
+
+ $dataValue = $this->newMockBuilder()->newObject(
'DataValue', array(
+ 'DataValueType' => 'SMWNumberValue',
+ 'getTypeID' => '_num',
+ 'getShortWikiText' => $value['dataValue'],
+ 'getDataItem' => $dataItem
+ ) );
+
+ $resultArray[] = $this->newMockBuilder()->newObject(
'ResultArray', array(
+ 'getText' => $value['printRequest'],
+ 'getPrintRequest' => $printRequest,
+ 'getNextDataValue' => $dataValue,
+ 'getNextDataItem' => $dataItem
+ ) );
+
+ }
+
+ $queryResult = $this->newMockBuilder()->newObject(
'QueryResult', array(
+ 'getPrintRequests' => $printRequests,
+ 'getNext' => $resultArray,
+ 'getLink' => new \SMWInfolink( true, 'Lala' ,
'Lula' ),
+ 'hasFurtherResults' => true
+ ) );
+
+ return $queryResult;
+ }
+
}
--
To view, visit https://gerrit.wikimedia.org/r/82364
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I6cce1067cc3db5892d007cf170bd60d6d6927bdf
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/extensions/SemanticMediaWiki
Gerrit-Branch: master
Gerrit-Owner: Mwjames <[email protected]>
Gerrit-Reviewer: Jamie Thingelstad <[email protected]>
Gerrit-Reviewer: Mwjames <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits