Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/repo/tests/phpunit/includes/StatementGrouperBuilderTest.php
<?php

namespace Wikibase\Test;

use InvalidArgumentException;
use PHPUnit_Framework_TestCase;
use Wikibase\DataModel\Entity\BasicEntityIdParser;
use Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookup;
use Wikibase\DataModel\Services\Statement\StatementGuidParser;
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
use Wikibase\DataModel\Statement\StatementList;
use Wikibase\Repo\DispatchingEntityTypeStatementGrouper;
use Wikibase\Repo\StatementGrouperBuilder;

/**
 * @covers Wikibase\Repo\StatementGrouperBuilder
 *
 * @group Wikibase
 *
 * @license GPL-2.0+
 * @author Thiemo Mättig
 */
class StatementGrouperBuilderTest extends PHPUnit_Framework_TestCase {

	/**
	 * @param array[] $specifications
	 *
	 * @return StatementGrouperBuilder
	 */
	private function newInstance( array $specifications ) {
		$lookup = $this->getMock( PropertyDataTypeLookup::class );

		$lookup->expects( $this->any() )
			->method( 'getDataTypeIdForProperty' )
			->will( $this->returnValue( true ) );

		$statementGuidParser = new StatementGuidParser( new BasicEntityIdParser() );

		return new StatementGrouperBuilder(
			$specifications,
			$lookup,
			$statementGuidParser
		);
	}

	/**
	 * @return StatementList
	 */
	private function newStatementList() {
		$statements = new StatementList();
		$statements->addNewStatement( new PropertyNoValueSnak( 1 ), null, null, 'Q1$' );
		return $statements;
	}

	public function testAcceptsEmptyArray() {
		$builder = $this->newInstance( array() );
		$grouper = $builder->getStatementGrouper();
		$this->assertInstanceOf( DispatchingEntityTypeStatementGrouper::class, $grouper );
	}

	public function testAcceptsNullGrouper() {
		$statements = $this->newStatementList();

		$builder = $this->newInstance( array(
			'item' => null,
		) );
		$grouper = $builder->getStatementGrouper();
		$groups = $grouper->groupStatements( $statements );

		$this->assertSame( array( 'statements' => $statements ), $groups );
	}

	public function testAcceptsDefaultFilter() {
		$statements = $this->newStatementList();

		$builder = $this->newInstance( array(
			'item' => array(
				'default' => null,
			)
		) );
		$grouper = $builder->getStatementGrouper();
		$groups = $grouper->groupStatements( $statements );

		$this->assertEquals( array( 'default' => $statements ), $groups );
	}

	public function testAcceptsNullFilter() {
		$statements = $this->newStatementList();

		$builder = $this->newInstance( array(
			'item' => array(
				'custom' => array( 'type' => null ),
			)
		) );
		$grouper = $builder->getStatementGrouper();
		$groups = $grouper->groupStatements( $statements );

		$this->assertEquals( array(
			'custom' => $statements,
			'statements' => new StatementList(),
		), $groups );
	}

	public function testIncompleteDataTypeFilter() {
		$builder = $this->newInstance( array(
			'item' => array(
				'custom' => array( 'type' => 'dataType' ),
			)
		) );
		$this->setExpectedException( InvalidArgumentException::class );
		$builder->getStatementGrouper();
	}

	public function testDataTypeFilter() {
		$statements = $this->newStatementList();

		$builder = $this->newInstance( array(
			'item' => array(
				'custom' => array( 'type' => 'dataType', 'dataTypes' => array( 'string' ) ),
			)
		) );
		$grouper = $builder->getStatementGrouper();
		$groups = $grouper->groupStatements( $statements );

		$this->assertEquals( array(
			'custom' => $statements,
			'statements' => new StatementList(),
		), $groups );
	}

	public function testIncompletePropertySetFilter() {
		$builder = $this->newInstance( array(
			'item' => array(
				'custom' => array( 'type' => 'propertySet' ),
			)
		) );
		$this->setExpectedException( InvalidArgumentException::class );
		$builder->getStatementGrouper();
	}

	public function testPropertySetFilter() {
		$statements = $this->newStatementList();

		$builder = $this->newInstance( array(
			'item' => array(
				'custom' => array( 'type' => 'propertySet', 'propertyIds' => array( 'P1' ) ),
			)
		) );
		$grouper = $builder->getStatementGrouper();
		$groups = $grouper->groupStatements( $statements );

		$this->assertEquals( array(
			'custom' => $statements,
			'statements' => new StatementList(),
		), $groups );
	}

	public function testInvalidFilterType() {
		$builder = $this->newInstance( array(
			'item' => array(
				'custom' => array( 'type' => 'invalid' ),
			)
		) );
		$this->setExpectedException( InvalidArgumentException::class );
		$builder->getStatementGrouper();
	}

}