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

namespace Wikibase\Lib\Tests;

use PHPUnit_Framework_TestCase;
use Wikibase\Lib\DataTypeDefinitions;

/**
 * @covers Wikibase\Lib\DataTypeDefinitions
 *
 * @group DataValueExtensions
 * @group WikibaseLib
 * @group Wikibase
 *
 * @license GPL-2.0+
 * @author Daniel Kinzler
 */
class DataTypeDefinitionsTest extends PHPUnit_Framework_TestCase {

	private function getDefinitions() {
		return array(
			'VT:FOO' => array(
				'formatter-factory-callback' => 'DataTypeDefinitionsTest::getFooValueFormatter',
				'parser-factory-callback' => 'DataTypeDefinitionsTest::getFooValueParser',
				'rdf-builder-factory-callback' => 'DataTypeDefinitionsTest::getFooRdfBuilder',
			),
			'PT:foo' => array(
				'value-type' => 'FOO',
				'rdf-uri' => 'http://acme.test/vocab/Foo',
				'validator-factory-callback' => 'DataTypeDefinitionsTest::getFooValidators',
				'parser-factory-callback' => 'DataTypeDefinitionsTest::getFooParser',
				'snak-formatter-factory-callback' => 'DataTypeDefinitionsTest::getFooSnakFormatter',
			),
			'PT:bar' => array(
				'value-type' => 'BAR',
				'formatter-factory-callback' => 'DataTypeDefinitionsTest::getBarFormatter',
			)
		);
	}

	private function getDataTypeDefinitions() {
		return new DataTypeDefinitions( $this->getDefinitions() );
	}

	public function testTypeIds() {
		$defs = $this->getDataTypeDefinitions();
		$this->assertEquals( array( 'foo', 'bar' ), $defs->getTypeIds() );
	}

	public function testGetValueTypes() {
		$defs = $this->getDataTypeDefinitions();
		$this->assertEquals( array( 'foo' => 'FOO', 'bar' => 'BAR' ), $defs->getValueTypes() );
	}

	public function testGetRdfTypeUris() {
		$defs = $this->getDataTypeDefinitions();
		$this->assertEquals( array( 'foo' => 'http://acme.test/vocab/Foo' ), $defs->getRdfTypeUris() );
	}

	public function testGetValidatorFactoryCallbacks() {
		$defs = $this->getDataTypeDefinitions();

		$expected = array( 'foo' => 'DataTypeDefinitionsTest::getFooValidators' );
		$this->assertEquals( $expected, $defs->getValidatorFactoryCallbacks() );

		$expected = array( 'PT:foo' => 'DataTypeDefinitionsTest::getFooValidators' );
		$this->assertEquals( $expected, $defs->getValidatorFactoryCallbacks( DataTypeDefinitions::PREFIXED_MODE ) );
	}

	public function testGetParserFactoryCallbacks() {
		$defs = $this->getDataTypeDefinitions();

		$expected = array( 'foo' => 'DataTypeDefinitionsTest::getFooParser' );
		$this->assertEquals( $expected, $defs->getParserFactoryCallbacks() );

		$expected = array(
			'PT:foo' => 'DataTypeDefinitionsTest::getFooParser',
			'VT:FOO' => 'DataTypeDefinitionsTest::getFooValueParser',
		);
		$this->assertEquals( $expected, $defs->getParserFactoryCallbacks( DataTypeDefinitions::PREFIXED_MODE ) );
	}

	public function testGetFormatterFactoryCallbacks() {
		$defs = $this->getDataTypeDefinitions();

		$expected = array(
			'foo' => 'DataTypeDefinitionsTest::getFooValueFormatter',
			'bar' => 'DataTypeDefinitionsTest::getBarFormatter',
		);
		$this->assertEquals( $expected, $defs->getFormatterFactoryCallbacks() );

		$expected = array(
			'VT:FOO' => 'DataTypeDefinitionsTest::getFooValueFormatter',
			'PT:bar' => 'DataTypeDefinitionsTest::getBarFormatter',
		);
		$this->assertEquals( $expected, $defs->getFormatterFactoryCallbacks( DataTypeDefinitions::PREFIXED_MODE ) );
	}

	public function testRegisterDataTypes() {
		$defs = $this->getDataTypeDefinitions();

		$extraTypes = array(
			'VT:FOO' => array(
				'validator-factory-callback' => 'DataTypeDefinitionsTest::getFooValueValidator',
			),
			'PT:bar' => array(
				'validator-factory-callback' => 'DataTypeDefinitionsTest::getBarValidators',
				'parser-factory-callback' => 'DataTypeDefinitionsTest::getBarParser',
			),
			'PT:fuzz' => array(
				'value-type' => 'FOO',
			),
		);

		$defs->registerDataTypes( $extraTypes );

		$this->assertEquals( array( 'foo', 'bar', 'fuzz' ), $defs->getTypeIds() );
		$this->assertEquals( array( 'foo' => 'FOO', 'bar' => 'BAR', 'fuzz' => 'FOO' ), $defs->getValueTypes() );

		$actual = $defs->getValidatorFactoryCallbacks();
		$this->assertEquals(
			array( 'foo' => 'DataTypeDefinitionsTest::getFooValidators',
				'bar' => 'DataTypeDefinitionsTest::getBarValidators',
				'fuzz' => 'DataTypeDefinitionsTest::getFooValueValidator' ),
			$actual
		);
	}

	public function testGetRdfBuilderFactoryCallbacks() {
		$defs = $this->getDataTypeDefinitions();
		$this->assertEquals(
			array( 'foo' => 'DataTypeDefinitionsTest::getFooRdfBuilder' ),
			$defs->getRdfBuilderFactoryCallbacks()
		);
		$this->assertEquals(
			array( 'VT:FOO' => 'DataTypeDefinitionsTest::getFooRdfBuilder' ),
			$defs->getRdfBuilderFactoryCallbacks( DataTypeDefinitions::PREFIXED_MODE )
		);
	}

	public function testDataTypeDefinitions_onlySomeDataTypesEnabled() {
		$definitions = $this->getDefinitions();
		$defs = new DataTypeDefinitions( $definitions, array( 'bar' ) );

		$this->assertSame(
			array( 'foo' ),
			$defs->getTypeIds(),
			'data type ids'
		);

		$this->assertSame(
			array( 'VT:FOO' => 'DataTypeDefinitionsTest::getFooValueFormatter' ),
			$defs->getFormatterFactoryCallbacks( DataTypeDefinitions::PREFIXED_MODE ),
			'formatter factory callbacks, prefixed mode'
		);
	}

}