MediaWiki  REL1_24
MessageTest.php
Go to the documentation of this file.
00001 <?php
00002 
00003 class MessageTest extends MediaWikiLangTestCase {
00004 
00005     protected function setUp() {
00006         parent::setUp();
00007 
00008         $this->setMwGlobals( array(
00009             'wgLang' => Language::factory( 'en' ),
00010             'wgForceUIMsgAsContentMsg' => array(),
00011         ) );
00012     }
00013 
00018     public function testConstructor( $expectedLang, $key, $params, $language ) {
00019         $reflection = new ReflectionClass( 'Message' );
00020 
00021         $keyProperty = $reflection->getProperty( 'key' );
00022         $keyProperty->setAccessible( true );
00023 
00024         $paramsProperty = $reflection->getProperty( 'parameters' );
00025         $paramsProperty->setAccessible( true );
00026 
00027         $langProperty = $reflection->getProperty( 'language' );
00028         $langProperty->setAccessible( true );
00029 
00030         $message = new Message( $key, $params, $language );
00031 
00032         $this->assertEquals( $key, $keyProperty->getValue( $message ) );
00033         $this->assertEquals( $params, $paramsProperty->getValue( $message ) );
00034         $this->assertEquals( $expectedLang, $langProperty->getValue( $message ) );
00035     }
00036 
00037     public static function provideConstructor() {
00038         $langDe = Language::factory( 'de' );
00039         $langEn = Language::factory( 'en' );
00040 
00041         return array(
00042             array( $langDe, 'foo', array(), $langDe ),
00043             array( $langDe, 'foo', array( 'bar' ), $langDe ),
00044             array( $langEn, 'foo', array( 'bar' ), null )
00045         );
00046     }
00047 
00048     public static function provideTestParams() {
00049         return array(
00050             array( array() ),
00051             array( array( 'foo' ), 'foo' ),
00052             array( array( 'foo', 'bar' ), 'foo', 'bar' ),
00053             array( array( 'baz' ), array( 'baz' ) ),
00054             array( array( 'baz', 'foo' ), array( 'baz', 'foo' ) ),
00055             array( array( 'baz', 'foo' ), array( 'baz', 'foo' ), 'hhh' ),
00056             array( array( 'baz', 'foo' ), array( 'baz', 'foo' ), 'hhh', array( 'ahahahahha' ) ),
00057             array( array( 'baz', 'foo' ), array( 'baz', 'foo' ), array( 'ahahahahha' ) ),
00058             array( array( 'baz' ), array( 'baz' ), array( 'ahahahahha' ) ),
00059         );
00060     }
00061 
00062     public function getLanguageProvider() {
00063         return array(
00064             array( 'foo', array( 'bar' ), 'en' ),
00065             array( 'foo', array( 'bar' ), 'de' )
00066         );
00067     }
00068 
00073     public function testGetLanguageCode( $key, $params, $languageCode ) {
00074         $language = Language::factory( $languageCode );
00075         $message = new Message( $key, $params, $language );
00076 
00077         $this->assertEquals( $language, $message->getLanguage() );
00078     }
00079 
00084     public function testParams( $expected ) {
00085         $msg = new Message( 'imasomething' );
00086 
00087         $returned = call_user_func_array( array( $msg, 'params' ), array_slice( func_get_args(), 1 ) );
00088 
00089         $this->assertSame( $msg, $returned );
00090         $this->assertEquals( $expected, $msg->getParams() );
00091     }
00092 
00096     public function testExists() {
00097         $this->assertTrue( wfMessage( 'mainpage' )->exists() );
00098         $this->assertTrue( wfMessage( 'mainpage' )->params( array() )->exists() );
00099         $this->assertTrue( wfMessage( 'mainpage' )->rawParams( 'foo', 123 )->exists() );
00100         $this->assertFalse( wfMessage( 'i-dont-exist-evar' )->exists() );
00101         $this->assertFalse( wfMessage( 'i-dont-exist-evar' )->params( array() )->exists() );
00102         $this->assertFalse( wfMessage( 'i-dont-exist-evar' )->rawParams( 'foo', 123 )->exists() );
00103     }
00104 
00108     public function testKey() {
00109         $this->assertInstanceOf( 'Message', wfMessage( 'mainpage' ) );
00110         $this->assertInstanceOf( 'Message', wfMessage( 'i-dont-exist-evar' ) );
00111         $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->text() );
00112         $this->assertEquals( '&lt;i-dont-exist-evar&gt;', wfMessage( 'i-dont-exist-evar' )->text() );
00113         $this->assertEquals( '<i-dont-exist-evar>', wfMessage( 'i-dont-exist-evar' )->plain() );
00114         $this->assertEquals( '&lt;i-dont-exist-evar&gt;', wfMessage( 'i-dont-exist-evar' )->escaped() );
00115     }
00116 
00120     public function testInLanguage() {
00121         $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( 'en' )->text() );
00122         $this->assertEquals( 'Заглавная страница',
00123             wfMessage( 'mainpage' )->inLanguage( 'ru' )->text() );
00124 
00125         // NOTE: make sure internal caching of the message text is reset appropriately
00126         $msg = wfMessage( 'mainpage' );
00127         $this->assertEquals( 'Main Page', $msg->inLanguage( Language::factory( 'en' ) )->text() );
00128         $this->assertEquals(
00129             'Заглавная страница',
00130             $msg->inLanguage( Language::factory( 'ru' ) )->text()
00131         );
00132     }
00133 
00137     public function testMessageParams() {
00138         $this->assertEquals( 'Return to $1.', wfMessage( 'returnto' )->text() );
00139         $this->assertEquals( 'Return to $1.', wfMessage( 'returnto', array() )->text() );
00140         $this->assertEquals(
00141             'You have foo (bar).',
00142             wfMessage( 'youhavenewmessages', 'foo', 'bar' )->text()
00143         );
00144         $this->assertEquals(
00145             'You have foo (bar).',
00146             wfMessage( 'youhavenewmessages', array( 'foo', 'bar' ) )->text()
00147         );
00148     }
00149 
00154     public function testMessageParamSubstitution() {
00155         $this->assertEquals(
00156             '(Заглавная страница)',
00157             wfMessage( 'parentheses', 'Заглавная страница' )->plain()
00158         );
00159         $this->assertEquals(
00160             '(Заглавная страница $1)',
00161             wfMessage( 'parentheses', 'Заглавная страница $1' )->plain()
00162         );
00163         $this->assertEquals(
00164             '(Заглавная страница)',
00165             wfMessage( 'parentheses' )->rawParams( 'Заглавная страница' )->plain()
00166         );
00167         $this->assertEquals(
00168             '(Заглавная страница $1)',
00169             wfMessage( 'parentheses' )->rawParams( 'Заглавная страница $1' )->plain()
00170         );
00171     }
00172 
00177     public function testDeliciouslyManyParams() {
00178         $msg = new RawMessage( '$1$2$3$4$5$6$7$8$9$10$11$12' );
00179         // One less than above has placeholders
00180         $params = array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k' );
00181         $this->assertEquals(
00182             'abcdefghijka2',
00183             $msg->params( $params )->plain(),
00184             'Params > 9 are replaced correctly'
00185         );
00186     }
00187 
00191     public function testMessageNumParams() {
00192         $lang = Language::factory( 'en' );
00193         $msg = new RawMessage( '$1' );
00194 
00195         $this->assertEquals(
00196             $lang->formatNum( 123456.789 ),
00197             $msg->inLanguage( $lang )->numParams( 123456.789 )->plain(),
00198             'numParams is handled correctly'
00199         );
00200     }
00201 
00205     public function testMessageDurationParams() {
00206         $lang = Language::factory( 'en' );
00207         $msg = new RawMessage( '$1' );
00208 
00209         $this->assertEquals(
00210             $lang->formatDuration( 1234 ),
00211             $msg->inLanguage( $lang )->durationParams( 1234 )->plain(),
00212             'durationParams is handled correctly'
00213         );
00214     }
00215 
00221     public function testMessageExpiryParams() {
00222         $lang = Language::factory( 'en' );
00223         $msg = new RawMessage( '$1' );
00224 
00225         $this->assertEquals(
00226             $lang->formatExpiry( wfTimestampNow() ),
00227             $msg->inLanguage( $lang )->expiryParams( wfTimestampNow() )->plain(),
00228             'expiryParams is handled correctly'
00229         );
00230     }
00231 
00235     public function testMessageTimeperiodParams() {
00236         $lang = Language::factory( 'en' );
00237         $msg = new RawMessage( '$1' );
00238 
00239         $this->assertEquals(
00240             $lang->formatTimePeriod( 1234 ),
00241             $msg->inLanguage( $lang )->timeperiodParams( 1234 )->plain(),
00242             'timeperiodParams is handled correctly'
00243         );
00244     }
00245 
00249     public function testMessageSizeParams() {
00250         $lang = Language::factory( 'en' );
00251         $msg = new RawMessage( '$1' );
00252 
00253         $this->assertEquals(
00254             $lang->formatSize( 123456 ),
00255             $msg->inLanguage( $lang )->sizeParams( 123456 )->plain(),
00256             'sizeParams is handled correctly'
00257         );
00258     }
00259 
00263     public function testMessageBitrateParams() {
00264         $lang = Language::factory( 'en' );
00265         $msg = new RawMessage( '$1' );
00266 
00267         $this->assertEquals(
00268             $lang->formatBitrate( 123456 ),
00269             $msg->inLanguage( $lang )->bitrateParams( 123456 )->plain(),
00270             'bitrateParams is handled correctly'
00271         );
00272     }
00273 
00277     public function testInContentLanguage() {
00278         $this->setMwGlobals( 'wgLang', Language::factory( 'fr' ) );
00279 
00280         // NOTE: make sure internal caching of the message text is reset appropriately
00281         $msg = wfMessage( 'mainpage' );
00282         $this->assertEquals( 'Hauptseite', $msg->inLanguage( 'de' )->plain(), "inLanguage( 'de' )" );
00283         $this->assertEquals( 'Main Page', $msg->inContentLanguage()->plain(), "inContentLanguage()" );
00284         $this->assertEquals( 'Accueil', $msg->inLanguage( 'fr' )->plain(), "inLanguage( 'fr' )" );
00285     }
00286 
00290     public function testInContentLanguageOverride() {
00291         $this->setMwGlobals( array(
00292             'wgLang' => Language::factory( 'fr' ),
00293             'wgForceUIMsgAsContentMsg' => array( 'mainpage' ),
00294         ) );
00295 
00296         // NOTE: make sure internal caching of the message text is reset appropriately.
00297         // NOTE: wgForceUIMsgAsContentMsg forces the messages *current* language to be used.
00298         $msg = wfMessage( 'mainpage' );
00299         $this->assertEquals(
00300             'Accueil',
00301             $msg->inContentLanguage()->plain(),
00302             'inContentLanguage() with ForceUIMsg override enabled'
00303         );
00304         $this->assertEquals( 'Main Page', $msg->inLanguage( 'en' )->plain(), "inLanguage( 'en' )" );
00305         $this->assertEquals(
00306             'Main Page',
00307             $msg->inContentLanguage()->plain(),
00308             'inContentLanguage() with ForceUIMsg override enabled'
00309         );
00310         $this->assertEquals( 'Hauptseite', $msg->inLanguage( 'de' )->plain(), "inLanguage( 'de' )" );
00311     }
00312 
00317     public function testInLanguageThrows() {
00318         wfMessage( 'foo' )->inLanguage( 123 );
00319     }
00320 
00321     public function keyProvider() {
00322         return array(
00323             'string' => array(
00324                 'key' => 'mainpage',
00325                 'expected' => array( 'mainpage' ),
00326             ),
00327             'single' => array(
00328                 'key' => array( 'mainpage' ),
00329                 'expected' => array( 'mainpage' ),
00330             ),
00331             'multi' => array(
00332                 'key' => array( 'mainpage-foo', 'mainpage-bar', 'mainpage' ),
00333                 'expected' => array( 'mainpage-foo', 'mainpage-bar', 'mainpage' ),
00334             ),
00335             'empty' => array(
00336                 'key' => array(),
00337                 'expected' => null,
00338                 'exception' => 'InvalidArgumentException',
00339             ),
00340             'null' => array(
00341                 'key' => null,
00342                 'expected' => null,
00343                 'exception' => 'InvalidArgumentException',
00344             ),
00345             'bad type' => array(
00346                 'key' => 17,
00347                 'expected' => null,
00348                 'exception' => 'InvalidArgumentException',
00349             ),
00350         );
00351     }
00352 
00358     public function testGetKey( $key, $expected, $exception = null ) {
00359         if ( $exception ) {
00360             $this->setExpectedException( $exception );
00361         }
00362 
00363         $msg = new Message( $key );
00364         $this->assertEquals( $expected, $msg->getKeysToTry() );
00365         $this->assertEquals( count( $expected ) > 1, $msg->isMultiKey() );
00366         $this->assertContains( $msg->getKey(), $expected );
00367     }
00368 }