Author: oheger
Date: Sun Apr 16 10:56:48 2006
New Revision: 394530

URL: http://svn.apache.org/viewcvs?rev=394530&view=rev
Log:
Test classes for event listener support

Added:
    
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/
    
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestConfigurationEvents.java
   (with props)
    
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestFileConfigurationEvents.java
   (with props)
    
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestEventSource.java
   (with props)
    
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestHierarchicalConfigurationEvents.java
   (with props)
    
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestMapConfigurationEvents.java
   (with props)
    
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestPropertiesConfigurationEvents.java
   (with props)
    
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestXMLConfigurationEvents.java
   (with props)
Modified:
    jakarta/commons/proper/configuration/trunk/build.xml
    jakarta/commons/proper/configuration/trunk/project.xml

Modified: jakarta/commons/proper/configuration/trunk/build.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/build.xml?rev=394530&r1=394529&r2=394530&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/build.xml (original)
+++ jakarta/commons/proper/configuration/trunk/build.xml Sun Apr 16 10:56:48 
2006
@@ -148,6 +148,8 @@
           <exclude name="**/XPathTest.java">
           </exclude>
           <exclude name="**/AbstractCombinerTest.java"/>
+          <exclude name="**/AbstractTestConfigurationEvents.java"/>
+          <exclude name="**/AbstractTestFileConfigurationEvents.java"/>
         </fileset>
       </batchtest>
     </junit>

Modified: jakarta/commons/proper/configuration/trunk/project.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/project.xml?rev=394530&r1=394529&r2=394530&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/project.xml (original)
+++ jakarta/commons/proper/configuration/trunk/project.xml Sun Apr 16 10:56:48 
2006
@@ -431,6 +431,8 @@
         <exclude>**/TestAbstractConfiguration.java</exclude>
         <exclude>**/XPathTest.java</exclude>
         <exclude>**/AbstractCombinerTest.java</exclude>
+        <exclude>**/AbstractTestConfigurationEvents.java</exclude>
+        <exclude>**/AbstractTestFileConfigurationEvents.java</exclude>
       </excludes>
       <resources>
         <resource>

Added: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestConfigurationEvents.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestConfigurationEvents.java?rev=394530&view=auto
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestConfigurationEvents.java
 (added)
+++ 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestConfigurationEvents.java
 Sun Apr 16 10:56:48 2006
