diff --git a/tck/faces41/facesMessage/pom.xml b/tck/faces41/facesMessage/pom.xml
new file mode 100644
index 0000000000..7aa95149bd
--- /dev/null
+++ b/tck/faces41/facesMessage/pom.xml
@@ -0,0 +1,36 @@
+
+
+
+ 4.0.0
+
+
+ org.eclipse.ee4j.tck.faces.faces41
+ pom
+ 4.1.0-SNAPSHOT
+
+
+ facesMessage
+ war
+
+ Jakarta Faces TCK ${project.version} - Test - Faces 4.1 - facesMessage
+
+
+ test-faces41-facesMessage
+
+
diff --git a/tck/faces41/facesMessage/src/test/java/org/eclipse/ee4j/tck/faces/faces41/facesMessage/Deployments.java b/tck/faces41/facesMessage/src/test/java/org/eclipse/ee4j/tck/faces/faces41/facesMessage/Deployments.java
new file mode 100644
index 0000000000..ab7aaffa9e
--- /dev/null
+++ b/tck/faces41/facesMessage/src/test/java/org/eclipse/ee4j/tck/faces/faces41/facesMessage/Deployments.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.eclipse.ee4j.tck.faces.faces41.facesMessage;
+
+import org.eu.ingwar.tools.arquillian.extension.suite.annotations.ArquillianSuiteDeployment;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+
+import ee.jakarta.tck.faces.test.util.selenium.BaseITNG;
+
+/**
+ * Given Arquilian has no single deployment testsuite
+ * mechanism we have to rely on a third party library.
+ * This improves the performance in a major area, namely
+ * we are only deploying once and then run all tests
+ * on the same deployment (cuts down by 95% the test time)
+ */
+@ArquillianSuiteDeployment
+public class Deployments {
+ @Deployment(testable = false)
+ public static WebArchive createDeployment() {
+ return BaseITNG.createDeployment();
+ }
+}
+
diff --git a/tck/faces41/facesMessage/src/test/java/org/eclipse/ee4j/tck/faces/faces41/facesMessage/Spec1823IT.java b/tck/faces41/facesMessage/src/test/java/org/eclipse/ee4j/tck/faces/faces41/facesMessage/Spec1823IT.java
new file mode 100644
index 0000000000..e3607dca95
--- /dev/null
+++ b/tck/faces41/facesMessage/src/test/java/org/eclipse/ee4j/tck/faces/faces41/facesMessage/Spec1823IT.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.eclipse.ee4j.tck.faces.faces41.facesMessage;
+
+import static jakarta.faces.application.FacesMessage.SEVERITY_INFO;
+import static jakarta.faces.application.FacesMessage.SEVERITY_WARN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import jakarta.faces.application.FacesMessage;
+
+import org.junit.Test;
+
+public class Spec1823IT {
+
+ private static final FacesMessage MESSAGE1A = new FacesMessage(SEVERITY_INFO, "summary1", "detail1");
+ private static final FacesMessage MESSAGE1B = new FacesMessage(SEVERITY_INFO, "summary1", "detail1");
+ private static final FacesMessage MESSAGE2A = new FacesMessage(SEVERITY_INFO, "summary1", "detail2");
+ private static final FacesMessage MESSAGE2B = new FacesMessage(SEVERITY_INFO, "summary1", "detail2");
+ private static final FacesMessage MESSAGE3A = new FacesMessage(SEVERITY_INFO, "summary2", "detail1");
+ private static final FacesMessage MESSAGE3B = new FacesMessage(SEVERITY_INFO, "summary2", "detail1");
+ private static final FacesMessage MESSAGE4A = new FacesMessage(SEVERITY_INFO, "summary2", "detail2");
+ private static final FacesMessage MESSAGE4B = new FacesMessage(SEVERITY_INFO, "summary2", "detail2");
+ private static final FacesMessage MESSAGE5A = new FacesMessage(SEVERITY_WARN, "summary1", "detail1");
+ private static final FacesMessage MESSAGE5B = new FacesMessage(SEVERITY_WARN, "summary1", "detail1");
+ private static final FacesMessage MESSAGE6A = new FacesMessage(SEVERITY_WARN, "summary1", "detail2");
+ private static final FacesMessage MESSAGE6B = new FacesMessage(SEVERITY_WARN, "summary1", "detail2");
+ private static final FacesMessage MESSAGE7A = new FacesMessage(SEVERITY_WARN, "summary2", "detail1");
+ private static final FacesMessage MESSAGE7B = new FacesMessage(SEVERITY_WARN, "summary2", "detail1");
+ private static final FacesMessage MESSAGE8A = new FacesMessage(SEVERITY_WARN, "summary2", "detail2");
+ private static final FacesMessage MESSAGE8B = new FacesMessage(SEVERITY_WARN, "summary2", "detail2");
+
+ public static class CustomFacesMessage extends FacesMessage {
+ private static final long serialVersionUID = 1L;
+
+ public CustomFacesMessage(Severity severity, String summary, String detail) {
+ super(severity, summary, detail);
+ }
+ }
+
+ /**
+ * @see FacesMessage
+ * @see https://github.com/jakartaee/faces/issues/1823
+ */
+ @Test
+ public void testEquals() {
+ assertEquals(MESSAGE1A, MESSAGE1A);
+ assertEquals(MESSAGE1A, MESSAGE1B);
+ assertNotEquals(MESSAGE1A, MESSAGE2A);
+ assertNotEquals(MESSAGE1A, MESSAGE2B);
+ assertNotEquals(MESSAGE1A, MESSAGE3A);
+ assertNotEquals(MESSAGE1A, MESSAGE3B);
+ assertNotEquals(MESSAGE1A, MESSAGE4A);
+ assertNotEquals(MESSAGE1A, MESSAGE4B);
+ assertNotEquals(MESSAGE1A, MESSAGE5A);
+ assertNotEquals(MESSAGE1A, MESSAGE5B);
+ assertNotEquals(MESSAGE1A, MESSAGE6A);
+ assertNotEquals(MESSAGE1A, MESSAGE6B);
+ assertNotEquals(MESSAGE1A, MESSAGE7A);
+ assertNotEquals(MESSAGE1A, MESSAGE7B);
+ assertNotEquals(MESSAGE1A, MESSAGE8A);
+ assertNotEquals(MESSAGE1A, MESSAGE8B);
+ assertEquals(MESSAGE1A, new FacesMessage(SEVERITY_INFO, "summary1", "detail1"));
+ assertNotEquals(MESSAGE1A, new CustomFacesMessage(SEVERITY_INFO, "summary1", "detail1"));
+ assertEquals(new CustomFacesMessage(SEVERITY_INFO, "summary1", "detail1"), new CustomFacesMessage(SEVERITY_INFO, "summary1", "detail1"));
+ assertNotEquals(new CustomFacesMessage(SEVERITY_INFO, "summary1", "detail1"), new CustomFacesMessage(SEVERITY_WARN, "summary1", "detail1"));
+ }
+
+ /**
+ * @see FacesMessage
+ * @see https://github.com/jakartaee/faces/issues/1823
+ */
+ @Test
+ public void testHashCode() {
+ assertEquals(MESSAGE1A.hashCode(), MESSAGE1A.hashCode());
+ assertEquals(MESSAGE1A.hashCode(), MESSAGE1B.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE2A.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE2B.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE3A.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE3B.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE4A.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE4B.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE5A.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE5B.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE6A.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE6B.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE7A.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE7B.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE8A.hashCode());
+ assertNotEquals(MESSAGE1A.hashCode(), MESSAGE8B.hashCode());
+ assertEquals(MESSAGE1A.hashCode(), new FacesMessage(SEVERITY_INFO, "summary1", "detail1").hashCode());
+ assertNotEquals(MESSAGE1A, new CustomFacesMessage(SEVERITY_INFO, "summary1", "detail1").hashCode());
+ assertEquals(new CustomFacesMessage(SEVERITY_INFO, "summary1", "detail1").hashCode(), new CustomFacesMessage(SEVERITY_INFO, "summary1", "detail1").hashCode());
+ assertNotEquals(new CustomFacesMessage(SEVERITY_INFO, "summary1", "detail1").hashCode(), new CustomFacesMessage(SEVERITY_WARN, "summary1", "detail1").hashCode());
+ }
+}
diff --git a/tck/faces41/headAndBodyRenderer/pom.xml b/tck/faces41/headAndBodyRenderer/pom.xml
new file mode 100644
index 0000000000..3141e4b88b
--- /dev/null
+++ b/tck/faces41/headAndBodyRenderer/pom.xml
@@ -0,0 +1,36 @@
+
+
+
+ 4.0.0
+
+
+ org.eclipse.ee4j.tck.faces.faces41
+ pom
+ 4.1.0-SNAPSHOT
+
+
+ headAndBodyRenderer
+ war
+
+ Jakarta Faces TCK ${project.version} - Test - Faces 4.1 - headAndBodyRenderer
+
+
+ test-faces41-headAndBodyRenderer
+
+
diff --git a/tck/faces41/headAndBodyRenderer/src/main/webapp/WEB-INF/beans.xml b/tck/faces41/headAndBodyRenderer/src/main/webapp/WEB-INF/beans.xml
new file mode 100644
index 0000000000..68d62ccb17
--- /dev/null
+++ b/tck/faces41/headAndBodyRenderer/src/main/webapp/WEB-INF/beans.xml
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/tck/faces41/headAndBodyRenderer/src/main/webapp/WEB-INF/faces-config.xml b/tck/faces41/headAndBodyRenderer/src/main/webapp/WEB-INF/faces-config.xml
new file mode 100644
index 0000000000..8a510fba96
--- /dev/null
+++ b/tck/faces41/headAndBodyRenderer/src/main/webapp/WEB-INF/faces-config.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+ .xhtmlAsXml
+ xml
+
+
+ .xhtmlAsXhtml
+ xhtml
+
+
+
diff --git a/tck/faces41/headAndBodyRenderer/src/main/webapp/WEB-INF/web.xml b/tck/faces41/headAndBodyRenderer/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..2c68bce4ec
--- /dev/null
+++ b/tck/faces41/headAndBodyRenderer/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,48 @@
+
+
+
+
+ jakarta.faces.PROJECT_STAGE
+ ${webapp.projectStage}
+
+
+ jakarta.faces.STATE_SAVING_METHOD
+ ${webapp.stateSavingMethod}
+
+
+ jakarta.faces.SERIALIZE_SERVER_STATE
+ ${webapp.serializeServerState}
+
+
+
+ facesServlet
+ jakarta.faces.webapp.FacesServlet
+
+
+ facesServlet
+ *.xhtml
+ *.xhtmlAsXhtml
+ *.xhtmlAsXml
+
+
diff --git a/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withIDdefault.xhtml b/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withIDdefault.xhtml
new file mode 100644
index 0000000000..6f13f53d1d
--- /dev/null
+++ b/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withIDdefault.xhtml
@@ -0,0 +1,26 @@
+
+
+
+
+ Spec1760: h:head and h:body with ID while using default HTML5 output processing
+
+
+ TEST
+
+
diff --git a/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withIDxhtml.xhtmlAsXhtml b/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withIDxhtml.xhtmlAsXhtml
new file mode 100644
index 0000000000..d42e92a2af
--- /dev/null
+++ b/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withIDxhtml.xhtmlAsXhtml
@@ -0,0 +1,26 @@
+
+
+
+
+ Spec1760: h:head and h:body with ID while explicitly output as XHTML
+
+
+ TEST
+
+
diff --git a/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withIDxml.xhtmlAsXml b/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withIDxml.xhtmlAsXml
new file mode 100644
index 0000000000..f975964774
--- /dev/null
+++ b/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withIDxml.xhtmlAsXml
@@ -0,0 +1,26 @@
+
+
+
+
+ Spec1760: h:head and h:body with ID while explicitly output as XML
+
+
+ TEST
+
+
diff --git a/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withoutIDdefault.xhtml b/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withoutIDdefault.xhtml
new file mode 100644
index 0000000000..1370ffab75
--- /dev/null
+++ b/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withoutIDdefault.xhtml
@@ -0,0 +1,26 @@
+
+
+
+
+ Spec1760: h:head and h:body without ID while using default HTML5 output processing
+
+
+ TEST
+
+
diff --git a/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withoutIDxhtml.xhtmlAsXhtml b/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withoutIDxhtml.xhtmlAsXhtml
new file mode 100644
index 0000000000..5212f12523
--- /dev/null
+++ b/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withoutIDxhtml.xhtmlAsXhtml
@@ -0,0 +1,26 @@
+
+
+
+
+ Spec1760: h:head and h:body without ID while explicitly output as XHTML
+
+
+ TEST
+
+
diff --git a/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withoutIDxml.xhtmlAsXml b/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withoutIDxml.xhtmlAsXml
new file mode 100644
index 0000000000..03ca4a82be
--- /dev/null
+++ b/tck/faces41/headAndBodyRenderer/src/main/webapp/spec1760withoutIDxml.xhtmlAsXml
@@ -0,0 +1,26 @@
+
+
+
+
+ Spec1760: h:head and h:body without ID while explicitly output as XML
+
+
+ TEST
+
+
diff --git a/tck/faces41/headAndBodyRenderer/src/test/java/org/eclipse/ee4j/tck/faces/faces41/headAndBodyRenderer/Deployments.java b/tck/faces41/headAndBodyRenderer/src/test/java/org/eclipse/ee4j/tck/faces/faces41/headAndBodyRenderer/Deployments.java
new file mode 100644
index 0000000000..6313178b0b
--- /dev/null
+++ b/tck/faces41/headAndBodyRenderer/src/test/java/org/eclipse/ee4j/tck/faces/faces41/headAndBodyRenderer/Deployments.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.eclipse.ee4j.tck.faces.faces41.headAndBodyRenderer;
+
+import org.eu.ingwar.tools.arquillian.extension.suite.annotations.ArquillianSuiteDeployment;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+
+import ee.jakarta.tck.faces.test.util.selenium.BaseITNG;
+
+/**
+ * Given Arquilian has no single deployment testsuite
+ * mechanism we have to rely on a third party library.
+ * This improves the performance in a major area, namely
+ * we are only deploying once and then run all tests
+ * on the same deployment (cuts down by 95% the test time)
+ */
+@ArquillianSuiteDeployment
+public class Deployments {
+ @Deployment(testable = false)
+ public static WebArchive createDeployment() {
+ return BaseITNG.createDeployment();
+ }
+}
+
diff --git a/tck/faces41/headAndBodyRenderer/src/test/java/org/eclipse/ee4j/tck/faces/faces41/headAndBodyRenderer/Spec1760IT.java b/tck/faces41/headAndBodyRenderer/src/test/java/org/eclipse/ee4j/tck/faces/faces41/headAndBodyRenderer/Spec1760IT.java
new file mode 100644
index 0000000000..4e847593f9
--- /dev/null
+++ b/tck/faces41/headAndBodyRenderer/src/test/java/org/eclipse/ee4j/tck/faces/faces41/headAndBodyRenderer/Spec1760IT.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.eclipse.ee4j.tck.faces.faces41.headAndBodyRenderer;
+
+import static org.junit.Assert.assertEquals;
+
+import jakarta.faces.render.RenderKit;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import ee.jakarta.tck.faces.test.util.selenium.BaseITNG;
+import ee.jakarta.tck.faces.test.util.selenium.WebPage;
+
+public class Spec1760IT extends BaseITNG {
+
+ /**
+ * @see RenderKit
+ * @see https://github.com/jakartaee/faces/issues/1760
+ * @see https://github.com/jakartaee/faces/issues/1100
+ */
+ @Test
+ public void testDefaultOutputWithID() {
+ WebPage page = getPage("spec1760withIDdefault.xhtml");
+ WebElement head = page.findElement(By.tagName("head"));
+ WebElement body = page.findElement(By.tagName("body"));
+ assertEquals("headId", head.getAttribute("id"));
+ assertEquals("bodyId", body.getAttribute("id"));
+ }
+
+ /**
+ * @see RenderKit
+ * @see https://github.com/jakartaee/faces/issues/1760
+ * @see https://github.com/jakartaee/faces/issues/1100
+ */
+ @Test
+ public void testDefaultOutputWithoutID() {
+ WebPage page = getPage("spec1760withoutIDdefault.xhtml");
+ WebElement head = page.findElement(By.tagName("head"));
+ WebElement body = page.findElement(By.tagName("body"));
+ assertEquals("", head.getAttribute("id"));
+ assertEquals("", body.getAttribute("id"));
+ }
+
+ /**
+ * @see RenderKit
+ * @see https://github.com/jakartaee/faces/issues/1760
+ * @see https://github.com/jakartaee/faces/issues/1100
+ */
+ @Test
+ public void testXhtmlOutputWithID() {
+ WebPage page = getPage("spec1760withIDxhtml.xhtmlAsXhtml");
+ WebElement head = page.findElement(By.tagName("head"));
+ WebElement body = page.findElement(By.tagName("body"));
+ assertEquals("", head.getAttribute("id"));
+ assertEquals("", body.getAttribute("id"));
+ }
+
+ /**
+ * @see RenderKit
+ * @see https://github.com/jakartaee/faces/issues/1760
+ * @see https://github.com/jakartaee/faces/issues/1100
+ */
+ @Test
+ public void testXhtmlOutputWithoutID() {
+ WebPage page = getPage("spec1760withoutIDxhtml.xhtmlAsXhtml");
+ WebElement head = page.findElement(By.tagName("head"));
+ WebElement body = page.findElement(By.tagName("body"));
+ assertEquals("", head.getAttribute("id"));
+ assertEquals("", body.getAttribute("id"));
+ }
+
+ /**
+ * @see RenderKit
+ * @see https://github.com/jakartaee/faces/issues/1760
+ * @see https://github.com/jakartaee/faces/issues/1100
+ */
+ @Test
+ public void testXmlOutputWithID() {
+ WebPage page = getPage("spec1760withIDxml.xhtmlAsXml");
+ WebElement head = page.findElement(By.tagName("head"));
+ WebElement body = page.findElement(By.tagName("body"));
+ assertEquals("", head.getAttribute("id"));
+ assertEquals("", body.getAttribute("id"));
+ }
+
+ /**
+ * @see RenderKit
+ * @see https://github.com/jakartaee/faces/issues/1760
+ * @see https://github.com/jakartaee/faces/issues/1100
+ */
+ @Test
+ public void testXmlOutputWithoutID() {
+ WebPage page = getPage("spec1760withoutIDxml.xhtmlAsXml");
+ WebElement head = page.findElement(By.tagName("head"));
+ WebElement body = page.findElement(By.tagName("body"));
+ assertEquals("", head.getAttribute("id"));
+ assertEquals("", body.getAttribute("id"));
+ }
+}
diff --git a/tck/faces41/pom.xml b/tck/faces41/pom.xml
new file mode 100755
index 0000000000..06269966d1
--- /dev/null
+++ b/tck/faces41/pom.xml
@@ -0,0 +1,48 @@
+
+
+
+ 4.0.0
+
+
+ org.eclipse.ee4j.faces.tck
+ jakarta-faces-tck
+ 4.1.0-SNAPSHOT
+
+
+ org.eclipse.ee4j.tck.faces.faces41
+ pom
+ pom
+
+ Jakarta Faces TCK ${project.version} - Test - Faces 4.1
+
+
+ facesMessage
+ headAndBodyRenderer
+ uiRepeat
+ uuidConverter
+
+
+
+
+ org.eclipse.ee4j.tck.faces.test
+ util
+ ${project.version}
+
+
+
diff --git a/tck/faces41/uiRepeat/pom.xml b/tck/faces41/uiRepeat/pom.xml
new file mode 100644
index 0000000000..f350cdf399
--- /dev/null
+++ b/tck/faces41/uiRepeat/pom.xml
@@ -0,0 +1,36 @@
+
+
+
+ 4.0.0
+
+
+ org.eclipse.ee4j.tck.faces.faces41
+ pom
+ 4.1.0-SNAPSHOT
+
+
+ uiRepeat
+ war
+
+ Jakarta Faces TCK ${project.version} - Test - Faces 4.1 - uiRepeat
+
+
+ test-faces41-uiRepeat
+
+
diff --git a/tck/faces41/uiRepeat/src/main/java/org/eclipse/ee4j/tck/faces/faces41/uiRepeat/Spec1263.java b/tck/faces41/uiRepeat/src/main/java/org/eclipse/ee4j/tck/faces/faces41/uiRepeat/Spec1263.java
new file mode 100644
index 0000000000..237470dab4
--- /dev/null
+++ b/tck/faces41/uiRepeat/src/main/java/org/eclipse/ee4j/tck/faces/faces41/uiRepeat/Spec1263.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.eclipse.ee4j.tck.faces.faces41.uiRepeat;
+
+import java.io.Serializable;
+import java.util.Arrays;
+
+import jakarta.annotation.PostConstruct;
+import jakarta.faces.view.ViewScoped;
+import jakarta.inject.Named;
+
+@Named
+@ViewScoped
+public class Spec1263 implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private Cell[][] matrix = new Cell[2][2];
+ private String output;
+
+ @PostConstruct
+ public void init() {
+ for (int x = 0; x < matrix.length; x++) {
+ for (int y = 0; y < matrix[x].length; y++) {
+ matrix[x][y] = new Cell();
+ }
+ }
+ }
+
+ public void submit() {
+ output = Arrays.deepToString(matrix);
+ }
+
+ public Cell[][] getMatrix() {
+ return matrix;
+ }
+
+ public String getOutput() {
+ return output;
+ }
+
+ public static class Cell implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private String value;
+
+ public String getValue() {
+ return this.value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return value;
+ }
+ }
+}
diff --git a/tck/faces41/uiRepeat/src/main/webapp/WEB-INF/beans.xml b/tck/faces41/uiRepeat/src/main/webapp/WEB-INF/beans.xml
new file mode 100644
index 0000000000..68d62ccb17
--- /dev/null
+++ b/tck/faces41/uiRepeat/src/main/webapp/WEB-INF/beans.xml
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/tck/faces41/uiRepeat/src/main/webapp/WEB-INF/faces-config.xml b/tck/faces41/uiRepeat/src/main/webapp/WEB-INF/faces-config.xml
new file mode 100644
index 0000000000..0b08b962ad
--- /dev/null
+++ b/tck/faces41/uiRepeat/src/main/webapp/WEB-INF/faces-config.xml
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/tck/faces41/uiRepeat/src/main/webapp/WEB-INF/web.xml b/tck/faces41/uiRepeat/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..dc208d8a1a
--- /dev/null
+++ b/tck/faces41/uiRepeat/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ jakarta.faces.PROJECT_STAGE
+ ${webapp.projectStage}
+
+
+ jakarta.faces.STATE_SAVING_METHOD
+ ${webapp.stateSavingMethod}
+
+
+ jakarta.faces.SERIALIZE_SERVER_STATE
+ ${webapp.serializeServerState}
+
+
+
+ facesServlet
+ jakarta.faces.webapp.FacesServlet
+
+
+ facesServlet
+ *.xhtml
+
+
diff --git a/tck/faces41/uiRepeat/src/main/webapp/spec1263.xhtml b/tck/faces41/uiRepeat/src/main/webapp/spec1263.xhtml
new file mode 100644
index 0000000000..7fa78bcc23
--- /dev/null
+++ b/tck/faces41/uiRepeat/src/main/webapp/spec1263.xhtml
@@ -0,0 +1,34 @@
+
+
+
+
+ Spec1263: ui:repeat row state preserving
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tck/faces41/uiRepeat/src/test/java/org/eclipse/ee4j/tck/faces/faces41/uiRepeat/Deployments.java b/tck/faces41/uiRepeat/src/test/java/org/eclipse/ee4j/tck/faces/faces41/uiRepeat/Deployments.java
new file mode 100644
index 0000000000..9ca0888820
--- /dev/null
+++ b/tck/faces41/uiRepeat/src/test/java/org/eclipse/ee4j/tck/faces/faces41/uiRepeat/Deployments.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.eclipse.ee4j.tck.faces.faces41.uiRepeat;
+
+import org.eu.ingwar.tools.arquillian.extension.suite.annotations.ArquillianSuiteDeployment;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+
+import ee.jakarta.tck.faces.test.util.selenium.BaseITNG;
+
+/**
+ * Given Arquilian has no single deployment testsuite
+ * mechanism we have to rely on a third party library.
+ * This improves the performance in a major area, namely
+ * we are only deploying once and then run all tests
+ * on the same deployment (cuts down by 95% the test time)
+ */
+@ArquillianSuiteDeployment
+public class Deployments {
+ @Deployment(testable = false)
+ public static WebArchive createDeployment() {
+ return BaseITNG.createDeployment();
+ }
+}
+
diff --git a/tck/faces41/uiRepeat/src/test/java/org/eclipse/ee4j/tck/faces/faces41/uiRepeat/Spec1263IT.java b/tck/faces41/uiRepeat/src/test/java/org/eclipse/ee4j/tck/faces/faces41/uiRepeat/Spec1263IT.java
new file mode 100644
index 0000000000..60448b482d
--- /dev/null
+++ b/tck/faces41/uiRepeat/src/test/java/org/eclipse/ee4j/tck/faces/faces41/uiRepeat/Spec1263IT.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.eclipse.ee4j.tck.faces.faces41.uiRepeat;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+
+import ee.jakarta.tck.faces.test.util.selenium.BaseITNG;
+import ee.jakarta.tck.faces.test.util.selenium.WebPage;
+
+public class Spec1263IT extends BaseITNG {
+
+ /**
+ * @see UIRepeat
+ * @see https://github.com/jakartaee/faces/issues/1263
+ */
+ @Test
+ public void testUiRepeatRowStatePreserved() {
+ WebPage page = getPage("spec1263.xhtml");
+ page.findElement(By.id("row:0:cell:0:form:input")).sendKeys("00");
+ page.findElement(By.id("row:0:cell:0:form:submit")).click();
+ assertEquals("[[00, null], [null, null]]", page.findElement(By.id("output")).getText());
+
+ page.findElement(By.id("row:0:cell:1:form:input")).sendKeys("01");
+ page.findElement(By.id("row:0:cell:1:form:submit")).click();
+ assertEquals("[[00, 01], [null, null]]", page.findElement(By.id("output")).getText());
+
+ page.findElement(By.id("row:1:cell:0:form:input")).sendKeys("10");
+ page.findElement(By.id("row:1:cell:0:form:submit")).click();
+ assertEquals("[[00, 01], [10, null]]", page.findElement(By.id("output")).getText());
+
+ page.findElement(By.id("row:1:cell:1:form:input")).sendKeys("11");
+ page.findElement(By.id("row:1:cell:1:form:submit")).click();
+ assertEquals("[[00, 01], [10, 11]]", page.findElement(By.id("output")).getText());
+ }
+}
diff --git a/tck/faces41/uuidConverter/pom.xml b/tck/faces41/uuidConverter/pom.xml
new file mode 100644
index 0000000000..faf14a0f03
--- /dev/null
+++ b/tck/faces41/uuidConverter/pom.xml
@@ -0,0 +1,36 @@
+
+
+
+ 4.0.0
+
+
+ org.eclipse.ee4j.tck.faces.faces41
+ pom
+ 4.1.0-SNAPSHOT
+
+
+ uuidConverter
+ war
+
+ Jakarta Faces TCK ${project.version} - Test - Faces 4.1 - uuidConverter
+
+
+ test-faces41-uuidConverter
+
+
diff --git a/tck/faces41/uuidConverter/src/main/java/org/eclipse/ee4j/tck/faces/faces41/uuidConverter/Spec1819.java b/tck/faces41/uuidConverter/src/main/java/org/eclipse/ee4j/tck/faces/faces41/uuidConverter/Spec1819.java
new file mode 100644
index 0000000000..246cca21fa
--- /dev/null
+++ b/tck/faces41/uuidConverter/src/main/java/org/eclipse/ee4j/tck/faces/faces41/uuidConverter/Spec1819.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.eclipse.ee4j.tck.faces.faces41.uuidConverter;
+
+import java.util.UUID;
+
+import jakarta.enterprise.context.RequestScoped;
+import jakarta.inject.Named;
+
+@Named
+@RequestScoped
+public class Spec1819 {
+
+ private UUID uuid;
+
+ public UUID getUuid() {
+ return uuid;
+ }
+
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+}
diff --git a/tck/faces41/uuidConverter/src/main/webapp/WEB-INF/beans.xml b/tck/faces41/uuidConverter/src/main/webapp/WEB-INF/beans.xml
new file mode 100644
index 0000000000..68d62ccb17
--- /dev/null
+++ b/tck/faces41/uuidConverter/src/main/webapp/WEB-INF/beans.xml
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/tck/faces41/uuidConverter/src/main/webapp/WEB-INF/faces-config.xml b/tck/faces41/uuidConverter/src/main/webapp/WEB-INF/faces-config.xml
new file mode 100644
index 0000000000..0b08b962ad
--- /dev/null
+++ b/tck/faces41/uuidConverter/src/main/webapp/WEB-INF/faces-config.xml
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/tck/faces41/uuidConverter/src/main/webapp/WEB-INF/web.xml b/tck/faces41/uuidConverter/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..dc208d8a1a
--- /dev/null
+++ b/tck/faces41/uuidConverter/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,46 @@
+
+
+
+
+ jakarta.faces.PROJECT_STAGE
+ ${webapp.projectStage}
+
+
+ jakarta.faces.STATE_SAVING_METHOD
+ ${webapp.stateSavingMethod}
+
+
+ jakarta.faces.SERIALIZE_SERVER_STATE
+ ${webapp.serializeServerState}
+
+
+
+ facesServlet
+ jakarta.faces.webapp.FacesServlet
+
+
+ facesServlet
+ *.xhtml
+
+
diff --git a/tck/faces41/uuidConverter/src/main/webapp/spec1819explicitConversionViaAttribute.xhtml b/tck/faces41/uuidConverter/src/main/webapp/spec1819explicitConversionViaAttribute.xhtml
new file mode 100644
index 0000000000..45c6b54960
--- /dev/null
+++ b/tck/faces41/uuidConverter/src/main/webapp/spec1819explicitConversionViaAttribute.xhtml
@@ -0,0 +1,31 @@
+
+
+
+
+ Spec1819: explicit conversion via attribute
+
+
+
+
+
+
+
+
+
+
diff --git a/tck/faces41/uuidConverter/src/main/webapp/spec1819explicitConversionViaTag.xhtml b/tck/faces41/uuidConverter/src/main/webapp/spec1819explicitConversionViaTag.xhtml
new file mode 100644
index 0000000000..0d4135893a
--- /dev/null
+++ b/tck/faces41/uuidConverter/src/main/webapp/spec1819explicitConversionViaTag.xhtml
@@ -0,0 +1,35 @@
+
+
+
+
+ Spec1819: explicit conversion via tag
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tck/faces41/uuidConverter/src/main/webapp/spec1819implicitConversion.xhtml b/tck/faces41/uuidConverter/src/main/webapp/spec1819implicitConversion.xhtml
new file mode 100644
index 0000000000..2e449ec2bc
--- /dev/null
+++ b/tck/faces41/uuidConverter/src/main/webapp/spec1819implicitConversion.xhtml
@@ -0,0 +1,31 @@
+
+
+
+
+ Spec1819: implicit conversion
+
+
+
+
+
+
+
+
+
+
diff --git a/tck/faces41/uuidConverter/src/test/java/org/eclipse/ee4j/tck/faces/faces41/uuidConverter/Deployments.java b/tck/faces41/uuidConverter/src/test/java/org/eclipse/ee4j/tck/faces/faces41/uuidConverter/Deployments.java
new file mode 100644
index 0000000000..bc248e8a3c
--- /dev/null
+++ b/tck/faces41/uuidConverter/src/test/java/org/eclipse/ee4j/tck/faces/faces41/uuidConverter/Deployments.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.eclipse.ee4j.tck.faces.faces41.uuidConverter;
+
+import org.eu.ingwar.tools.arquillian.extension.suite.annotations.ArquillianSuiteDeployment;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+
+import ee.jakarta.tck.faces.test.util.selenium.BaseITNG;
+
+/**
+ * Given Arquilian has no single deployment testsuite
+ * mechanism we have to rely on a third party library.
+ * This improves the performance in a major area, namely
+ * we are only deploying once and then run all tests
+ * on the same deployment (cuts down by 95% the test time)
+ */
+@ArquillianSuiteDeployment
+public class Deployments {
+ @Deployment(testable = false)
+ public static WebArchive createDeployment() {
+ return BaseITNG.createDeployment();
+ }
+}
+
diff --git a/tck/faces41/uuidConverter/src/test/java/org/eclipse/ee4j/tck/faces/faces41/uuidConverter/Spec1819IT.java b/tck/faces41/uuidConverter/src/test/java/org/eclipse/ee4j/tck/faces/faces41/uuidConverter/Spec1819IT.java
new file mode 100644
index 0000000000..2b5b33f9e4
--- /dev/null
+++ b/tck/faces41/uuidConverter/src/test/java/org/eclipse/ee4j/tck/faces/faces41/uuidConverter/Spec1819IT.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2024 Contributors to Eclipse Foundation.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package org.eclipse.ee4j.tck.faces.faces41.uuidConverter;
+
+import static org.junit.Assert.assertEquals;
+
+import jakarta.faces.convert.UUIDConverter;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import ee.jakarta.tck.faces.test.util.selenium.BaseITNG;
+import ee.jakarta.tck.faces.test.util.selenium.WebPage;
+
+public class Spec1819IT extends BaseITNG {
+
+ private static final String TEST_UUID = "cafebabe-0420-0069-dead-123456789012";
+
+ /**
+ * @see UUIDConverter
+ * @see https://github.com/jakartaee/faces/issues/1819
+ */
+ @Test
+ public void testValidImplicitUUID() {
+ WebPage page = getPage("spec1819implicitConversion.xhtml");
+ WebElement input = page.findElement(By.id("form:input"));
+ input.sendKeys(TEST_UUID);
+ WebElement submit = page.findElement(By.id("form:submit"));
+ submit.click();
+ WebElement messages = page.findElement(By.id("form:messages"));
+ assertEquals("", messages.getText());
+ WebElement output = page.findElement(By.id("form:output"));
+ assertEquals(TEST_UUID, output.getText());
+ }
+
+ /**
+ * @see UUIDConverter
+ * @see https://github.com/jakartaee/faces/issues/1819
+ */
+ @Test
+ public void testInvalidImplicitUUID() {
+ WebPage page = getPage("spec1819implicitConversion.xhtml");
+ WebElement input = page.findElement(By.id("form:input"));
+ input.sendKeys("fubar");
+ WebElement submit = page.findElement(By.id("form:submit"));
+ submit.click();
+ WebElement messages = page.findElement(By.id("form:messages"));
+ assertEquals("form:input: 'fubar' must be a UUID.", messages.getText());
+ WebElement output = page.findElement(By.id("form:output"));
+ assertEquals("", output.getText());
+ }
+
+ /**
+ * @see UUIDConverter
+ * @see https://github.com/jakartaee/faces/issues/1819
+ */
+ @Test
+ public void testEmptyImplicitUUID() {
+ WebPage page = getPage("spec1819implicitConversion.xhtml");
+ WebElement input = page.findElement(By.id("form:input"));
+ input.sendKeys("");
+ WebElement submit = page.findElement(By.id("form:submit"));
+ submit.click();
+ WebElement messages = page.findElement(By.id("form:messages"));
+ assertEquals("", messages.getText());
+ WebElement output = page.findElement(By.id("form:output"));
+ assertEquals("", output.getText());
+ }
+
+ /**
+ * @see UUIDConverter
+ * @see https://github.com/jakartaee/faces/issues/1819
+ */
+ @Test
+ public void testValidExplicitUUIDviaAttribute() {
+ WebPage page = getPage("spec1819explicitConversionViaAttribute.xhtml");
+ WebElement input = page.findElement(By.id("form:input"));
+ input.sendKeys(TEST_UUID);
+ WebElement submit = page.findElement(By.id("form:submit"));
+ submit.click();
+ WebElement messages = page.findElement(By.id("form:messages"));
+ assertEquals("", messages.getText());
+ WebElement output = page.findElement(By.id("form:output"));
+ assertEquals(TEST_UUID, output.getText());
+ }
+
+ /**
+ * @see UUIDConverter
+ * @see https://github.com/jakartaee/faces/issues/1819
+ */
+ @Test
+ public void testInvalidExplicitUUIDviaAttribute() {
+ WebPage page = getPage("spec1819explicitConversionViaAttribute.xhtml");
+ WebElement input = page.findElement(By.id("form:input"));
+ input.sendKeys("fubar");
+ WebElement submit = page.findElement(By.id("form:submit"));
+ submit.click();
+ WebElement messages = page.findElement(By.id("form:messages"));
+ assertEquals("form:input: 'fubar' must be a UUID.", messages.getText());
+ WebElement output = page.findElement(By.id("form:output"));
+ assertEquals("", output.getText());
+ }
+
+ /**
+ * @see UUIDConverter
+ * @see https://github.com/jakartaee/faces/issues/1819
+ */
+ @Test
+ public void testEmptyExplicitUUIDviaAttribute() {
+ WebPage page = getPage("spec1819explicitConversionViaAttribute.xhtml");
+ WebElement input = page.findElement(By.id("form:input"));
+ input.sendKeys("");
+ WebElement submit = page.findElement(By.id("form:submit"));
+ submit.click();
+ WebElement messages = page.findElement(By.id("form:messages"));
+ assertEquals("", messages.getText());
+ WebElement output = page.findElement(By.id("form:output"));
+ assertEquals("", output.getText());
+ }
+
+ /**
+ * @see UUIDConverter
+ * @see https://github.com/jakartaee/faces/issues/1819
+ */
+ @Test
+ public void testValidExplicitUUIDviaTag() {
+ WebPage page = getPage("spec1819explicitConversionViaTag.xhtml");
+ WebElement input = page.findElement(By.id("form:input"));
+ input.sendKeys(TEST_UUID);
+ WebElement submit = page.findElement(By.id("form:submit"));
+ submit.click();
+ WebElement messages = page.findElement(By.id("form:messages"));
+ assertEquals("", messages.getText());
+ WebElement output = page.findElement(By.id("form:output"));
+ assertEquals(TEST_UUID, output.getText());
+ }
+
+ /**
+ * @see UUIDConverter
+ * @see https://github.com/jakartaee/faces/issues/1819
+ */
+ @Test
+ public void testInvalidExplicitUUIDviaTag() {
+ WebPage page = getPage("spec1819explicitConversionViaTag.xhtml");
+ WebElement input = page.findElement(By.id("form:input"));
+ input.sendKeys("fubar");
+ WebElement submit = page.findElement(By.id("form:submit"));
+ submit.click();
+ WebElement messages = page.findElement(By.id("form:messages"));
+ assertEquals("form:input: 'fubar' must be a UUID.", messages.getText());
+ WebElement output = page.findElement(By.id("form:output"));
+ assertEquals("", output.getText());
+ }
+
+ /**
+ * @see UUIDConverter
+ * @see https://github.com/jakartaee/faces/issues/1819
+ */
+ @Test
+ public void testEmptyExplicitUUIDviaTag() {
+ WebPage page = getPage("spec1819explicitConversionViaTag.xhtml");
+ WebElement input = page.findElement(By.id("form:input"));
+ input.sendKeys("");
+ WebElement submit = page.findElement(By.id("form:submit"));
+ submit.click();
+ WebElement messages = page.findElement(By.id("form:messages"));
+ assertEquals("", messages.getText());
+ WebElement output = page.findElement(By.id("form:output"));
+ assertEquals("", output.getText());
+ }
+}
diff --git a/tck/pom.xml b/tck/pom.xml
index ce4dabf4db..68ac0905d9 100755
--- a/tck/pom.xml
+++ b/tck/pom.xml
@@ -85,6 +85,7 @@ mvn clean install -pl :old-tck-run -Dglassfish.suspend
faces22
faces23
faces40
+ faces41
old-tck-selenium
old-tck
faces-signaturetest