From c875265effff3283a7a6078c8178be2c1fb6d6c9 Mon Sep 17 00:00:00 2001 From: Brad Jorsch Date: Fri, 30 Aug 2019 15:14:37 -0400 Subject: [PATCH] lib/Message: Support MessageValue as a parameter Fixes an overstrict test in ListParam, and has TextFormatter convert to Message recursively where necessary. Change-Id: I387754b6857fbdeedea6afd222a2fdba1ebe1a9c --- includes/Message/TextFormatter.php | 19 ++++++++++++++----- includes/libs/Message/ListParam.php | 2 +- .../includes/Message/TextFormatterTest.php | 13 +++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/includes/Message/TextFormatter.php b/includes/Message/TextFormatter.php index f5eeb16f24..783dd4302e 100644 --- a/includes/Message/TextFormatter.php +++ b/includes/Message/TextFormatter.php @@ -45,18 +45,27 @@ class TextFormatter implements ITextFormatter { return $this->langCode; } - private static function convertParam( MessageParam $param ) { + private function convertParam( MessageParam $param ) { if ( $param instanceof ListParam ) { $convertedElements = []; foreach ( $param->getValue() as $element ) { - $convertedElements[] = self::convertParam( $element ); + $convertedElements[] = $this->convertParam( $element ); } return Message::listParam( $convertedElements, $param->getListType() ); } elseif ( $param instanceof MessageParam ) { + $value = $param->getValue(); + if ( $value instanceof MessageValue ) { + $mv = $value; + $value = $this->createMessage( $mv->getKey() ); + foreach ( $mv->getParams() as $mvParam ) { + $value->params( $this->convertParam( $mvParam ) ); + } + } + if ( $param->getType() === ParamType::TEXT ) { - return $param->getValue(); + return $value; } else { - return [ $param->getType() => $param->getValue() ]; + return [ $param->getType() => $value ]; } } else { throw new \InvalidArgumentException( 'Invalid message parameter type' ); @@ -66,7 +75,7 @@ class TextFormatter implements ITextFormatter { public function format( MessageValue $mv ) { $message = $this->createMessage( $mv->getKey() ); foreach ( $mv->getParams() as $param ) { - $message->params( self::convertParam( $param ) ); + $message->params( $this->convertParam( $param ) ); } $message->inLanguage( $this->langCode ); return $message->text(); diff --git a/includes/libs/Message/ListParam.php b/includes/libs/Message/ListParam.php index d550fec51a..970ef6b1ba 100644 --- a/includes/libs/Message/ListParam.php +++ b/includes/libs/Message/ListParam.php @@ -22,7 +22,7 @@ class ListParam extends MessageParam { foreach ( $elements as $element ) { if ( $element instanceof MessageParam ) { $this->value[] = $element; - } elseif ( is_scalar( $element ) ) { + } elseif ( is_scalar( $element ) || $element instanceof MessageValue ) { $this->value[] = new ScalarParam( ParamType::TEXT, $element ); } else { throw new \InvalidArgumentException( diff --git a/tests/phpunit/includes/Message/TextFormatterTest.php b/tests/phpunit/includes/Message/TextFormatterTest.php index 74c56a06a2..53539eabc4 100644 --- a/tests/phpunit/includes/Message/TextFormatterTest.php +++ b/tests/phpunit/includes/Message/TextFormatterTest.php @@ -50,6 +50,19 @@ class TextFormatterTest extends MediaWikiTestCase { $result = $formatter->format( $mv ); $this->assertSame( 'test a, 100 bps $2', $result ); } + + public function testFormatMessage() { + $formatter = $this->createTextFormatter( 'en' ); + $mv = ( new MessageValue( 'test' ) ) + ->params( new MessageValue( 'test2', [ 'a', 'b' ] ) ) + ->commaListParams( [ + 'x', + new ScalarParam( ParamType::BITRATE, 100 ), + new MessageValue( 'test3', [ 'c', new MessageValue( 'test4', [ 'd', 'e' ] ) ] ) + ] ); + $result = $formatter->format( $mv ); + $this->assertSame( 'test test2 a b x, 100 bps, test3 c test4 d e', $result ); + } } class FakeMessage extends Message { -- 2.20.1