@@ -0,0 +1,255 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.commons.configuration.event;
+
+import java.util.LinkedList;
+
+import org.apache.commons.configuration.AbstractConfiguration;
+import org.apache.commons.configuration.event.ConfigurationEvent;
+import org.apache.commons.configuration.event.ConfigurationListener;
+
+import junit.framework.TestCase;
+
+/**
+ * Base class for testing events generated by configuration classes derived 
from
+ * AbstractConfiguration. This class implements a couple of tests related to
+ * event generation. Concrete sub classes only have to implement the
+ * <code>createConfiguration()</code> method for creating an instance of a
+ * specific configuration class. Because tests for detail events depend on a
+ * concrete implementation an exact sequence of events cannot be checked.
+ * Instead the corresponding test methods check whether the enclosing events
+ * (not the detail events) are of the expected type.
+ *
+ * @version $Id$
+ */
+public abstract class AbstractTestConfigurationEvents extends TestCase
+{
+    /** Constant for a test property name. */
+    static final String TEST_PROPNAME = "event.test";
+
+    /** Constant for a test property value. */
+    static final String TEST_PROPVALUE = "a value";
+
+    /** Constant for an existing property. */
+    static final String EXIST_PROPERTY = "event.property";
+
+    /** The configuration to be tested. */
+    protected AbstractConfiguration config;
+
+    /** A test event listener. */
+    protected TestConfigurationListener l;
+
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        config = createConfiguration();
+        config.addProperty(EXIST_PROPERTY, "existing value");
+        l = new TestConfigurationListener();
+        config.addConfigurationListener(l);
+    }
+
+    /**
+     * Creates the configuration instance to be tested.
+     *
+     * @return the configuration instance under test
+     */
+    protected abstract AbstractConfiguration createConfiguration();
+
+    /**
+     * Tests events generated by addProperty().
+     */
+    public void testAddPropertyEvent()
+    {
+        config.addProperty(TEST_PROPNAME, TEST_PROPVALUE);
+        l.checkEvent(AbstractConfiguration.EVENT_ADD_PROPERTY, TEST_PROPNAME,
+                TEST_PROPVALUE, true);
+        l.checkEvent(AbstractConfiguration.EVENT_ADD_PROPERTY, TEST_PROPNAME,
+                TEST_PROPVALUE, false);
+        l.done();
+    }
+
+    /**
+     * Tests events generated by addProperty() when detail events are enabled.
+     */
+    public void testAddPropertyEventWithDetails()
+    {
+        config.setDetailEvents(true);
+        config.addProperty(TEST_PROPNAME, TEST_PROPVALUE);
+        l.checkEventCount(2);
+        l.checkEvent(AbstractConfiguration.EVENT_ADD_PROPERTY, TEST_PROPNAME,
+                TEST_PROPVALUE, true);
+        l.skipToLast(AbstractConfiguration.EVENT_ADD_PROPERTY);
+        l.checkEvent(AbstractConfiguration.EVENT_ADD_PROPERTY, TEST_PROPNAME,
+                TEST_PROPVALUE, false);
+        l.done();
+    }
+
+    /**
+     * Tests events generated by clearProperty().
+     */
+    public void testClearPropertyEvent()
+    {
+        config.clearProperty(EXIST_PROPERTY);
+        l.checkEvent(AbstractConfiguration.EVENT_CLEAR_PROPERTY,
+                EXIST_PROPERTY, null, true);
+        l.checkEvent(AbstractConfiguration.EVENT_CLEAR_PROPERTY,
+                EXIST_PROPERTY, null, false);
+        l.done();
+    }
+
+    /**
+     * Tests events generated by clearProperty() when detail events are 
enabled.
+     */
+    public void testClearPropertyEventWithDetails()
+    {
+        config.setDetailEvents(true);
+        config.clearProperty(EXIST_PROPERTY);
+        l.checkEventCount(2);
+        l.checkEvent(AbstractConfiguration.EVENT_CLEAR_PROPERTY,
+                EXIST_PROPERTY, null, true);
+        l.skipToLast(AbstractConfiguration.EVENT_CLEAR_PROPERTY);
+        l.checkEvent(AbstractConfiguration.EVENT_CLEAR_PROPERTY,
+                EXIST_PROPERTY, null, false);
+        l.done();
+    }
+
+    /**
+     * Tests events generated by setProperty().
+     */
+    public void testSetPropertyEvent()
+    {
+        config.setProperty(EXIST_PROPERTY, TEST_PROPVALUE);
+        l.checkEvent(AbstractConfiguration.EVENT_SET_PROPERTY, EXIST_PROPERTY,
+                TEST_PROPVALUE, true);
+        l.checkEvent(AbstractConfiguration.EVENT_SET_PROPERTY, EXIST_PROPERTY,
+                TEST_PROPVALUE, false);
+        l.done();
+    }
+
+    /**
+     * Tests events generated by setProperty() when detail events are enabled.
+     */
+    public void testSetPropertyEventWithDetails()
+    {
+        config.setDetailEvents(true);
+        config.setProperty(EXIST_PROPERTY, TEST_PROPVALUE);
+        l.checkEventCount(2);
+        l.checkEvent(AbstractConfiguration.EVENT_SET_PROPERTY, EXIST_PROPERTY,
+                TEST_PROPVALUE, true);
+        l.skipToLast(AbstractConfiguration.EVENT_SET_PROPERTY);
+        l.checkEvent(AbstractConfiguration.EVENT_SET_PROPERTY, EXIST_PROPERTY,
+                TEST_PROPVALUE, false);
+        l.done();
+    }
+
+    /**
+     * Tests the events generated by the clear() method.
+     */
+    public void testClearEvent()
+    {
+        config.clear();
+        l.checkEvent(AbstractConfiguration.EVENT_CLEAR, null, null, true);
+        l.checkEvent(AbstractConfiguration.EVENT_CLEAR, null, null, false);
+        l.done();
+    }
+
+    /**
+     * Tests the events generated by the clear method when detail events are
+     * enabled.
+     */
+    public void testClearEventWithDetails()
+    {
+        config.setDetailEvents(true);
+        config.clear();
+        l.checkEventCount(2);
+        l.checkEvent(AbstractConfiguration.EVENT_CLEAR, null, null, true);
+        l.skipToLast(AbstractConfiguration.EVENT_CLEAR);
+        l.checkEvent(AbstractConfiguration.EVENT_CLEAR, null, null, false);
+        l.done();
+    }
+
+    /**
+     * A test event listener class used for testing events generated by the
+     * configuration.
+     */
+    class TestConfigurationListener implements ConfigurationListener
+    {
+        /** Stores the received events. */
+        private LinkedList events = new LinkedList();
+
+        public void configurationChanged(ConfigurationEvent event)
+        {
+            events.add(event);
+        }
+
+        /**
+         * Checks if at least <code>minEvents</code> events have been
+         * received.
+         *
+         * @param minEvents the minimum number of expected events
+         */
+        public void checkEventCount(int minEvents)
+        {
+            assertTrue("Too view events received", events.size() >= minEvents);
+        }
+
+        /**
+         * Checks an expected event.
+         *
+         * @param type the event type
+         * @param propName the expected property name
+         * @param propValue the expected property value
+         * @param before the expected before flag
+         */
+        public void checkEvent(int type, String propName, Object propValue,
+                boolean before)
+        {
+            assertFalse("Too few events received", events.isEmpty());
+            ConfigurationEvent e = (ConfigurationEvent) events.removeFirst();
+            assertEquals("Wrong event source", config, e.getSource());
+            assertEquals("Wrong event type", type, e.getType());
+            assertEquals("Wrong property name", propName, e.getPropertyName());
+            assertEquals("Wrong property value", propValue, e
+                    .getPropertyValue());
+            assertEquals("Wrong before flag", before, e.isBeforeUpdate());
+        }
+
+        /**
+         * Skips to the last received event and checks that no events of the
+         * given type have been received. This method is used by checks for
+         * detail events to ignore the detail events.
+         *
+         * @param type the event type
+         */
+        public void skipToLast(int type)
+        {
+            while (events.size() > 1)
+            {
+                ConfigurationEvent e = (ConfigurationEvent) events
+                        .removeFirst();
+                assertTrue("Found end event in details", type != e.getType());
+            }
+        }
+
+        /**
+         * Checks if all events has been processed.
+         */
+        public void done()
+        {
+            assertTrue("Too many events received", events.isEmpty());
+        }
+    }
+}

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestConfigurationEvents.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestConfigurationEvents.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestConfigurationEvents.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestFileConfigurationEvents.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestFileConfigurationEvents.java?rev=394530&view=auto
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestFileConfigurationEvents.java
 (added)
