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

namespace Wikibase\Test;

use Language;
use MWException;
use Wikibase\LanguageWithConversion;

/**
 * @covers Wikibase\LanguageWithConversion
 *
 * @group Wikibase
 * @group WikibaseLib
 *
 * @license GPL-2.0+
 * @author Liangent < liangent@gmail.com >
 */
class LanguageWithConversionTest extends \MediaWikiTestCase {

	/**
	 * @param LanguageWithConversion $obj
	 * @param string $expectedLangCode
	 * @param string|null $expectedSourceLangCode
	 * @param string $expectedFetchLangCode
	 */
	private function assertLanguageWithConversion(
		LanguageWithConversion $obj,
		$expectedLangCode,
		$expectedSourceLangCode,
		$expectedFetchLangCode
	) {
		$this->assertEquals( $expectedLangCode, $obj->getLanguage()->getCode() );
		$this->assertEquals( $expectedLangCode, $obj->getLanguageCode() );
		if ( $expectedSourceLangCode === null ) {
			$this->assertNull( $obj->getSourceLanguage() );
			$this->assertNull( $obj->getSourceLanguageCode() );
		} else {
			$this->assertEquals( $expectedSourceLangCode, $obj->getSourceLanguage()->getCode() );
			$this->assertEquals( $expectedSourceLangCode, $obj->getSourceLanguageCode() );
		}
		$this->assertEquals( $expectedFetchLangCode, $obj->getFetchLanguageCode() );
	}

	/**
	 * @dataProvider provideFactory
	 */
	public function testFactoryCode( $langCode, $sourceLangCode,
		$expectedLangCode, $expectedSourceLangCode, $expectedFetchLangCode
	) {
		$obj = LanguageWithConversion::factory( $langCode, $sourceLangCode );
		$this->assertLanguageWithConversion( $obj,
			$expectedLangCode, $expectedSourceLangCode, $expectedFetchLangCode
		);
	}

	/**
	 * @dataProvider provideFactory
	 */
	public function testFactory( $langCode, $sourceLangCode,
		$expectedLangCode, $expectedSourceLangCode, $expectedFetchLangCode
	) {
		$obj = LanguageWithConversion::factory( Language::factory( $langCode ),
			$sourceLangCode === null ? null : Language::factory( $sourceLangCode ) );
		$this->assertLanguageWithConversion( $obj,
			$expectedLangCode, $expectedSourceLangCode, $expectedFetchLangCode
		);
	}

	public function provideFactory() {
		return array(
			array( 'en', null, 'en', null, 'en' ),
			array( 'zh', null, 'zh', null, 'zh' ),
			array( 'zh-classical', null, 'lzh', null, 'lzh' ),
			array( 'zh-cn', null, 'zh-cn', null, 'zh-cn' ),
			array( 'zh', 'zh-cn', 'zh', 'zh-cn', 'zh-cn' ),
			array( 'zh-cn', 'zh', 'zh-cn', 'zh', 'zh' ),
			array( 'zh-cn', 'zh-tw', 'zh-cn', 'zh-tw', 'zh-tw' ),
		);
	}

	/**
	 * @dataProvider provideFactoryException
	 * @expectedException MWException
	 */
	public function testFactoryCodeException( $langCode, $sourceLangCode ) {
		LanguageWithConversion::factory( $langCode, $sourceLangCode );
	}

	/**
	 * @dataProvider provideFactoryException
	 * @expectedException MWException
	 */
	public function testFactoryException( $langCode, $sourceLangCode ) {
		LanguageWithConversion::factory( Language::factory( $langCode ),
			$sourceLangCode === null ? null : Language::factory( $sourceLangCode ) );
	}

	public function provideFactoryException() {
		return array(
			array( ':', null ),
			array( '/', null ),
			array( '/', ':' ),
			array( 'en', '/' ),
			array( 'en', 'de' ),
			array( 'en', 'en-gb' ),
			array( 'en-gb', 'en' ),
			array( 'de', 'de-formal' ),
			array( 'zh', 'en' ),
			array( 'zh-cn', 'zh-classical' ),
			array( 'zh', 'sr' ),
			array( 'zh-cn', 'en-gb' ),
			array( 'zh-tw', 'sr-ec' ),
		);
	}

	/**
	 * @dataProvider provideTranslate
	 */
	public function testTranslate( $langCode, $sourceLangCode, $translations ) {
		$obj = LanguageWithConversion::factory( $langCode, $sourceLangCode );
		foreach ( $translations as $text => $translatedText ) {
			$this->assertEquals( $obj->translate( $text ), $translatedText );
		}
	}

	/**
	 * @dataProvider provideTranslate
	 */
	public function testTranslateBatched( $langCode, $sourceLangCode, $translations ) {
		$obj = LanguageWithConversion::factory( $langCode, $sourceLangCode );
		foreach ( $translations as $text => $translatedText ) {
			$this->assertEquals( $obj->translate( $text ), $translatedText );
		}
	}

	public function provideTranslate() {
		return array(
			array( 'de', null, array(
				'foo' => 'foo',
				'bar' => 'bar',
			) ),
			array( 'zh', null, array(
				'測試' => '測試',
				'测试' => '测试',
			) ),
			array( 'zh-cn', null, array(
				'測試' => '測試',
				'测试' => '测试',
			) ),
			array( 'zh-cn', 'zh-tw', array(
				'測試' => '测试',
			) ),
			array( 'zh-tw', 'zh-cn', array(
				'測試' => '測試',
				'测试' => '測試',
				'測-{}-試' => '測-{}-試',
				'-{测试}-' => '-{測試}-',
				'测-{1}-试' => '測-{1}-試',
			) ),
			array( 'zh', 'zh', array(
				'測試' => '測試',
				'测试' => '测试',
				'測-{}-試' => '測-{}-試',
				'-{测试}-' => '-{测试}-',
				'测-{1}-试' => '测-{1}-试',
			) ),
		);
	}

}