lib/Message: Support MessageValue as a parameter
authorBrad Jorsch <bjorsch@wikimedia.org>
Fri, 30 Aug 2019 19:14:37 +0000 (15:14 -0400)
committerBrad Jorsch <bjorsch@wikimedia.org>
Fri, 30 Aug 2019 19:14:37 +0000 (15:14 -0400)
Fixes an overstrict test in ListParam, and has TextFormatter convert
to Message recursively where necessary.

Change-Id: I387754b6857fbdeedea6afd222a2fdba1ebe1a9c

includes/Message/TextFormatter.php
includes/libs/Message/ListParam.php
tests/phpunit/includes/Message/TextFormatterTest.php

index f5eeb16..783dd43 100644 (file)
@@ -45,18 +45,27 @@ class TextFormatter implements ITextFormatter {
                return $this->langCode;
        }
 
                return $this->langCode;
        }
 
-       private static function convertParam( MessageParam $param ) {
+       private function convertParam( MessageParam $param ) {
                if ( $param instanceof ListParam ) {
                        $convertedElements = [];
                        foreach ( $param->getValue() as $element ) {
                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 ) {
                        }
                        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 ) {
                        if ( $param->getType() === ParamType::TEXT ) {
-                               return $param->getValue();
+                               return $value;
                        } else {
                        } else {
-                               return [ $param->getType() => $param->getValue() ];
+                               return [ $param->getType() => $value ];
                        }
                } else {
                        throw new \InvalidArgumentException( 'Invalid message parameter type' );
                        }
                } 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 ) {
        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();
                }
                $message->inLanguage( $this->langCode );
                return $message->text();
index d550fec..970ef6b 100644 (file)
@@ -22,7 +22,7 @@ class ListParam extends MessageParam {
                foreach ( $elements as $element ) {
                        if ( $element instanceof MessageParam ) {
                                $this->value[] = $element;
                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(
                                $this->value[] = new ScalarParam( ParamType::TEXT, $element );
                        } else {
                                throw new \InvalidArgumentException(
index 74c56a0..53539ea 100644 (file)
@@ -50,6 +50,19 @@ class TextFormatterTest extends MediaWikiTestCase {
                $result = $formatter->format( $mv );
                $this->assertSame( 'test a, 100 bps $2', $result );
        }
                $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 {
 }
 
 class FakeMessage extends Message {