Author: oheger Date: Sat Mar 8 12:43:33 2008 New Revision: 635082 URL: http://svn.apache.org/viewvc?rev=635082&view=rev Log: Test classes for hierarchical configurations based on node handlers
Added: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestInMemoryConfiguration.java - copied, changed from r632835, commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestHierarchicalConfiguration.java commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestSubConfiguration.java - copied, changed from r632835, commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestSubnodeConfiguration.java Copied: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestInMemoryConfiguration.java (from r632835, commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestHierarchicalConfiguration.java) URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestInMemoryConfiguration.java?p2=commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestInMemoryConfiguration.java&p1=commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestHierarchicalConfiguration.java&r1=632835&r2=635082&rev=635082&view=diff ============================================================================== --- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestHierarchicalConfiguration.java (original) +++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestInMemoryConfiguration.java Sat Mar 8 12:43:33 2008 @@ -24,63 +24,71 @@ import java.util.List; import java.util.Set; -import org.apache.commons.configuration2.Configuration; -import org.apache.commons.configuration2.ConfigurationKey; +import junit.framework.TestCase; + import org.apache.commons.configuration2.event.ConfigurationEvent; import org.apache.commons.configuration2.event.ConfigurationListener; +import org.apache.commons.configuration2.expr.DefaultExpressionEngine; +import org.apache.commons.configuration2.expr.ExpressionEngine; +import org.apache.commons.configuration2.expr.NodeHandler; +import org.apache.commons.configuration2.expr.NodeVisitorAdapter; import org.apache.commons.configuration2.tree.ConfigurationNode; -import org.apache.commons.configuration2.tree.ConfigurationNodeVisitorAdapter; import org.apache.commons.configuration2.tree.DefaultConfigurationNode; -import org.apache.commons.configuration2.tree.DefaultExpressionEngine; -import org.apache.commons.configuration2.tree.ExpressionEngine; - -import junit.framework.TestCase; /** - * Test class for HierarchicalConfiguration. + * Test class for InMemoryConfiguration. * * @version $Id$ */ -public class TestHierarchicalConfiguration extends TestCase +public class TestInMemoryConfiguration extends TestCase { - private static String[] tables = { "users", "documents" }; + /** An array with the names of the test TABLES.*/ + private static final String[] TABLES = { "users", "documents" }; - private static String[][] fields = + /** An array with the names of the table FIELDS.*/ + private static final String[][] FIELDS = { { "uid", "uname", "firstName", "lastName", "email" }, { "docid", "name", "creationDate", "authorID", "version" } }; - private HierarchicalConfiguration config; + /** An array with flags whether the test TABLES are system TABLES.*/ + private static final Boolean[] SYS_TABLES = { Boolean.TRUE, Boolean.FALSE }; + + /** The configuration to be tested.*/ + private InMemoryConfiguration config; + /** + * Initializes the configuration with the following structure: + * + * tables + * table + * name + * fields + * field + * name + * field + * name + */ + @Override protected void setUp() throws Exception { - /** - * Initialize the configuration with the following structure: - * - * tables - * table - * name - * fields - * field - * name - * field - * name - */ - config = new HierarchicalConfiguration(); + config = new InMemoryConfiguration(); ConfigurationNode nodeTables = createNode("tables", null); - for(int i = 0; i < tables.length; i++) + for(int i = 0; i < TABLES.length; i++) { ConfigurationNode nodeTable = createNode("table", null); nodeTables.addChild(nodeTable); - ConfigurationNode nodeName = createNode("name", tables[i]); + ConfigurationNode nodeName = createNode("name", TABLES[i]); nodeTable.addChild(nodeName); + ConfigurationNode attrType = createNode("sysTab", SYS_TABLES[i]); + nodeTable.addAttribute(attrType); ConfigurationNode nodeFields = createNode("fields", null); nodeTable.addChild(nodeFields); - for (int j = 0; j < fields[i].length; j++) + for (int j = 0; j < FIELDS[i].length; j++) { - nodeFields.addChild(createFieldNode(fields[i][j])); + nodeFields.addChild(createFieldNode(FIELDS[i][j])); } } @@ -109,7 +117,7 @@ public void testIsEmpty() { assertFalse(config.isEmpty()); - HierarchicalConfiguration conf2 = new HierarchicalConfiguration(); + InMemoryConfiguration conf2 = new InMemoryConfiguration(); assertTrue(conf2.isEmpty()); ConfigurationNode child1 = new DefaultConfigurationNode("child1"); ConfigurationNode child2 = new DefaultConfigurationNode("child2"); @@ -120,7 +128,7 @@ public void testGetProperty() { - assertNull(config.getProperty("tables.table.resultset")); + assertNull(config.getProperty("TABLES.table.resultset")); assertNull(config.getProperty("tables.table.fields.field")); Object prop = config.getProperty("tables.table(0).fields.field.name"); @@ -301,9 +309,10 @@ keys.add(it.next().toString()); } - assertEquals(2, keys.size()); + assertEquals("Wrong number of keys", 3, keys.size()); assertTrue(keys.contains("tables.table.name")); assertTrue(keys.contains("tables.table.fields.field.name")); + assertTrue(keys.contains("[EMAIL PROTECTED]")); // test the order of the keys returned config.addProperty("order.key1", "value1"); @@ -329,9 +338,10 @@ config.addProperty("connections.connection(-1).param.url", "url2"); config.addProperty("connections.connection(1).param.user", "guest"); - checkKeys("tables.table(1)", new String[] { "name", "fields.field.name" }); + checkKeys("tables.table(1)", new String[] { "name", "fields.field.name", "tables.table(1)[EMAIL PROTECTED]" }); checkKeys("tables.table(0)", - new String[] { "name", "fields.field.name", "tables.table(0)[EMAIL PROTECTED]", "size", "fields.field.type", "fields.field.size" }); + new String[] { "name", "fields.field.name", "tables.table(0)[EMAIL PROTECTED]", + "tables.table(0)[EMAIL PROTECTED]", "size", "fields.field.type", "fields.field.size" }); checkKeys("connections.connection(0).param", new String[] {"url", "user", "pwd" }); checkKeys("connections.connection(1).param", @@ -413,31 +423,32 @@ { // test the subset on the first table Configuration subset = config.subset("tables.table(0)"); - assertEquals(tables[0], subset.getProperty("name")); + assertEquals("Wrong table name", TABLES[0], subset.getProperty("name")); + assertEquals("Wrong attribute", SYS_TABLES[0].booleanValue(), subset.getBoolean("[EMAIL PROTECTED]")); Object prop = subset.getProperty("fields.field.name"); assertNotNull(prop); assertTrue(prop instanceof Collection); assertEquals(5, ((Collection<?>) prop).size()); - for (int i = 0; i < fields[0].length; i++) + for (int i = 0; i < FIELDS[0].length; i++) { ConfigurationKey key = new ConfigurationKey(); key.append("fields").append("field").appendIndex(i); key.append("name"); - assertEquals(fields[0][i], subset.getProperty(key.toString())); + assertEquals(FIELDS[0][i], subset.getProperty(key.toString())); } // test the subset on the second table assertTrue("subset is not empty", config.subset("tables.table(2)").isEmpty()); - // test the subset on the fields + // test the subset on the FIELDS subset = config.subset("tables.table.fields.field"); prop = subset.getProperty("name"); assertTrue("prop is not a collection", prop instanceof Collection); assertEquals(10, ((Collection<?>) prop).size()); - assertEquals(fields[0][0], subset.getProperty("name(0)")); + assertEquals(FIELDS[0][0], subset.getProperty("name(0)")); // test the subset on the field names subset = config.subset("tables.table.fields.field.name"); @@ -450,11 +461,11 @@ */ public void testSubsetNodeWithValue() { - config.setProperty("tables.table(0).fields", "My fields"); + config.setProperty("tables.table(0).fields", "My FIELDS"); Configuration subset = config.subset("tables.table(0).fields"); - assertEquals("Wrong field name", fields[0][0], subset + assertEquals("Wrong field name", FIELDS[0][0], subset .getString("field(0).name")); - assertEquals("Wrong value of root", "My fields", subset.getString("")); + assertEquals("Wrong value of root", "My FIELDS", subset.getString("")); } /** @@ -464,29 +475,39 @@ */ public void testSubsetMultipleNodesWithValues() { - config.setProperty("tables.table(0).fields", "My fields"); + config.setProperty("tables.table(0).fields", "My FIELDS"); Configuration subset = config.subset("tables.table.fields"); - assertEquals("Wrong value of root", "My fields", subset.getString("")); - config.setProperty("tables.table(1).fields", "My other fields"); + assertEquals("Wrong value of root", "My FIELDS", subset.getString("")); + config.setProperty("tables.table(1).fields", "My other FIELDS"); subset = config.subset("tables.table.fields"); assertNull("Root value is not null though there are multiple values", subset.getString("")); } /** + * Tests creating a subset from an attribute property. + */ + public void testSubsetWithAttribute() + { + Configuration subset = config.subset("tables.table(0)[EMAIL PROTECTED]"); + assertEquals("Wrong attribute value", SYS_TABLES[0].booleanValue(), + subset.getBoolean(null)); + } + + /** * Tests the configurationAt() method to obtain a configuration for a sub * tree. */ public void testConfigurationAt() { - HierarchicalConfiguration subConfig = config + AbstractHierarchicalConfiguration<ConfigurationNode> subConfig = config .configurationAt("tables.table(1)"); - assertEquals("Wrong table name", tables[1], subConfig.getString("name")); + assertEquals("Wrong table name", TABLES[1], subConfig.getString("name")); List<?> lstFlds = subConfig.getList("fields.field.name"); - assertEquals("Wrong number of fields", fields[1].length, lstFlds.size()); - for (int i = 0; i < fields[1].length; i++) + assertEquals("Wrong number of fields", FIELDS[1].length, lstFlds.size()); + for (int i = 0; i < FIELDS[1].length; i++) { - assertEquals("Wrong field at position " + i, fields[1][i], lstFlds + assertEquals("Wrong field at position " + i, FIELDS[1][i], lstFlds .get(i)); } @@ -536,13 +557,12 @@ */ public void testConfigurationsAt() { - List<?> lstFlds = config.configurationsAt("tables.table(1).fields.field"); - assertEquals("Wrong size of fields", fields[1].length, lstFlds.size()); - for (int i = 0; i < fields[1].length; i++) - { - HierarchicalConfiguration sub = (HierarchicalConfiguration) lstFlds - .get(i); - assertEquals("Wrong field at position " + i, fields[1][i], sub + List<AbstractHierarchicalConfiguration<ConfigurationNode>> lstFlds = config.configurationsAt("tables.table(1).fields.field"); + assertEquals("Wrong size of FIELDS", FIELDS[1].length, lstFlds.size()); + for (int i = 0; i < FIELDS[1].length; i++) + { + AbstractHierarchicalConfiguration<ConfigurationNode> sub = lstFlds.get(i); + assertEquals("Wrong field at position " + i, FIELDS[1][i], sub .getString("name")); } } @@ -560,7 +580,7 @@ public void testClone() { Configuration copy = (Configuration) config.clone(); - assertTrue(copy instanceof HierarchicalConfiguration); + assertTrue(copy instanceof InMemoryConfiguration); checkContent(copy); } @@ -577,8 +597,7 @@ // just a dummy } }); - HierarchicalConfiguration copy = (HierarchicalConfiguration) config - .clone(); + InMemoryConfiguration copy = (InMemoryConfiguration) config.clone(); assertTrue("Event listener registered at clone", copy .getConfigurationListeners().isEmpty()); } @@ -642,26 +661,35 @@ */ public void testAddNodesCopy() { - HierarchicalConfiguration configDest = new HierarchicalConfiguration(); + InMemoryConfiguration configDest = new InMemoryConfiguration(); configDest.addProperty("test", "TEST"); Collection<ConfigurationNode> nodes = config.getRootNode().getChildren(); assertEquals("Wrong number of children", 1, nodes.size()); configDest.addNodes("newNodes", nodes); - for (int i = 0; i < tables.length; i++) + for (int i = 0; i < TABLES.length; i++) { String keyTab = "newNodes.tables.table(" + i + ")."; - assertEquals("Table " + i + " not found", tables[i], configDest + assertEquals("Table " + i + " not found", TABLES[i], configDest .getString(keyTab + "name")); - for (int j = 0; j < fields[i].length; j++) + for (int j = 0; j < FIELDS[i].length; j++) { assertEquals("Invalid field " + j + " in table " + i, - fields[i][j], configDest.getString(keyTab + FIELDS[i][j], configDest.getString(keyTab + "fields.field(" + j + ").name")); } } } /** + * Tests adding a null collection of nodes. This should be a no-op. + */ + public void testAddNodesNull() + { + config.addNodes("tables", null); + checkContent(config); + } + + /** * Tests removing children from a configuration node. */ public void testNodeRemove() @@ -703,7 +731,7 @@ public void testNodeVisitor() { CountVisitor v = new CountVisitor(); - config.getRootNode().visit(v); + config.visit(config.getRootNode(), v); assertEquals(28, v.beforeCount); assertEquals(v.beforeCount, v.afterCount); } @@ -716,7 +744,7 @@ { config.setExpressionEngine(null); assertNotNull("Expression engine is null", config.getExpressionEngine()); - assertSame("Default engine is not used", HierarchicalConfiguration + assertSame("Default engine is not used", AbstractHierarchicalConfiguration .getDefaultExpressionEngine(), config.getExpressionEngine()); config.setExpressionEngine(createAlternativeExpressionEngine()); @@ -729,11 +757,11 @@ */ public void testSetDefaultExpressionEngine() { - ExpressionEngine engineOld = HierarchicalConfiguration.getDefaultExpressionEngine(); - HierarchicalConfiguration + ExpressionEngine engineOld = AbstractHierarchicalConfiguration.getDefaultExpressionEngine(); + AbstractHierarchicalConfiguration .setDefaultExpressionEngine(createAlternativeExpressionEngine()); checkAlternativeSyntax(); - HierarchicalConfiguration.setDefaultExpressionEngine(engineOld); + AbstractHierarchicalConfiguration.setDefaultExpressionEngine(engineOld); } /** @@ -744,7 +772,7 @@ { try { - HierarchicalConfiguration.setDefaultExpressionEngine(null); + InMemoryConfiguration.setDefaultExpressionEngine(null); fail("Could set default expression engine to null!"); } catch (IllegalArgumentException iex) @@ -758,7 +786,7 @@ */ public void testInitCopy() { - HierarchicalConfiguration copy = new HierarchicalConfiguration(config); + InMemoryConfiguration copy = new InMemoryConfiguration(config); checkContent(copy); } @@ -768,7 +796,7 @@ */ public void testInitCopyUpdate() { - HierarchicalConfiguration copy = new HierarchicalConfiguration(config); + InMemoryConfiguration copy = new InMemoryConfiguration(config); config.setProperty("tables.table(0).name", "NewTable"); checkContent(copy); } @@ -870,7 +898,7 @@ */ public void testInterpolatedConfiguration() { - HierarchicalConfiguration c = (HierarchicalConfiguration) InterpolationTestHelper + InMemoryConfiguration c = (InMemoryConfiguration) InterpolationTestHelper .testInterpolatedConfiguration(config); // tests whether the hierarchical structure has been maintained @@ -883,7 +911,7 @@ */ public void testInitCopyNull() { - HierarchicalConfiguration copy = new HierarchicalConfiguration(null); + InMemoryConfiguration copy = new InMemoryConfiguration(null); assertTrue("Configuration not empty", copy.isEmpty()); } @@ -923,8 +951,8 @@ */ private void checkAlternativeSyntax() { - assertNull(config.getProperty("tables/table/resultset")); - assertNull(config.getProperty("tables/table/fields/field")); + assertNull(config.getProperty("tables.table/resultset")); + assertNull(config.getProperty("tables.table/fields/field")); Object prop = config.getProperty("tables/table[0]/fields/field/name"); assertNotNull(prop); @@ -950,10 +978,11 @@ { keys.add(it.next().toString()); } - assertEquals("Wrong number of defined keys", 2, keys.size()); - assertTrue("Key not found", keys.contains("tables/table/name")); - assertTrue("Key not found", keys + assertEquals("Wrong number of defined keys", 3, keys.size()); + assertTrue("Key 1 not found", keys.contains("tables/table/name")); + assertTrue("Key 2 not found", keys .contains("tables/table/fields/field/name")); + assertTrue("Attr key not found", keys.contains("tables/[EMAIL PROTECTED]")); } /** @@ -964,15 +993,19 @@ */ private void checkContent(Configuration c) { - for (int i = 0; i < tables.length; i++) - { - assertEquals(tables[i], c.getString("tables.table(" + i + ").name")); - for (int j = 0; j < fields[i].length; j++) - { - assertEquals(fields[i][j], c.getString("tables.table(" + i - + ").fields.field(" + j + ").name")); - } - } + for (int i = 0; i < TABLES.length; i++) + { + assertEquals("Wrong table name", TABLES[i], c + .getString("tables.table(" + i + ").name")); + assertEquals("Wrong system flag", SYS_TABLES[i].booleanValue(), c + .getBoolean("tables.table(" + i + ")[EMAIL PROTECTED]")); + for (int j = 0; j < FIELDS[i].length; j++) + { + assertEquals("Wrong field", FIELDS[i][j], c + .getString("tables.table(" + i + ").fields.field(" + j + + ").name")); + } + } } private ExpressionEngine createAlternativeExpressionEngine() @@ -1014,23 +1047,23 @@ * A test visitor implementation for checking whether all visitor methods * are correctly called. */ - static class CountVisitor extends ConfigurationNodeVisitorAdapter + static class CountVisitor extends NodeVisitorAdapter<ConfigurationNode> { public int beforeCount; public int afterCount; @Override - public void visitAfterChildren(ConfigurationNode node) + public void visitAfterChildren(ConfigurationNode node, NodeHandler<ConfigurationNode> handler) { - super.visitAfterChildren(node); + super.visitAfterChildren(node, handler); afterCount++; } @Override - public void visitBeforeChildren(ConfigurationNode node) + public void visitBeforeChildren(ConfigurationNode node, NodeHandler<ConfigurationNode> handler) { - super.visitBeforeChildren(node); + super.visitBeforeChildren(node, handler); beforeCount++; } } Copied: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestSubConfiguration.java (from r632835, commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestSubnodeConfiguration.java) URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestSubConfiguration.java?p2=commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestSubConfiguration.java&p1=commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestSubnodeConfiguration.java&r1=632835&r2=635082&rev=635082&view=diff ============================================================================== --- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestSubnodeConfiguration.java (original) +++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestSubConfiguration.java Sat Mar 8 12:43:33 2008 @@ -23,24 +23,19 @@ import java.util.NoSuchElementException; import java.util.Set; -import org.apache.commons.configuration2.Configuration; -import org.apache.commons.configuration2.ConfigurationException; -import org.apache.commons.configuration2.HierarchicalConfiguration; -import org.apache.commons.configuration2.SubnodeConfiguration; -import org.apache.commons.configuration2.XMLConfiguration; -import org.apache.commons.configuration2.reloading.FileAlwaysReloadingStrategy; -import org.apache.commons.configuration2.tree.ConfigurationNode; -import org.apache.commons.configuration2.tree.xpath.XPathExpressionEngine; - import junit.framework.TestCase; +import org.apache.commons.configuration2.expr.ExpressionEngine; +import org.apache.commons.configuration2.tree.ConfigurationNode; +import org.easymock.EasyMock; + /** - * Test case for SubnodeConfiguration. + * Test class for SubConfiguration. * * @author Oliver Heger * @version $Id$ */ -public class TestSubnodeConfiguration extends TestCase +public class TestSubConfiguration extends TestCase { /** An array with names of tables (test data). */ private static final String[] TABLE_NAMES = @@ -55,21 +50,19 @@ /** Constant for a test output file.*/ private static final File TEST_FILE = new File("target/test.xml"); - /** Constant for an updated table name.*/ - private static final String NEW_TABLE_NAME = "newTable"; +// /** Constant for an updated table name.*/ +// private static final String NEW_TABLE_NAME = "newTable"; /** The parent configuration. */ - HierarchicalConfiguration parent; + private InMemoryConfiguration parent; - /** The subnode configuration to be tested. */ - SubnodeConfiguration config; - - /** Stores the root node of the subnode config. */ - ConfigurationNode subnode; + /** The sub configuration to be tested. */ + private SubConfiguration<ConfigurationNode> config; /** Stores a counter for the created nodes. */ - int nodeCounter; + private int nodeCounter; + @Override protected void setUp() throws Exception { super.setUp(); @@ -77,6 +70,7 @@ nodeCounter = 0; } + @Override protected void tearDown() throws Exception { // remove the test output file if necessary @@ -87,7 +81,7 @@ } /** - * Tests creation of a subnode config. + * Tests the creation of a sub configuration. */ public void testInitSubNodeConfig() { @@ -98,14 +92,14 @@ } /** - * Tests constructing a subnode configuration with a null parent. This + * Tests constructing a sub configuration with a null parent. This * should cause an exception. */ public void testInitSubNodeConfigWithNullParent() { try { - config = new SubnodeConfiguration(null, getSubnodeRoot(parent)); + config = new SubConfiguration<ConfigurationNode>(null, getSubnodeRoot(parent)); fail("Could set a null parent config!"); } catch (IllegalArgumentException iex) @@ -115,14 +109,14 @@ } /** - * Tests constructing a subnode configuration with a null root node. This + * Tests constructing a sub configuration with a null root node. This * should cause an exception. */ public void testInitSubNodeConfigWithNullNode() { try { - config = new SubnodeConfiguration(parent, null); + config = new SubConfiguration<ConfigurationNode>(parent, null); fail("Could set a null root node!"); } catch (IllegalArgumentException iex) @@ -175,7 +169,6 @@ { setUpSubnodeConfig(); config.addProperty("[EMAIL PROTECTED]", "test"); - assertEquals("parent.createNode() was not called", 1, nodeCounter); assertEquals("Attribute not set", "test", parent .getString("tables.table(0)[EMAIL PROTECTED]")); @@ -267,27 +260,28 @@ .getListDelimiter()); } - /** - * Tests changing the expression engine. - */ - public void testSetExpressionEngine() - { - parent.setExpressionEngine(new XPathExpressionEngine()); - setUpSubnodeConfig(); - assertEquals("Wrong field name", TABLE_FIELDS[0][1], config - .getString("fields/field[2]/name")); - Set<String> keys = new HashSet<String>(); - for (Iterator<?> it = config.getKeys(); it.hasNext();) - { - keys.add(it.next().toString()); - } - assertEquals("Wrong number of keys", 2, keys.size()); - assertTrue("Key 1 not contained", keys.contains("name")); - assertTrue("Key 2 not contained", keys.contains("fields/field/name")); - config.setExpressionEngine(null); - assertTrue("Expression engine reset on parent", parent - .getExpressionEngine() instanceof XPathExpressionEngine); - } +// TODO uncomment when XPathExpressionEngine has been ported +// /** +// * Tests changing the expression engine. +// */ +// public void testSetExpressionEngine() +// { +// parent.setExpressionEngine(new XPathExpressionEngine()); +// setUpSubnodeConfig(); +// assertEquals("Wrong field name", TABLE_FIELDS[0][1], config +// .getString("fields/field[2]/name")); +// Set<String> keys = new HashSet<String>(); +// for (Iterator<?> it = config.getKeys(); it.hasNext();) +// { +// keys.add(it.next().toString()); +// } +// assertEquals("Wrong number of keys", 2, keys.size()); +// assertTrue("Key 1 not contained", keys.contains("name")); +// assertTrue("Key 2 not contained", keys.contains("fields/field/name")); +// config.setExpressionEngine(null); +// assertTrue("Expression engine reset on parent", parent +// .getExpressionEngine() instanceof XPathExpressionEngine); +// } /** * Tests the configurationAt() method. @@ -295,7 +289,7 @@ public void testConfiguarationAt() { setUpSubnodeConfig(); - SubnodeConfiguration sub2 = (SubnodeConfiguration) config + SubConfiguration<ConfigurationNode> sub2 = (SubConfiguration<ConfigurationNode>) config .configurationAt("fields.field(1)"); assertEquals("Wrong value of property", TABLE_FIELDS[0][1], sub2 .getString("name")); @@ -303,7 +297,7 @@ } /** - * Tests interpolation features. The subnode config should use its parent + * Tests interpolation features. The sub configuration should use its parent * for interpolation. */ public void testInterpolation() @@ -341,101 +335,102 @@ } } - /** - * Tests a reload operation for the parent configuration when the subnode - * configuration does not support reloads. Then the new value should not be - * detected. - */ - public void testParentReloadNotSupported() throws ConfigurationException - { - Configuration c = setUpReloadTest(false); - assertEquals("Name changed in sub config", TABLE_NAMES[1], config - .getString("name")); - assertEquals("Name not changed in parent", NEW_TABLE_NAME, c - .getString("tables.table(1).name")); - } - - /** - * Tests a reload operation for the parent configuration when the subnode - * configuration does support reloads. The new value should be returned. - */ - public void testParentReloadSupported() throws ConfigurationException - { - Configuration c = setUpReloadTest(true); - assertEquals("Name not changed in sub config", NEW_TABLE_NAME, config - .getString("name")); - assertEquals("Name not changed in parent", NEW_TABLE_NAME, c - .getString("tables.table(1).name")); - } - - /** - * Tests a reload operation for the parent configuration when the subnode - * configuration is aware of reloads, and the parent configuration is - * accessed first. The new value should be returned. - */ - public void testParentReloadSupportAccessParent() - throws ConfigurationException - { - Configuration c = setUpReloadTest(true); - assertEquals("Name not changed in parent", NEW_TABLE_NAME, c - .getString("tables.table(1).name")); - assertEquals("Name not changed in sub config", NEW_TABLE_NAME, config - .getString("name")); - } - - /** - * Tests whether reloads work with sub subnode configurations. - */ - public void testParentReloadSubSubnode() throws ConfigurationException - { - setUpReloadTest(true); - SubnodeConfiguration sub = config.configurationAt("fields", true); - assertEquals("Wrong subnode key", "tables.table(1).fields", sub - .getSubnodeKey()); - assertEquals("Changed field not detected", "newField", sub - .getString("field(0).name")); - } - - /** - * Tests creating a sub sub config when the sub config is not aware of - * changes. Then the sub sub config shouldn't be either. - */ - public void testParentReloadSubSubnodeNoChangeSupport() - throws ConfigurationException - { - setUpReloadTest(false); - SubnodeConfiguration sub = config.configurationAt("fields", true); - assertNull("Sub sub config is attached to parent", sub.getSubnodeKey()); - assertEquals("Changed field name returned", TABLE_FIELDS[1][0], sub - .getString("field(0).name")); - } - - /** - * Prepares a test for a reload operation. - * - * @param supportReload a flag whether the subnode configuration should - * support reload operations - * @return the parent configuration that can be used for testing - * @throws ConfigurationException if an error occurs - */ - private XMLConfiguration setUpReloadTest(boolean supportReload) - throws ConfigurationException - { - XMLConfiguration xmlConf = new XMLConfiguration(parent); - xmlConf.setFile(TEST_FILE); - xmlConf.save(); - config = xmlConf.configurationAt("tables.table(1)", supportReload); - assertEquals("Wrong table name", TABLE_NAMES[1], config - .getString("name")); - xmlConf.setReloadingStrategy(new FileAlwaysReloadingStrategy()); - // Now change the configuration file - XMLConfiguration confUpdate = new XMLConfiguration(TEST_FILE); - confUpdate.setProperty("tables.table(1).name", NEW_TABLE_NAME); - confUpdate.setProperty("tables.table(1).fields.field(0).name", - "newField"); - confUpdate.save(); - return xmlConf; - } +//TODO uncomment when reloading features are available +// /** +// * Tests a reload operation for the parent configuration when the subnode +// * configuration does not support reloads. Then the new value should not be +// * detected. +// */ +// public void testParentReloadNotSupported() throws ConfigurationException +// { +// Configuration c = setUpReloadTest(false); +// assertEquals("Name changed in sub config", TABLE_NAMES[1], config +// .getString("name")); +// assertEquals("Name not changed in parent", NEW_TABLE_NAME, c +// .getString("tables.table(1).name")); +// } +// +// /** +// * Tests a reload operation for the parent configuration when the subnode +// * configuration does support reloads. The new value should be returned. +// */ +// public void testParentReloadSupported() throws ConfigurationException +// { +// Configuration c = setUpReloadTest(true); +// assertEquals("Name not changed in sub config", NEW_TABLE_NAME, config +// .getString("name")); +// assertEquals("Name not changed in parent", NEW_TABLE_NAME, c +// .getString("tables.table(1).name")); +// } +// +// /** +// * Tests a reload operation for the parent configuration when the subnode +// * configuration is aware of reloads, and the parent configuration is +// * accessed first. The new value should be returned. +// */ +// public void testParentReloadSupportAccessParent() +// throws ConfigurationException +// { +// Configuration c = setUpReloadTest(true); +// assertEquals("Name not changed in parent", NEW_TABLE_NAME, c +// .getString("tables.table(1).name")); +// assertEquals("Name not changed in sub config", NEW_TABLE_NAME, config +// .getString("name")); +// } +// +// /** +// * Tests whether reloads work with sub subnode configurations. +// */ +// public void testParentReloadSubSubnode() throws ConfigurationException +// { +// setUpReloadTest(true); +// SubnodeConfiguration sub = config.configurationAt("fields", true); +// assertEquals("Wrong subnode key", "tables.table(1).fields", sub +// .getSubnodeKey()); +// assertEquals("Changed field not detected", "newField", sub +// .getString("field(0).name")); +// } +// +// /** +// * Tests creating a sub sub config when the sub config is not aware of +// * changes. Then the sub sub config shouldn't be either. +// */ +// public void testParentReloadSubSubnodeNoChangeSupport() +// throws ConfigurationException +// { +// setUpReloadTest(false); +// SubnodeConfiguration sub = config.configurationAt("fields", true); +// assertNull("Sub sub config is attached to parent", sub.getSubnodeKey()); +// assertEquals("Changed field name returned", TABLE_FIELDS[1][0], sub +// .getString("field(0).name")); +// } +// +// /** +// * Prepares a test for a reload operation. +// * +// * @param supportReload a flag whether the subnode configuration should +// * support reload operations +// * @return the parent configuration that can be used for testing +// * @throws ConfigurationException if an error occurs +// */ +// private XMLConfiguration setUpReloadTest(boolean supportReload) +// throws ConfigurationException +// { +// XMLConfiguration xmlConf = new XMLConfiguration(parent); +// xmlConf.setFile(TEST_FILE); +// xmlConf.save(); +// config = xmlConf.configurationAt("tables.table(1)", supportReload); +// assertEquals("Wrong table name", TABLE_NAMES[1], config +// .getString("name")); +// xmlConf.setReloadingStrategy(new FileAlwaysReloadingStrategy()); +// // Now change the configuration file +// XMLConfiguration confUpdate = new XMLConfiguration(TEST_FILE); +// confUpdate.setProperty("tables.table(1).name", NEW_TABLE_NAME); +// confUpdate.setProperty("tables.table(1).fields.field(0).name", +// "newField"); +// confUpdate.save(); +// return xmlConf; +// } /** * Tests a manipulation of the parent configuration that causes the subnode @@ -445,7 +440,7 @@ public void testParentChangeDetach() { final String key = "tables.table(1)"; - config = parent.configurationAt(key, true); + config = (SubConfiguration<ConfigurationNode>) parent.configurationAt(key, true); assertEquals("Wrong subnode key", key, config.getSubnodeKey()); assertEquals("Wrong table name", TABLE_NAMES[1], config .getString("name")); @@ -456,17 +451,21 @@ } /** - * Tests detaching a subnode configuration when an exception is thrown + * Tests detaching a sub configuration when an exception is thrown * during reconstruction. This can happen e.g. if the expression engine is * changed for the parent. */ public void testParentChangeDetatchException() { - config = parent.configurationAt("tables.table(1)", true); - parent.setExpressionEngine(new XPathExpressionEngine()); + ExpressionEngine engine = EasyMock.createMock(ExpressionEngine.class); + config = (SubConfiguration<ConfigurationNode>) parent.configurationAt("tables.table(1)", true); + EasyMock.expect(engine.query(parent.getRootNode(), config.getSubnodeKey(), parent.getNodeHandler())).andThrow(new ConfigurationRuntimeException("Test exception")); + EasyMock.replay(engine); + parent.setExpressionEngine(engine); assertEquals("Wrong name of table", TABLE_NAMES[1], config .getString("name")); assertNull("Sub config was not detached", config.getSubnodeKey()); + EasyMock.verify(engine); } /** @@ -475,18 +474,18 @@ * * @return the parent configuration */ - protected HierarchicalConfiguration setUpParentConfig() + protected InMemoryConfiguration setUpParentConfig() { @SuppressWarnings("serial") - HierarchicalConfiguration conf = new HierarchicalConfiguration() + InMemoryConfiguration conf = new InMemoryConfiguration() { // Provide a special implementation of createNode() to check // if it is called by the subnode config @Override - protected ConfigurationNode createNode(String name) + protected ConfigurationNode createNode(ConfigurationNode parent, String name) { nodeCounter++; - return super.createNode(name); + return super.createNode(parent, name); } }; for (int i = 0; i < TABLE_NAMES.length; i++) @@ -508,7 +507,7 @@ * @param conf the parent config * @return the root node for the subnode config */ - protected ConfigurationNode getSubnodeRoot(HierarchicalConfiguration conf) + protected ConfigurationNode getSubnodeRoot(InMemoryConfiguration conf) { ConfigurationNode root = conf.getRootNode(); return root.getChild(0).getChild(0); @@ -519,6 +518,6 @@ */ protected void setUpSubnodeConfig() { - config = new SubnodeConfiguration(parent, getSubnodeRoot(parent)); + config = new SubConfiguration<ConfigurationNode>(parent, getSubnodeRoot(parent)); } }