4 use Wikimedia\TestingAccessWrapper;
11 protected function setUp() {
15 'wgForceUIMsgAsContentMsg' => [],
24 public function testConstructor( $expectedLang, $key,
$params, $language ) {
25 $message =
new Message( $key,
$params, $language );
27 $this->assertSame( $key, $message->getKey() );
28 $this->assertSame(
$params, $message->getParams() );
29 $this->assertSame( $expectedLang->getCode(), $message->getLanguage()->getCode() );
32 $messageSpecifier->expects( $this->
any() )
33 ->method(
'getKey' )->will( $this->returnValue( $key ) );
34 $messageSpecifier->expects( $this->
any() )
35 ->method(
'getParams' )->will( $this->returnValue(
$params ) );
36 $message =
new Message( $messageSpecifier, [], $language );
38 $this->assertSame( $key, $message->getKey() );
39 $this->assertSame(
$params, $message->getParams() );
40 $this->assertSame( $expectedLang->getCode(), $message->getLanguage()->getCode() );
43 public static function provideConstructor() {
48 [ $langDe,
'foo', [], $langDe ],
49 [ $langDe,
'foo', [
'bar' ], $langDe ],
50 [ $langEn,
'foo', [
'bar' ], null ]
54 public static function provideConstructorParams() {
81 [ Message::rawParam(
'baz' ) ],
82 [ Message::rawParam(
'baz' ) ],
85 [ Message::rawParam(
'baz' ),
'foo' ],
86 [ Message::rawParam(
'baz' ),
'foo' ],
89 [ Message::rawParam(
'baz' ) ],
90 [ [ Message::rawParam(
'baz' ) ] ],
93 [ Message::rawParam(
'baz' ),
'foo' ],
94 [ [ Message::rawParam(
'baz' ),
'foo' ] ],
99 [ [
'baz',
'foo' ],
'hhh' ],
100 [ [
'baz',
'foo' ],
'hhh' ],
103 [ [
'baz',
'foo' ],
'hhh', [
'ahahahahha' ] ],
104 [ [
'baz',
'foo' ],
'hhh', [
'ahahahahha' ] ],
107 [ [
'baz',
'foo' ], [
'ahahahahha' ] ],
108 [ [
'baz',
'foo' ], [
'ahahahahha' ] ],
111 [ [
'baz' ], [
'ahahahahha' ] ],
112 [ [
'baz' ], [
'ahahahahha' ] ],
122 public function testConstructorParams( $expected,
$args ) {
123 $msg =
new Message(
'imasomething' );
125 $returned = call_user_func_array( [ $msg,
'params' ],
$args );
127 $this->assertSame( $msg, $returned );
128 $this->assertSame( $expected, $msg->getParams() );
131 public static function provideConstructorLanguage() {
133 [
'foo', [
'bar' ],
'en' ],
134 [
'foo', [
'bar' ],
'de' ]
143 public function testConstructorLanguage( $key,
$params, $languageCode ) {
145 $message =
new Message( $key,
$params, $language );
147 $this->assertEquals( $language, $message->getLanguage() );
150 public static function provideKeys() {
154 'expected' => [
'mainpage' ],
157 'key' => [
'mainpage' ],
158 'expected' => [
'mainpage' ],
161 'key' => [
'mainpage-foo',
'mainpage-bar',
'mainpage' ],
162 'expected' => [
'mainpage-foo',
'mainpage-bar',
'mainpage' ],
167 'exception' =>
'InvalidArgumentException',
172 'exception' =>
'InvalidArgumentException',
177 'exception' =>
'InvalidArgumentException',
189 public function testKeys( $key, $expected, $exception =
null ) {
191 $this->setExpectedException( $exception );
194 $msg =
new Message( $key );
195 $this->assertContains( $msg->getKey(), $expected );
196 $this->assertSame( $expected, $msg->getKeysToTry() );
197 $this->assertSame(
count( $expected ) > 1, $msg->isMultiKey() );
203 public function testWfMessage() {
211 public function testNewFromKey() {
212 $this->assertInstanceOf(
Message::class, Message::newFromKey(
'mainpage' ) );
213 $this->assertInstanceOf(
Message::class, Message::newFromKey(
'i-dont-exist-evar' ) );
220 public function testWfMessageParams() {
221 $this->assertSame(
'Return to $1.',
wfMessage(
'returnto' )->
text() );
222 $this->assertSame(
'Return to $1.',
wfMessage(
'returnto', [] )->
text() );
229 wfMessage(
'returnto', [ Message::numParam( 1024 ) ] )->
text()
232 'You have foo (bar).',
236 'You have foo (bar).',
240 'You have 1,024 (bar).',
242 'youhavenewmessages',
243 Message::numParam( 1024 ),
'bar'
247 'You have foo (2,048).',
249 'youhavenewmessages',
250 'foo', Message::numParam( 2048 )
254 'You have 1,024 (2,048).',
256 'youhavenewmessages',
257 [ Message::numParam( 1024 ), Message::numParam( 2048 ) ]
265 public function testExists() {
266 $this->assertTrue(
wfMessage(
'mainpage' )->exists() );
267 $this->assertTrue(
wfMessage(
'mainpage' )->params( [] )->exists() );
268 $this->assertTrue(
wfMessage(
'mainpage' )->rawParams(
'foo', 123 )->exists() );
269 $this->assertFalse(
wfMessage(
'i-dont-exist-evar' )->exists() );
270 $this->assertFalse(
wfMessage(
'i-dont-exist-evar' )->params( [] )->exists() );
271 $this->assertFalse(
wfMessage(
'i-dont-exist-evar' )->rawParams(
'foo', 123 )->exists() );
281 public function testToStringKey() {
282 $this->assertSame(
'Main Page',
wfMessage(
'mainpage' )->
text() );
283 $this->assertSame(
'⧼i-dont-exist-evar⧽',
wfMessage(
'i-dont-exist-evar' )->
text() );
284 $this->assertSame(
'⧼i<dont>exist-evar⧽',
wfMessage(
'i<dont>exist-evar' )->
text() );
285 $this->assertSame(
'⧼i-dont-exist-evar⧽',
wfMessage(
'i-dont-exist-evar' )->
plain() );
286 $this->assertSame(
'⧼i<dont>exist-evar⧽',
wfMessage(
'i<dont>exist-evar' )->
plain() );
287 $this->assertSame(
'⧼i-dont-exist-evar⧽',
wfMessage(
'i-dont-exist-evar' )->escaped() );
289 '⧼i<dont>exist-evar⧽',
290 wfMessage(
'i<dont>exist-evar' )->escaped()
294 public static function provideToString() {
297 [
'mainpage',
'plain',
'Main Page',
'Main Page' ],
298 [
'i-dont-exist-evar',
'plain',
'⧼i-dont-exist-evar⧽',
'⧼i-dont-exist-evar⧽' ],
299 [
'i-dont-exist-evar',
'escaped',
'⧼i-dont-exist-evar⧽',
'⧼i-dont-exist-evar⧽' ],
300 [
'script>alert(1)</script',
'escaped',
'⧼script>alert(1)</script⧽',
301 '⧼script>alert(1)</script⧽' ],
302 [
'script>alert(1)</script',
'plain',
'⧼script>alert(1)</script⧽',
303 '⧼script>alert(1)</script⧽' ],
312 public function testToString( $key, $format, $expect, $expectImplicit ) {
313 $msg =
new Message( $key );
314 $this->assertSame( $expect, $msg->$format() );
315 $this->assertSame( $expect, $msg->toString(),
'toString is unaffected by previous call' );
316 $this->assertSame( $expectImplicit, $msg->__toString() );
317 $this->assertSame( $expect, $msg->toString(),
'toString is unaffected by __toString' );
320 public static function provideToString_raw() {
322 [
'<span>foo</span>',
'parse',
'<span>foo</span>',
'<span>foo</span>' ],
323 [
'<span>foo</span>',
'escaped',
'<span>foo</span>',
324 '<span>foo</span>' ],
325 [
'<span>foo</span>',
'plain',
'<span>foo</span>',
'<span>foo</span>' ],
326 [
'<script>alert(1)</script>',
'parse',
'<script>alert(1)</script>',
327 '<script>alert(1)</script>' ],
328 [
'<script>alert(1)</script>',
'escaped',
'<script>alert(1)</script>',
329 '<script>alert(1)</script>' ],
330 [
'<script>alert(1)</script>',
'plain',
'<script>alert(1)</script>',
331 '<script>alert(1)</script>' ],
340 public function testToString_raw( $message, $format, $expect, $expectImplicit ) {
342 $msg = $this->getMockBuilder(
Message::class )->setMethods( [
'fetchMessage' ] )
343 ->disableOriginalConstructor()
345 $msg->expects( $this->
any() )->method(
'fetchMessage' )->willReturn( $message );
347 $this->assertSame( $expect, $msg->$format() );
348 $this->assertSame( $expect, $msg->toString(),
'toString is unaffected by previous call' );
349 $this->assertSame( $expectImplicit, $msg->__toString() );
350 $this->assertSame( $expect, $msg->toString(),
'toString is unaffected by __toString' );
356 public function testInLanguage() {
357 $this->assertSame(
'Main Page',
wfMessage(
'mainpage' )->inLanguage(
'en' )->
text() );
358 $this->assertSame(
'Заглавная страница',
363 $this->assertSame(
'Main Page', $msg->inLanguage(
Language::factory(
'en' ) )->text() );
365 'Заглавная страница',
374 public function testRawParams() {
376 '(Заглавная страница)',
380 '(Заглавная страница $1)',
384 '(Заглавная страница)',
385 wfMessage(
'parentheses' )->rawParams(
'Заглавная страница' )->
plain()
388 '(Заглавная страница $1)',
389 wfMessage(
'parentheses' )->rawParams(
'Заглавная страница $1' )->
plain()
397 public function testRawMessage() {
399 $this->assertSame(
'example &', $msg->plain() );
400 $this->assertSame(
'example &', $msg->escaped() );
403 public function testRawHtmlInMsg() {
409 MediaWikiServices::getInstance()->getParserFactory()->create() );
411 $msg =
new RawMessage(
'<html><script>alert("xss")</script></html>' );
412 $txt =
'<span class="error"><html> tags cannot be' .
413 ' used outside of normal pages.</span>';
414 $this->assertSame( $txt, $msg->parse() );
422 public function testReplaceManyParams() {
423 $msg =
new RawMessage(
'$1$2$3$4$5$6$7$8$9$10$11$12' );
425 $params = [
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k' ];
428 $msg->params(
$params )->plain(),
429 'Params > 9 are replaced correctly'
433 $params = [
'ab',
'bc',
'cd' ];
435 'Params: ab, bc, cd',
436 $msg->params(
$params )->text()
444 public function testNumParams() {
449 $lang->formatNum( 123456.789 ),
450 $msg->inLanguage(
$lang )->numParams( 123456.789 )->plain(),
451 'numParams is handled correctly'
459 public function testDurationParams() {
464 $lang->formatDuration( 1234 ),
465 $msg->inLanguage(
$lang )->durationParams( 1234 )->plain(),
466 'durationParams is handled correctly'
475 public function testExpiryParams() {
482 'expiryParams is handled correctly'
490 public function testTimeperiodParams() {
495 $lang->formatTimePeriod( 1234 ),
496 $msg->inLanguage(
$lang )->timeperiodParams( 1234 )->plain(),
497 'timeperiodParams is handled correctly'
505 public function testSizeParams() {
510 $lang->formatSize( 123456 ),
511 $msg->inLanguage(
$lang )->sizeParams( 123456 )->plain(),
512 'sizeParams is handled correctly'
520 public function testBitrateParams() {
525 $lang->formatBitrate( 123456 ),
526 $msg->inLanguage(
$lang )->bitrateParams( 123456 )->plain(),
527 'bitrateParams is handled correctly'
531 public static function providePlaintextParams() {
534 'one $2 <div>foo</div> [[Bar]] {{Baz}} <',
540 'one $2 <div>foo</div> [[Bar]] {{Baz}} <',
545 'one $2 <div>foo</div> [[Bar]] {{Baz}} &lt;',
550 'one $2 <div>foo</div> [[Bar]] {{Baz}} &lt;',
555 "<p>one $2 <div>foo</div> [[Bar]] {{Baz}} &lt;\n</p>",
570 public function testPlaintextParams( $expect, $format ) {
576 '<div>foo</div> [[Bar]] {{Baz}} <',
580 $msg->inLanguage(
$lang )->plaintextParams(
$params )->$format(),
581 "Fail formatting for $format"
585 public static function provideListParam() {
587 $msg1 =
new Message(
'mainpage', [],
$lang );
591 'Simple comma list' => [
598 'Simple semicolon list' => [
605 'Simple pipe list' => [
612 'Simple text list' => [
626 'List with all "before" params, ->text()' => [
627 [
"''link''", Message::numParam( 12345678 ) ],
630 '\'\
'link\'\'; 12,345,678'
633 'List with all "before" params, ->parse()' => [
634 [
"''link''", Message::numParam( 12345678 ) ],
637 '<i>link</i>; 12,345,678'
640 'List with all "after" params, ->text()' => [
641 [ $msg1, $msg2, Message::rawParam(
'[[foo]]' ) ],
644 'Main Page; \'\'link\'\'; [[foo]]'
647 'List with all "after" params, ->parse()' => [
648 [ $msg1, $msg2, Message::rawParam(
'[[foo]]' ) ],
651 'Main Page; <i>link</i>; [[foo]]'
654 'List with both "before" and "after" params, ->text()' => [
655 [ $msg1, $msg2, Message::rawParam(
'[[foo]]' ),
"''link''", Message::numParam( 12345678 ) ],
658 'Main Page; \'\'link\'\'; [[foo]]; \'\'link\'\'; 12,345,678'
661 'List with both "before" and "after" params, ->parse()' => [
662 [ $msg1, $msg2, Message::rawParam(
'[[foo]]' ),
"''link''", Message::numParam( 12345678 ) ],
665 'Main Page; <i>link</i>; [[foo]]; <i>link</i>; 12,345,678'
676 public function testListParam( $list,
$type, $format, $expect ) {
680 $msg->params( [ Message::listParam( $list,
$type ) ] );
683 $msg->inLanguage(
$lang )->$format()
690 public function testMessageAsParam() {
692 'wgScript' =>
'/wiki/index.php',
693 'wgArticlePath' =>
'/wiki/$1',
696 $msg =
new Message(
'returnto', [
697 new Message(
'apihelp-link', [
703 'Volver a [[Special:ApiHelp/foo|Página principal]].',
705 'Process with ->text()'
708 '<p>Volver a <a href="/wiki/Special:ApiHelp/foo" title="Special:ApiHelp/foo">Página '
709 .
"principal</a>.\n</p>",
710 $msg->parseAsBlock(),
711 'Process with ->parseAsBlock()'
715 public static function provideParser() {
718 "''&'' <x><!-- x -->",
723 "''&'' <x><!-- x -->",
727 '<i>&</i> <x>',
732 "<p><i>&</i> <x>\n</p>",
747 public function testParser( $expect, $format ) {
748 $msg =
new RawMessage(
"''&'' <x><!-- x -->" );
751 $msg->inLanguage(
'en' )->$format()
758 public function testInContentLanguage() {
763 $this->assertSame(
'Hauptseite', $msg->inLanguage(
'de' )->plain(),
"inLanguage( 'de' )" );
764 $this->assertSame(
'Main Page', $msg->inContentLanguage()->plain(),
"inContentLanguage()" );
765 $this->assertSame(
'Accueil', $msg->inLanguage(
'fr' )->plain(),
"inLanguage( 'fr' )" );
771 public function testInContentLanguageOverride() {
773 'wgForceUIMsgAsContentMsg' => [
'mainpage' ],
782 $msg->inContentLanguage()->plain(),
783 'inContentLanguage() with ForceUIMsg override enabled'
785 $this->assertSame(
'Main Page', $msg->inLanguage(
'en' )->plain(),
"inLanguage( 'en' )" );
788 $msg->inContentLanguage()->plain(),
789 'inContentLanguage() with ForceUIMsg override enabled'
791 $this->assertSame(
'Hauptseite', $msg->inLanguage(
'de' )->plain(),
"inLanguage( 'de' )" );
798 public function testInLanguageThrows() {
806 public function testSerialization() {
807 $msg =
new Message(
'parentheses' );
808 $msg->rawParams(
'<a>foo</a>' );
810 $this->assertSame(
'(<a>foo</a>)', $msg->parse(),
'Sanity check' );
812 $this->assertSame(
'(<a>foo</a>)', $msg->parse() );
813 $title = TestingAccessWrapper::newFromObject( $msg )->title;
815 $this->assertSame(
'Testing',
$title->getFullText() );
817 $msg =
new Message(
'mainpage' );
818 $msg->inLanguage(
'de' );
819 $this->assertSame(
'Hauptseite', $msg->plain(),
'Sanity check' );
821 $this->assertSame(
'Hauptseite', $msg->plain() );
828 public function testNewFromSpecifier(
$value, $expectedText ) {
829 $message = Message::newFromSpecifier(
$value );
831 if (
$value instanceof Message ) {
832 $this->assertInstanceOf( get_class(
$value ), $message );
833 $this->assertEquals(
$value, $message );
835 $this->assertSame( $expectedText, $message->text() );
838 public function provideNewFromSpecifier() {
840 $messageSpecifier->expects( $this->
any() )->method(
'getKey' )->willReturn(
'mainpage' );
841 $messageSpecifier->expects( $this->
any() )->method(
'getParams' )->willReturn( [] );
844 'string' => [
'mainpage',
'Main Page' ],
845 'array' => [ [
'youhavenewmessages',
'foo',
'bar' ],
'You have foo (bar).' ],
846 'Message' => [
new Message(
'youhavenewmessages', [
'foo',
'bar' ] ),
'You have foo (bar).' ],
847 'RawMessage' => [
new RawMessage(
'foo ($1)', [
'bar' ] ),
'foo (bar)' ],
848 'ApiMessage' => [
new ApiMessage( [
'mainpage' ],
'code', [
'data' ] ),
'Main Page' ],
849 'MessageSpecifier' => [ $messageSpecifier,
'Main Page' ],
850 'nested RawMessage' => [ [
new RawMessage(
'foo ($1)', [
'bar' ] ) ],
'foo (bar)' ],