+++ 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestFileConfigurationEvents.java
 Sun Apr 16 10:56:48 2006
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.commons.configuration.event;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.apache.commons.configuration.AbstractFileConfiguration;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.FileConfiguration;
+import org.apache.commons.configuration.reloading.ReloadingStrategy;
+
+/**
+ * A base test class that can be used for testing file-based configurations.
+ * This class tests reload events, too.
+ *
+ * @version $Id$
+ */
+public abstract class AbstractTestFileConfigurationEvents extends
+        AbstractTestConfigurationEvents
+{
+    /**
+     * Initializes the file configuration for the tests.
+     *
+     * @throws ConfigurationException if an error occurs
+     */
+    protected void setUpFileConfiguration() throws ConfigurationException,
+            IOException
+    {
+        FileConfiguration fc = (FileConfiguration) config;
+        fc.setReloadingStrategy(new AlwaysReloadingStrategy());
+        fc.setURL(getSourceURL());
+
+        // deregister event listener before load because load will cause
+        // other events being generated
+        config.removeConfigurationListener(l);
+        fc.load();
+        config.addConfigurationListener(l);
+    }
+
+    /**
+     * Returns the URL of the file to be loaded. Must be implemented in 
concrete
+     * test classes.
+     *
+     * @return the URL of the file-based configuration
+     * @throws IOException if an error occurs
+     */
+    protected abstract URL getSourceURL() throws IOException;
+
+    /**
+     * Tests events generated by the reload() method.
+     */
+    public void testReloadEvent() throws ConfigurationException, IOException
+    {
+        setUpFileConfiguration();
+        config.isEmpty(); // This should cause a reload
+        l.checkEvent(AbstractFileConfiguration.EVENT_RELOAD, null,
+                getSourceURL(), true);
+        l.checkEvent(AbstractFileConfiguration.EVENT_RELOAD, null,
+                getSourceURL(), false);
+        l.done();
+    }
+
+    /**
+     * Tests events generated by the reload() method when detail events are
+     * enabled.
+     */
+    public void testReloadEventWithDetails() throws ConfigurationException,
+            IOException
+    {
+        setUpFileConfiguration();
+        config.setDetailEvents(true);
+        config.isEmpty(); // This should cause a reload
+        l.checkEventCount(2);
+        l.checkEvent(AbstractFileConfiguration.EVENT_RELOAD, null,
+                getSourceURL(), true);
+        l.skipToLast(AbstractFileConfiguration.EVENT_RELOAD);
+        l.checkEvent(AbstractFileConfiguration.EVENT_RELOAD, null,
+                getSourceURL(), false);
+        l.done();
+    }
+
+    /**
+     * Tests accessing a property during a reload event to ensure that no
+     * infinite loops are possible.
+     */
+    public void testAccessPropertiesOnReload() throws ConfigurationException,
+            IOException
+    {
+        setUpFileConfiguration();
+        config.addConfigurationListener(new ConfigurationListener()
+        {
+            public void configurationChanged(ConfigurationEvent event)
+            {
+                config.getString("test");
+            }
+        });
+        config.isEmpty();
+        l.checkEvent(AbstractFileConfiguration.EVENT_RELOAD, null,
+                getSourceURL(), true);
+        l.checkEvent(AbstractFileConfiguration.EVENT_RELOAD, null,
+                getSourceURL(), false);
+        l.done();
+    }
+
+    /**
+     * A dummy implementation of the ReloadingStrategy interface. This
+     * implementation will always indicate that a reload should be performed. 
So
+     * it can be used for testing reloading events.
+     */
+    static class AlwaysReloadingStrategy implements ReloadingStrategy
+    {
+        public void setConfiguration(FileConfiguration configuration)
+        {
+        }
+
+        public void init()
+        {
+        }
+
+        public boolean reloadingRequired()
+        {
+            return true;
+        }
+
+        public void reloadingPerformed()
+        {
+        }
+    }
+}

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestFileConfigurationEvents.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestFileConfigurationEvents.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/AbstractTestFileConfigurationEvents.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestEventSource.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestEventSource.java?rev=394530&view=auto
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestEventSource.java
 (added)
