Allow to optionally set language in Message constructor
authoraude <aude.wiki@gmail.com>
Wed, 26 Mar 2014 17:36:36 +0000 (18:36 +0100)
committeraude <aude.wiki@gmail.com>
Fri, 28 Mar 2014 16:59:48 +0000 (17:59 +0100)
This helps with testability to not have to rely on $wgLang
and setting globals in tests.

This also provides convenience, so one does not necessarily
need to call Message::inLanguage() if language is known
at time of constructing the message object.

Also added tests to cover this change.

Change-Id: I14ee98972c7be954e04398ece9e6103f96ab60dd

includes/Message.php
tests/phpunit/includes/MessageTest.php

index 7c9b095..9ffd9aa 100644 (file)
@@ -223,12 +223,14 @@ class Message {
         * @param string|string[] $key Message key or array of message keys to try and use the first
         * non-empty message for.
         * @param array $params Message parameters.
+        * @param Language $language Optional language of the message, defaults to $wgLang.
         */
-       public function __construct( $key, $params = array() ) {
+       public function __construct( $key, $params = array(), Language $language = null ) {
                global $wgLang;
+
                $this->key = $key;
                $this->parameters = array_values( $params );
-               $this->language = $wgLang;
+               $this->language = $language ? $language : $wgLang;
        }
 
        /**
index 930a7f6..914f235 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 class MessageTest extends MediaWikiLangTestCase {
+
        protected function setUp() {
                parent::setUp();
 
@@ -10,6 +11,40 @@ class MessageTest extends MediaWikiLangTestCase {
                ) );
        }
 
+       /**
+        * @covers Message::__construct
+        * @dataProvider provideConstructor
+        */
+       public function testConstructor( $expectedLang, $key, $params, $language ) {
+               $reflection = new ReflectionClass( 'Message' );
+
+               $keyProperty = $reflection->getProperty( 'key' );
+               $keyProperty->setAccessible( true );
+
+               $paramsProperty = $reflection->getProperty( 'parameters' );
+               $paramsProperty->setAccessible( true );
+
+               $langProperty = $reflection->getProperty( 'language' );
+               $langProperty->setAccessible( true );
+
+               $message = new Message( $key, $params, $language );
+
+               $this->assertEquals( $key, $keyProperty->getValue( $message ) );
+               $this->assertEquals( $params, $paramsProperty->getValue( $message ) );
+               $this->assertEquals( $expectedLang, $langProperty->getValue( $message ) );
+       }
+
+       public function provideConstructor() {
+               $langDe = Language::factory( 'de' );
+               $langEn = Language::factory( 'en' );
+
+               return array(
+                       array( $langDe, 'foo', array(), $langDe ),
+                       array( $langDe, 'foo', array( 'bar' ), $langDe ),
+                       array( $langEn, 'foo', array( 'bar' ), null )
+               );
+       }
+
        public function provideTestParams() {
                return array(
                        array( array() ),