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

namespace Wikibase\Test;

use Diff\DiffOp\Diff\Diff;
use Diff\DiffOp\DiffOpAdd;
use Diff\DiffOp\DiffOpChange;
use Wikibase\DataModel\Reference;
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
use Wikibase\DataModel\Statement\Statement;
use Wikibase\Repo\Diff\ClaimDifference;

/**
 * @covers Wikibase\Repo\Diff\ClaimDifference
 *
 * @group Wikibase
 * @group WikibaseRepo
 * @group WikibaseClaim
 *
 * @license GPL-2.0+
 * @author Jeroen De Dauw < jeroendedauw@gmail.com >
 * @author Tobias Gritschacher < tobias.gritschacher@wikimedia.de >
 */
class ClaimDifferenceTest extends \MediaWikiTestCase {

	public function testGetReferenceChanges() {
		$expected = new Diff( array(
			new DiffOpAdd( new Reference() )
		), false );

		$difference = new ClaimDifference( null, null, $expected );

		$actual = $difference->getReferenceChanges();

		$this->assertInstanceOf( Diff::class, $actual );
		$this->assertEquals( $expected, $actual );
	}

	public function testGetQualifierChanges() {
		$expected = new Diff( array(
			new DiffOpAdd( new PropertyNoValueSnak( 42 ) )
		), false );

		$difference = new ClaimDifference( null, $expected );

		$actual = $difference->getQualifierChanges();

		$this->assertInstanceOf( Diff::class, $actual );
		$this->assertEquals( $expected, $actual );
	}

	public function testGetMainSnakChange() {
		$expected = new DiffOpChange(
			new PropertyNoValueSnak( 42 ),
			new PropertyNoValueSnak( 43 )
		);

		$difference = new ClaimDifference( $expected );

		$actual = $difference->getMainSnakChange();

		$this->assertInstanceOf( DiffOpChange::class, $actual );
		$this->assertEquals( $expected, $actual );
	}

	public function testGetRankChange() {
		$expected = new DiffOpChange(
			Statement::RANK_PREFERRED,
			Statement::RANK_DEPRECATED
		);

		$difference = new ClaimDifference( null, null, null, $expected );

		$actual = $difference->getRankChange();

		$this->assertInstanceOf( DiffOpChange::class, $actual );
		$this->assertEquals( $expected, $actual );
	}

	public function atomicClaimDifferenceProvider() {
		$changeOp = new DiffOpChange( "old", "new" );
		$diff = new Diff( array( $changeOp ) );

		return array(
			array( new ClaimDifference( $changeOp ) ),
			array( new ClaimDifference( null, $diff ) ),
			array( new ClaimDifference( null, null, $diff ) ),
			array( new ClaimDifference( null, null, null, $changeOp ) ),
		);
	}

	public function nonAtomicClaimDifferenceProvider() {
		$changeOp = new DiffOpChange( "old", "new" );
		$diff = new Diff( array( $changeOp ) );

		return array(
			array( new ClaimDifference() ),
			array( new ClaimDifference( $changeOp, $diff, null, null ) ),
			array( new ClaimDifference( $changeOp, null, $diff, null ) ),
			array( new ClaimDifference( $changeOp, null, null, $changeOp ) ),
			array( new ClaimDifference( $changeOp, $diff, $diff, null ) ),
			array( new ClaimDifference( $changeOp, $diff, null, $changeOp ) ),
			array( new ClaimDifference( $changeOp, null, $diff, $changeOp ) ),
			array( new ClaimDifference( $changeOp, $diff, $diff, $changeOp ) ),
			array( new ClaimDifference( null, null, $diff, $changeOp ) ),
			array( new ClaimDifference( null, $diff, null, $changeOp ) ),
			array( new ClaimDifference( null, $diff, $diff, null ) ),
			array( new ClaimDifference( null, $diff, $diff, $changeOp ) ),
			array( new ClaimDifference( null, new Diff(), null, null ) ),
			array( new ClaimDifference( null, new Diff(), null, null ) ),
		);
	}

	/**
	 * @dataProvider atomicClaimDifferenceProvider
	 *
	 * @param ClaimDifference $claimDifference
	 */
	public function testIsAtomic( $claimDifference ) {
		$this->assertTrue( $claimDifference->isAtomic(), "isAtomic reports claimDifference as non-atomic, although it is" );
	}

	/**
	 * @dataProvider nonAtomicClaimDifferenceProvider
	 *
	 * @param ClaimDifference $claimDifference
	 */
	public function testIsNotAtomic( $claimDifference ) {
		$this->assertFalse( $claimDifference->isAtomic(), "isAtomic reports claimDifference as atomic, although it is not" );
	}

}