Current File : /home/jvzmxxx/wiki/extensions/Wikibase/lib/tests/phpunit/DataValueFactoryTest.php
<?php

namespace Wikibase\Lib\Test;

use DataValues\DataValueFactory;
use DataValues\IllegalValueException;
use Deserializers\Deserializer;
use Deserializers\Exceptions\DeserializationException;
use InvalidArgumentException;
use PHPUnit_Framework_TestCase;

/**
 * @covers DataValues\DataValueFactory
 *
 * @group WikibaseLib
 * @group Wikibase
 *
 * @license GPL-2.0+
 * @author Thiemo Mättig
 */
class DataValueFactoryTest extends PHPUnit_Framework_TestCase {

	public function newInstance() {
		$deserializer = $this->getMock( Deserializer::class );
		$deserializer->expects( $this->any() )
			->method( 'deserialize' )
			->will( $this->returnCallback( function( array $data ) {
				if ( $data['type'] === 'string' ) {
					return 'success';
				}
				throw new DeserializationException();
			} ) );

		return new DataValueFactory( $deserializer );
	}

	public function testGivenUnknownType_newDataValueFails() {
		$this->setExpectedException( InvalidArgumentException::class );
		$this->newInstance()->newDataValue( 'unknown', '' );
	}

	public function testGivenKnownType_newDataValueSucceeds() {
		$value = $this->newInstance()->newDataValue( 'string', '' );
		$this->assertSame( 'success', $value );
	}

	public function testGivenNoType_newFromArrayFails() {
		$this->setExpectedException( IllegalValueException::class );
		$this->newInstance()->newFromArray( array() );
	}

	public function testGivenNoValue_newFromArrayFails() {
		$this->setExpectedException( IllegalValueException::class );
		$this->newInstance()->newFromArray( array( 'type' => 'unknown' ) );
	}

	public function testGivenUnknownType_newFromArrayFails() {
		$this->setExpectedException( InvalidArgumentException::class );
		$this->newInstance()->newFromArray( array(
			'type' => 'unknown',
			'value' => '',
		) );
	}

	public function testGivenKnownType_newFromArraySucceeds() {
		$value = $this->newInstance()->newFromArray( array(
			'type' => 'string',
			'value' => '',
		) );
		$this->assertSame( 'success', $value );
	}

}