1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
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 }