/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.tree.xpath;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.configuration.tree.ConfigurationNode;
import org.apache.commons.configuration.tree.DefaultConfigurationNode;
import org.apache.commons.jxpath.ri.model.NodeIterator;
import junit.framework.TestCase;
/**
* A base class for testing classes of the XPath package. This base class
* creates a hierarchy of nodes in its setUp() method that can be used for test
* cases.
*
* @author Oliver Heger
* @version $Id: AbstractXPathTest.java 505938 2007-02-11 12:41:13Z brett $
*/
public abstract class AbstractXPathTest extends TestCase
{
/** Constant for the name of the counter attribute. */
protected static final String ATTR_NAME = "counter";
/** Constant for the name of the first child. */
protected static final String CHILD_NAME1 = "subNode";
/** Constant for the name of the second child. */
protected static final String CHILD_NAME2 = "childNode";
/** Constant for the number of sub nodes. */
protected static final int CHILD_COUNT = 5;
/** Constant for the number of levels in the hierarchy. */
protected static final int LEVEL_COUNT = 3;
/** Stores the root node of the hierarchy. */
protected ConfigurationNode root;
protected void setUp() throws Exception
{
super.setUp();
root = constructHierarchy(LEVEL_COUNT);
}
/**
* Clears the test environment.
*/
protected void tearDown() throws Exception
{
root = null;
}
/**
* Builds up a hierarchy of nodes. Each node has <code>CHILD_COUNT</code>
* child nodes having the names <code>CHILD_NAME1</code> or
* <code>CHILD_NAME2</code>. Their values are named like their parent
* node with an additional index. Each node has an attribute with a counter
* value.
*
* @param levels the number of levels in the hierarchy
* @return the root node of the hierarchy
*/
protected ConfigurationNode constructHierarchy(int levels)
{
ConfigurationNode result = new DefaultConfigurationNode();
createLevel(result, levels);
return result;
}
/**
* Determines the number of elements contained in the given iterator.
*
* @param iterator the iterator
* @return the number of elements in this iteration
*/
protected int iteratorSize(NodeIterator iterator)
{
int cnt = 0;
boolean ok;
do
{
ok = iterator.setPosition(cnt + 1);
if (ok)
{
cnt++;
}
} while (ok);
return cnt;
}
/**
* Returns a list with all configuration nodes contained in the specified
* iteration. It is assumed that the iteration contains only elements of
* this type.
*
* @param iterator the iterator
* @return a list with configuration nodes obtained from the iterator
*/
protected List iterationElements(NodeIterator iterator)
{
List result = new ArrayList();
for (int pos = 1; iterator.setPosition(pos); pos++)
{
result.add(iterator.getNodePointer().getNode());
}
return result;
}
/**
* Recursive helper method for creating a level of the node hierarchy.
*
* @param parent the parent node
* @param level the level counter
*/
private void createLevel(ConfigurationNode parent, int level)
{
if (level >= 0)
{
String prefix = (parent.getValue() == null) ? "" : parent
.getValue()
+ ".";
for (int i = 1; i <= CHILD_COUNT; i++)
{
ConfigurationNode child = new DefaultConfigurationNode(
(i % 2 == 0) ? CHILD_NAME1 : CHILD_NAME2, prefix + i);
parent.addChild(child);
child.addAttribute(new DefaultConfigurationNode(ATTR_NAME,
String.valueOf(i)));
createLevel(child, level - 1);
}
}
}
}