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);
 
     }
-
-
-
 }

Reply via email to