View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.jxpath.ri.model.container;
19  
20  import static org.junit.jupiter.api.Assertions.assertEquals;
21  
22  import java.util.ArrayList;
23  import java.util.HashMap;
24  import java.util.List;
25  import java.util.Map;
26  
27  import org.apache.commons.jxpath.AbstractJXPathTest;
28  import org.apache.commons.jxpath.Container;
29  import org.apache.commons.jxpath.JXPathContext;
30  import org.junit.jupiter.api.Test;
31  
32  /**
33   * Tests JXPath with containers as root or value of a variable, property, etc.
34   */
35  public class ContainerModelTest extends AbstractJXPathTest {
36  
37      private static final class ArrayContainer implements Container {
38  
39          private static final long serialVersionUID = 1L;
40          private final String[] array = { "foo", "bar" };
41  
42          @Override
43          public Object getValue() {
44              return array;
45          }
46  
47          @Override
48          public void setValue(final Object value) {
49              throw new UnsupportedOperationException();
50          }
51      }
52  
53      public class Bean {
54  
55          private final ListContainer container = new ListContainer();
56  
57          public ListContainer getContainer() {
58              return container;
59          }
60      }
61  
62      public class ListContainer implements Container {
63  
64          private static final long serialVersionUID = 1L;
65          private final List list;
66  
67          public ListContainer() {
68              list = new ArrayList();
69              list.add("foo");
70              list.add("bar");
71          }
72  
73          @Override
74          public Object getValue() {
75              return list;
76          }
77  
78          @Override
79          public void setValue(final Object value) {
80              throw new UnsupportedOperationException();
81          }
82      }
83  
84      @Test
85      public void testContainerMapWithCollection() {
86          final ListContainer container = new ListContainer();
87          final List list = (List) container.getValue();
88          final Map map = new HashMap();
89          map.put("container", container);
90          final JXPathContext context = JXPathContext.newContext(map);
91          assertXPathValueAndPointer(context, "/container", list, "/.[@name='container']");
92          assertXPathValueAndPointer(context, "/container[1]", list.get(0), "/.[@name='container'][1]");
93          assertXPathValueAndPointer(context, "/container[2]", list.get(1), "/.[@name='container'][2]");
94          assertXPathSetValue(context, "/container[1]", "baz");
95          assertEquals("baz", list.get(0), "Checking setValue(index)");
96      }
97  
98      @Test
99      public void testContainerPropertyWithCollection() {
100         final Bean bean = new Bean();
101         final List list = (List) bean.getContainer().getValue();
102         final JXPathContext context = JXPathContext.newContext(bean);
103         assertXPathValueAndPointer(context, "/container", list, "/container");
104         assertXPathValueAndPointer(context, "/container[1]", list.get(0), "/container[1]");
105         assertXPathValueAndPointer(context, "/container[2]", list.get(1), "/container[2]");
106         assertXPathSetValue(context, "/container[1]", "baz");
107         assertEquals("baz", list.get(0), "Checking setValue(index)");
108     }
109 
110     @Test
111     public void testContainerRootWithCollection() {
112         final ArrayContainer container = new ArrayContainer();
113         final String[] array = (String[]) container.getValue();
114         final JXPathContext context = JXPathContext.newContext(container);
115         context.getVariables().declareVariable("list", container);
116         assertXPathValueAndPointer(context, "/", array, "/");
117         assertXPathValueAndPointer(context, "/.[1]", "foo", "/.[1]");
118         assertXPathValueAndPointer(context, "/.[2]", "bar", "/.[2]");
119         assertXPathSetValue(context, "/.[1]", "baz");
120         assertEquals("baz", array[0], "Checking setValue(index)");
121     }
122 
123     @Test
124     public void testContainerVariableWithCollection() {
125         final ArrayContainer container = new ArrayContainer();
126         final String[] array = (String[]) container.getValue();
127         final JXPathContext context = JXPathContext.newContext(null);
128         context.getVariables().declareVariable("list", container);
129         assertXPathValueAndPointer(context, "$list", array, "$list");
130         assertXPathValueAndPointer(context, "$list[1]", "foo", "$list[1]");
131         assertXPathValueAndPointer(context, "$list[2]", "bar", "$list[2]");
132         assertXPathSetValue(context, "$list[1]", "baz");
133         assertEquals("baz", array[0], "Checking setValue(index)");
134     }
135 }