MFHTML5-6
git-svn-id: https://svn.apache.org/repos/asf/myfaces/html5/trunk@1162382 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/myfaces-html5-core/pom.xml b/myfaces-html5-core/pom.xml
index 1aaad9a..132fb1b 100644
--- a/myfaces-html5-core/pom.xml
+++ b/myfaces-html5-core/pom.xml
@@ -16,7 +16,7 @@
* limitations under the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
@@ -82,6 +82,22 @@
<type>jar</type>
<scope>compile</scope>
</dependency>
+
+ <!-- test dependencies -->
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.myfaces.test</groupId>
+ <artifactId>myfaces-test20</artifactId>
+ <version>1.0.0</version>
+ <scope>test</scope>
+ </dependency>
+
</dependencies>
<build>
@@ -242,7 +258,7 @@
<goal>make-config</goal>
</goals>
</execution>
-
+
<!-- generate <hx> JSP tld file -->
<execution>
<id>make-html5-hx-tld-forsite</id>
@@ -289,11 +305,11 @@
<goal>make-config</goal>
</goals>
</execution>
-
+
</executions>
</plugin>
</plugins>
- </build>
+ </build>
<profiles>
<profile>
@@ -309,7 +325,7 @@
-Running the install and site with generate-site profile fails since these executions is run already on install phase!
-So, for facelets documentation, only need to run site goal!
-->
-
+
<plugin>
<groupId>org.apache.myfaces.buildtools</groupId>
<artifactId>myfaces-builder-plugin</artifactId>
@@ -341,7 +357,7 @@
</execution>
</executions>
</plugin>
-
+
</plugins>
</build>
@@ -352,15 +368,15 @@
<groupId>net.sourceforge.maven-taglib</groupId>
<artifactId>maven-taglib-plugin</artifactId>
<version>2.4</version>
- <configuration>
+ <configuration>
<!--
<taglib.src.dir>${basedir}/target/classes/META-INF</taglib.src.dir> -->
- <srcDir>${basedir}/target/tlddoc-facelets</srcDir>
- <!--
- <tldDocDir>${basedir}/target/site/tlddoc-facelets</tldDocDir>
- -->
- <tldDocDir>${basedir}/target/site/tlddoc</tldDocDir>
- </configuration>
+ <srcDir>${basedir}/target/tlddoc-facelets</srcDir>
+ <!--
+ <tldDocDir>${basedir}/target/site/tlddoc-facelets</tldDocDir>
+ -->
+ <tldDocDir>${basedir}/target/site/tlddoc</tldDocDir>
+ </configuration>
</plugin>
<!-- trigger tagdoc-index report -->
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/PassThroughAttributes.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/PassThroughAttributes.java
index a859531..67f376d 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/PassThroughAttributes.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/PassThroughAttributes.java
@@ -32,6 +32,7 @@
public interface PassThroughAttributes
{
Map<String, String> AUDIO = map(13)
+ .attrs(PassThroughAttributeGroups.HTML_GLOBAL_PROPS)
.attrs(PassThroughAttributeGroups.HTML5_GLOBAL_PROPS)
//media props
.attr(PRELOAD_PROP)
@@ -102,14 +103,12 @@
.attrs(PassThroughAttributeGroups.HTML5_GLOBAL_PROPS)
.attrs(PassThroughAttributeGroups.HTML5_INPUT_PROPS)
.attr(REQUIRED_PROP)
- .attr(READONLY_PROP)
.unmodifiable();
Map<String, String> INPUT_DATE_TIME = map(6)
.attrs(PassThroughAttributeGroups.HTML5_GLOBAL_PROPS)
.attrs(PassThroughAttributeGroups.HTML5_INPUT_PROPS)
.attr(REQUIRED_PROP)
- .attr(READONLY_PROP)
.unmodifiable();
Map<String, String> PROGRESS = map(11)
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/AbstractHtml5ViewControllerTestCase.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/AbstractHtml5ViewControllerTestCase.java
new file mode 100644
index 0000000..c6a78f3
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/AbstractHtml5ViewControllerTestCase.java
@@ -0,0 +1,52 @@
+/*
+ * 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.html5.test;
+
+import org.apache.myfaces.test.mock.MockResponseWriter;
+
+import java.io.StringWriter;
+
+public abstract class AbstractHtml5ViewControllerTestCase extends org.apache.myfaces.test.base.AbstractViewControllerTestCase
+{
+ protected MockResponseWriter writer;
+
+ public AbstractHtml5ViewControllerTestCase(String name)
+ {
+ super(name);
+ }
+
+ @Override
+ protected void setUp() throws Exception
+ {
+ super.setUp();
+
+ writer = new MockResponseWriter(new StringWriter(), null, null);
+ facesContext.setResponseWriter(writer);
+
+ TestUtils.addDefaultRenderers(facesContext);
+ }
+
+ @Override
+ protected void tearDown() throws Exception
+ {
+ writer = null;
+ super.tearDown();
+ }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/HtmlCheckAttributesUtil.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/HtmlCheckAttributesUtil.java
new file mode 100644
index 0000000..d476c15
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/HtmlCheckAttributesUtil.java
@@ -0,0 +1,149 @@
+/*
+ * 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.html5.test;
+
+import java.util.Map;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+
+import org.apache.myfaces.test.mock.MockResponseWriter;
+
+public class HtmlCheckAttributesUtil
+{
+ private static void addBaseAttributes(UIComponent component, HtmlRenderedAttr[] attrs)
+ {
+ Map map = component.getAttributes();
+ for(int i = 0; i < attrs.length; i++)
+ {
+ HtmlRenderedAttr attr = attrs[i];
+ map.put(attr.getName(), attr.getValue());
+ }
+ }
+
+ private static void checkRenderedAttributes(HtmlRenderedAttr[] attrs, String output) throws Exception
+ {
+ for(int i = 0; i < attrs.length; i++)
+ {
+ //assertContainsOnlyOnce(attrs[i], output);
+ checkAttributeOccurrences(attrs[i], output);
+ }
+ }
+
+ /**
+ * This method adds all attributes from attrs into the component. After adding the attributes,
+ * it calls the encodeAll() method of the component. The html generated from the component's
+ * renderer will be checked to see if the attributes have been rendered correctly.
+ * @param component The component whose attributes will be tested.
+ * @param context
+ * @param writer The ResponseWriter used by the renderer to output the html generated.
+ * @param attrs An array of attributes which will be tested.
+ * @throws Exception
+ */
+ public static void checkRenderedAttributes(
+ UIComponent component,
+ FacesContext context,
+ MockResponseWriter writer,
+ HtmlRenderedAttr[] attrs) throws Exception
+ {
+
+ addBaseAttributes(component, attrs);
+ component.encodeBegin(context);
+ component.encodeChildren(context);
+ component.encodeEnd(context);
+ context.renderResponse();
+ checkRenderedAttributes(attrs, writer.getWriter().toString());
+ }
+
+ /**
+ * Checks the attrs array if it has elements which were rendered incorrectly.
+ * @param attrs The attributes to be checked.
+ * @return True if there are attributes not rendered correctly.
+ */
+ public static boolean hasFailedAttrRender(HtmlRenderedAttr[] attrs)
+ {
+ for(int i = 0; i < attrs.length; i++)
+ {
+ if(!attrs[i].isRenderSuccessful()) return true;
+ }
+ return false;
+ }
+
+ /**
+ * Constructs an error message string detailing which attributes were not rendered
+ * and which attributes were rendered more than once.
+ * @param attrs The attributes to be tested.
+ * @param actual The html generated by the renderer.
+ * @return The error message.
+ */
+ public static String constructErrorMessage(HtmlRenderedAttr[] attrs, String actual)
+ {
+ StringBuffer messgBuffer = new StringBuffer();
+ for(int i = 0; i < attrs.length; i++)
+ {
+ if(attrs[i].getErrorCode() == HtmlRenderedAttr.RENDERED_MORE_TIMES_THAN_EXPECTED)
+ {
+ messgBuffer.append(attrs[i].getName()).append(" (");
+ messgBuffer.append(attrs[i].getExpectedHtml()).append(") was rendered more times (");
+ messgBuffer.append(attrs[i].getActualOccurrences()).append(") than expected (");
+ messgBuffer.append(attrs[i].getExpectedOccurrences()).append(").");
+ messgBuffer.append(System.getProperty("line.separator"));
+ }
+ else if(attrs[i].getErrorCode() == HtmlRenderedAttr.RENDERED_LESS_TIMES_THAN_EXPECTED)
+ {
+ messgBuffer.append(attrs[i].getName()).append(" (");
+ messgBuffer.append(attrs[i].getExpectedHtml()).append(") was rendered less times (");
+ messgBuffer.append(attrs[i].getActualOccurrences()).append(") than expected (");
+ messgBuffer.append(attrs[i].getExpectedOccurrences()).append(").");
+ messgBuffer.append(System.getProperty("line.separator"));
+ }
+ }
+ messgBuffer.append("Actual HTML: ").append(actual);
+ return messgBuffer.toString();
+ }
+
+ private static void checkAttributeOccurrences(HtmlRenderedAttr attr, String actual)
+ {
+ String expectedHtml = attr.getExpectedHtml();
+
+ int index;
+ int offset = 0;
+ while((index=actual.indexOf(expectedHtml,offset)) != -1)
+ {
+ attr.increaseActualOccurrences();
+ if(attr.getActualOccurrences() > attr.getExpectedOccurrences())
+ {
+ attr.setErrorCode(HtmlRenderedAttr.RENDERED_MORE_TIMES_THAN_EXPECTED);
+ return;
+ }
+
+ offset += index + expectedHtml.length();
+ }
+
+ if(attr.getActualOccurrences() < attr.getExpectedOccurrences())
+ {
+ attr.setErrorCode(HtmlRenderedAttr.RENDERED_LESS_TIMES_THAN_EXPECTED);
+ }
+ else
+ {
+ attr.setRenderSuccessful(true);
+ }
+ }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/HtmlRenderedAttr.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/HtmlRenderedAttr.java
new file mode 100644
index 0000000..efd926c
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/HtmlRenderedAttr.java
@@ -0,0 +1,135 @@
+/*
+ * 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.html5.test;
+
+public class HtmlRenderedAttr
+{
+ public static final int RENDERED_MORE_TIMES_THAN_EXPECTED = 1;
+ public static final int RENDERED_LESS_TIMES_THAN_EXPECTED = 2;
+
+ private String name;
+ private Object value;
+ private String expectedHtml;
+ private boolean renderSuccessful;
+ private int errorCode;
+ private int expectedOccurrences;
+ private int actualOccurrences;
+
+ public HtmlRenderedAttr(String name) {
+ this(name, name, name + "=\"" + name + "\"");
+ expectedOccurrences = 1;
+ }
+
+ public HtmlRenderedAttr(String name, int expectedOccurences) {
+ this(name);
+ this.expectedOccurrences = expectedOccurences;
+ }
+
+ /**
+ * Represents an attribute of a component that is expected to be
+ * rendered into html
+ * @param name The name of the attribute.
+ * @param value The value of the attribute.
+ * @param expectedHtml The expected html output for this attribute.
+ * E.g. name="value".
+ */
+ public HtmlRenderedAttr(String name, Object value, String expectedHtml) {
+ this.name = name;
+ this.value = value;
+ this.expectedHtml = expectedHtml;
+
+ renderSuccessful = false;
+ expectedOccurrences = 1;
+ }
+
+ public HtmlRenderedAttr(String name, Object value, String expectedHtml, int occurances) {
+ this(name, value, expectedHtml);
+ this.expectedOccurrences = occurances;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ public Object getValue()
+ {
+ return value;
+ }
+
+ public void setValue(Object value)
+ {
+ this.value = value;
+ }
+
+ public String getExpectedHtml()
+ {
+ return expectedHtml;
+ }
+
+ public void setExpectedHtml(String expectedHtml)
+ {
+ this.expectedHtml = expectedHtml;
+ }
+
+ /**
+ * This returns the result of the rendering of the attribute.
+ * @return True if the rendered html output of this attribute is
+ * the same as expectedHtml. False if either the attribute was not
+ * rendered, it was rendered multiple times, or the rendered html
+ * is different from expectedHtml.
+ */
+ public boolean isRenderSuccessful()
+ {
+ return renderSuccessful;
+ }
+
+ public void setRenderSuccessful(boolean renderSuccessful)
+ {
+ this.renderSuccessful = renderSuccessful;
+ }
+
+ public int getErrorCode()
+ {
+ return errorCode;
+ }
+
+ public void setErrorCode(int errorCode)
+ {
+ this.errorCode = errorCode;
+ setRenderSuccessful(false);
+ }
+
+ public void increaseActualOccurrences() {
+ actualOccurrences++;
+ }
+
+ public int getActualOccurrences() {
+ return this.actualOccurrences;
+ }
+
+ public int getExpectedOccurrences() {
+ return this.expectedOccurrences;
+ }
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/TestUtils.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/TestUtils.java
new file mode 100644
index 0000000..1edd014
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/TestUtils.java
@@ -0,0 +1,229 @@
+/*
+ * 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.html5.test;
+
+import java.io.IOException;
+
+import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.render.RenderKit;
+import javax.faces.render.Renderer;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public abstract class TestUtils
+{
+ /** Default Logger */
+ private static final Log log = LogFactory.getLog(TestUtils.class);
+
+ /** utility class, do not instantiate */
+ private TestUtils()
+ {
+ // utility class, disable instantiation
+ }
+
+ /**
+ * Add all of Tomahawk's renderers. Currently this is not tied to
+ * faces-config.xml, so all change to the file MUST also be made here.
+ *
+ * @param facesContext
+ * @todo Do not add renderer if renderer is already added.
+ */
+ public static void addDefaultRenderers(FacesContext facesContext)
+ {
+ addRenderer(facesContext, "org.apache.myfaces.Div", "org.apache.myfaces.html5.Div",
+ "org.apache.myfaces.html5.renderkit.panel.DivRenderer");
+
+ addRenderer(facesContext, "javax.faces.Input", "org.apache.myfaces.html5.Text",
+ "org.apache.myfaces.html5.renderkit.input.HtmlInputTextRenderer");
+
+ addRenderer(facesContext, "javax.faces.Input", "org.apache.myfaces.html5.Color",
+ "org.apache.myfaces.html5.renderkit.input.HtmlInputColorRenderer");
+
+ addRenderer(facesContext, "javax.faces.Input", "org.apache.myfaces.html5.DateTime",
+ "org.apache.myfaces.html5.renderkit.input.HtmlInputDateTimeRenderer");
+
+ addRenderer(facesContext, "javax.faces.Input", "org.apache.myfaces.html5.Email",
+ "org.apache.myfaces.html5.renderkit.input.HtmlInputEmailRenderer");
+
+ addRenderer(facesContext, "javax.faces.Input", "org.apache.myfaces.html5.NumberSlider",
+ "org.apache.myfaces.html5.renderkit.input.HtmlInputNumberSliderRenderer");
+
+ addRenderer(facesContext, "javax.faces.Input", "org.apache.myfaces.html5.NumberSpinner",
+ "org.apache.myfaces.html5.renderkit.input.HtmlInputNumberSpinnerRenderer");
+
+ addRenderer(facesContext, "org.apache.myfaces.Media", "org.apache.myfaces.html5.Audio",
+ "org.apache.myfaces.html5.renderkit.media.AudioRenderer");
+
+ addRenderer(facesContext, "org.apache.myfaces.Media", "org.apache.myfaces.html5.Video",
+ "org.apache.myfaces.html5.renderkit.media.VideoRenderer");
+
+ addRenderer(facesContext, "org.apache.myfaces.Meter", "org.apache.myfaces.html5.Meter",
+ "org.apache.myfaces.html5.renderkit.output.MeterRenderer");
+
+ addRenderer(facesContext, "org.apache.myfaces.Progress", "org.apache.myfaces.html5.Progress",
+ "org.apache.myfaces.html5.renderkit.output.ProgressRenderer");
+
+ addRenderer(facesContext, "org.apache.myfaces.SlideView", "org.apache.myfaces.html5.SlideView",
+ "org.apache.myfaces.html5.renderkit.output.SlideViewRenderer");
+
+ addRenderer(facesContext, "org.apache.myfaces.Slide", "org.apache.myfaces.html5.Slide",
+ "org.apache.myfaces.html5.renderkit.output.SlideRenderer");
+
+ }
+
+ /**
+ * Add a renderer to the FacesContext.
+ *
+ * @param facesContext Faces Context
+ * @param family Componenet Family
+ * @param rendererType Component Type
+ * @param renderClassName Class Name of Renderer
+ */
+ public static void addRenderer(FacesContext facesContext, String family,
+ String rendererType, String renderClassName)
+ {
+ Renderer renderer = (javax.faces.render.Renderer) newInstance(renderClassName);
+ RenderKit kit = facesContext.getRenderKit();
+ kit.addRenderer(family, rendererType, renderer);
+ }
+
+ /**
+ * Tries a Class.loadClass with the context class loader of the current thread first and
+ * automatically falls back to the ClassUtils class loader (i.e. the loader of the
+ * myfaces.jar lib) if necessary.
+ *
+ * Note: This was copied from org.apache.myfaces.shared.util.ClassUtils
+ *
+ * @param type fully qualified name of a non-primitive non-array class
+ * @return the corresponding Class
+ * @throws NullPointerException if type is null
+ * @throws ClassNotFoundException
+ */
+ private static Class classForName(String type)
+ throws ClassNotFoundException
+ {
+ if (type == null)
+ throw new NullPointerException("type");
+ try
+ {
+ // Try WebApp ClassLoader first
+ return Class.forName(type, false, // do not initialize for faster startup
+ Thread.currentThread().getContextClassLoader());
+ }
+ catch (ClassNotFoundException ignore)
+ {
+ // fallback: Try ClassLoader for ClassUtils (i.e. the myfaces.jar lib)
+ return Class.forName(type, false, // do not initialize for faster startup
+ TestUtils.class.getClassLoader());
+ }
+ }
+
+ /**
+ * Same as {@link #classForName(String)}, but throws a RuntimeException
+ * (FacesException) instead of a ClassNotFoundException.
+ *
+ * Note: This was copied from org.apache.myfaces.shared.util.ClassUtils
+ *
+ * @return the corresponding Class
+ * @throws NullPointerException if type is null
+ * @throws FacesException if class not found
+ */
+ private static Class simpleClassForName(String type)
+ {
+ try
+ {
+ return classForName(type);
+ }
+ catch (ClassNotFoundException e)
+ {
+ log.error("Class " + type + " not found", e);
+ throw new FacesException(e);
+ }
+ }
+
+ /**
+ * Create an instance of the class with the type of <code>type</code>.
+ *
+ * Note: This was copied from org.apache.myfaces.shared.util.ClassUtils
+ *
+ * @param type Type of new class.
+ * @return Instance of the class <code>type</code>
+ * @throws FacesException
+ */
+ private static Object newInstance(String type) throws FacesException
+ {
+ if (type == null)
+ return null;
+ return newInstance(simpleClassForName(type));
+ }
+
+ /**
+ * Create an instance of the class <code>clazz</code>.
+ *
+ * Note: This was copied from org.apache.myfaces.shared.util.ClassUtils
+ *
+ * @param clazz Class to create an instance of.
+ * @return Instance of the class <code>clazz</code>
+ * @throws FacesException
+ */
+ private static Object newInstance(Class clazz) throws FacesException
+ {
+ try
+ {
+ return clazz.newInstance();
+ }
+ catch (NoClassDefFoundError e)
+ {
+ log.error("Class : " + clazz.getName() + " not found.", e);
+ throw new FacesException(e);
+ }
+ catch (InstantiationException e)
+ {
+ log.error(e.getMessage(), e);
+ throw new FacesException(e);
+ }
+ catch (IllegalAccessException e)
+ {
+ log.error(e.getMessage(), e);
+ throw new FacesException(e);
+ }
+ }
+
+ /**
+ * Renderered a component, including it's children, then complete the reponse.
+ *
+ * @param context Faces Context
+ * @param component Component to be rendered.
+ * @throws IOException Thrown while rendering.
+ */
+ public static void renderComponent(FacesContext context,
+ UIComponent component) throws IOException
+ {
+ Renderer renderer = context.getRenderKit().getRenderer(
+ component.getFamily(), component.getRendererType());
+ renderer.encodeBegin(context, component);
+ renderer.encodeChildren(context, component);
+ renderer.encodeEnd(context, component);
+ context.responseComplete();
+ context.renderResponse();
+ }
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputColorRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputColorRendererTest.java
new file mode 100644
index 0000000..723b7a0
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputColorRendererTest.java
@@ -0,0 +1,56 @@
+package org.apache.myfaces.html5.renderkit.input;
+
+import org.apache.myfaces.html5.component.input.HtmlInputColor;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class HtmlInputColorRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private HtmlInputColor htmlInputColor;
+
+ public HtmlInputColorRendererTest(String name) {
+ super(name);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ htmlInputColor = new HtmlInputColor();
+ }
+
+ public void testPassThruHtmlProperties() throws Exception {
+ HtmlRenderedAttr[] attrs = {
+ //Html5 Global Props
+ new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ //Common input props
+ new HtmlRenderedAttr("align"),
+ new HtmlRenderedAttr("alt"),
+ new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+ new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+ //Input props
+ new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+ new HtmlRenderedAttr("datalist", "datalist", "list=\"datalist\""),
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputColor, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputDateTimeRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputDateTimeRendererTest.java
new file mode 100644
index 0000000..64cfe95
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputDateTimeRendererTest.java
@@ -0,0 +1,58 @@
+package org.apache.myfaces.html5.renderkit.input;
+
+import org.apache.myfaces.html5.component.input.HtmlInputColor;
+import org.apache.myfaces.html5.component.input.HtmlInputDateTime;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class HtmlInputDateTimeRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private HtmlInputDateTime htmlInputDateTime;
+
+ public HtmlInputDateTimeRendererTest(String name) {
+ super(name);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ htmlInputDateTime = new HtmlInputDateTime();
+ }
+
+ public void testPassThruHtmlProperties() throws Exception {
+ HtmlRenderedAttr[] attrs = {
+ //Html5 Global Props
+ new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ //Common input props
+ new HtmlRenderedAttr("align"),
+ new HtmlRenderedAttr("alt"),
+ new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+ new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+ //Input props
+ new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+ new HtmlRenderedAttr("datalist", "datalist", "list=\"datalist\""),
+ new HtmlRenderedAttr("required", true, "required=\"true\""),
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputDateTime, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputEmailRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputEmailRendererTest.java
new file mode 100644
index 0000000..41f572e
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputEmailRendererTest.java
@@ -0,0 +1,62 @@
+package org.apache.myfaces.html5.renderkit.input;
+
+import org.apache.myfaces.html5.component.HtmlInputEmail;
+import org.apache.myfaces.html5.component.input.HtmlInputDateTime;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class HtmlInputEmailRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private HtmlInputEmail htmlInputEmail;
+
+ public HtmlInputEmailRendererTest(String name) {
+ super(name);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ htmlInputEmail = new HtmlInputEmail();
+ }
+
+ public void testPassThruHtmlProperties() throws Exception {
+ HtmlRenderedAttr[] attrs = {
+ //Html5 Global Props
+ new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ //Common input props
+ new HtmlRenderedAttr("align"),
+ new HtmlRenderedAttr("alt"),
+ new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+ new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+ //Input props
+ new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+ new HtmlRenderedAttr("datalist", "datalist", "list=\"datalist\""),
+
+ //email input props
+ new HtmlRenderedAttr("required", true, "required=\"true\""),
+ new HtmlRenderedAttr("multiple", true, "multiple=\"true\""),
+ new HtmlRenderedAttr("placeholder"),
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputEmail, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSliderRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSliderRendererTest.java
new file mode 100644
index 0000000..847cf7c
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSliderRendererTest.java
@@ -0,0 +1,57 @@
+package org.apache.myfaces.html5.renderkit.input;
+
+import org.apache.myfaces.html5.component.HtmlInputEmail;
+import org.apache.myfaces.html5.component.input.HtmlInputNumberSlider;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class HtmlInputNumberSliderRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private HtmlInputNumberSlider htmlInputNumberSlider;
+
+ public HtmlInputNumberSliderRendererTest(String name) {
+ super(name);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ htmlInputNumberSlider = new HtmlInputNumberSlider();
+ }
+
+ public void testPassThruHtmlProperties() throws Exception {
+ HtmlRenderedAttr[] attrs = {
+ //Html5 Global Props
+ new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ //Common input props
+ new HtmlRenderedAttr("align"),
+ new HtmlRenderedAttr("alt"),
+ new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+ new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+ //Input props
+ new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+ new HtmlRenderedAttr("datalist", "datalist", "list=\"datalist\""),
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputNumberSlider, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSpinnerRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSpinnerRendererTest.java
new file mode 100644
index 0000000..ab8ac0b
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSpinnerRendererTest.java
@@ -0,0 +1,59 @@
+package org.apache.myfaces.html5.renderkit.input;
+
+import org.apache.myfaces.html5.component.input.HtmlInputNumberSlider;
+import org.apache.myfaces.html5.component.input.HtmlInputNumberSpinner;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class HtmlInputNumberSpinnerRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private HtmlInputNumberSpinner htmlInputNumberSpinner;
+
+ public HtmlInputNumberSpinnerRendererTest(String name) {
+ super(name);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ htmlInputNumberSpinner = new HtmlInputNumberSpinner();
+ }
+
+ public void testPassThruHtmlProperties() throws Exception {
+ HtmlRenderedAttr[] attrs = {
+ //Html5 Global Props
+ new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ //Common input props
+ new HtmlRenderedAttr("align"),
+ new HtmlRenderedAttr("alt"),
+ new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+ new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+ //Input props
+ new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+ new HtmlRenderedAttr("datalist", "datalist", "list=\"datalist\""),
+ //spinner props
+ new HtmlRenderedAttr("required", true, "required=\"true\""),
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputNumberSpinner, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputTextRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputTextRendererTest.java
new file mode 100644
index 0000000..7c160c5
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputTextRendererTest.java
@@ -0,0 +1,130 @@
+package org.apache.myfaces.html5.renderkit.input;
+
+import org.apache.myfaces.html5.component.input.HtmlInputText;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class HtmlInputTextRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private HtmlInputText htmlInputText;
+
+ public HtmlInputTextRendererTest(String name) {
+ super(name);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ this.htmlInputText = new HtmlInputText();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testPassThruHtmlPropertiesForInputTextForTypeText() throws Exception
+ {
+ this.htmlInputText.setType("text");
+
+ doTestForInputText();
+ }
+
+ public void testPassThruHtmlPropertiesForInputTextForTypeSearch() throws Exception
+ {
+ this.htmlInputText.setType("search");
+
+ doTestForInputText();
+ }
+
+ public void testPassThruHtmlPropertiesForInputTextForTypeURL() throws Exception
+ {
+ this.htmlInputText.setType("url");
+
+ doTestForInputText();
+ }
+
+ public void testPassThruHtmlPropertiesForInputTextForTypeTel() throws Exception
+ {
+ this.htmlInputText.setType("tel");
+
+ doTestForInputText();
+ }
+
+
+
+ private void doTestForInputText() throws Exception {
+ HtmlRenderedAttr[] attrs = {
+ //Html5 Global Props
+ new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ //Common input props
+ new HtmlRenderedAttr("align"),
+ new HtmlRenderedAttr("alt"),
+ new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+ new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+ //Input props
+ new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+ new HtmlRenderedAttr("datalist", "datalist", "list=\"datalist\""),
+ //text input props
+ new HtmlRenderedAttr("placeholder"),
+ new HtmlRenderedAttr("required", true, "required=\"true\""),
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputText, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+
+ public void testPassThruHtmlPropertiesForInputTextForTypeTextarea() throws Exception
+ {
+ this.htmlInputText.setType("textarea");
+
+ HtmlRenderedAttr[] attrs = {
+ //Html5 Global Props
+ new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ //Common input props
+ new HtmlRenderedAttr("align"),
+ new HtmlRenderedAttr("alt"),
+ new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+ new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+ //Textarea props
+ new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+ new HtmlRenderedAttr("required", true, "required=\"true\""),
+ new HtmlRenderedAttr("cols", 1, "cols=\"1\""),
+ new HtmlRenderedAttr("rows", 1, "rows=\"1\""),
+ new HtmlRenderedAttr("wrap"),
+
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputText, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/media/AudioRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/media/AudioRendererTest.java
new file mode 100644
index 0000000..9736f13
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/media/AudioRendererTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.html5.renderkit.media;
+
+import org.apache.myfaces.html5.component.media.Audio;
+import org.apache.myfaces.html5.component.media.Video;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class AudioRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private Audio audio;
+
+ public AudioRendererTest(String name) {
+ super(name);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ audio = new Audio();
+ }
+
+ public void testPassThruHtmlProperties() throws Exception
+ {
+ HtmlRenderedAttr[] attrs = {
+ //Global Props
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ //audio
+ new HtmlRenderedAttr("preload"),
+ new HtmlRenderedAttr("showControls", true, "controls=\"true\""),
+ new HtmlRenderedAttr("loop", true, "loop=\"true\""),
+ new HtmlRenderedAttr("autoplay", true, "autoplay=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(audio, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/media/VideoRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/media/VideoRendererTest.java
new file mode 100644
index 0000000..f47d80e
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/media/VideoRendererTest.java
@@ -0,0 +1,55 @@
+package org.apache.myfaces.html5.renderkit.media;
+
+import org.apache.myfaces.html5.component.media.Video;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class VideoRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private Video video;
+
+ public VideoRendererTest(String name) {
+ super(name);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ video = new Video();
+ }
+
+ public void testPassThruHtmlProperties() throws Exception
+ {
+ HtmlRenderedAttr[] attrs = {
+ //Global Props
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ //audio
+ new HtmlRenderedAttr("preload"),
+ new HtmlRenderedAttr("showControls", true, "controls=\"true\""),
+ new HtmlRenderedAttr("loop", true, "loop=\"true\""),
+ new HtmlRenderedAttr("autoplay", true, "autoplay=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ //video
+ new HtmlRenderedAttr("poster"),
+ new HtmlRenderedAttr("width"),
+ new HtmlRenderedAttr("height"),
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(video, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/MeterRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/MeterRendererTest.java
new file mode 100644
index 0000000..dafa43e
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/MeterRendererTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.html5.renderkit.output;
+
+import org.apache.myfaces.html5.component.output.Meter;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class MeterRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private Meter meter;
+
+ public MeterRendererTest(String name) {
+ super(name);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ meter = new Meter();
+ }
+
+ public void testPassThruHtmlProperties() throws Exception
+ {
+ HtmlRenderedAttr[] attrs = {
+ //Global Props
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ //Html5 Global Props
+ new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ //meter
+ new HtmlRenderedAttr("value", 10.0, "value=\"10.0\""),
+ new HtmlRenderedAttr("maximum", 10.0, "max=\"10.0\""),
+ new HtmlRenderedAttr("minimum", 10.0, "min=\"10.0\""),
+ new HtmlRenderedAttr("low", 10.0, "low=\"10.0\""),
+ new HtmlRenderedAttr("high", 10.0, "high=\"10.0\""),
+ new HtmlRenderedAttr("optimum", 10.0, "optimum=\"10.0\""),
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(meter, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/ProgressRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/ProgressRendererTest.java
new file mode 100644
index 0000000..ebfa86c
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/ProgressRendererTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.html5.renderkit.output;
+
+import org.apache.myfaces.html5.component.output.Meter;
+import org.apache.myfaces.html5.component.output.Progress;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class ProgressRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private Progress progress;
+
+ public ProgressRendererTest(String name) {
+ super(name);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ progress = new Progress();
+ }
+
+ public void testPassThruHtmlProperties() throws Exception
+ {
+ HtmlRenderedAttr[] attrs = {
+ //Global Props
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ //Html5 Global Props
+ new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ //meter
+ new HtmlRenderedAttr("value", 10.0, "value=\"10.0\""),
+ new HtmlRenderedAttr("maximum", 10.0, "max=\"10.0\""),
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(progress, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/SlideRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/SlideRendererTest.java
new file mode 100644
index 0000000..61de075
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/SlideRendererTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.html5.renderkit.output;
+
+import org.apache.myfaces.html5.component.output.Slide;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class SlideRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private Slide slide;
+
+ public SlideRendererTest(String name) {
+ super(name);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ this.slide = new Slide();
+ }
+
+ public void testPassThruHtmlProperties() throws Exception
+ {
+ HtmlRenderedAttr[] attrs = {
+ //Global Props
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ //Html5 Global Props
+ new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(slide, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/SlideViewRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/SlideViewRendererTest.java
new file mode 100644
index 0000000..ae5cf16
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/SlideViewRendererTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.html5.renderkit.output;
+
+import org.apache.myfaces.html5.component.output.SlideView;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class SlideViewRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private SlideView slideView;
+
+ public SlideViewRendererTest(String name) {
+ super(name);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ this.slideView = new SlideView();
+ }
+
+ public void testPassThruHtmlProperties() throws Exception
+ {
+ HtmlRenderedAttr[] attrs = {
+ //Global Props
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ //Html5 Global Props
+ new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(slideView, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/panel/DivRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/panel/DivRendererTest.java
new file mode 100644
index 0000000..0c59ec1
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/panel/DivRendererTest.java
@@ -0,0 +1,76 @@
+/*
+* 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.html5.renderkit.panel;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.apache.myfaces.html5.component.panel.Div;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+
+public class DivRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+ private Div div;
+
+ public DivRendererTest(String name) {
+ super(name);
+ }
+
+ public static Test suite() {
+ return new TestSuite(DivRendererTest.class);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ div = new Div();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ div = null;
+ }
+
+ public void testPassThruHtmlProperties() throws Exception
+ {
+ HtmlRenderedAttr[] attrs = {
+ //Global Props
+ new HtmlRenderedAttr("dir"),
+ new HtmlRenderedAttr("lang"),
+ new HtmlRenderedAttr("style"),
+ new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+ new HtmlRenderedAttr("title"),
+ new HtmlRenderedAttr("accesskey"),
+ new HtmlRenderedAttr("tabindex"),
+ //Html5 Global Props
+ new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+ new HtmlRenderedAttr("hidden", true, "hidden=\"true\"")
+ };
+
+ HtmlCheckAttributesUtil.checkRenderedAttributes(div, facesContext, writer, attrs);
+ if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+ {
+ fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+ }
+ }
+
+}
diff --git a/myfaces-html5-demo/pom.xml b/myfaces-html5-demo/pom.xml
index 6b803f8..a3be126 100644
--- a/myfaces-html5-demo/pom.xml
+++ b/myfaces-html5-demo/pom.xml
@@ -96,7 +96,7 @@
<dependency>
<groupId>org.apache.myfaces.html5</groupId>
<artifactId>myfaces-html5-core</artifactId>
- <version>${parent.version}</version>
+ <version>${project.parent.version}</version>
</dependency>
<dependency>
diff --git a/pom.xml b/pom.xml
index 27719de..6102407 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,7 @@
~ "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
+ ~ 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
diff --git a/src/site/site.xml b/src/site/site.xml
index 3014419..c14b766 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -8,7 +8,7 @@
~ "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
+ ~ 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