blob: 4fad2bb0d68b0baba901fce8b2a5665c297234f9 [file] [log] [blame]
/*
* 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.configuration2.tree;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertThat;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.apache.commons.configuration2.ConfigurationAssert;
import org.easymock.EasyMock;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Test class for {@code NodeSelector}.
*
* @version $Id$
*/
public class TestNodeSelector
{
/** Constant for a test key. */
private static final String KEY = "tables.testKey";
/** The root node for query operations. */
private static ImmutableNode root;
/** A NodeKeyResolver implementation. */
private static NodeKeyResolver<ImmutableNode> resolver;
/** The node handler object. */
private static NodeHandler<ImmutableNode> handler;
@BeforeClass
public static void setUpBeforeClass() throws Exception
{
resolver = createResolver();
handler = new InMemoryNodeModel().getNodeHandler();
root =
new ImmutableNode.Builder(1).addChild(
NodeStructureHelper.ROOT_TABLES_TREE).create();
}
/**
* Creates a {@code NodeKeyResolver} object to be used in the tests. This
* resolver object uses a {@code DefaultExpressionEngine} instance for
* resolving keys. Methods for obtaining add or update data objects are not
* implemented.
*
* @return the {@code NodeKeyResolver}
*/
private static NodeKeyResolver<ImmutableNode> createResolver()
{
NodeKeyResolver<ImmutableNode> resolver =
NodeStructureHelper.createResolverMock();
NodeStructureHelper.expectResolveKeyForQueries(resolver);
EasyMock.replay(resolver);
return resolver;
}
/**
* Tests a successful select operation for a single key.
*/
@Test
public void testSelectSingleKeySuccess()
{
NodeSelector selector = new NodeSelector("tables.table(0).name");
ImmutableNode target = selector.select(root, resolver, handler);
assertEquals("Wrong name", "name", target.getNodeName());
assertEquals("Wrong value", NodeStructureHelper.table(0),
target.getValue());
}
/**
* Tests a select operation if the key selects an attribute node.
*/
@Test
public void testSelectSingleAttributeKey()
{
NodeKeyResolver<ImmutableNode> resolverMock =
NodeStructureHelper.createResolverMock();
EasyMock.expect(resolverMock.resolveKey(root, KEY, handler)).andReturn(
Collections.singletonList(QueryResult.createAttributeResult(
root, KEY)));
EasyMock.replay(resolverMock);
NodeSelector selector = new NodeSelector(KEY);
assertNull("Got a result", selector.select(root, resolverMock, handler));
}
/**
* Tests whether attribute results are ignored when evaluating the key.
*/
@Test
public void testSelectIgnoreAttributeResults()
{
NodeKeyResolver<ImmutableNode> resolverMock =
NodeStructureHelper.createResolverMock();
List<QueryResult<ImmutableNode>> results =
new LinkedList<QueryResult<ImmutableNode>>();
results.add(QueryResult.createAttributeResult(
NodeStructureHelper.nodeForKey(root, "tables/table(0)"), "type"));
ImmutableNode target =
NodeStructureHelper.nodeForKey(root, "tables/table(1)");
results.add(QueryResult.createNodeResult(target));
results.add(QueryResult.createAttributeResult(NodeStructureHelper
.nodeForKey(root, "tables/table(0)/fields/field(1)"), "type"));
EasyMock.expect(resolverMock.resolveKey(root, KEY, handler)).andReturn(
results);
EasyMock.replay(resolverMock);
NodeSelector selector = new NodeSelector(KEY);
assertSame("Wrong target", target,
selector.select(root, resolverMock, handler));
}
/**
* Tests a select operation with a key yielding multiple target nodes.
*/
@Test
public void testSelectMultipleTargets()
{
NodeSelector selector = new NodeSelector("tables.table.name");
assertNull("Got a result", selector.select(root, resolver, handler));
}
/**
* Tests a select operation with a sub key.
*/
@Test
public void testSelectSubKey()
{
NodeSelector selectorParent = new NodeSelector("tables.table(0)");
NodeSelector selector =
selectorParent.subSelector("fields.field(1).name");
ImmutableNode target = selector.select(root, resolver, handler);
assertEquals("Wrong node selected", NodeStructureHelper.field(0, 1),
target.getValue());
}
/**
* Tests select() if a key is used which does not yield any results.
*/
@Test
public void testSelectSubKeyUnknown()
{
NodeSelector selectorParent = new NodeSelector("tables.unknown");
NodeSelector selector =
selectorParent.subSelector("fields.field(1).name");
assertNull("Got a result", selector.select(root, resolver, handler));
}
/**
* Tests a select operation with a sub key which produces multiple results.
*/
@Test
public void testSelectSubKeyMultipleResults()
{
NodeSelector selectorParent = new NodeSelector("tables.table");
NodeSelector selector =
selectorParent.subSelector("fields.field(1).name");
assertNull("Got a result", selector.select(root, resolver, handler));
}
/**
* Tests a select operation with a sub key which requires complex
* processing: The first kes produce multiple results; the final key reduces
* the result set to a single node.
*/
@Test
public void testSelectSubKeyComplexEvaluation()
{
NodeSelector first = new NodeSelector("tables.table");
NodeSelector second = first.subSelector("fields");
int fldIdx = NodeStructureHelper.fieldsLength(1) - 1;
NodeSelector selector =
second.subSelector("field(" + fldIdx + ").name");
ImmutableNode target = selector.select(root, resolver, handler);
assertEquals("Wrong target node", NodeStructureHelper.field(1, fldIdx),
target.getValue());
}
/**
* Tests equals() if the expected result is true.
*/
@Test
public void testEqualsTrue()
{
NodeSelector selector = new NodeSelector(KEY);
ConfigurationAssert.checkEquals(selector, selector, true);
NodeSelector sel2 = new NodeSelector(KEY);
ConfigurationAssert.checkEquals(selector, sel2, true);
NodeSelector sub1 = selector.subSelector("k2");
NodeSelector sub2 = sel2.subSelector("k2");
ConfigurationAssert.checkEquals(sub1, sub2, true);
}
/**
* Tests equals() if the expected result is false.
*/
@Test
public void testEqualsFalse()
{
NodeSelector selector = new NodeSelector(KEY);
NodeSelector sel2 = new NodeSelector("other" + KEY);
ConfigurationAssert.checkEquals(selector, sel2, false);
sel2 = new NodeSelector(KEY).subSelector(KEY);
ConfigurationAssert.checkEquals(selector, sel2, false);
}
/**
* Tests equals() with other objects.
*/
@Test
public void testEqualsOtherObjects()
{
NodeSelector selector = new NodeSelector(KEY);
ConfigurationAssert.checkEquals(selector, null, false);
ConfigurationAssert.checkEquals(selector, this, false);
}
/**
* Tests the string representation.
*/
@Test
public void testToString()
{
final String key2 = "anotherSelectionKey";
NodeSelector selector = new NodeSelector(KEY).subSelector(key2);
String s = selector.toString();
assertThat(s, containsString(KEY));
assertThat(s, containsString(key2));
}
}