You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by si...@apache.org on 2011/05/26 16:03:41 UTC

svn commit: r1127922 - in /commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules: DigesterRulesSourceTestImpl.java FromXmlRuleSetTest.java

Author: simonetripodi
Date: Thu May 26 14:03:41 2011
New Revision: 1127922

URL: http://svn.apache.org/viewvc?rev=1127922&view=rev
Log:
tests moved to the universal loader

Modified:
    commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/DigesterRulesSourceTestImpl.java
    commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/FromXmlRuleSetTest.java

Modified: commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/DigesterRulesSourceTestImpl.java
URL: http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/DigesterRulesSourceTestImpl.java?rev=1127922&r1=1127921&r2=1127922&view=diff
==============================================================================
--- commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/DigesterRulesSourceTestImpl.java (original)
+++ commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/DigesterRulesSourceTestImpl.java Thu May 26 14:03:41 2011
@@ -18,8 +18,7 @@
 
 package org.apache.commons.digester3.xmlrules;
 
-import org.apache.commons.digester3.Digester;
-import org.apache.commons.digester3.xmlrules.DigesterRulesSource;
+import org.apache.commons.digester3.binder.AbstractRulesModule;
 
 /**
  * A test class, for validating FromXmlRuleSet's ability to 'include' programmatically-created rules from within an XML
@@ -29,19 +28,21 @@ import org.apache.commons.digester3.xmlr
  * @author Scott Sanders - Added ASL, removed external dependencies
  */
 public class DigesterRulesSourceTestImpl
-    implements DigesterRulesSource
+    extends AbstractRulesModule
 {
 
     /**
-     * Creates and adds Digester Rules to a given Rules object
-     * 
-     * @param digester the Digester to add the new Rule objects to
+     * {@inheritDoc}
      */
-    public void getRules( Digester digester )
+    @Override
+    protected void configure()
     {
-        digester.addObjectCreate( "/baz", ObjectTestImpl.class.getName() );
-        digester.addSetNext( "/baz", "add", "java.lang.Object" );
-        digester.addSetProperties( "/baz" );
+        forPattern("baz")
+            .createObject().ofType( ObjectTestImpl.class )
+            .then()
+            .setProperties()
+            .then()
+            .setNext( "add" ).withParameterType( "java.lang.Object" );
     }
 
 }

Modified: commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/FromXmlRuleSetTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/FromXmlRuleSetTest.java?rev=1127922&r1=1127921&r2=1127922&view=diff
==============================================================================
--- commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/FromXmlRuleSetTest.java (original)
+++ commons/sandbox/digester3/trunk/src/test/java/org/apache/commons/digester3/xmlrules/FromXmlRuleSetTest.java Thu May 26 14:03:41 2011
@@ -18,12 +18,20 @@
 
 package org.apache.commons.digester3.xmlrules;
 
-import static org.junit.Assert.*;
+import static org.apache.commons.digester3.binder.DigesterLoader.newLoader;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
+import java.io.InputStream;
 import java.io.StringReader;
+import java.net.URL;
+import java.util.ArrayList;
 
+import org.apache.commons.digester3.Address;
 import org.apache.commons.digester3.Digester;
-import org.apache.commons.digester3.xmlrules.FromXmlRuleSet;
+import org.apache.commons.digester3.ObjectCreationFactoryTestImpl;
+import org.apache.commons.digester3.binder.RulesModule;
 import org.junit.Test;
 import org.xml.sax.InputSource;
 