+++ 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestEventSource.java
 Sun Apr 16 10:56:48 2006
@@ -0,0 +1,246 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.commons.configuration.event;
+
+import java.util.Collection;
+
+import junit.framework.TestCase;
+
+/**
+ * Test class for EventSource.
+ *
+ * @version $Id$
+ */
+public class TestEventSource extends TestCase
+{
+    /** Constant for the event type used for testing. */
+    static final int TEST_TYPE = 42;
+
+    /** Constant for the event property name. */
+    static final String TEST_PROPNAME = "test.property.name";
+
+    /** Constant for the event property value. */
+    static final Object TEST_PROPVALUE = "a test property value";
+
+    /** The object under test. */
+    CountingEventSource source;
+
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        source = new CountingEventSource();
+    }
+
+    /**
+     * Tests a newly created source object.
+     */
+    public void testInit()
+    {
+        assertTrue("Listeners list is not empty", source
+                .getConfigurationListeners().isEmpty());
+        assertFalse("Removing listener", source
+                .removeConfigurationListener(new TestListener()));
+        assertFalse("Detail events are enabled", source.isDetailEvents());
+    }
+
+    /**
+     * Tests registering a new listener.
+     */
+    public void testAddConfigurationListener()
+    {
+        TestListener l = new TestListener();
+        source.addConfigurationListener(l);
+        Collection listeners = source.getConfigurationListeners();
+        assertEquals("Wrong number of listeners", 1, listeners.size());
+        assertTrue("Listener not in list", listeners.contains(l));
+    }
+
+    /**
+     * Tests adding an undefined configuration listener. This should cause an
+     * exception.
+     */
+    public void testAddNullConfigurationListener()
+    {
+        try
+        {
+            source.addConfigurationListener(null);
+            fail("Could add null listener!");
+        }
+        catch (IllegalArgumentException iex)
+        {
+            // ok
+        }
+    }
+
+    /**
+     * Tests removing a listener.
+     */
+    public void testRemoveConfigurationListener()
+    {
+        TestListener l = new TestListener();
+        assertFalse("Listener can be removed?", source
+                .removeConfigurationListener(l));
+        source.addConfigurationListener(l);
+        source.addConfigurationListener(new TestListener());
+        assertFalse("Unknown listener can be removed", source
+                .removeConfigurationListener(new TestListener()));
+        assertTrue("Could not remove listener", source
+                .removeConfigurationListener(l));
+        assertFalse("Listener still in list", source
+                .getConfigurationListeners().contains(l));
+    }
+
+    /**
+     * Tests if a null listener can be removed. This should be a no-op.
+     */
+    public void testRemoveNullConfigurationListener()
+    {
+        source.addConfigurationListener(new TestListener());
+        assertFalse("Null listener can be removed", source
+                .removeConfigurationListener(null));
+        assertEquals("Listener list was modified", 1, source
+                .getConfigurationListeners().size());
+    }
+
+    /**
+     * Tests whether the listeners list is read only.
+     */
+    public void testGetConfigurationListenersUpdate()
+    {
+        source.addConfigurationListener(new TestListener());
+        Collection list = source.getConfigurationListeners();
+        try
+        {
+            list.add("test");
+            fail("Could manipulate list!");
+        }
+        catch (Exception ex)
+        {
+            // ok
+        }
+    }
+
+    /**
+     * Tests enabling and disabling the detail events flag.
+     */
+    public void testSetDetailEvents()
+    {
+        source.setDetailEvents(true);
+        assertTrue("Detail events are disabled", source.isDetailEvents());
+        source.setDetailEvents(true);
+        source.setDetailEvents(false);
+        assertTrue("Detail events are disabled again", 
source.isDetailEvents());
+        source.setDetailEvents(false);
+        assertFalse("Detail events are still enabled", 
source.isDetailEvents());
+    }
+
+    /**
+     * Tests delivering an event to a listener.
+     */
+    public void testFireEvent()
+    {
+        TestListener l = new TestListener();
+        source.addConfigurationListener(l);
+        source.fireEvent(TEST_TYPE, TEST_PROPNAME, TEST_PROPVALUE, true);
+        assertEquals("Not 1 event created", 1, source.eventCount);
+        assertEquals("Listener not called once", 1, l.numberOfCalls);
+        assertEquals("Wrong event type", TEST_TYPE, l.lastEvent.getType());
+        assertEquals("Wrong property name", TEST_PROPNAME, l.lastEvent
+                .getPropertyName());
+        assertEquals("Wrong property value", TEST_PROPVALUE, l.lastEvent
+                .getPropertyValue());
+        assertTrue("Wrong before event flag", l.lastEvent.isBeforeUpdate());
+    }
+
+    /**
+     * Tests firering an event if there are no listeners.
+     */
+    public void testFireEventNoListeners()
+    {
+        source.fireEvent(TEST_TYPE, TEST_PROPNAME, TEST_PROPVALUE, false);
+        assertEquals("An event object was created", 0, source.eventCount);
+    }
+
+    /**
+     * Tests generating a detail event if detail events are not allowed.
+     */
+    public void testFireEventNoDetails()
+    {
+        TestListener l = new TestListener();
+        source.addConfigurationListener(l);
+        source.setDetailEvents(false);
+        source.fireEvent(TEST_TYPE, TEST_PROPNAME, TEST_PROPVALUE, false);
+        assertEquals("Event object was created", 0, source.eventCount);
+        assertEquals("Listener was called", 0, l.numberOfCalls);
+    }
+
+    /**
+     * Tests whether an event listener can deregister itself in reaction of a
+     * delivered event.
+     */
+    public void testRemoveListenerInFireEvent()
+    {
+        ConfigurationListener lstRemove = new ConfigurationListener()
+        {
+            public void configurationChanged(ConfigurationEvent event)
+            {
+                source.removeConfigurationListener(this);
+            }
+        };
+
+        source.addConfigurationListener(lstRemove);
+        TestListener l = new TestListener();
+        source.addConfigurationListener(l);
+        source.fireEvent(TEST_TYPE, TEST_PROPNAME, TEST_PROPVALUE, false);
+        assertEquals("Listener was not called", 1, l.numberOfCalls);
+        assertEquals("Listener was not removed", 1, source
+                .getConfigurationListeners().size());
+    }
+
+    /**
+     * A test event listener implementation.
+     */
+    static class TestListener implements ConfigurationListener
+    {
+        ConfigurationEvent lastEvent;
+
+        int numberOfCalls;
+
+        public void configurationChanged(ConfigurationEvent event)
+        {
+            lastEvent = event;
+            numberOfCalls++;
+        }
+    }
+
+    /**
+     * A specialized event source implementation that counts the number of
+     * created event objects. It is used to test whether the
+     * <code>fireEvent()</code> methods only creates event objects if
+     * necessary.
+     */
+    static class CountingEventSource extends EventSource
+    {
+        int eventCount;
+
+        protected ConfigurationEvent createEvent(int type, String propName,
+                Object propValue, boolean before)
+        {
+            eventCount++;
+            return super.createEvent(type, propName, propValue, before);
+        }
+    }
+}

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestEventSource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestEventSource.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestEventSource.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestHierarchicalConfigurationEvents.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestHierarchicalConfigurationEvents.java?rev=394530&view=auto
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestHierarchicalConfigurationEvents.java
 (added)
