5 * Contains \Drupal\KernelTests\Core\Theme\TwigMarkupInterfaceTest.
8 namespace Drupal\KernelTests\Core\Theme;
10 use Drupal\Component\Render\FormattableMarkup;
11 use Drupal\Component\Render\MarkupInterface;
12 use Drupal\Component\Render\MarkupTrait;
13 use Drupal\Core\GeneratedLink;
14 use Drupal\Core\Render\RenderContext;
15 use Drupal\Core\Render\Markup;
16 use Drupal\Core\Site\Settings;
17 use Drupal\Core\StringTranslation\TranslatableMarkup;
18 use Drupal\KernelTests\KernelTestBase;
21 * Tests Twig with MarkupInterface objects.
25 class TwigMarkupInterfaceTest extends KernelTestBase {
32 public static $modules = [
37 * @dataProvider providerTestMarkupInterfaceEmpty
39 public function testMarkupInterfaceEmpty($expected, $variable) {
40 $this->assertEquals($expected, $this->renderObjectWithTwig($variable));
44 * Provide test examples.
46 public function providerTestMarkupInterfaceEmpty() {
48 // @codingStandardsIgnoreStart
49 // The first argument to \Drupal\Core\StringTranslation\TranslatableMarkup
50 // is not supposed to be an empty string.
51 'empty TranslatableMarkup' => ['', new TranslatableMarkup('')],
52 // @codingStandardsIgnoreEnd
53 'non-empty TranslatableMarkup' => ['<span>test</span>', new TranslatableMarkup('test')],
54 'empty FormattableMarkup' => ['', new FormattableMarkup('', ['@foo' => 'bar'])],
55 'non-empty FormattableMarkup' => ['<span>bar</span>', new FormattableMarkup('@foo', ['@foo' => 'bar'])],
56 'non-empty Markup' => ['<span>test</span>', Markup::create('test')],
57 'empty GeneratedLink' => ['', new GeneratedLink()],
58 'non-empty GeneratedLink' => ['<span><a hef="http://www.example.com">test</a></span>', (new GeneratedLink())->setGeneratedLink('<a hef="http://www.example.com">test</a>')],
59 // Test objects that do not implement \Countable.
60 'empty SafeMarkupTestMarkup' => ['', SafeMarkupTestMarkup::create('')],
61 'non-empty SafeMarkupTestMarkup' => ['<span>test</span>', SafeMarkupTestMarkup::create('test')],
66 * Tests behaviour if a string is translated to become an empty string.
68 public function testEmptyTranslation() {
69 $settings = Settings::getAll();
70 $settings['locale_custom_strings_en'] = ['' => ['test' => '']];
71 // Recreate the settings static.
72 new Settings($settings);
74 $variable = new TranslatableMarkup('test');
75 $this->assertEquals('', $this->renderObjectWithTwig($variable));
77 $variable = new TranslatableMarkup('test', [], ['langcode' => 'de']);
78 $this->assertEquals('<span>test</span>', $this->renderObjectWithTwig($variable));
82 * @return \Drupal\Component\Render\MarkupInterface
85 protected function renderObjectWithTwig($variable) {
86 /** @var \Drupal\Core\Render\RendererInterface $renderer */
87 $renderer = \Drupal::service('renderer');
88 $context = new RenderContext();
89 return $renderer->executeInRenderContext($context, function () use ($renderer, $variable) {
91 '#type' => 'inline_template',
92 '#template' => '{%- if variable is not empty -%}<span>{{ variable }}</span>{%- endif -%}',
93 '#context' => ['variable' => $variable],
95 return $renderer->render($elements);
102 * Implements MarkupInterface without implementing \Countable
104 class SafeMarkupTestMarkup implements MarkupInterface {
108 * Overrides MarkupTrait::create() to allow creation with empty strings.
110 public static function create($string) {
111 $object = new static();
112 $object->string = $string;