You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2014/07/22 13:44:47 UTC

[2/2] git commit: WICKET-5651 Add TagTester#getChild(String tagName) method

WICKET-5651 Add TagTester#getChild(String tagName) method


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/5d47267e
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/5d47267e
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/5d47267e

Branch: refs/heads/wicket-6.x
Commit: 5d47267e94ba2eae0d188132774cc2dc61b03f68
Parents: f9668b5
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Tue Jul 22 14:41:38 2014 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Tue Jul 22 14:41:38 2014 +0300

----------------------------------------------------------------------
 .../apache/wicket/util/tester/TagTester.java    | 127 +++++++++++++++++--
 .../wicket/util/tester/TagTesterTest.java       |  24 ++++
 2 files changed, 141 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/5d47267e/wicket-core/src/main/java/org/apache/wicket/util/tester/TagTester.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/util/tester/TagTester.java b/wicket-core/src/main/java/org/apache/wicket/util/tester/TagTester.java
index e5a27af..827aabb 100644
--- a/wicket-core/src/main/java/org/apache/wicket/util/tester/TagTester.java
+++ b/wicket-core/src/main/java/org/apache/wicket/util/tester/TagTester.java
@@ -24,6 +24,7 @@ import java.util.regex.Pattern;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.markup.parser.XmlPullParser;
 import org.apache.wicket.markup.parser.XmlTag;
+import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.string.Strings;
 import org.apache.wicket.util.value.IValueMap;
 
