getCompiler(); (new TransExpression('t', new Node($arguments), 1))->compile($compiler); self::assertSame($expected, $compiler->getSource()); } /** @return iterable */ public static function transExpressionsProvider(): iterable { yield 't("Message")' => [[self::getConstantExpression('Message')], '\\_gettext("Message")']; yield 't(message = "Message")' => [ ['message' => self::getConstantExpression('Message')], '\\_gettext("Message")', ]; yield 't("Message", notes = "Notes")' => [ [self::getConstantExpression('Message'), 'notes' => self::getConstantExpression('Notes')], "\n" . '// l10n: Notes' . "\n" . '\\_gettext("Message")' . "\n", ]; yield 't(message = "Message", notes = "Notes")' => [ ['message' => self::getConstantExpression('Message'), 'notes' => self::getConstantExpression('Notes')], "\n" . '// l10n: Notes' . "\n" . '\\_gettext("Message")' . "\n", ]; yield 't("Message", notes = " \n\rNotes\rwith line\nbreaks \n ")' => [ [ 0 => self::getConstantExpression('Message'), 'notes' => self::getConstantExpression(" \n\rNotes\rwith line\nbreaks \n "), ], "\n" . '// l10n: Notes with line breaks' . "\n" . '\\_gettext("Message")' . "\n", ]; yield 't("Message", context = "Context")' => [ [self::getConstantExpression('Message'), 'context' => self::getConstantExpression('Context')], '\\_pgettext("Context", "Message")', ]; yield 't(message = "Message", context = "Context")' => [ ['message' => self::getConstantExpression('Message'), 'context' => self::getConstantExpression('Context')], '\\_pgettext("Context", "Message")', ]; yield 't("Message", context = "Context", notes = "Notes")' => [ [ 0 => self::getConstantExpression('Message'), 'context' => self::getConstantExpression('Context'), 'notes' => self::getConstantExpression('Notes'), ], "\n" . '// l10n: Notes' . "\n" . '\\_pgettext("Context", "Message")' . "\n", ]; yield 't(message = "Message", context = "Context", notes = "Notes")' => [ [ 'message' => self::getConstantExpression('Message'), 'context' => self::getConstantExpression('Context'), 'notes' => self::getConstantExpression('Notes'), ], "\n" . '// l10n: Notes' . "\n" . '\\_pgettext("Context", "Message")' . "\n", ]; yield 't("One apple", "%d apples", number_of_apples)' => [ [ self::getConstantExpression('One apple'), self::getConstantExpression('%d apples'), self::getNameExpression('number_of_apples'), ], '\\_ngettext("One apple", "%d apples", // line 1' . "\n" . '($context["number_of_apples"] ?? null))', ]; yield 't("One apple", "%d apples", count = number_of_apples)' => [ [ 0 => self::getConstantExpression('One apple'), 1 => self::getConstantExpression('%d apples'), 'count' => self::getNameExpression('number_of_apples'), ], '\\_ngettext("One apple", "%d apples", // line 1' . "\n" . '($context["number_of_apples"] ?? null))', ]; yield 't("One apple", plural = "%d apples", count = number_of_apples)' => [ [ 0 => self::getConstantExpression('One apple'), 'plural' => self::getConstantExpression('%d apples'), 'count' => self::getNameExpression('number_of_apples'), ], '\\_ngettext("One apple", "%d apples", // line 1' . "\n" . '($context["number_of_apples"] ?? null))', ]; yield 't(singular = "One apple", plural = "%d apples", count = number_of_apples)' => [ [ 'singular' => self::getConstantExpression('One apple'), 'plural' => self::getConstantExpression('%d apples'), 'count' => self::getNameExpression('number_of_apples'), ], '\\_ngettext("One apple", "%d apples", // line 1' . "\n" . '($context["number_of_apples"] ?? null))', ]; yield 't("One apple", "%d apples", 3, notes = "Notes")' => [ [ 0 => self::getConstantExpression('One apple'), 1 => self::getConstantExpression('%d apples'), 2 => self::getConstantExpression(3), 'notes' => self::getConstantExpression('Notes'), ], "\n" . '// l10n: Notes' . "\n" . '\\_ngettext("One apple", "%d apples", 3)' . "\n", ]; yield 't(singular = "One apple", plural = "%d apples", count = 3, notes = "Notes")' => [ [ 'singular' => self::getConstantExpression('One apple'), 'plural' => self::getConstantExpression('%d apples'), 'count' => self::getConstantExpression(3), 'notes' => self::getConstantExpression('Notes'), ], "\n" . '// l10n: Notes' . "\n" . '\\_ngettext("One apple", "%d apples", 3)' . "\n", ]; } /** @param Node[] $arguments */ #[DataProvider('transExpressionsWithErrorProvider')] public function testTransExpressionsWithError(array $arguments, string $expected): void { self::expectException(SyntaxError::class); self::expectExceptionMessage($expected); (new TransExpression('t', new Node($arguments), 1))->compile($this->getCompiler()); } /** @return iterable */ public static function transExpressionsWithErrorProvider(): iterable { yield 't()' => [[], 'Value for argument "message" must be a non-empty literal string at line 1.']; yield 't("")' => [ [self::getConstantExpression('')], 'Value for argument "message" must be a non-empty literal string at line 1.', ]; yield 't(message = "")' => [ ['message' => self::getConstantExpression('')], 'Value for argument "message" must be a non-empty literal string at line 1.', ]; yield 't(notes = "Notes")' => [ ['message' => self::getConstantExpression('')], 'Value for argument "message" must be a non-empty literal string at line 1.', ]; yield 't(variable_name)' => [ [self::getNameExpression('variable_name')], 'Value for argument "message" must be a non-empty literal string at line 1.', ]; yield 't(message = variable_name)' => [ ['message' => self::getNameExpression('variable_name')], 'Value for argument "message" must be a non-empty literal string at line 1.', ]; yield 't("Message", unknown = "Unknown argument")' => [ [self::getConstantExpression('Message'), 'unknown' => self::getConstantExpression('Unknown argument')], 'Unknown argument "unknown" at line 1.', ]; yield 't("Message", notes = variable_name)' => [ [self::getConstantExpression('Message'), 'notes' => self::getNameExpression('variable_name')], 'Value for argument "notes" must be a non-empty literal string at line 1.', ]; yield 't("Message", notes = "")' => [ [self::getConstantExpression('Message'), 'notes' => self::getConstantExpression('')], 'Value for argument "notes" must be a non-empty literal string at line 1.', ]; yield 't("Message", notes = " \n ")' => [ [self::getConstantExpression('Message'), 'notes' => self::getConstantExpression(" \n\r ")], 'Value for argument "notes" must be a non-empty literal string at line 1.', ]; yield 't("Message", context = variable_name)' => [ [self::getConstantExpression('Message'), 'context' => self::getNameExpression('variable_name')], 'Value for argument "context" must be a non-empty literal string at line 1.', ]; yield 't("Message", context = "")' => [ [self::getConstantExpression('Message'), 'context' => self::getConstantExpression('')], 'Value for argument "context" must be a non-empty literal string at line 1.', ]; yield 't("Message", message = "Message")' => [ [self::getConstantExpression('Message'), 'message' => self::getConstantExpression('Message')], 'Argument "message" is defined twice at line 1.', ]; yield 't("Message", context = "Context", message = "Message")' => [ [ 0 => self::getConstantExpression('Message'), 'context' => self::getConstantExpression('Context'), 'message' => self::getConstantExpression('Message'), ], 'Argument "message" is defined twice at line 1.', ]; yield 't("", "%d apples", 3)' => [ [ self::getConstantExpression(''), self::getConstantExpression('%d apples'), self::getConstantExpression(3), ], 'Value for argument "singular" must be a non-empty literal string at line 1.', ]; yield 't(variable_name, "%d apples", 3)' => [ [ self::getNameExpression('variable_name'), self::getConstantExpression('%d apples'), self::getConstantExpression(3), ], 'Value for argument "singular" must be a non-empty literal string at line 1.', ]; yield 't("One apple", "", 3)' => [ [ self::getConstantExpression('One apple'), self::getConstantExpression(''), self::getConstantExpression(3), ], 'Value for argument "plural" must be a non-empty literal string at line 1.', ]; yield 't("One apple", variable_name, 3)' => [ [ self::getConstantExpression('One apple'), self::getNameExpression('variable_name'), self::getConstantExpression(3), ], 'Value for argument "plural" must be a non-empty literal string at line 1.', ]; yield 't("One apple", "%d apples")' => [ [ self::getConstantExpression('One apple'), self::getConstantExpression('%d apples'), ], 'Value for argument "count" is required at line 1.', ]; yield 't("One apple", "%d apples", 3, singular = "One apple")' => [ [ 0 => self::getConstantExpression('One apple'), 1 => self::getConstantExpression('%d apples'), 2 => self::getConstantExpression(3), 'singular' => self::getConstantExpression('One apple'), ], 'Argument "singular" is defined twice at line 1.', ]; yield 't("One apple", "%d apples", 3, plural = "%d apples")' => [ [ 0 => self::getConstantExpression('One apple'), 1 => self::getConstantExpression('%d apples'), 2 => self::getConstantExpression(3), 'plural' => self::getConstantExpression('%d apples'), ], 'Argument "plural" is defined twice at line 1.', ]; yield 't("One apple", "%d apples", 3, count = 3)' => [ [ 0 => self::getConstantExpression('One apple'), 1 => self::getConstantExpression('%d apples'), 2 => self::getConstantExpression(3), 'count' => self::getConstantExpression(3), ], 'Argument "count" is defined twice at line 1.', ]; } private static function getConstantExpression(mixed $value): ConstantExpression { return new ConstantExpression($value, 1); } private static function getNameExpression(string $name): NameExpression { return new NameExpression($name, 1); } private function getCompiler(): Compiler { return (new Compiler(Template::getTwigEnvironment(null, false)))->reset(); } }