diff --git a/modules/ui_patterns_field_formatters/tests/src/Functional/LayoutBuilderFieldFormatterRenderTest.php b/modules/ui_patterns_field_formatters/tests/src/Functional/LayoutBuilderFieldFormatterRenderTest.php
index 27d915a8e1ed2c6a5637e6485df591536d94c85e..988b6e9abbd90797d4a69762d8135e5d7ddff5a4 100644
--- a/modules/ui_patterns_field_formatters/tests/src/Functional/LayoutBuilderFieldFormatterRenderTest.php
+++ b/modules/ui_patterns_field_formatters/tests/src/Functional/LayoutBuilderFieldFormatterRenderTest.php
@@ -46,7 +46,7 @@ class LayoutBuilderFieldFormatterRenderTest extends UiPatternsFunctionalTestBase
   public function testContextInForm(): void {
     $this->createTestContentContentType();
     $assert_session = $this->assertSession();
-    $config_import = $this->loadConfigFixture(__DIR__ . '/../fixtures/core.entity_view_display.node.page.full.yml');
+    $config_import = $this->loadConfigFixture(__DIR__ . '/../fixtures/core.entity_view_display.node.page.full.layout_builder.yml');
     $ui_patterns_config = &$config_import['third_party_settings']['layout_builder']['sections'][0]['components']['6d778a84-cdc2-4a00-af66-54dab3ea2bf7']['configuration']['formatter']['settings']['ui_patterns'];
     $test_data = $this->loadTestDataFixture();
     $test_set = $test_data->getTestSet('context_exists_default');
@@ -64,7 +64,7 @@ class LayoutBuilderFieldFormatterRenderTest extends UiPatternsFunctionalTestBase
    */
   public function testRender(): void {
     $assert_session = $this->assertSession();
-    $config_import = $this->loadConfigFixture(__DIR__ . '/../fixtures/core.entity_view_display.node.page.full.yml');
+    $config_import = $this->loadConfigFixture(__DIR__ . '/../fixtures/core.entity_view_display.node.page.full.layout_builder.yml');
     $ui_patterns_config = &$config_import['third_party_settings']['layout_builder']['sections'][0]['components']['6d778a84-cdc2-4a00-af66-54dab3ea2bf7']['configuration']['formatter']['settings']['ui_patterns'];
     $test_data = $this->loadTestDataFixture();
     $tests = [
diff --git a/modules/ui_patterns_field_formatters/tests/src/Kernel/Source/FieldFormatterSourceTest.php b/modules/ui_patterns_field_formatters/tests/src/Kernel/Source/FieldFormatterSourceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..93bae0389d7419670ec2b714132a9b1fb7258b20
--- /dev/null
+++ b/modules/ui_patterns_field_formatters/tests/src/Kernel/Source/FieldFormatterSourceTest.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\ui_patterns_field_formatters\Kernel\Source;
+
+use Drupal\Tests\ui_patterns\Kernel\SourcePluginsTestBase;
+
+/**
+ * Test FieldFormatterSource.
+ *
+ * @coversDefaultClass \Drupal\ui_patterns_field_formatters\Plugin\UiPatterns\Source\FieldFormatterSource
+ * @group ui_patterns_field_formatters
+ */
+class FieldFormatterSourceTest extends SourcePluginsTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = ['ui_patterns_field_formatters'];
+
+  /**
+   * Test Field Property Plugin.
+   */
+  public function testPlugin(): void {
+    $testData = self::loadTestDataFixture(__DIR__ . "/../../fixtures/tests.yml");
+    $testSets = $testData->getTestSets();
+    foreach ($testSets as $test_set_name => $test_set) {
+      if (!str_starts_with($test_set_name, 'field_formatter_')) {
+        continue;
+      }
+      $this->runSourcePluginTest($test_set);
+    }
+  }
+
+}
diff --git a/modules/ui_patterns_field_formatters/tests/src/Kernel/Source/FieldLabelSourceTest.php b/modules/ui_patterns_field_formatters/tests/src/Kernel/Source/FieldLabelSourceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..4efafc2205a3512ce039d62971755c444771fd69
--- /dev/null
+++ b/modules/ui_patterns_field_formatters/tests/src/Kernel/Source/FieldLabelSourceTest.php
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\Tests\ui_patterns_field_formatters\Kernel\Source;
+
+use Drupal\Tests\ui_patterns\Kernel\SourcePluginsTestBase;
+
+/**
+ * Test FieldLabelSource.
+ *
+ * @coversDefaultClass \Drupal\ui_patterns_field_formatters\Plugin\UiPatterns\Source\FieldLabelSource
+ * @group ui_patterns_field_formatters
+ */
+class FieldLabelSourceTest extends SourcePluginsTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = ['ui_patterns_field_formatters'];
+
+  /**
+   * Test Field Property Plugin.
+   */
+  public function testPlugin(): void {
+    $testData = self::loadTestDataFixture(__DIR__ . "/../../fixtures/tests.yml");
+    $testSets = $testData->getTestSets();
+    foreach ($testSets as $test_set_name => $test_set) {
+      if (!str_starts_with($test_set_name, 'field_label_')) {
+        continue;
+      }
+      $this->runSourcePluginTest($test_set);
+    }
+  }
+
+}
diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.classic.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.classic.yml
new file mode 100644
index 0000000000000000000000000000000000000000..984f2dc88257b495c7adfd9e2e888b8b0af97996
--- /dev/null
+++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.classic.yml
@@ -0,0 +1,37 @@
+uuid: a9e67581-da30-4331-8fb0-397e185541f3
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.full
+    - field.field.node.page.body
+    - node.type.page
+  module:
+    - ui_patterns
+    - ui_patterns_field_formatters
+    - user
+_core:
+  default_config_hash: M_Y8L5tfmhx7DR143E05YyZSpvgil6VFvqcfBWykalg
+id: node.page.full
+targetEntityType: node
+bundle: page
+mode: full
+content:
+  body:
+    type: ui_patterns_component_per_item
+    label: hidden
+    settings:
+      ui_patterns:
+        component_id: 'ui_patterns_test_tmp:slot_test'
+        variant_id: null
+        props:
+          attributes:
+            source_id: attributes
+            source:
+              value: ''
+        slots: {  }
+    third_party_settings: {  }
+    weight: 0
+    region: content
+hidden:
+  links: true
diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.classic.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.classic.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5fbd562c71940f007a00e58fb58a2d80243cc88f
--- /dev/null
+++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.classic.yml
@@ -0,0 +1,44 @@
+uuid: a9e67581-da30-4331-8fb0-397e185541f3
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.full
+    - field.field.node.page.body
+    - node.type.page
+  module:
+    - field_layout
+    - layout_discovery
+    - ui_patterns
+    - ui_patterns_field_formatters
+    - user
+third_party_settings:
+  field_layout:
+    id: layout_onecol
+    settings:
+      label: ''
+_core:
+  default_config_hash: M_Y8L5tfmhx7DR143E05YyZSpvgil6VFvqcfBWykalg
+id: node.page.full
+targetEntityType: node
+bundle: page
+mode: full
+content:
+  body:
+    type: ui_patterns_component_per_item
+    label: hidden
+    settings:
+      ui_patterns:
+        component_id: 'ui_patterns_test_tmp:slot_test'
+        variant_id: null
+        props:
+          attributes:
+            source_id: attributes
+            source:
+              value: ''
+        slots: {  }
+    third_party_settings: {  }
+    weight: 0
+    region: content
+hidden:
+  links: true
diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.section_component.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.section_component.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4b0e4ffdfd3e1ddf305c396c9c26f05c7f87d26c
--- /dev/null
+++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.section_component.yml
@@ -0,0 +1,53 @@
+uuid: a9e67581-da30-4331-8fb0-397e185541f3
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.full
+    - field.field.node.page.body
+    - node.type.page
+  module:
+    - field_layout
+    - ui_patterns
+    - ui_patterns_field_formatters
+    - ui_patterns_layouts
+    - user
+third_party_settings:
+  field_layout:
+    id: 'ui_patterns:ui_patterns_test_tmp:slot_test'
+    settings:
+      label: ''
+      ui_patterns:
+        component_id: null
+        variant_id: null
+        slots: {  }
+        props:
+          attributes:
+            source_id: attributes
+            source:
+              value: ''
+_core:
+  default_config_hash: M_Y8L5tfmhx7DR143E05YyZSpvgil6VFvqcfBWykalg
+id: node.page.full
+targetEntityType: node
+bundle: page
+mode: full
+content:
+  body:
+    type: ui_patterns_component_per_item
+    label: hidden
+    settings:
+      ui_patterns:
+        component_id: 'ui_patterns_test_tmp:slot_test'
+        variant_id: null
+        props:
+          attributes:
+            source_id: attributes
+            source:
+              value: ''
+        slots: {  }
+    third_party_settings: {  }
+    weight: 0
+    region: my_slot
+hidden:
+  links: true
diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8688ed4f73782488308c9b3ed40c56b0439f6c83
--- /dev/null
+++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout.yml
@@ -0,0 +1,54 @@
+uuid: a9e67581-da30-4331-8fb0-397e185541f3
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.full
+    - field.field.node.page.body
+    - node.type.page
+  module:
+    - field_layout
+    - ui_patterns
+    - ui_patterns_field_formatters
+    - ui_patterns_layouts
+    - ui_patterns_test_tmp
+    - user
+third_party_settings:
+  field_layout:
+    id: 'ui_patterns:ui_patterns_test_tmp:slot_test'
+    settings:
+      label: ''
+      ui_patterns:
+        component_id: null
+        variant_id: null
+        slots: {  }
+        props:
+          attributes:
+            source_id: attributes
+            source:
+              value: ''
+_core:
+  default_config_hash: M_Y8L5tfmhx7DR143E05YyZSpvgil6VFvqcfBWykalg
+id: node.page.full
+targetEntityType: node
+bundle: page
+mode: full
+content:
+  body:
+    type: ui_patterns_component_per_item
+    label: hidden
+    settings:
+      ui_patterns:
+        component_id: 'ui_patterns_test_tmp:slot_test'
+        variant_id: null
+        props:
+          attributes:
+            source_id: attributes
+            source:
+              value: ''
+        slots: {  }
+    third_party_settings: {  }
+    weight: 0
+    region: my_slot
+hidden:
+  links: true
diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout_builder.classic.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout_builder.classic.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ac36d93e33d02a7c42893b65b5a0009a826cfe4b
--- /dev/null
+++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout_builder.classic.yml
@@ -0,0 +1,78 @@
+uuid: a9e67581-da30-4331-8fb0-397e185541f3
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.full
+    - field.field.node.page.body
+    - node.type.page
+  module:
+    - layout_builder
+    - layout_discovery
+    - ui_patterns
+    - ui_patterns_field_formatters
+    - user
+third_party_settings:
+  layout_builder:
+    enabled: true
+    allow_custom: false
+    sections:
+      -
+        layout_id: layout_onecol
+        layout_settings:
+          label: ''
+          context_mapping: {  }
+        components:
+          b1fbf76f-1430-4a9c-8397-e060f3893142:
+            uuid: b1fbf76f-1430-4a9c-8397-e060f3893142
+            region: content
+            configuration:
+              id: 'field_block:node:page:body'
+              label: Body
+              label_display: '0'
+              provider: layout_builder
+              context_mapping:
+                entity: layout_builder.entity
+                view_mode: view_mode
+              formatter:
+                type: ui_patterns_component_per_item
+                label: above
+                settings:
+                  ui_patterns:
+                    component_id: 'ui_patterns_test_tmp:slot_test'
+                    variant_id: null
+                    props:
+                      attributes:
+                        source_id: attributes
+                        source:
+                          value: ''
+                    slots: {  }
+                third_party_settings: {  }
+            weight: 0
+            additional: {  }
+        third_party_settings: {  }
+_core:
+  default_config_hash: M_Y8L5tfmhx7DR143E05YyZSpvgil6VFvqcfBWykalg
+id: node.page.full
+targetEntityType: node
+bundle: page
+mode: full
+content:
+  body:
+    type: ui_patterns_component_per_item
+    label: hidden
+    settings:
+      ui_patterns:
+        component_id: 'ui_patterns_test_tmp:slot_test'
+        variant_id: null
+        props:
+          attributes:
+            source_id: attributes
+            source:
+              value: ''
+        slots: {  }
+    third_party_settings: {  }
+    weight: 0
+    region: my_slot
+hidden:
+  links: true
diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout_builder.section_component.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout_builder.section_component.yml
new file mode 100644
index 0000000000000000000000000000000000000000..22a9aad88f7e495fb18a6927768e39fd80a3aff9
--- /dev/null
+++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.layout_builder.section_component.yml
@@ -0,0 +1,89 @@
+uuid: a9e67581-da30-4331-8fb0-397e185541f3
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.full
+    - field.field.node.page.body
+    - node.type.page
+  module:
+    - layout_builder
+    - ui_patterns
+    - ui_patterns_field_formatters
+    - ui_patterns_layouts
+    - ui_patterns_test_tmp
+    - user
+third_party_settings:
+  layout_builder:
+    enabled: true
+    allow_custom: false
+    sections:
+      -
+        layout_id: 'ui_patterns:ui_patterns_test_tmp:slot_test'
+        layout_settings:
+          label: ''
+          context_mapping:
+            entity: layout_builder.entity
+          ui_patterns:
+            component_id: null
+            variant_id: null
+            slots: {  }
+            props:
+              attributes:
+                source_id: attributes
+                source:
+                  value: ''
+        components:
+          2b7726dd-cf0a-4b6c-b2d6-3c7e9b3bab33:
+            uuid: 2b7726dd-cf0a-4b6c-b2d6-3c7e9b3bab33
+            region: my_slot
+            configuration:
+              id: 'field_block:node:page:body'
+              label: Body
+              label_display: '0'
+              provider: layout_builder
+              context_mapping:
+                entity: layout_builder.entity
+                view_mode: view_mode
+              formatter:
+                type: ui_patterns_component_per_item
+                label: hidden
+                settings:
+                  ui_patterns:
+                    component_id: 'ui_patterns_test_tmp:slot_test'
+                    variant_id: null
+                    props:
+                      attributes:
+                        source_id: attributes
+                        source:
+                          value: ''
+                    slots: {  }
+                third_party_settings: {  }
+            weight: 0
+            additional: {  }
+        third_party_settings: {  }
+_core:
+  default_config_hash: M_Y8L5tfmhx7DR143E05YyZSpvgil6VFvqcfBWykalg
+id: node.page.full
+targetEntityType: node
+bundle: page
+mode: full
+content:
+  body:
+    type: ui_patterns_component_per_item
+    label: hidden
+    settings:
+      ui_patterns:
+        component_id: 'ui_patterns_test_tmp:slot_test'
+        variant_id: null
+        props:
+          attributes:
+            source_id: attributes
+            source:
+              value: ''
+        slots: {  }
+    third_party_settings: {  }
+    weight: 0
+    region: my_slot
+hidden:
+  links: true
diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.yml
deleted file mode 100644
index 1cbc9c0dc92c47ddf2b18b8d0a5e861f8a2c8e20..0000000000000000000000000000000000000000
--- a/modules/ui_patterns_field_formatters/tests/src/fixtures/core.entity_view_display.node.page.full.yml
+++ /dev/null
@@ -1,51 +0,0 @@
-langcode: en
-status: true
-third_party_settings:
-  layout_builder:
-    enabled: true
-    allow_custom: false
-    sections:
-      -
-        layout_id: 'ui_patterns:ui_patterns_test:test_wrapper_component'
-        layout_settings:
-          label: ''
-          context_mapping: {  }
-          ui_patterns:
-            component_id: null
-            variant_id: null
-            slots: {  }
-            props: {  }
-        components:
-          6d778a84-cdc2-4a00-af66-54dab3ea2bf7:
-            uuid: 6d778a84-cdc2-4a00-af66-54dab3ea2bf7
-            region: wrapper
-            configuration:
-              id: 'field_block:node:page:body'
-              label: Body
-              label_display: '0'
-              provider: layout_builder
-              context_mapping:
-                entity: layout_builder.entity
-                view_mode: view_mode
-              formatter:
-                type: ui_patterns_component_per_item
-                label: hidden
-                settings:
-                  ui_patterns:
-                    component_id: 'ui_patterns_test:test-component'
-                    variant_id: null
-                    slots: { }
-                    props: { }
-                third_party_settings: {  }
-            weight: 0
-            additional: {  }
-        third_party_settings: {  }
-  entity_test:
-    foo: bar
-id: node.page.full
-targetEntityType: node
-bundle: page
-mode: full
-content: {}
-hidden:
-  layout_builder__layout: true
diff --git a/modules/ui_patterns_field_formatters/tests/src/fixtures/tests.yml b/modules/ui_patterns_field_formatters/tests/src/fixtures/tests.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dce185888d1eb80a08efe0f4b2fc1774589cfe48
--- /dev/null
+++ b/modules/ui_patterns_field_formatters/tests/src/fixtures/tests.yml
@@ -0,0 +1,68 @@
+---
+field_formatter_default_1:
+  component:
+    component_id: ui_patterns_test:test-component
+    slots:
+      slot:
+        sources:
+          -
+            source_id: field_formatter:node:page:field_text_1
+            source:
+              type: 'string'
+#  contexs:
+    #bundle: page
+    #field_name: 'field_text_1'
+  entity:
+    field_text_1:
+      value: 'value_text_1'
+  output:
+    slots:
+      slot:
+        -
+          rendered_value: "<p>value_text_1</p>"
+          rendered_value_plain: "value_text_1"
+field_formatter_default_2:
+  component:
+    component_id: ui_patterns_test:test-component
+    props:
+      string:
+        source_id: field_formatter:node:page:field_text_1
+        source:
+          type: 'string'
+  output:
+    props:
+      string:
+        rendered_value: "<p>value_text_2</p>"
+        rendered_value_plain: "value_text_2"
+  entity:
+    field_text_1:
+      value: 'value_text_2'
+field_label_default_1:
+  component:
+    component_id: ui_patterns_test:test-component
+    slots:
+      slot:
+        sources:
+          -
+            source_id: field_label
+  contexts:
+    field_name: 'field_text_1'
+  entity: {}
+  output:
+    slots:
+      slot:
+        -
+          rendered_value: "Text (formatted)"
+field_label_default_2:
+  component:
+    component_id: ui_patterns_test:test-component
+    props:
+      string:
+        source_id: field_label
+  contexts:
+    field_name: 'field_text_1'
+  entity: {}
+  output:
+    props:
+      string:
+        value: "Text (formatted)"
diff --git a/tests/src/Traits/RunSourcePluginTestTrait.php b/tests/src/Traits/RunSourcePluginTestTrait.php
index 25da2062700755b3d4c61425d48061d9712075c1..9159b50c1e88216b54302f49ae974a5094669b2b 100644
--- a/tests/src/Traits/RunSourcePluginTestTrait.php
+++ b/tests/src/Traits/RunSourcePluginTestTrait.php
@@ -144,9 +144,12 @@ trait RunSourcePluginTestTrait {
             }
             $plugin = $this->getSourcePluginForPropOrSlot($component, $prop_or_slot_id, $source_to_test, $source_to_test["source_id"], $contexts);
             assertTrue($plugin instanceof SourcePluginBase);
-            $message = sprintf("Test '%s' failed for prop/slot '%s' of component %s with source '%s' ", $test_set["name"] ?? "", $prop_or_slot_id, $component_id, $source_to_test["source_id"]);
-            $prop_value = $plugin->getPropValue();
+            // getPropValue() returns the 'raw' value of the source compatible with the type declared.
+            // getValue() returns the value of the source converted to the type definition.
+            $prop_value = $plugin->getValue($plugin->getPropDefinition()["ui_patterns"]["type_definition"]);
+            $message = sprintf("Test '%s' failed for prop/slot '%s' of component %s with source '%s'", $test_set["name"] ?? "", $prop_or_slot_id, $component_id, $source_to_test["source_id"]);
             $this->assertExpectedOutput($expected_outputs_here[$index], $prop_value, $message);
+
           }
         }
       }
