dbdf351a718321e11c245b91951d312a6e6460cc
[yaffs-website] / web / core / tests / Drupal / KernelTests / Core / Theme / TwigMarkupInterfaceTest.php
1 <?php
2
3 /**
4  * @file
5  * Contains \Drupal\KernelTests\Core\Theme\TwigMarkupInterfaceTest.
6  */
7
8 namespace Drupal\KernelTests\Core\Theme;
9
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;
19
20 /**
21  * Tests Twig with MarkupInterface objects.
22  *
23  * @group Theme
24  */
25 class TwigMarkupInterfaceTest extends KernelTestBase {
26
27   /**
28    * Modules to enable.
29    *
30    * @var array
31    */
32   public static $modules = [
33     'language'
34   ];
35
36   /**
37    * @dataProvider providerTestMarkupInterfaceEmpty
38    */
39   public function testMarkupInterfaceEmpty($expected, $variable) {
40     $this->assertEquals($expected, $this->renderObjectWithTwig($variable));
41   }
42
43   /**
44    * Provide test examples.
45    */
46   public function providerTestMarkupInterfaceEmpty() {
47     return [
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')],
62     ];
63   }
64
65   /**
66    * Tests behaviour if a string is translated to become an empty string.
67    */
68   public function testEmptyTranslation() {
69     $settings = Settings::getAll();
70     $settings['locale_custom_strings_en'] = ['' => ['test' => '']];
71     // Recreate the settings static.
72     new Settings($settings);
73
74     $variable = new TranslatableMarkup('test');
75     $this->assertEquals('', $this->renderObjectWithTwig($variable));
76
77     $variable = new TranslatableMarkup('test', [], ['langcode' => 'de']);
78     $this->assertEquals('<span>test</span>', $this->renderObjectWithTwig($variable));
79   }
80
81   /**
82    * @return \Drupal\Component\Render\MarkupInterface
83    *   The rendered HTML.
84    */
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) {
90       $elements = [
91         '#type' => 'inline_template',
92         '#template' => '{%- if variable is not empty -%}<span>{{ variable }}</span>{%- endif -%}',
93         '#context' => ['variable' => $variable],
94       ];
95       return $renderer->render($elements);
96     });
97   }
98
99 }
100
101 /**
102  * Implements MarkupInterface without implementing \Countable
103  */
104 class SafeMarkupTestMarkup implements MarkupInterface {
105   use MarkupTrait;
106
107   /**
108    * Overrides MarkupTrait::create() to allow creation with empty strings.
109    */
110   public static function create($string) {
111     $object = new static();
112     $object->string = $string;
113     return $object;
114   }
115
116 }