diff --git a/CHANGELOG b/CHANGELOG index d36aa696f..23970440b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,7 @@ # 3.21.0 (2025-XX-XX) + * Fix testing and expression when it evaluates to an instance of `Markup` + * Add `ReturnPrimitiveTypeInterface` (and sub-interfaces for number, boolean, string, and array) * Add `SupportDefinedTestInterface` for expression nodes supporting the `defined` test * Deprecate using the `|` operator in an expression with `+` or `-` without using parentheses to clarify precedence * Deprecate operator precedence outside of the [0, 512] range diff --git a/src/Extension/CoreExtension.php b/src/Extension/CoreExtension.php index f44b6ad6d..e41b5ba3c 100644 --- a/src/Extension/CoreExtension.php +++ b/src/Extension/CoreExtension.php @@ -76,6 +76,7 @@ use Twig\Node\Expression\Test\EvenTest; use Twig\Node\Expression\Test\NullTest; use Twig\Node\Expression\Test\OddTest; use Twig\Node\Expression\Test\SameasTest; +use Twig\Node\Expression\Test\TrueTest; use Twig\Node\Expression\Unary\NegUnary; use Twig\Node\Expression\Unary\NotUnary; use Twig\Node\Expression\Unary\PosUnary; @@ -318,6 +319,7 @@ final class CoreExtension extends AbstractExtension new TwigTest('iterable', 'is_iterable'), new TwigTest('sequence', [self::class, 'testSequence']), new TwigTest('mapping', [self::class, 'testMapping']), + new TwigTest('true', null, ['node_class' => TrueTest::class]), ]; } diff --git a/src/Node/Expression/ArrayExpression.php b/src/Node/Expression/ArrayExpression.php index e58f43c91..9678be26c 100644 --- a/src/Node/Expression/ArrayExpression.php +++ b/src/Node/Expression/ArrayExpression.php @@ -16,7 +16,7 @@ use Twig\Node\Expression\Unary\SpreadUnary; use Twig\Node\Expression\Unary\StringCastUnary; use Twig\Node\Expression\Variable\ContextVariable; -class ArrayExpression extends AbstractExpression implements SupportDefinedTestInterface +class ArrayExpression extends AbstractExpression implements SupportDefinedTestInterface, ReturnArrayInterface { use SupportDefinedTestTrait; diff --git a/src/Node/Expression/Binary/AddBinary.php b/src/Node/Expression/Binary/AddBinary.php index ee4307e33..42377aea0 100644 --- a/src/Node/Expression/Binary/AddBinary.php +++ b/src/Node/Expression/Binary/AddBinary.php @@ -13,8 +13,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnNumberInterface; -class AddBinary extends AbstractBinary +class AddBinary extends AbstractBinary implements ReturnNumberInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/AndBinary.php b/src/Node/Expression/Binary/AndBinary.php index 5f2380da5..454ea70e5 100644 --- a/src/Node/Expression/Binary/AndBinary.php +++ b/src/Node/Expression/Binary/AndBinary.php @@ -13,8 +13,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class AndBinary extends AbstractBinary +class AndBinary extends AbstractBinary implements ReturnBoolInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/BitwiseAndBinary.php b/src/Node/Expression/Binary/BitwiseAndBinary.php index db7d6d612..1c26f9893 100644 --- a/src/Node/Expression/Binary/BitwiseAndBinary.php +++ b/src/Node/Expression/Binary/BitwiseAndBinary.php @@ -13,8 +13,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnNumberInterface; -class BitwiseAndBinary extends AbstractBinary +class BitwiseAndBinary extends AbstractBinary implements ReturnNumberInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/BitwiseOrBinary.php b/src/Node/Expression/Binary/BitwiseOrBinary.php index ce803dd90..ec17e2280 100644 --- a/src/Node/Expression/Binary/BitwiseOrBinary.php +++ b/src/Node/Expression/Binary/BitwiseOrBinary.php @@ -13,8 +13,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnNumberInterface; -class BitwiseOrBinary extends AbstractBinary +class BitwiseOrBinary extends AbstractBinary implements ReturnNumberInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/BitwiseXorBinary.php b/src/Node/Expression/Binary/BitwiseXorBinary.php index 5c2978501..e6432a7ae 100644 --- a/src/Node/Expression/Binary/BitwiseXorBinary.php +++ b/src/Node/Expression/Binary/BitwiseXorBinary.php @@ -13,8 +13,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnNumberInterface; -class BitwiseXorBinary extends AbstractBinary +class BitwiseXorBinary extends AbstractBinary implements ReturnNumberInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/ConcatBinary.php b/src/Node/Expression/Binary/ConcatBinary.php index f825ab874..75ee65473 100644 --- a/src/Node/Expression/Binary/ConcatBinary.php +++ b/src/Node/Expression/Binary/ConcatBinary.php @@ -13,8 +13,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnStringInterface; -class ConcatBinary extends AbstractBinary +class ConcatBinary extends AbstractBinary implements ReturnStringInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/DivBinary.php b/src/Node/Expression/Binary/DivBinary.php index e3817d1cd..11c061e18 100644 --- a/src/Node/Expression/Binary/DivBinary.php +++ b/src/Node/Expression/Binary/DivBinary.php @@ -13,8 +13,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnNumberInterface; -class DivBinary extends AbstractBinary +class DivBinary extends AbstractBinary implements ReturnNumberInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/EndsWithBinary.php b/src/Node/Expression/Binary/EndsWithBinary.php index a73a5608d..e689d668a 100644 --- a/src/Node/Expression/Binary/EndsWithBinary.php +++ b/src/Node/Expression/Binary/EndsWithBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class EndsWithBinary extends AbstractBinary +class EndsWithBinary extends AbstractBinary implements ReturnBoolInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/EqualBinary.php b/src/Node/Expression/Binary/EqualBinary.php index 5f423196f..8c3650355 100644 --- a/src/Node/Expression/Binary/EqualBinary.php +++ b/src/Node/Expression/Binary/EqualBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class EqualBinary extends AbstractBinary +class EqualBinary extends AbstractBinary implements ReturnBoolInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/FloorDivBinary.php b/src/Node/Expression/Binary/FloorDivBinary.php index d7e7980ef..a60ab3b21 100644 --- a/src/Node/Expression/Binary/FloorDivBinary.php +++ b/src/Node/Expression/Binary/FloorDivBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnNumberInterface; -class FloorDivBinary extends AbstractBinary +class FloorDivBinary extends AbstractBinary implements ReturnNumberInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/GreaterBinary.php b/src/Node/Expression/Binary/GreaterBinary.php index f42de3f86..71a980b3e 100644 --- a/src/Node/Expression/Binary/GreaterBinary.php +++ b/src/Node/Expression/Binary/GreaterBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class GreaterBinary extends AbstractBinary +class GreaterBinary extends AbstractBinary implements ReturnBoolInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/GreaterEqualBinary.php b/src/Node/Expression/Binary/GreaterEqualBinary.php index 0c4f43fd9..c92e61b37 100644 --- a/src/Node/Expression/Binary/GreaterEqualBinary.php +++ b/src/Node/Expression/Binary/GreaterEqualBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class GreaterEqualBinary extends AbstractBinary +class GreaterEqualBinary extends AbstractBinary implements ReturnBoolInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/HasEveryBinary.php b/src/Node/Expression/Binary/HasEveryBinary.php index c57bb20e9..22b380118 100644 --- a/src/Node/Expression/Binary/HasEveryBinary.php +++ b/src/Node/Expression/Binary/HasEveryBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class HasEveryBinary extends AbstractBinary +class HasEveryBinary extends AbstractBinary implements ReturnBoolInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/HasSomeBinary.php b/src/Node/Expression/Binary/HasSomeBinary.php index 12293f84c..a2a363e99 100644 --- a/src/Node/Expression/Binary/HasSomeBinary.php +++ b/src/Node/Expression/Binary/HasSomeBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class HasSomeBinary extends AbstractBinary +class HasSomeBinary extends AbstractBinary implements ReturnBoolInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/InBinary.php b/src/Node/Expression/Binary/InBinary.php index 68a98fe15..31a21e7d6 100644 --- a/src/Node/Expression/Binary/InBinary.php +++ b/src/Node/Expression/Binary/InBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class InBinary extends AbstractBinary +class InBinary extends AbstractBinary implements ReturnBoolInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/LessBinary.php b/src/Node/Expression/Binary/LessBinary.php index fb3264a2d..293d98d51 100644 --- a/src/Node/Expression/Binary/LessBinary.php +++ b/src/Node/Expression/Binary/LessBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class LessBinary extends AbstractBinary +class LessBinary extends AbstractBinary implements ReturnBoolInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/LessEqualBinary.php b/src/Node/Expression/Binary/LessEqualBinary.php index 8f3653892..239d9fdfe 100644 --- a/src/Node/Expression/Binary/LessEqualBinary.php +++ b/src/Node/Expression/Binary/LessEqualBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class LessEqualBinary extends AbstractBinary +class LessEqualBinary extends AbstractBinary implements ReturnBoolInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/MatchesBinary.php b/src/Node/Expression/Binary/MatchesBinary.php index 0a523c216..32e8d34e4 100644 --- a/src/Node/Expression/Binary/MatchesBinary.php +++ b/src/Node/Expression/Binary/MatchesBinary.php @@ -13,10 +13,11 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; use Twig\Error\SyntaxError; +use Twig\Node\Expression\ReturnBoolInterface; use Twig\Node\Expression\ConstantExpression; use Twig\Node\Node; -class MatchesBinary extends AbstractBinary +class MatchesBinary extends AbstractBinary implements ReturnBoolInterface { public function __construct(Node $left, Node $right, int $lineno) { diff --git a/src/Node/Expression/Binary/ModBinary.php b/src/Node/Expression/Binary/ModBinary.php index 271b45cac..aef48f3d0 100644 --- a/src/Node/Expression/Binary/ModBinary.php +++ b/src/Node/Expression/Binary/ModBinary.php @@ -13,8 +13,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnNumberInterface; -class ModBinary extends AbstractBinary +class ModBinary extends AbstractBinary implements ReturnNumberInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/MulBinary.php b/src/Node/Expression/Binary/MulBinary.php index 6d4c1e0b6..beb881ae3 100644 --- a/src/Node/Expression/Binary/MulBinary.php +++ b/src/Node/Expression/Binary/MulBinary.php @@ -13,8 +13,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnNumberInterface; -class MulBinary extends AbstractBinary +class MulBinary extends AbstractBinary implements ReturnNumberInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/NotEqualBinary.php b/src/Node/Expression/Binary/NotEqualBinary.php index d137ef627..fd24ef911 100644 --- a/src/Node/Expression/Binary/NotEqualBinary.php +++ b/src/Node/Expression/Binary/NotEqualBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class NotEqualBinary extends AbstractBinary +class NotEqualBinary extends AbstractBinary implements ReturnBoolInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/NotInBinary.php b/src/Node/Expression/Binary/NotInBinary.php index 80c8755d8..9fd27311f 100644 --- a/src/Node/Expression/Binary/NotInBinary.php +++ b/src/Node/Expression/Binary/NotInBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class NotInBinary extends AbstractBinary +class NotInBinary extends AbstractBinary implements ReturnBoolInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/OrBinary.php b/src/Node/Expression/Binary/OrBinary.php index 21f87c91b..82dcb7e95 100644 --- a/src/Node/Expression/Binary/OrBinary.php +++ b/src/Node/Expression/Binary/OrBinary.php @@ -13,8 +13,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class OrBinary extends AbstractBinary +class OrBinary extends AbstractBinary implements ReturnBoolInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/PowerBinary.php b/src/Node/Expression/Binary/PowerBinary.php index c9f4c6697..5325e8eb0 100644 --- a/src/Node/Expression/Binary/PowerBinary.php +++ b/src/Node/Expression/Binary/PowerBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnNumberInterface; -class PowerBinary extends AbstractBinary +class PowerBinary extends AbstractBinary implements ReturnNumberInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/RangeBinary.php b/src/Node/Expression/Binary/RangeBinary.php index 55982c819..f318d8e55 100644 --- a/src/Node/Expression/Binary/RangeBinary.php +++ b/src/Node/Expression/Binary/RangeBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnArrayInterface; -class RangeBinary extends AbstractBinary +class RangeBinary extends AbstractBinary implements ReturnArrayInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/SpaceshipBinary.php b/src/Node/Expression/Binary/SpaceshipBinary.php index ae5a4a493..c0a28b0a8 100644 --- a/src/Node/Expression/Binary/SpaceshipBinary.php +++ b/src/Node/Expression/Binary/SpaceshipBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnNumberInterface; -class SpaceshipBinary extends AbstractBinary +class SpaceshipBinary extends AbstractBinary implements ReturnNumberInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/StartsWithBinary.php b/src/Node/Expression/Binary/StartsWithBinary.php index 4519f30d9..ef2fc9502 100644 --- a/src/Node/Expression/Binary/StartsWithBinary.php +++ b/src/Node/Expression/Binary/StartsWithBinary.php @@ -12,8 +12,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class StartsWithBinary extends AbstractBinary +class StartsWithBinary extends AbstractBinary implements ReturnBoolInterface { public function compile(Compiler $compiler): void { diff --git a/src/Node/Expression/Binary/SubBinary.php b/src/Node/Expression/Binary/SubBinary.php index eeb87faca..10663f5c1 100644 --- a/src/Node/Expression/Binary/SubBinary.php +++ b/src/Node/Expression/Binary/SubBinary.php @@ -13,8 +13,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnNumberInterface; -class SubBinary extends AbstractBinary +class SubBinary extends AbstractBinary implements ReturnNumberInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/Binary/XorBinary.php b/src/Node/Expression/Binary/XorBinary.php index d8ccd7853..6f412d22f 100644 --- a/src/Node/Expression/Binary/XorBinary.php +++ b/src/Node/Expression/Binary/XorBinary.php @@ -13,8 +13,9 @@ namespace Twig\Node\Expression\Binary; use Twig\Compiler; +use Twig\Node\Expression\ReturnBoolInterface; -class XorBinary extends AbstractBinary +class XorBinary extends AbstractBinary implements ReturnBoolInterface { public function operator(Compiler $compiler): Compiler { diff --git a/src/Node/Expression/ConstantExpression.php b/src/Node/Expression/ConstantExpression.php index 8f8b2ffe9..12dc0621f 100644 --- a/src/Node/Expression/ConstantExpression.php +++ b/src/Node/Expression/ConstantExpression.php @@ -17,7 +17,7 @@ use Twig\Compiler; /** * @final */ -class ConstantExpression extends AbstractExpression implements SupportDefinedTestInterface +class ConstantExpression extends AbstractExpression implements SupportDefinedTestInterface, ReturnPrimitiveTypeInterface { use SupportDefinedTestTrait; diff --git a/src/Node/Expression/ReturnArrayInterface.php b/src/Node/Expression/ReturnArrayInterface.php new file mode 100644 index 000000000..a74864b5d --- /dev/null +++ b/src/Node/Expression/ReturnArrayInterface.php @@ -0,0 +1,16 @@ +getTemplateLine()); + } + parent::__construct(['test' => $test, 'left' => $left, 'right' => $right], [], $lineno); } diff --git a/src/Node/Expression/Test/NullTest.php b/src/Node/Expression/Test/NullTest.php index 45b54ae37..be5d38891 100644 --- a/src/Node/Expression/Test/NullTest.php +++ b/src/Node/Expression/Test/NullTest.php @@ -15,7 +15,7 @@ use Twig\Compiler; use Twig\Node\Expression\TestExpression; /** - * Checks that a variable is null. + * Checks that an expression is null. * * {{ var is none }} * diff --git a/src/Node/Expression/Test/TrueTest.php b/src/Node/Expression/Test/TrueTest.php new file mode 100644 index 000000000..22186a689 --- /dev/null +++ b/src/Node/Expression/Test/TrueTest.php @@ -0,0 +1,34 @@ + + */ +class TrueTest extends TestExpression +{ + public function compile(Compiler $compiler): void + { + $compiler + ->raw('(($tmp = ') + ->subcompile($this->getNode('node')) + ->raw(') && $tmp instanceof Markup ? (string) $tmp : $tmp)') + ; + } +} diff --git a/src/Node/Expression/TestExpression.php b/src/Node/Expression/TestExpression.php index 27e1526a1..3b51dd320 100644 --- a/src/Node/Expression/TestExpression.php +++ b/src/Node/Expression/TestExpression.php @@ -17,7 +17,7 @@ use Twig\Node\NameDeprecation; use Twig\Node\Node; use Twig\TwigTest; -class TestExpression extends CallExpression +class TestExpression extends CallExpression implements ReturnBoolInterface { #[FirstClassTwigCallableReady] /** diff --git a/src/Node/IfNode.php b/src/Node/IfNode.php index 2af48fa81..2c0e2a8e9 100644 --- a/src/Node/IfNode.php +++ b/src/Node/IfNode.php @@ -14,6 +14,9 @@ namespace Twig\Node; use Twig\Attribute\YieldReady; use Twig\Compiler; +use Twig\Node\Expression\ReturnPrimitiveTypeInterface; +use Twig\Node\Expression\Test\TrueTest; +use Twig\TwigTest; /** * Represents an if node. @@ -25,6 +28,12 @@ class IfNode extends Node { public function __construct(Node $tests, ?Node $else, int $lineno) { + for ($i = 0, $count = \count($tests); $i < $count; $i += 2) { + $test = $tests->getNode((string) $i); + if (!$test instanceof ReturnPrimitiveTypeInterface) { + $tests->setNode($i, new TrueTest($test, new TwigTest('true'), null, $test->getTemplateLine())); + } + } $nodes = ['tests' => $tests]; if (null !== $else) { $nodes['else'] = $else; diff --git a/tests/Fixtures/regression/markup_test.test b/tests/Fixtures/regression/markup_test.test new file mode 100644 index 000000000..e03c5291b --- /dev/null +++ b/tests/Fixtures/regression/markup_test.test @@ -0,0 +1,18 @@ +--TEST-- +Twig outputs 0 nodes correctly +--TEMPLATE-- +{{ empty|trim ? 'KO' : 'ok' }} +{{ spaces|trim ? 'KO' : 'ok' }} +{% if empty %}KO{% else %}ok{% endif %} + +{% if spaces|trim %}KO{% else %}ok{% endif %} + +{% set bar %} {% endset %}{{ bar|trim ? 'KO' : 'ok' }} +--DATA-- +return ['spaces' => new Twig\Markup(' ', 'UTF-8'), 'empty' => new Twig\Markup('', 'UTF-8')] +--EXPECT-- +ok +ok +ok +ok +ok