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

namespace Wikibase\Test\IO;

use Wikibase\DataModel\Entity\EntityId;
use Wikibase\DataModel\Entity\Item;
use Wikibase\DataModel\Entity\ItemId;
use Wikibase\DataModel\Entity\Property;
use Wikibase\DataModel\Entity\PropertyId;
use Wikibase\DataModel\Entity\BasicEntityIdParser;
use Wikibase\Lib\Reporting\ExceptionHandler;
use Wikibase\Repo\IO\EntityIdReader;
use Wikibase\Repo\IO\LineReader;

/**
 * @covers Wikibase\Repo\IO\EntityIdReader
 *
 * @group Wikibase
 * @group WikibaseRepo
 * @group WikibaseIO
 *
 * @license GPL-2.0+
 * @author Daniel Kinzler
 */
class EntityIdReaderTest extends \PHPUnit_Framework_TestCase {

	protected function getTestFile() {
		return __DIR__ . '/EntityIdReaderTest.txt';
	}

	protected function openIdReader( $file, $type = null ) {
		$path = __DIR__ . '/' . $file;
		$handle = fopen( $path, 'r' );
		return new EntityIdReader( new LineReader( $handle ), new BasicEntityIdParser(), $type );
	}

	protected function getIdStrings( array $entityIds ) {
		return array_map( function( EntityId $id ) {
			return $id->getSerialization();
		}, $entityIds );
	}

	protected function assertEqualIds( array $expected,array $actual, $msg = null ) {
		$expectedIds = array_values( $this->getIdStrings( $expected ) );
		$actualIds = array_values( $this->getIdStrings( $actual ) );

		sort( $expectedIds );
		sort( $actualIds );
		$this->assertEquals( $expectedIds, $actualIds, $msg );
	}

	/**
	 * @dataProvider listEntitiesProvider
	 */
	public function testListEntities( $file, $type, $limit, array $expected ) {
		$reader = $this->openIdReader( $file, $type );

		$actual = $reader->fetchIds( $limit );

		$this->assertEqualIds( $expected, $actual );
	}

	public function listEntitiesProvider() {
		$q1 = new ItemId( 'Q1' );
		$p2 = new PropertyId( 'P2' );
		$q3 = new ItemId( 'Q3' );
		$p4 = new PropertyId( 'P4' );

		return array(
			'all' => array(
				'EntityIdReaderTest.txt', null, 100, array( $q1, $p2, $q3, $p4 )
			),
			'just properties' => array(
				'EntityIdReaderTest.txt', Property::ENTITY_TYPE, 100, array( $p2, $p4 )
			),
			'limit' => array(
				'EntityIdReaderTest.txt', null, 2, array( $q1, $p2 )
			),
			'limit and filter' => array(
				'EntityIdReaderTest.txt', Item::ENTITY_TYPE, 1, array( $q1 )
			),
		);
	}

	/**
	 * @dataProvider listEntitiesProvider_paging
	 */
	public function testListEntities_paging( $file, $type, $limit, array $expectedChunks ) {
		$reader = $this->openIdReader( $file, $type );

		foreach ( $expectedChunks as $expected ) {
			$actual = $reader->fetchIds( $limit );

			$this->assertEqualIds( $expected, $actual );
		}
	}

	public function listEntitiesProvider_paging() {
		$q1 = new ItemId( 'Q1' );
		$p2 = new PropertyId( 'P2' );
		$q3 = new ItemId( 'Q3' );
		$p4 = new PropertyId( 'P4' );

		return array(
			'limit' => array(
				'EntityIdReaderTest.txt',
				null,
				2,
				array(
					array( $q1, $p2 ),
					array( $q3, $p4 ),
					array(),
				)
			),
			'limit and filter' => array(
				'EntityIdReaderTest.txt',
				Item::ENTITY_TYPE,
				1,
				array(
					array( $q1 ),
					array( $q3 ),
					array(),
				)
			)
		);
	}

	public function testErrorHandler() {
		$expected = array(
			new ItemId( 'Q23' ),
			new PropertyId( 'P42' ),
		);

		$exceptionHandler = $this->getMock( ExceptionHandler::class );
		$exceptionHandler->expects( $this->exactly( 2 ) ) //two bad lines in EntityIdReaderTest.bad.txt
			->method( 'handleException' );

		$reader = $this->openIdReader( 'EntityIdReaderTest.bad.txt' );
		$reader->setExceptionHandler( $exceptionHandler );

		$actual = $reader->fetchIds( 100 );
		$reader->dispose();

		$this->assertEqualIds( $expected, $actual );
	}

}