/*
* 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.jxpath.ri.model.dynamic;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.jxpath.JXPathTestCase;
import org.apache.commons.jxpath.TestBean;
/**
* TODO more iterator testing with maps
*
* @author Dmitri Plotnikov
* @version $Revision: 652845 $ $Date: 2008-05-02 12:46:46 -0500 (Fri, 02 May 2008) $
*/
public class DynamicPropertiesModelTest extends JXPathTestCase {
private JXPathContext context;
public void setUp() {
if (context == null) {
context = JXPathContext.newContext(new TestBean());
context.setFactory(new TestDynamicPropertyFactory());
}
}
public void testAxisChild() {
assertXPathValue(context, "map/Key1", "Value 1");
assertXPathPointer(context, "map/Key1", "/map[@name='Key1']");
assertXPathValue(context, "map/Key2/name", "Name 6");
assertXPathPointer(context, "map/Key2/name", "/map[@name='Key2']/name");
}
public void testAxisDescendant() {
assertXPathValue(context, "//Key1", "Value 1");
}
/**
* Testing the pseudo-attribute "name" that dynamic property
* objects appear to have.
*/
public void testAttributeName() {
assertXPathValue(context, "map[@name = 'Key1']", "Value 1");
assertXPathPointer(
context,
"map[@name = 'Key1']",
"/map[@name='Key1']");
assertXPathPointerLenient(
context,
"map[@name = 'Key"'"'1']",
"/map[@name='Key"'"'1']");
assertXPathValue(context, "/.[@name='map']/Key2/name", "Name 6");
assertXPathPointer(
context,
"/.[@name='map']/Key2/name",
"/map[@name='Key2']/name");
// Bean in a map
assertXPathValue(context, "/map[@name='Key2'][@name='name']", "Name 6");
assertXPathPointer(
context,
"/map[@name='Key2'][@name='name']",
"/map[@name='Key2']/name");
// Map in a bean in a map
assertXPathValue(
context,
"/.[@name='map'][@name='Key2'][@name='name']",
"Name 6");
assertXPathPointer(
context,
"/.[@name='map'][@name='Key2'][@name='name']",
"/map[@name='Key2']/name");
((Map)context.getValue("map")).put("Key:3", "value3");
assertXPathValueAndPointer(
context,
"/map[@name='Key:3']",
"value3",
"/map[@name='Key:3']");
assertXPathValueAndPointer(
context,
"/map[@name='Key:4:5']",
null,
"/map[@name='Key:4:5']");
}
public void testSetPrimitiveValue() {
assertXPathSetValue(context, "map/Key1", new Integer(6));
}
public void testSetCollection() {
// See if we can assign a whole collection
context.setValue(
"map/Key1",
new Integer[] { new Integer(7), new Integer(8)});
// And then an element in that collection
assertXPathSetValue(context, "map/Key1[1]", new Integer(9));
}
/**
* The key does not exist, but the assignment should succeed anyway,
* because you should always be able to store anything in a Map.
*/
public void testSetNewKey() {
// Using a "simple" path
assertXPathSetValue(context, "map/Key4", new Integer(7));
// Using a "non-simple" path
assertXPathPointerLenient(context, "//map/Key5", "/map/Key5");
assertXPathSetValue(context, "//map/Key5", new Integer(8));
}
public void testCreatePath() {
TestBean bean = (TestBean) context.getContextBean();
bean.setMap(null);
// Calls factory.createObject(..., testBean, "map"), then
// sets the value
assertXPathCreatePath(
context,
"/map[@name='TestKey1']",
"",
"/map[@name='TestKey1']");
}
public void testCreatePathAndSetValue() {
TestBean bean = (TestBean) context.getContextBean();
bean.setMap(null);
// Calls factory.createObject(..., testBean, "map"), then
// sets the value
assertXPathCreatePathAndSetValue(
context,
"/map[@name='TestKey1']",
"Test",
"/map[@name='TestKey1']");
}
public void testCreatePathCreateBean() {
TestBean bean = (TestBean) context.getContextBean();
bean.setMap(null);
// Calls factory.createObject(..., testBean, "map"), then
// then factory.createObject(..., map, "TestKey2"), then
// sets the value
assertXPathCreatePath(
context,
"/map[@name='TestKey2']/int",
new Integer(1),
"/map[@name='TestKey2']/int");
}
public void testCreatePathAndSetValueCreateBean() {
TestBean bean = (TestBean) context.getContextBean();
bean.setMap(null);
// Calls factory.createObject(..., testBean, "map"), then
// then factory.createObject(..., map, "TestKey2"), then
// sets the value
assertXPathCreatePathAndSetValue(
context,
"/map[@name='TestKey2']/int",
new Integer(4),
"/map[@name='TestKey2']/int");
}
public void testCreatePathCollectionElement() {
TestBean bean = (TestBean) context.getContextBean();
bean.setMap(null);
assertXPathCreatePath(
context,
"/map/TestKey3[2]",
null,
"/map[@name='TestKey3'][2]");
// Should be the same as the one before
assertXPathCreatePath(
context,
"/map[@name='TestKey3'][3]",
null,
"/map[@name='TestKey3'][3]");
}
public void testCreatePathAndSetValueCollectionElement() {
TestBean bean = (TestBean) context.getContextBean();
bean.setMap(null);
assertXPathCreatePathAndSetValue(
context,
"/map/TestKey3[2]",
"Test1",
"/map[@name='TestKey3'][2]");
// Should be the same as the one before
assertXPathCreatePathAndSetValue(
context,
"/map[@name='TestKey3'][3]",
"Test2",
"/map[@name='TestKey3'][3]");
}
public void testCreatePathNewCollectionElement() {
TestBean bean = (TestBean) context.getContextBean();
bean.setMap(null);
// Create an element of a dynamic map element, which is a collection
assertXPathCreatePath(
context,
"/map/TestKey4[1]/int",
new Integer(1),
"/map[@name='TestKey4'][1]/int");
bean.getMap().remove("TestKey4");
// Should be the same as the one before
assertXPathCreatePath(
context,
"/map/TestKey4[1]/int",
new Integer(1),
"/map[@name='TestKey4'][1]/int");
}
public void testCreatePathAndSetValueNewCollectionElement() {
TestBean bean = (TestBean) context.getContextBean();
bean.setMap(null);
// Create an element of a dynamic map element, which is a collection
assertXPathCreatePathAndSetValue(
context,
"/map/TestKey4[1]/int",
new Integer(2),
"/map[@name='TestKey4'][1]/int");
bean.getMap().remove("TestKey4");
// Should be the same as the one before
assertXPathCreatePathAndSetValue(
context,
"/map/TestKey4[1]/int",
new Integer(3),
"/map[@name='TestKey4'][1]/int");
}
public void testRemovePath() {
TestBean bean = (TestBean) context.getContextBean();
bean.getMap().put("TestKey1", "test");
// Remove dynamic property
context.removePath("map[@name = 'TestKey1']");
assertEquals(
"Remove dynamic property value",
null,
context.getValue("map[@name = 'TestKey1']"));
}
public void testRemovePathArrayElement() {
TestBean bean = (TestBean) context.getContextBean();
bean.getMap().put("TestKey2", new String[] { "temp1", "temp2" });
context.removePath("map[@name = 'TestKey2'][1]");
assertEquals(
"Remove dynamic property collection element",
"temp2",
context.getValue("map[@name = 'TestKey2'][1]"));
}
public void testCollectionOfMaps() {
TestBean bean = (TestBean) context.getContextBean();
List list = new ArrayList();
bean.getMap().put("stuff", list);
Map m = new HashMap();
m.put("fruit", "apple");
list.add(m);
m = new HashMap();
m.put("berry", "watermelon");
list.add(m);
m = new HashMap();
m.put("fruit", "banana");
list.add(m);
assertXPathValueIterator(
context,
"/map/stuff/fruit",
list("apple", "banana"));
assertXPathValueIterator(
context,
"/map/stuff[@name='fruit']",
list("apple", "banana"));
}
public void testMapOfMaps() {
TestBean bean = (TestBean) context.getContextBean();
Map fruit = new HashMap();
fruit.put("apple", "green");
fruit.put("orange", "red");
Map meat = new HashMap();
meat.put("pork", "pig");
meat.put("beef", "cow");
bean.getMap().put("fruit", fruit);
bean.getMap().put("meat", meat);
assertXPathPointer(
context,
"//beef",
"/map[@name='meat'][@name='beef']");
assertXPathPointer(
context,
"map//apple",
"/map[@name='fruit'][@name='apple']");
// Ambiguous search - will return nothing
assertXPathPointerLenient(context, "map//banana", "null()");
// Unambiguous, even though the particular key is missing
assertXPathPointerLenient(
context,
"//fruit/pear",
"/map[@name='fruit']/pear");
}
}