@@ -34,46 +42,314 @@ import org.xml.sax.InputSource;
 public class FromXmlRuleSetTest
 {
 
+    private final RulesModule createRules( final URL xmlRules )
+    {
+        return new FromXmlRulesModule()
+        {
+
+            @Override
+            protected void loadRules()
+            {
+                loadXMLRules( xmlRules );
+            }
+
+        };
+    }
+
+    private final RulesModule createRules( final String xmlText )
+    {
+        return new FromXmlRulesModule()
+        {
+
+            @Override
+            protected void loadRules()
+            {
+                loadXMLRulesFromText( xmlText );
+            }
+
+        };
+    }
+
     /**
-     * Test the FromXmlRules.addRuleInstances(digester, path) method, ie test loading rules at a base position other
-     * than the root.
+     * Tests the DigesterLoader.createDigester(), with multiple
+     * included rule sources: testrules.xml includes another rules xml
+     * file, and also includes programmatically created rules.
      */
     @Test
-    public void testBasePath()
+    public void testCreateDigester()
         throws Exception
     {
-        String xmlRules =
-            "<?xml version='1.0'?>" + "<digester-rules>" + "   <pattern value='foo'>" + "      <call-method-rule "
-                + "              methodname='setProperty' " + "              paramcount='0' />" + "   </pattern>"
-                + "</digester-rules>";
+        URL rules = getClass().getResource( "testrules.xml" );
+        URL input = getClass().getResource( "test.xml" );
+
+        Digester digester = newLoader( createRules( rules ) ).newDigester();
+        digester.push( new ArrayList<Object>() );
+        Object root = digester.parse( input.openStream() );
+        assertEquals( "[foo1 baz1 foo2, foo3 foo4]", root.toString() );
+    }
+
+    /**
+     * Tests the DigesterLoader.load(), with multiple included rule
+     * sources: testrules.xml includes another rules xml file, and
+     * also includes programmatically created rules.
+     */
+    @Test
+    public void testLoad1()
+        throws Exception
+    {
+        ClassLoader classLoader = getClass().getClassLoader();
+        URL rules = getClass().getResource( "testrules.xml" );
+        URL input = getClass().getResource( "test.xml" );
 
-        String xml = "<?xml version='1.0'?>" + "<root>" + "  <foo>success</foo>" + "</root>";
+        Digester digester = newLoader( createRules( rules ) ).setClassLoader( classLoader ).newDigester();
+        digester.push( new ArrayList<Object>() );
 
-        // First try with no base path. The rule shouldn't match, because
-        // foo is not the root element.
+        Object root = digester.parse( input );
+        if ( !( root instanceof ArrayList<?> ) )
         {
-            ObjectTestImpl testObject = new ObjectTestImpl();
-            FromXmlRuleSet ruleset = new FromXmlRuleSet( new InputSource( new StringReader( xmlRules ) ) );
-            Digester digester = new Digester();
-            ruleset.addRuleInstances( digester );
+            fail( "Unexpected object returned from DigesterLoader. Expected ArrayList; got "
+                + root.getClass().getName() );
+        }
+        assertEquals( "[foo1 baz1 foo2, foo3 foo4]", root.toString() );
+
+        @SuppressWarnings( "unchecked" )
+        // root is an ArrayList
+        ArrayList<Object> al = (ArrayList<Object>) root;
+        Object obj = al.get( 0 );
+        if ( !( obj instanceof ObjectTestImpl ) )
+        {
+            fail( "Unexpected object returned from DigesterLoader. Expected TestObject; got "
+                + obj.getClass().getName() );
+        }
+        ObjectTestImpl to = (ObjectTestImpl) obj;
+        assertEquals( new Long( 555 ), to.getLongValue() );
+        assertEquals( "foo", to.getMapValue( "test1" ) );
+        assertEquals( "bar", to.getMapValue( "test2" ) );
+    }
 
-            digester.push( testObject );
-            digester.parse( new InputSource( new StringReader( xml ) ) );
+    /**
+     * The same as testLoad1, exception the input file is passed to
+     * DigesterLoader as an InputStream instead of a URL.
+     */
+    @Test
+    public void testLoad2()
+        throws Exception
+    {
+        URL rules = getClass().getResource( "testrules.xml" );
+        InputStream input = getClass().getResourceAsStream( "test.xml" );
+        Digester digester =
+            newLoader( createRules( rules ) ).setClassLoader( this.getClass().getClassLoader() ).newDigester();
+        digester.push( new ArrayList<Object>() );
+
+        ArrayList<Object> list = digester.parse( input );
+
+        assertEquals( list.toString(), "[foo1 baz1 foo2, foo3 foo4]" );
+        assertEquals( "Wrong number of classes created", 2, list.size() );
+        assertEquals( "Pushed first", true, ( (ObjectTestImpl) list.get( 0 ) ).isPushed() );
+        assertEquals( "Didn't push second", false, ( (ObjectTestImpl) list.get( 1 ) ).isPushed() );
+        assertTrue( "Property was set properly",
+                    ( (ObjectTestImpl) list.get( 0 ) ).getProperty().equals( "I am a property!" ) );
+    }
 
-            assertEquals( "", testObject.getProperty() );
+    /**
+     */
+    @Test
+    public void testSetCustomProperties()
+        throws Exception
+    {
+        URL rules = this.getClass().getResource( "testPropertyAliasRules.xml" );
+        InputStream input =
+            getClass().getClassLoader().getResource( "org/apache/commons/digester3/Test7.xml" ).openStream();
+
+        Digester digester =
+            newLoader( createRules( rules ) ).setClassLoader( this.getClass().getClassLoader() ).newDigester();
+        digester.push( new ArrayList<Object>() );
+
+        Object obj = digester.parse( input );
+
+        if ( !( obj instanceof ArrayList<?> ) )
+        {
+            fail( "Unexpected object returned from DigesterLoader. Expected ArrayList; got " + obj.getClass().getName() );
         }
 
-        // Now try with a base path. The rule should now match.
+        @SuppressWarnings("unchecked") // root is an ArrayList of Address
+        ArrayList<Address> root = (ArrayList<Address>) obj;
+
+        assertEquals( "Wrong array size", 4, root.size() );
+
+        // note that the array is in popped order (rather than pushed)
+
+        Address add = root.get( 0 );
+        Address addressOne = add;
+        assertEquals( "(1) Street attribute", "New Street", addressOne.getStreet() );
+        assertEquals( "(1) City attribute", "Las Vegas", addressOne.getCity() );
+        assertEquals( "(1) State attribute", "Nevada", addressOne.getState() );
+
+        add = root.get( 1 );
+        Address addressTwo = add;
+        assertEquals( "(2) Street attribute", "Old Street", addressTwo.getStreet() );
+        assertEquals( "(2) City attribute", "Portland", addressTwo.getCity() );
+        assertEquals( "(2) State attribute", "Oregon", addressTwo.getState() );
+
+        add = root.get( 2 );
+        Address addressThree = add;
+        assertEquals( "(3) Street attribute", "4th Street", addressThree.getStreet() );
+        assertEquals( "(3) City attribute", "Dayton", addressThree.getCity() );
+        assertEquals( "(3) State attribute", "US", addressThree.getState() );
+
+        add = root.get( 3 );
+        Address addressFour = add;
+        assertEquals( "(4) Street attribute", "6th Street", addressFour.getStreet() );
+        assertEquals( "(4) City attribute", "Cleveland", addressFour.getCity() );
+        assertEquals( "(4) State attribute", "Ohio", addressFour.getState() );
+    }
+
+    @Test
+    public void testFactoryCreateRule()
+        throws Exception
+    {
+        URL rules = getClass().getResource( "testfactory.xml" );
+        String xml = "<?xml version='1.0' ?><root one='good' two='bad' three='ugly'><foo/></root>";
+
+        Digester digester =
+            newLoader( createRules( rules ) ).setClassLoader( this.getClass().getClassLoader() ).newDigester();
+        digester.push( new ArrayList<ObjectCreationFactoryTestImpl>() );
+
+        Object obj = digester.parse( new StringReader( xml ) );
+        if ( !( obj instanceof ArrayList<?> ) )
         {
-            ObjectTestImpl testObject = new ObjectTestImpl();
-            FromXmlRuleSet ruleset = new FromXmlRuleSet( new InputSource( new StringReader( xmlRules ) ) );
-            Digester digester = new Digester();
-            ruleset.addRuleInstances( digester, "root" );
+            fail( "Unexpected object returned from DigesterLoader. Expected ArrayList; got " + obj.getClass().getName() );
+        }
+
+        @SuppressWarnings("unchecked") // root is an ArrayList of TestObjectCreationFactory
+        ArrayList<ObjectCreationFactoryTestImpl> list = (ArrayList<ObjectCreationFactoryTestImpl>) obj;
 
-            digester.push( testObject );
-            digester.parse( new InputSource( new StringReader( xml ) ) );
+        assertEquals( "List should contain only the factory object", list.size(), 1 );
+        ObjectCreationFactoryTestImpl factory = list.get( 0 );
+        assertEquals( "Object create not called(1)", factory.called, true );
+        assertEquals( "Attribute not passed (1)", factory.attributes.getValue( "one" ), "good" );
+        assertEquals( "Attribute not passed (2)", factory.attributes.getValue( "two" ), "bad" );
+        assertEquals( "Attribute not passed (3)", factory.attributes.getValue( "three" ), "ugly" );
+    }
 
-            assertEquals( "success", testObject.getProperty() );
+    @Test
+    public void testFactoryIgnoreCreateRule()
+        throws Exception
+    {
+        URL rules = getClass().getResource( "testfactoryignore.xml" );
+
+        String xml = "<?xml version='1.0' ?><root one='good' two='bad' three='ugly'><foo/></root>";
+        try {
+            newLoader(createRules(rules)).newDigester().parse(new StringReader(xml));
+        } catch (Exception e) {
+            fail("This exception should have been ignored: " + e.getClass().getName());
+        }
+    }
+
+    @Test
+    public void testFactoryNotIgnoreCreateRule()
+        throws Exception
+    {
+        URL rules = getClass().getResource( "testfactorynoignore.xml" );
+
+        String xml = "<?xml version='1.0' ?><root one='good' two='bad' three='ugly'><foo/></root>";
+        try
+        {
+            newLoader( createRules( rules ) ).newDigester().parse( new StringReader( xml ) );
+            fail( "Exception should have been propagated from create method." );
+        }
+        catch ( Exception e )
+        {
+            /* What we expected */
+            assertEquals( org.xml.sax.SAXParseException.class, e.getClass() );
         }
     }
+
+    @Test
+    public void testCallParamRule()
+        throws Exception
+    {
+        URL rules = getClass().getResource( "test-call-param-rules.xml" );
+
+         String xml = "<?xml version='1.0' ?>"
+                      + "<root><foo attr='long'><bar>short</bar><foobar><ping>tosh</ping></foobar></foo></root>";
+
+        CallParamTestObject testObject = new CallParamTestObject();
+
+        Digester digester =
+            newLoader( createRules( rules ) ).setClassLoader( this.getClass().getClassLoader() ).newDigester();
+        digester.push( testObject );
+        digester.parse( new StringReader( xml ) );
+
+        assertEquals( "Incorrect left value", "long", testObject.getLeft() );
+        assertEquals( "Incorrect middle value", "short", testObject.getMiddle() );
+        assertEquals( "Incorrect right value", "", testObject.getRight() );
+     }
+
+    @Test
+    public void testInputSourceLoader() throws Exception {
+        String rulesXml = "<?xml version='1.0'?>"
+                + "<digester-rules>"
+                + " <pattern value='root'>"
+                + "   <pattern value='foo'>"
+                + "     <call-method-rule methodname='triple' paramcount='3'"
+                + "            paramtypes='java.lang.String,java.lang.String,java.lang.String'/>"
+                + "     <call-param-rule paramnumber='0' attrname='attr'/>"
+                + "        <pattern value='bar'>"
+                + "            <call-param-rule paramnumber='1' from-stack='false'/>"
+                + "        </pattern>"
+                + "        <pattern value='foobar'>"
+                + "            <object-create-rule classname='java.lang.String'/>"
+                + "            <pattern value='ping'>"
+                + "                <call-param-rule paramnumber='2' from-stack='true'/>"
+                + "            </pattern>"
+                + "         </pattern>"
+                + "   </pattern>"
+                + " </pattern>"
+                + "</digester-rules>";
+                
+        String xml = "<?xml version='1.0' ?>"
+                     + "<root><foo attr='long'><bar>short</bar><foobar><ping>tosh</ping></foobar></foo></root>";
+
+        CallParamTestObject testObject = new CallParamTestObject();
+
+        Digester digester = newLoader( createRules( rulesXml ) ).newDigester();
+        digester.push( testObject );
+        digester.parse( new StringReader( xml ) );
+
+        assertEquals( "Incorrect left value", "long", testObject.getLeft() );
+        assertEquals( "Incorrect middle value", "short", testObject.getMiddle() );
+        assertEquals( "Incorrect right value", "", testObject.getRight() );
+    }
+
+    /** 
+     * Test the FromXmlRules.addRuleInstances(digester, path) method, ie
+     * test loading rules at a base position other than the root.
+     */
+    @Test
+    public void testBasePath()
+        throws Exception
+    {
+        String xmlRules =
+            "<?xml version='1.0'?>"
+            + "<digester-rules>"
+            + "   <pattern value='root/foo'>"
+            + "      <call-method-rule methodname='setProperty' usingElementBodyAsArgument='true' />"
+            + "   </pattern>"
+            + "</digester-rules>";
+
+        String xml =
+            "<?xml version='1.0'?>"
+            + "<root>"
+            + "  <foo>success</foo>"
+            + "</root>";
+
+        ObjectTestImpl testObject = new ObjectTestImpl();
+        Digester digester = newLoader( createRules( xmlRules ) ).newDigester();
+
+        digester.push( testObject );
+        digester.parse( new InputSource( new StringReader( xml ) ) );
+
+        assertEquals( "success", testObject.getProperty() );
+    }
 }