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

namespace Wikibase\Test;

use Diff\Comparer\ComparableComparer;
use Diff\Differ\OrderedListDiffer;
use Diff\DiffOp\Diff\Diff;
use Diff\DiffOp\DiffOpAdd;
use Diff\DiffOp\DiffOpChange;
use Diff\DiffOp\DiffOpRemove;
use PHPUnit_Framework_TestCase;
use Wikibase\DataModel\Reference;
use Wikibase\DataModel\ReferenceList;
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
use Wikibase\DataModel\Snak\SnakList;
use Wikibase\DataModel\Statement\Statement;
use Wikibase\Repo\Diff\ClaimDiffer;
use Wikibase\Repo\Diff\ClaimDifference;

/**
 * @covers Wikibase\Repo\Diff\ClaimDiffer
 *
 * @group Wikibase
 * @group WikibaseRepo
 * @group WikibaseClaim
 *
 * @license GPL-2.0+
 * @author Jeroen De Dauw < jeroendedauw@gmail.com >
 * @author Thiemo Mättig
 */
class ClaimDifferTest extends PHPUnit_Framework_TestCase {

	public function diffClaimsProvider() {
		$argLists = array();

		$noValueForP42 = new Statement( new PropertyNoValueSnak( 42 ) );
		$noValueForP43 = new Statement( new PropertyNoValueSnak( 43 ) );

		$argLists[] = array(
			null,
			null,
			new ClaimDifference()
		);

		$argLists[] = array(
			$noValueForP42,
			$noValueForP42,
			new ClaimDifference()
		);

		$argLists[] = array(
			$noValueForP42,
			$noValueForP43,
			new ClaimDifference( new DiffOpChange( new PropertyNoValueSnak( 42 ), new PropertyNoValueSnak( 43 ) ) )
		);

		$qualifiers = new SnakList( array( new PropertyNoValueSnak( 1 ) ) );
		$withQualifiers = clone $noValueForP42;
		$withQualifiers->setQualifiers( $qualifiers );

		$argLists[] = array(
			$noValueForP42,
			$withQualifiers,
			new ClaimDifference(
				null,
				new Diff( array(
					new DiffOpAdd( new PropertyNoValueSnak( 1 ) )
				), false )
			)
		);

		$references = new ReferenceList( array( new Reference( array( new PropertyNoValueSnak( 2 ) ) ) ) );
		$withReferences = clone $noValueForP42;
		$withReferences->setReferences( $references );

		$argLists[] = array(
			$noValueForP42,
			$withReferences,
			new ClaimDifference(
				null,
				null,
				new Diff( array(
					new DiffOpAdd( new Reference( array( new PropertyNoValueSnak( 2 ) ) ) )
				), false )
			)
		);

		$argLists[] = array(
			$withQualifiers,
			$withReferences,
			new ClaimDifference(
				null,
				new Diff( array(
					new DiffOpRemove( new PropertyNoValueSnak( 1 ) )
				), false ),
				new Diff( array(
					new DiffOpAdd( new Reference( array( new PropertyNoValueSnak( 2 ) ) ) )
				), false )
			)
		);

		$argLists[] = array(
			$withReferences,
			null,
			new ClaimDifference(
				new DiffOpChange( new PropertyNoValueSnak( 42 ), null ),
				null,
				new Diff( array(
					new DiffOpRemove( new Reference( array( new PropertyNoValueSnak( 2 ) ) ) )
				), false ),
				new DiffOpChange( 1, null )
			)
		);

		$argLists[] = array(
			null,
			$withReferences,
			new ClaimDifference(
				new DiffOpChange( null, new PropertyNoValueSnak( 42 ) ),
				null,
				new Diff( array(
					new DiffOpAdd( new Reference( array( new PropertyNoValueSnak( 2 ) ) ) )
				), false ),
				new DiffOpChange( null, 1 )
			)
		);

		$argLists[] = array(
			null,
			new Statement( new PropertyNoValueSnak( 42 ), null, new ReferenceList() ),
			new ClaimDifference(
				new DiffOpChange( null, new PropertyNoValueSnak( 42 ) ),
				null,
				null,
				new DiffOpChange( null, 1 )
			)
		);

		$noValueForP42Preferred = clone $noValueForP42;
		$noValueForP42Preferred->setRank( Statement::RANK_PREFERRED );

		$argLists[] = array(
			$noValueForP42,
			$noValueForP42Preferred,
			new ClaimDifference(
				null,
				null,
				null,
				new DiffOpChange( Statement::RANK_NORMAL, Statement::RANK_PREFERRED )
			)
		);

		return $argLists;
	}

	/**
	 * @dataProvider diffClaimsProvider
	 */
	public function testDiffClaims(
		Statement $oldStatement = null,
		Statement $newStatement = null,
		ClaimDifference $expected
	) {
		$differ = new ClaimDiffer( new OrderedListDiffer( new ComparableComparer() ) );
		$actual = $differ->diffClaims( $oldStatement, $newStatement );

		$this->assertTrue( $expected->equals( $actual ) );
		// Additional fail-safe checks to guard against an ArrayObject bug in PHP 5.3, that returned
		// true when using == to compare two ArrayObject instances with differing content.
		$this->assertEquals(
			$expected->getQualifierChanges()->getArrayCopy(),
			$actual->getQualifierChanges()->getArrayCopy()
		);
		$this->assertEquals(
			$expected->getReferenceChanges()->getArrayCopy(),
			$actual->getReferenceChanges()->getArrayCopy()
		);
	}

}