+++ 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestHierarchicalConfigurationEvents.java
 Sun Apr 16 10:56:48 2006
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.commons.configuration.event;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.commons.configuration.AbstractConfiguration;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.configuration.tree.DefaultConfigurationNode;
+
+/**
+ * Test class for the events generated by hierarchical configurations.
+ *
+ * @version $Id$
+ */
+public class TestHierarchicalConfigurationEvents extends
+        AbstractTestConfigurationEvents
+{
+    protected AbstractConfiguration createConfiguration()
+    {
+        return new HierarchicalConfiguration();
+    }
+
+    /**
+     * Tests events generated by the clearTree() method.
+     */
+    public void testClearTreeEvent()
+    {
+        HierarchicalConfiguration hc = (HierarchicalConfiguration) config;
+        String key = EXIST_PROPERTY.substring(0, EXIST_PROPERTY.indexOf('.'));
+        Collection nodes = hc.getExpressionEngine()
+                .query(hc.getRootNode(), key);
+        hc.clearTree(key);
+        l.checkEvent(HierarchicalConfiguration.EVENT_CLEAR_TREE, key, null,
+                true);
+        l.checkEvent(HierarchicalConfiguration.EVENT_CLEAR_TREE, key, nodes,
+                false);
+        l.done();
+    }
+
+    /**
+     * Tests events generated by the addNodes() method.
+     */
+    public void testAddNodesEvent()
+    {
+        HierarchicalConfiguration hc = (HierarchicalConfiguration) config;
+        Collection nodes = new ArrayList(1);
+        nodes.add(new DefaultConfigurationNode("a_key", TEST_PROPVALUE));
+        hc.addNodes(TEST_PROPNAME, nodes);
+        l.checkEvent(HierarchicalConfiguration.EVENT_ADD_NODES, TEST_PROPNAME,
+                nodes, true);
+        l.checkEvent(HierarchicalConfiguration.EVENT_ADD_NODES, TEST_PROPNAME,
+                nodes, false);
+        l.done();
+    }
+
+    /**
+     * Tests events generated by addNodes() when the list of nodes is empty. In
+     * this case no events should be generated.
+     */
+    public void testAddNodesEmptyEvent()
+    {
+        ((HierarchicalConfiguration) config).addNodes(TEST_PROPNAME,
+                new ArrayList());
+        l.done();
+    }
+}

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestHierarchicalConfigurationEvents.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestHierarchicalConfigurationEvents.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestHierarchicalConfigurationEvents.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestMapConfigurationEvents.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestMapConfigurationEvents.java?rev=394530&view=auto
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestMapConfigurationEvents.java
 (added)
