On Sunday, August 5, 2001, at 11:39 PM, Craig R. McClanahan wrote:
> Sounds like a good reason to enhance Digester to suit the needs. I just
> don't want to violate our "backwards compatibility" principles (in the
> Commons charter) for existing Digester users. Extensibility lets us have
> our cake and eat it too.
definitely
>> i'm feeling pretty confident at the moment that everything's going to
>> work
>> out well :)
>
> If you find yourself creating one or more Rules implementations that you
> think make sense to include in the standard Digester package, feel free to
> throw 'em this way. That might save other people from having to solve the
> same problem again.
>
> And it wouldn't hurt my feelings at all if some kind folks added some good
> JUnit test cases for Digester :-).
here's a patch that replaces the depricated method calls in
DigesterTestCase.java and adds an additional method that tests the basic
RulesBase pattern matching rules. the other attachment is a new helper
class (extending Rule) for testing (so it belongs in src/test/... not src/
java).
- robert
TestRule.java
Index: src/test/org/apache/commons/digester/DigesterTestCase.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/digester/src/test/org/apache/commons/digester/DigesterTestCase.java,v
retrieving revision 1.2
diff -u -r1.2 DigesterTestCase.java
--- src/test/org/apache/commons/digester/DigesterTestCase.java 2001/05/22 04:57:02
1.2
+++ src/test/org/apache/commons/digester/DigesterTestCase.java 2001/08/07 16:54:41
@@ -269,30 +269,81 @@
/**
- * Test rule creation and matching.
+ * Basic test for rule creation and matching.
*/
public void testRules() {
List list = null;
-
+
+ // make sure that we have a nice fresh RulesBase
+ digester.setRules(new RulesBase());
+
assertNull("Initial rules list is empty",
- digester.getRules("a"));
+ digester.getRules().match("a"));
digester.addSetProperties("a");
assertEquals("Add a matching rule",
- 1, digester.getRules("a").size());
+ 1, digester.getRules().match("a").size());
digester.addSetProperties("b");
assertEquals("Add a non-matching rule",
- 1, digester.getRules("a").size());
+ 1, digester.getRules().match("a").size());
digester.addSetProperties("a/b");
assertEquals("Add a non-matching nested rule",
- 1, digester.getRules("a").size());
+ 1, digester.getRules().match("a").size());
digester.addSetProperties("a/b");
assertEquals("Add a second matching rule",
- 2, digester.getRules("a/b").size());
+ 2, digester.getRules().match("a/b").size());
}
+ /**
+ * <p> Test matching rules in {@link RulesBase}.
+ *
+ * <p> Tests
+ * <ul><li> exact match </li>
+ * <li> tail match </li>
+ * <li> longest pattern rule </li>
+ * </ul>
+ */
+ public void testRulesBase() {
+ // make sure that we have a nice fresh RulesBase
+ digester.setRules(new RulesBase());
+
+ assertEquals("Initial rules list is empty",
+ 0, digester.getRules().rules().size());
+
+ // we're going to set up
+
+ digester.addRule("a/b/c/d", new TestRule(digester,"a/b/c/d"));
+ digester.addRule("*/d", new TestRule(digester,"*/d"));
+ digester.addRule("*/c/d", new TestRule(digester,"*/c/d"));
+
+ // test exact match
+ assertEquals("Exact match takes precedence",
+ 1, digester.getRules().match("a/b/c/d").size());
+
+ assertEquals("Exact match takes precedence",
+ "a/b/c/d",
+((TestRule)digester.getRules().match("a/b/c/d").iterator().next()).getIdentifier());
+
+
+ // test wildcard tail matching
+ assertEquals("Wildcard tail matching rule",
+ 1, digester.getRules().match("a/b/d").size());
+
+ assertEquals("Wildcard tail matching rule",
+ "*/d",
+((TestRule)digester.getRules().match("a/b/d").iterator().next()).getIdentifier());
+
+
+ // test the longest matching pattern rule
+ assertEquals("Longest tail rule",
+ 1, digester.getRules().match("x/c/d").size());
+
+ assertEquals("Longest tail rule",
+ "*/c/d",
+((TestRule)digester.getRules().match("x/c/d").iterator().next()).getIdentifier());
+
+
+ // clear up again
+ digester.setRules(new RulesBase());
+ }
+
/**
* Test the basic stack mechanisms.
*/
@@ -339,7 +390,4 @@
assertNull("Cleared stack pop() returns null", value);
}
-
-
-
}