@@ -235,19 +236,16 @@ public class TagTester
 
 	/**
 	 * Checks if the tag has a child with the given <code>tagName</code>.
-	 * 
+	 *
 	 * @param tagName
 	 *            the tag name to search for
 	 * @return <code>true</code> if this tag has a child with the given <code>tagName</code>.
 	 */
 	public boolean hasChildTag(String tagName)
 	{
-		boolean hasChild = false;
+		Args.notEmpty(tagName, "tagName");
 
-		if (Strings.isEmpty(tagName))
-		{
-			throw new IllegalArgumentException("You need to provide a not empty/not null argument.");
-		}
+		boolean hasChild = false;
 
 		if (openTag.isOpen())
 		{
@@ -263,7 +261,7 @@ public class TagTester
 					XmlPullParser p = new XmlPullParser();
 					p.parse(markup);
 
-					XmlTag tag = null;
+					XmlTag tag;
 					while ((tag = p.nextTag()) != null)
 					{
 						if (tagName.equalsIgnoreCase(tag.getName()))
@@ -276,16 +274,40 @@ public class TagTester
 			}
 			catch (Exception e)
 			{
-				// NOTE: IllegalStateException(Throwable) only exists since Java 1.5
 				throw new WicketRuntimeException(e);
 			}
-
 		}
 
 		return hasChild;
 	}
 
 	/**
+	 * Checks if the tag has a child with the given <code>tagName</code>.
+	 *
+	 * @param tagName
+	 *            the tag name to search for
+	 * @return <code>true</code> if this tag has a child with the given <code>tagName</code>.
+	 */
+	public TagTester getChild(String tagName)
+	{
+		Args.notNull(tagName, "tagName");
+
+		TagTester childTagTester = null;
+
+		if (openTag.isOpen())
+		{
+			// Get the content of the tag
+			int startPos = openTag.getPos() + openTag.getLength();
+			int endPos = closeTag.getPos();
+			String markup = parser.getInput(startPos, endPos).toString();
+
+			childTagTester = createTagByAttribute(markup, tagName);
+		}
+
+		return childTagTester;
+	}
+
+	/**
 	 * Gets a child tag for testing. If this tag contains child tags, you can get one of them as a
 	 * {@link TagTester} instance.
 	 * 
@@ -343,6 +365,92 @@ public class TagTester
 	}
 
 	/**
+	 * Static factory method for creating a <code>TagTester</code> based on a tag name. Please note
+	 * that it will return the first tag which matches the criteria.
+	 *
+	 * @param markup
+	 *            the markup to look for the tag to create the <code>TagTester</code> from
+	 *            the value which the attribute must have
+	 * @return the <code>TagTester</code> which matches the tag by name in the markup
+	 */
+	public static TagTester createTagByAttribute(String markup, String tagName)
+	{
+		TagTester tester = null;
+
+		if (Strings.isEmpty(markup) == false && Strings.isEmpty(tagName) == false)
+		{
+			try
+			{
+				// remove the CDATA and
+				// the id attribute of the component because it is often the same as the element's id
+				markup = AJAX_COMPONENT_CDATA_OPEN.matcher(markup).replaceAll("<component>");
+				markup = AJAX_COMPONENT_CDATA_CLOSE.matcher(markup).replaceAll("</component>");
+
+				XmlPullParser parser = new XmlPullParser();
+				parser.parse(markup);
+
+				XmlTag elm;
+				XmlTag openTag = null;
+				XmlTag closeTag = null;
+				int level = 0;
+				while ((elm = parser.nextTag()) != null && closeTag == null)
+				{
+					XmlTag xmlTag = elm;
+
+					String xmlTagName = xmlTag.getName();
+					if (openTag == null && xmlTagName.equalsIgnoreCase(tagName))
+					{
+						if (xmlTag.isOpen())
+						{
+							openTag = xmlTag;
+						}
+						else if (xmlTag.isOpenClose())
+						{
+							openTag = xmlTag;
+							closeTag = xmlTag;
+						}
+					}
+					else if (openTag != null)
+					{
+						String openTagName = openTag.getName();
+						if (xmlTag.isOpen() && xmlTagName.equals(openTagName))
+						{
+							level++;
+						}
+
+						if (xmlTag.isClose())
+						{
+							if (xmlTagName.equals(openTagName))
+							{
+								if (level == 0)
+								{
+									closeTag = xmlTag;
+									closeTag.setOpenTag(openTag);
+								}
+								else
+								{
+									level--;
+								}
+							}
+						}
+					}
+				}
+
+				if (openTag != null && closeTag != null)
+				{
+					tester = new TagTester(parser, openTag, closeTag);
+				}
+			}
+			catch (Exception e)
+			{
+				throw new WicketRuntimeException(e);
+			}
+		}
+
+		return tester;
+	}
+
+	/**
 	 * Static factory method for creating a <code>TagTester</code> based on a tag found by an
 	 * attribute with a specific value. Please note that it will return the first tag which matches
 	 * the criteria. It's therefore good for attributes such as "id" or "wicket:id", but only if
@@ -435,7 +543,6 @@ public class TagTester
 			}
 			catch (Exception e)
 			{
-				// NOTE: IllegalStateException(Throwable) only exists since Java 1.5
 				throw new WicketRuntimeException(e);
 			}
 		}

http://git-wip-us.apache.org/repos/asf/wicket/blob/5d47267e/wicket-core/src/test/java/org/apache/wicket/util/tester/TagTesterTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/util/tester/TagTesterTest.java b/wicket-core/src/test/java/org/apache/wicket/util/tester/TagTesterTest.java
index 5674436..8041601 100644
--- a/wicket-core/src/test/java/org/apache/wicket/util/tester/TagTesterTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/util/tester/TagTesterTest.java
@@ -16,6 +16,11 @@
  */
 package org.apache.wicket.util.tester;
 
+import static org.hamcrest.Matchers.endsWith;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.nullValue;
+
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -250,6 +255,25 @@ public class TagTesterTest extends Assert
 		assertFalse(tester.hasChildTag("p"));
 	}
 
+	@Test
+	public void getChildByTagName()
+	{
+		TagTester tester = TagTester.createTagByAttribute(
+			"<div id=\"id\">" +
+				"<div class=\"radio\">" +
+					"<label>" +
+						"<input name=\"id\" type=\"radio\" value=\"0\" id=\"id1-0\"/> One" +
+					"</label>" +
+				"</div>" +
+			"</div>", "id", "id");
+		assertThat(tester.getChild("DIV"), is(notNullValue())); // case-insensitive
+		TagTester divClassRadioTagTester = tester.getChild("div");
+		assertThat(divClassRadioTagTester, is(notNullValue()));
+		TagTester labelTagTester = divClassRadioTagTester.getChild("label");
+		String labelMarkup = labelTagTester.getValue();
+		assertThat(labelMarkup, endsWith(" One"));
+	}
+
 	/**
 	 * Test getMarkup returns the open-tag + content + close-tag
 	 */