diff --git a/tests/src/Traits/TestDataTrait.php b/tests/src/Traits/TestDataTrait.php
index 6eadf582d7e84af9741c29cb24b9fb809fca6b1e..33b4417ae4dcb3fc19439f312261cee38f1c0e9a 100644
--- a/tests/src/Traits/TestDataTrait.php
+++ b/tests/src/Traits/TestDataTrait.php
@@ -4,7 +4,9 @@ declare(strict_types=1);
 
 namespace Drupal\Tests\ui_patterns\Traits;
 
+use Drupal\Component\Render\MarkupInterface;
 use Drupal\Component\Serialization\Yaml;
+use Drupal\Component\Utility\Xss;
 
 /**
  * Trait to read fixtures that describe component test situations.
@@ -51,20 +53,54 @@ trait TestDataTrait {
    * @throws \RuntimeException
    */
   protected function assertExpectedOutput(array $expected_result, mixed $result, string $message = ''): void {
+    $assert_done = FALSE;
     if (isset($expected_result['value'])) {
-      $this->assertContains($expected_result['value'], [$result], $message);
+      $this->assertContains($expected_result['value'], [$result], sprintf("%s: '%s'", $message, print_r($result, TRUE)));
+      $assert_done = TRUE;
     }
-    elseif (isset($expected_result['same'])) {
+    if (isset($expected_result['value_normalized'])) {
+      $normalized_value = self::normalizeMarkupString($result);
+      $this->assertContains($expected_result['value'], [$normalized_value], sprintf("%s: '%s'", $message, $normalized_value));
+      $assert_done = TRUE;
+    }
+    if (isset($expected_result['same'])) {
       $this->assertSame($expected_result['same'], $result, $message);
+      $assert_done = TRUE;
     }
-    elseif (isset($expected_result['regEx'])) {
+    if (isset($expected_result['regEx'])) {
       $this->assertTrue(preg_match($expected_result['regEx'], $result) === 1, $message);
+      $assert_done = TRUE;
+    }
+    if (isset($expected_result['rendered_value']) || isset($expected_result['rendered_value_plain']) || isset($expected_result['rendered_value_normalized'])) {
+      $rendered = \Drupal::service('renderer')->renderRoot($result);
+      // $rendered = is_array($result) ? \Drupal::service('renderer')->renderRoot($result) : $result;
+      if ($rendered instanceof MarkupInterface) {
+        $rendered = "" . $rendered;
+      }
+      $normalized_rendered = self::normalizeMarkupString($rendered);
+      if (isset($expected_result['rendered_value'])) {
+        $this->assertContains($expected_result['rendered_value'], [$normalized_rendered], sprintf("%s: '%s'", $message, $normalized_rendered));
+      }
+      if (isset($expected_result['rendered_value_plain'])) {
+        $rendered_plain = Xss::filter($normalized_rendered);
+        $this->assertContains($expected_result['rendered_value_plain'], [$rendered_plain], sprintf("%s: '%s'", $message, $rendered_plain));
+      }
+      $assert_done = TRUE;
     }
-    else {
+    if (!$assert_done) {
       throw new \RuntimeException(sprintf('Missing "value" or "regEx" in expected result %s', print_r($expected_result, TRUE)));
     }
   }
 
+  /**
+   * Normalize a string of markup for comparison.
+   */
+  protected static function normalizeMarkupString(string $markup): string {
+    $markup = preg_replace('/\s*(<|>)\s*/', '$1', $markup);
+    $markup = trim($markup);
+    return $markup;
+  }
+
   /**
    * Loads test dataset fixture.
    */