+++ 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestMapConfigurationEvents.java
 Sun Apr 16 10:56:48 2006
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.commons.configuration.event;
+
+import java.util.HashMap;
+
+import org.apache.commons.configuration.AbstractConfiguration;
+import org.apache.commons.configuration.MapConfiguration;
+
+/**
+ * Test class for the events generated by MapConfiguration.
+ *
+ * @version $Id$
+ */
+public class TestMapConfigurationEvents extends AbstractTestConfigurationEvents
+{
+    protected AbstractConfiguration createConfiguration()
+    {
+        return new MapConfiguration(new HashMap());
+    }
+}

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestMapConfigurationEvents.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestMapConfigurationEvents.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestMapConfigurationEvents.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestPropertiesConfigurationEvents.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestPropertiesConfigurationEvents.java?rev=394530&view=auto
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestPropertiesConfigurationEvents.java
 (added)
+++ 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestPropertiesConfigurationEvents.java
 Sun Apr 16 10:56:48 2006
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.commons.configuration.event;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import org.apache.commons.configuration.AbstractConfiguration;
+import org.apache.commons.configuration.PropertiesConfiguration;
+
+/**
+ * Test class for the events generated by properties configurations. This class
+ * also tests reload events.
+ *
+ * @version $Id$
+ */
+public class TestPropertiesConfigurationEvents extends
+        AbstractTestFileConfigurationEvents
+{
+    /** The file to be loaded.*/
+    static final File TEST_FILE = new File("conf/test.properties");
+    
+    protected AbstractConfiguration createConfiguration()
+    {
+        return new PropertiesConfiguration();
+    }
+
+    protected URL getSourceURL() throws IOException
+    {
+        return TEST_FILE.toURL();
+    }
+}

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestPropertiesConfigurationEvents.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestPropertiesConfigurationEvents.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestPropertiesConfigurationEvents.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestXMLConfigurationEvents.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestXMLConfigurationEvents.java?rev=394530&view=auto
==============================================================================
--- 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestXMLConfigurationEvents.java
 (added)
+++ 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestXMLConfigurationEvents.java
 Sun Apr 16 10:56:48 2006
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.commons.configuration.event;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import org.apache.commons.configuration.AbstractConfiguration;
+import org.apache.commons.configuration.XMLConfiguration;
+
+/**
+ * Test class for events generated by XMLConfiguration.
+ *
+ * @version $Id$
+ */
+public class TestXMLConfigurationEvents extends
+        AbstractTestFileConfigurationEvents
+{
+    static final File TEST_FILE = new File("conf/test.xml");
+
+    protected URL getSourceURL() throws IOException
+    {
+        return TEST_FILE.toURL();
+    }
+
+    protected AbstractConfiguration createConfiguration()
+    {
+        return new XMLConfiguration();
+    }
+}

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestXMLConfigurationEvents.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestXMLConfigurationEvents.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/event/TestXMLConfigurationEvents.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to