The language classes have been using the same setUp() tearDown() to craft a new language object. I have abstracted that code in LanguageClassesTestCase and made all the language test classes to extend it. The language is interpolated directly from the class name and an object for it can be retrieved with the getLang() method. Change-Id: Ib931336ce219edabe2c72b7e9f04c976a500723e
100 lines
2.6 KiB
PHP
100 lines
2.6 KiB
PHP
<?php
|
|
/**
|
|
* Helping class to run tests using a clean language instance.
|
|
*
|
|
* This is intended for the MediaWiki language class tests under
|
|
* tests/phpunit/languages. You simply need to extends this test
|
|
* and set it up with a language code using setUpBeforeClass:
|
|
*
|
|
* @par Setting up a language:
|
|
* @code
|
|
* class LanguageFooTest extends LanguageClassesTestCase {
|
|
* public static function setUpBeforeClass() {
|
|
* self::setLang( 'Foo' );
|
|
* }
|
|
* @endcode
|
|
*
|
|
* Before each tests, a new language object is build which you
|
|
* can retrieve in your test using the $this->getLang() method:
|
|
*
|
|
* @par Using the crafted language object:
|
|
* @code
|
|
* function testHasLanguageObject() {
|
|
* $langObject = $this->getLang();
|
|
* $this->assertInstanceOf( 'LanguageFoo',
|
|
* $langObject
|
|
* );
|
|
* }
|
|
* @endcode
|
|
*/
|
|
abstract class LanguageClassesTestCase extends MediaWikiTestCase {
|
|
|
|
/**
|
|
* Regex used to find out the language code out of the class name
|
|
* used by setUpBeforeClass
|
|
*/
|
|
private static $reExtractLangFromClass = '/Language(.*)Test/';
|
|
|
|
/**
|
|
* Hold the language code we are going to use. This is extracted
|
|
* directly from the extending class.
|
|
*/
|
|
private static $LanguageClassCode;
|
|
|
|
/**
|
|
* Internal language object
|
|
*
|
|
* A new object is created before each tests thanks to PHPUnit
|
|
* setUp() method, it is deleted after each test too. To get
|
|
* this object you simply use the getLang method.
|
|
*
|
|
* You must have setup a language code first. See $LanguageClassCode
|
|
* @code
|
|
* function testWeAreTheChampions() {
|
|
* $this->getLang(); # language object
|
|
* }
|
|
* @endcode
|
|
*/
|
|
private $languageObject;
|
|
|
|
public static function setUpBeforeClass() {
|
|
$found = preg_match( self::$reExtractLangFromClass,
|
|
get_called_class(), $m );
|
|
if ( $found ) {
|
|
# Normalize language code since classes uses underscores
|
|
$m[1] = str_replace( '_', '-', $m[1] );
|
|
} else {
|
|
# Fallback to english language
|
|
$m[1] = 'en';
|
|
wfDebug(
|
|
__METHOD__ . " could not extract a language name "
|
|
. "out of " . get_called_class() . " failling back to 'en'\n"
|
|
);
|
|
}
|
|
// TODO: validate $m[1] which should be a valid language code
|
|
self::$LanguageClassCode = $m[1];
|
|
}
|
|
|
|
protected function getLang() {
|
|
return $this->languageObject;
|
|
}
|
|
|
|
/**
|
|
* Create a new language object before each test.
|
|
*/
|
|
protected function setUp() {
|
|
parent::setUp();
|
|
$this->languageObject = Language::factory(
|
|
self::$LanguageClassCode );
|
|
}
|
|
|
|
/**
|
|
* Delete the internal language object so each test start
|
|
* out with a fresh language instance.
|
|
*/
|
|
protected function tearDown() {
|
|
unset( $this->languageObject );
|
|
parent::tearDown();
|
|
}
|
|
|
|
}
|