You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lo...@apache.org on 2020/10/23 18:39:38 UTC

[myfaces-tobago] 12/13: TOBAGO-1633: Use TypeScript instead of JavaScript. Simplify Renderers: remove "inside": outInsideBoxLabel and outInsideSectionLabel

This is an automated email from the ASF dual-hosted git repository.

lofwyr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/myfaces-tobago.git

commit 58c0763bfcaa6fb5fecc110e9b140f09a9306840
Author: Udo Schnurpfeil <ud...@irian.eu>
AuthorDate: Fri Oct 23 17:51:54 2020 +0200

    TOBAGO-1633: Use TypeScript instead of JavaScript.
    Simplify Renderers: remove "inside": outInsideBoxLabel and outInsideSectionLabel
---
 .../myfaces/tobago/component/RendererTypes.java    |  4 --
 .../internal/renderkit/renderer/BoxRenderer.java   |  5 --
 .../renderer/OutInsideBoxLabelRenderer.java        | 44 --------------
 .../renderer/OutInsideSectionLabelRenderer.java    | 44 --------------
 .../renderkit/renderer/SectionRenderer.java        |  5 --
 .../taglib/component/OutTagDeclaration.java        |  3 +-
 .../internal/config/AbstractTobagoTestBase.java    |  8 +++
 .../renderkit/renderer/BoxRendererUnitTest.java    | 67 ++++++++++++++++++++++
 .../renderer/SectionRendererUnitTest.java          | 67 ++++++++++++++++++++++
 .../resources/renderer/box/box-label-facet.html    | 25 ++++++++
 .../src/test/resources/renderer/box/box-label.html | 25 ++++++++
 .../src/test/resources/renderer/box/simple.html    | 21 +++++++
 .../renderer/section/section-label-facet.html      | 25 ++++++++
 .../resources/renderer/section/section-label.html  | 26 +++++++++
 .../test/resources/renderer/section/simple.html    | 25 ++++++++
 .../20-component/050-container/10-box/Box.xhtml    |  4 +-
 16 files changed, 292 insertions(+), 106 deletions(-)

diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java
index 837cce5..720581c 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/component/RendererTypes.java
@@ -55,8 +55,6 @@ public enum RendererTypes {
   Object,
   Operation,
   Out,
-  OutInsideBoxLabel,
-  OutInsideSectionLabel,
   Page,
   Panel,
   Popup,
@@ -132,8 +130,6 @@ public enum RendererTypes {
   public static final String OBJECT = "Object";
   public static final String OPERATION = "Operation";
   public static final String OUT = "Out";
-  public static final String OUT_INSIDE_BOX_LABEL = "OutInsideBoxLabel";
-  public static final String OUT_INSIDE_SECTION_LABEL = "OutInsideSectionLabel";
   public static final String PAGE = "Page";
   public static final String PANEL = "Panel";
   public static final String POPUP = "Popup";
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BoxRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BoxRenderer.java
index 7053b81..1d05d97 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BoxRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BoxRenderer.java
@@ -19,10 +19,8 @@
 package org.apache.myfaces.tobago.internal.renderkit.renderer;
 
 import org.apache.myfaces.tobago.component.Facets;
-import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.context.Markup;
 import org.apache.myfaces.tobago.internal.component.AbstractUIBox;
-import org.apache.myfaces.tobago.internal.component.AbstractUIOut;
 import org.apache.myfaces.tobago.internal.util.HtmlRendererUtils;
 import org.apache.myfaces.tobago.internal.util.RenderUtils;
 import org.apache.myfaces.tobago.model.CollapseMode;
@@ -77,9 +75,6 @@ public class BoxRenderer<T extends AbstractUIBox> extends CollapsiblePanelRender
       writer.startElement(HtmlElements.H3);
       if (labelFacet != null) {
         for (final UIComponent child : RenderUtils.getFacetChildren(labelFacet)) {
-          if (child instanceof AbstractUIOut) {
-            child.setRendererType(RendererTypes.OutInsideBoxLabel.name());
-          }
           child.encodeAll(facesContext);
         }
       } else if (labelString != null) {
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/OutInsideBoxLabelRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/OutInsideBoxLabelRenderer.java
deleted file mode 100644
index 90b6d6d..0000000
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/OutInsideBoxLabelRenderer.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.myfaces.tobago.internal.renderkit.renderer;
-
-import org.apache.myfaces.tobago.internal.component.AbstractUIOut;
-import org.apache.myfaces.tobago.renderkit.css.CssItem;
-
-import javax.faces.context.FacesContext;
-import java.io.IOException;
-
-public class OutInsideBoxLabelRenderer<T extends AbstractUIOut> extends OutRenderer<T> {
-
-  @Override
-  public void encodeBeginInternal(final FacesContext facesContext, final T component) throws IOException {
-    encodeBeginField(facesContext, component);
-  }
-
-  @Override
-  public void encodeEndInternal(final FacesContext facesContext, final T component) throws IOException {
-    encodeEndField(facesContext, component);
-  }
-
-  @Override
-  protected CssItem[] getCssItems(final FacesContext facesContext, final AbstractUIOut out) {
-    return new CssItem[]{};
-  }
-}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/OutInsideSectionLabelRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/OutInsideSectionLabelRenderer.java
deleted file mode 100644
index 0320a0e..0000000
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/OutInsideSectionLabelRenderer.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.myfaces.tobago.internal.renderkit.renderer;
-
-import org.apache.myfaces.tobago.internal.component.AbstractUIOut;
-import org.apache.myfaces.tobago.renderkit.css.CssItem;
-
-import javax.faces.context.FacesContext;
-import java.io.IOException;
-
-public class OutInsideSectionLabelRenderer<T extends AbstractUIOut> extends OutRenderer<T> {
-
-  @Override
-  public void encodeBeginInternal(final FacesContext facesContext, final T component) throws IOException {
-    encodeBeginField(facesContext, component);
-  }
-
-  @Override
-  public void encodeEndInternal(final FacesContext facesContext, final T component) throws IOException {
-    encodeEndField(facesContext, component);
-  }
-
-  @Override
-  protected CssItem[] getCssItems(final FacesContext facesContext, final AbstractUIOut out) {
-    return new CssItem[]{};
-  }
-}
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SectionRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SectionRenderer.java
index 5c16808..2a55e3f 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SectionRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SectionRenderer.java
@@ -20,9 +20,7 @@
 package org.apache.myfaces.tobago.internal.renderkit.renderer;
 
 import org.apache.myfaces.tobago.component.Facets;
-import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.context.Markup;
-import org.apache.myfaces.tobago.internal.component.AbstractUIOut;
 import org.apache.myfaces.tobago.internal.component.AbstractUISection;
 import org.apache.myfaces.tobago.internal.util.HtmlRendererUtils;
 import org.apache.myfaces.tobago.internal.util.RenderUtils;
@@ -91,9 +89,6 @@ public class SectionRenderer<T extends AbstractUISection> extends CollapsiblePan
     final String labelString = component.getLabel();
     if (labelFacet != null) {
       for (final UIComponent child : RenderUtils.getFacetChildren(labelFacet)) {
-        if (child instanceof AbstractUIOut) {
-          child.setRendererType(RendererTypes.OutInsideSectionLabel.name());
-        }
         child.encodeAll(facesContext);
       }
     } else if (labelString != null) {
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OutTagDeclaration.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OutTagDeclaration.java
index 19f2155..970a056 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OutTagDeclaration.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/taglib/component/OutTagDeclaration.java
@@ -46,8 +46,7 @@ import javax.faces.component.UIOutput;
     uiComponent = "org.apache.myfaces.tobago.component.UIOut",
     uiComponentFacesClass = "javax.faces.component.UIOutput",
     componentFamily = UIOutput.COMPONENT_FAMILY,
-    rendererType = {RendererTypes.OUT, RendererTypes.OUT_INSIDE_BOX_LABEL,
-        RendererTypes.OUT_INSIDE_SECTION_LABEL},
+    rendererType = {RendererTypes.OUT},
     interfaces = {
         // As long as no behavior event names are defined, ClientBehaviorHolder must be implemented for Mojarra.
         "javax.faces.component.behavior.ClientBehaviorHolder"
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/AbstractTobagoTestBase.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/AbstractTobagoTestBase.java
index 4e2b8e4..bf62ae6 100644
--- a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/AbstractTobagoTestBase.java
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/AbstractTobagoTestBase.java
@@ -26,6 +26,7 @@ import org.apache.myfaces.test.mock.MockHttpServletRequest;
 import org.apache.myfaces.tobago.component.RendererTypes;
 import org.apache.myfaces.tobago.component.Tags;
 import org.apache.myfaces.tobago.component.UIBadge;
+import org.apache.myfaces.tobago.component.UIBox;
 import org.apache.myfaces.tobago.component.UIButton;
 import org.apache.myfaces.tobago.component.UIButtons;
 import org.apache.myfaces.tobago.component.UIGridLayout;
@@ -35,6 +36,7 @@ import org.apache.myfaces.tobago.component.UILinks;
 import org.apache.myfaces.tobago.component.UIOut;
 import org.apache.myfaces.tobago.component.UIPanel;
 import org.apache.myfaces.tobago.component.UIPopup;
+import org.apache.myfaces.tobago.component.UISection;
 import org.apache.myfaces.tobago.component.UISegmentLayout;
 import org.apache.myfaces.tobago.component.UISelectItem;
 import org.apache.myfaces.tobago.component.UISelectOneChoice;
@@ -43,6 +45,7 @@ import org.apache.myfaces.tobago.component.UISeparator;
 import org.apache.myfaces.tobago.component.UIStyle;
 import org.apache.myfaces.tobago.context.TobagoContext;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.BadgeRenderer;
+import org.apache.myfaces.tobago.internal.renderkit.renderer.BoxRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.ButtonRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.ButtonsRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.GridLayoutRenderer;
@@ -53,6 +56,7 @@ import org.apache.myfaces.tobago.internal.renderkit.renderer.LinksRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.OutRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.PanelRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.PopupRenderer;
+import org.apache.myfaces.tobago.internal.renderkit.renderer.SectionRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.SegmentLayoutRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.SelectOneChoiceRenderer;
 import org.apache.myfaces.tobago.internal.renderkit.renderer.SelectOneRadioRenderer;
@@ -115,11 +119,13 @@ public abstract class AbstractTobagoTestBase extends AbstractJsfTestCase {
     application.addComponent(Tags.panel.componentType(), UIPanel.class.getName());
     application.addComponent(Tags.link.componentType(), UILink.class.getName());
     application.addComponent(Tags.links.componentType(), UILinks.class.getName());
+    application.addComponent(Tags.box.componentType(), UIBox.class.getName());
     application.addComponent(Tags.button.componentType(), UIButton.class.getName());
     application.addComponent(Tags.buttons.componentType(), UIButtons.class.getName());
     application.addComponent(Tags.popup.componentType(), UIPopup.class.getName());
     application.addComponent(Tags.separator.componentType(), UISeparator.class.getName());
     application.addComponent(Tags.style.componentType(), UIStyle.class.getName());
+    application.addComponent(Tags.section.componentType(), UISection.class.getName());
     application.addComponent(Tags.selectItem.componentType(), UISelectItem.class.getName());
     application.addComponent(Tags.selectOneRadio.componentType(), UISelectOneRadio.class.getName());
     application.addComponent(Tags.selectOneChoice.componentType(), UISelectOneChoice.class.getName());
@@ -134,11 +140,13 @@ public abstract class AbstractTobagoTestBase extends AbstractJsfTestCase {
     renderKit.addRenderer(UILink.COMPONENT_FAMILY, RendererTypes.LINK, new LinkRenderer());
     renderKit.addRenderer(UILink.COMPONENT_FAMILY, RendererTypes.LINK_INSIDE_COMMAND, new LinkInsideCommandRenderer());
     renderKit.addRenderer(UILinks.COMPONENT_FAMILY, RendererTypes.LINKS, new LinksRenderer());
+    renderKit.addRenderer(UIBox.COMPONENT_FAMILY, RendererTypes.BOX, new BoxRenderer());
     renderKit.addRenderer(UIButton.COMPONENT_FAMILY, RendererTypes.BUTTON, new ButtonRenderer());
     renderKit.addRenderer(UIButtons.COMPONENT_FAMILY, RendererTypes.BUTTONS, new ButtonsRenderer());
     renderKit.addRenderer(UIPopup.COMPONENT_FAMILY, RendererTypes.POPUP, new PopupRenderer());
     renderKit.addRenderer(UISeparator.COMPONENT_FAMILY, RendererTypes.SEPARATOR, new SeparatorRenderer());
     renderKit.addRenderer(UIStyle.COMPONENT_FAMILY, RendererTypes.STYLE, new StyleRenderer());
+    renderKit.addRenderer(UISection.COMPONENT_FAMILY, RendererTypes.SECTION, new SectionRenderer());
     renderKit.addRenderer(
         UISelectOneRadio.COMPONENT_FAMILY, RendererTypes.SELECT_ONE_RADIO, new SelectOneRadioRenderer());
     renderKit.addRenderer(
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BoxRendererUnitTest.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BoxRendererUnitTest.java
new file mode 100644
index 0000000..76a6064
--- /dev/null
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/BoxRendererUnitTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.myfaces.tobago.internal.renderkit.renderer;
+
+import org.apache.myfaces.tobago.component.RendererTypes;
+import org.apache.myfaces.tobago.component.Tags;
+import org.apache.myfaces.tobago.component.UIBox;
+import org.apache.myfaces.tobago.component.UIOut;
+import org.apache.myfaces.tobago.util.ComponentUtils;
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+
+public class BoxRendererUnitTest extends RendererTestBase {
+
+  @Test
+  public void boxLabel() throws IOException {
+    final UIBox c = (UIBox) ComponentUtils.createComponent(
+        facesContext, Tags.box.componentType(), RendererTypes.Box, "id");
+    c.setLabel("label");
+    c.encodeAll(facesContext);
+
+    Assert.assertEquals(loadHtml("renderer/box/box-label.html"), formattedResult());
+  }
+
+  @Test
+  public void boxLabelFacet() throws IOException {
+    final UIBox c = (UIBox) ComponentUtils.createComponent(
+        facesContext, Tags.box.componentType(), RendererTypes.Box, "id");
+    final UIOut o = (UIOut) ComponentUtils.createComponent(
+        facesContext, Tags.out.componentType(), RendererTypes.Out, "out");
+    o.setValue("label");
+    o.setPlain(true);
+    c.getFacets().put("label", o);
+    c.encodeAll(facesContext);
+
+    Assert.assertEquals(loadHtml("renderer/box/box-label-facet.html"), formattedResult());
+  }
+
+  @Test
+  public void simple() throws IOException {
+    final UIBox c = (UIBox) ComponentUtils.createComponent(
+        facesContext, Tags.box.componentType(), RendererTypes.Box, "id");
+    c.encodeAll(facesContext);
+
+    Assert.assertEquals(loadHtml("renderer/box/simple.html"), formattedResult());
+  }
+
+}
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SectionRendererUnitTest.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SectionRendererUnitTest.java
new file mode 100644
index 0000000..b77bc4b
--- /dev/null
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SectionRendererUnitTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.myfaces.tobago.internal.renderkit.renderer;
+
+import org.apache.myfaces.tobago.component.RendererTypes;
+import org.apache.myfaces.tobago.component.Tags;
+import org.apache.myfaces.tobago.component.UISection;
+import org.apache.myfaces.tobago.component.UIOut;
+import org.apache.myfaces.tobago.util.ComponentUtils;
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+
+public class SectionRendererUnitTest extends RendererTestBase {
+
+  @Test
+  public void sectionLabel() throws IOException {
+    final UISection c = (UISection) ComponentUtils.createComponent(
+        facesContext, Tags.section.componentType(), RendererTypes.Section, "id");
+    c.setLabel("label");
+    c.encodeAll(facesContext);
+
+    Assert.assertEquals(loadHtml("renderer/section/section-label.html"), formattedResult());
+  }
+
+  @Test
+  public void sectionLabelFacet() throws IOException {
+    final UISection c = (UISection) ComponentUtils.createComponent(
+        facesContext, Tags.section.componentType(), RendererTypes.Section, "id");
+    final UIOut o = (UIOut) ComponentUtils.createComponent(
+        facesContext, Tags.out.componentType(), RendererTypes.Out, "out");
+    o.setValue("label");
+    o.setPlain(true);
+    c.getFacets().put("label", o);
+    c.encodeAll(facesContext);
+
+    Assert.assertEquals(loadHtml("renderer/section/section-label-facet.html"), formattedResult());
+  }
+
+  @Test
+  public void simple() throws IOException {
+    final UISection c = (UISection) ComponentUtils.createComponent(
+        facesContext, Tags.section.componentType(), RendererTypes.Section, "id");
+    c.encodeAll(facesContext);
+
+    Assert.assertEquals(loadHtml("renderer/section/simple.html"), formattedResult());
+  }
+
+}
diff --git a/tobago-core/src/test/resources/renderer/box/box-label-facet.html b/tobago-core/src/test/resources/renderer/box/box-label-facet.html
new file mode 100644
index 0000000..7c907a7
--- /dev/null
+++ b/tobago-core/src/test/resources/renderer/box/box-label-facet.html
@@ -0,0 +1,25 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+
+<div class='tobago-box card' id='id'>
+  <div class='card-header tobago-box-header'>
+    <h3>label
+    </h3>
+  </div>
+  <div class='card-body'>
+  </div>
+</div>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/box/box-label.html b/tobago-core/src/test/resources/renderer/box/box-label.html
new file mode 100644
index 0000000..7c907a7
--- /dev/null
+++ b/tobago-core/src/test/resources/renderer/box/box-label.html
@@ -0,0 +1,25 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+
+<div class='tobago-box card' id='id'>
+  <div class='card-header tobago-box-header'>
+    <h3>label
+    </h3>
+  </div>
+  <div class='card-body'>
+  </div>
+</div>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/box/simple.html b/tobago-core/src/test/resources/renderer/box/simple.html
new file mode 100644
index 0000000..5453e2a
--- /dev/null
+++ b/tobago-core/src/test/resources/renderer/box/simple.html
@@ -0,0 +1,21 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+
+<div class='tobago-box card' id='id'>
+  <div class='card-body'>
+  </div>
+</div>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/section/section-label-facet.html b/tobago-core/src/test/resources/renderer/section/section-label-facet.html
new file mode 100644
index 0000000..fd401b7
--- /dev/null
+++ b/tobago-core/src/test/resources/renderer/section/section-label-facet.html
@@ -0,0 +1,25 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+
+<div id='id' class='tobago-section'>
+  <div class='tobago-section-header'>
+    <h1>label
+    </h1>
+  </div>
+  <div class='tobago-section-content'>
+  </div>
+</div>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/section/section-label.html b/tobago-core/src/test/resources/renderer/section/section-label.html
new file mode 100644
index 0000000..20f8e13
--- /dev/null
+++ b/tobago-core/src/test/resources/renderer/section/section-label.html
@@ -0,0 +1,26 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+
+<div id='id' class='tobago-section'>
+  <div class='tobago-section-header'>
+    <h1>
+      <span>label</span>
+    </h1>
+  </div>
+  <div class='tobago-section-content'>
+  </div>
+</div>
\ No newline at end of file
diff --git a/tobago-core/src/test/resources/renderer/section/simple.html b/tobago-core/src/test/resources/renderer/section/simple.html
new file mode 100644
index 0000000..6ba2964
--- /dev/null
+++ b/tobago-core/src/test/resources/renderer/section/simple.html
@@ -0,0 +1,25 @@
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+
+<div id='id' class='tobago-section'>
+  <div class='tobago-section-header'>
+    <h1>
+    </h1>
+  </div>
+  <div class='tobago-section-content'>
+  </div>
+</div>
\ No newline at end of file
diff --git a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/050-container/10-box/Box.xhtml b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/050-container/10-box/Box.xhtml
index 25c571e..3e8dc30 100644
--- a/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/050-container/10-box/Box.xhtml
+++ b/tobago-example/tobago-example-demo/src/main/webapp/content/20-component/050-container/10-box/Box.xhtml
@@ -31,12 +31,12 @@
     <p>The title of the box is set by the <code>label</code> attribute or with
       <code class="language-markup">&lt;f:facet name="label"></code>.</p>
     <pre><code class="language-markup">&lt;tc:box label="Box">Content&lt;/tc:box></code></pre>
-    <tc:box id="labelAttrBox" label="Box">
+    <tc:box id="labelAttrBox" label="Box one">
       Title set by <code>label</code> attribute.
     </tc:box>
     <tc:box id="labelFacetBox">
       <f:facet name="label">
-        <h:outputText value="#{outController.html}" escape="false"/>
+        <tc:out value="Box another" plain="true"/>
       </f:facet>
       Title set by <code class="language-markup">&lt;f:facet name="label"></code>.
     </tc:box>