1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.nuiton.decorator;
23
24 import org.junit.After;
25 import org.junit.Test;
26
27 import java.util.ArrayList;
28 import java.util.Collections;
29 import java.util.Comparator;
30 import java.util.List;
31
32 import static org.junit.Assert.assertEquals;
33
34
35
36
37
38 public class MultiJXPathDecoratorTest {
39
40 protected MultiJXPathDecorator<?> decorator;
41
42 protected String expected;
43
44 protected String result;
45
46 @After
47 public void after() {
48 decorator = null;
49 }
50
51 @Test(expected = NullPointerException.class)
52 public void testNullInternalClass() throws Exception {
53 decorator = DecoratorUtil.newMultiJXPathDecorator(null, "hello", "#");
54 }
55
56 @Test(expected = IllegalArgumentException.class)
57 public void testMissingRightBrace() throws Exception {
58 decorator = DecoratorUtil.newMultiJXPathDecorator(Object.class, "${haha", "#");
59 }
60
61 @Test(expected = IllegalArgumentException.class)
62 public void testMissingRightBrace2() throws Exception {
63 decorator = DecoratorUtil.newMultiJXPathDecorator(Object.class, "${haha${hum}", "#");
64 }
65
66 @Test
67 public void testNullBean() throws Exception {
68 decorator = DecoratorUtil.newMultiJXPathDecorator(Object.class, "hello", "");
69 expected = "hello";
70 assertEquals(expected, decorator.getExpression());
71 assertEquals(0, decorator.nbToken);
72 assertEquals(0, decorator.getTokens().length);
73
74 result = decorator.toString(null);
75 assertEquals(null, result);
76 }
77
78 @Test
79 public void testMultiDecorator() throws Exception {
80
81 decorator = DecoratorUtil.newMultiJXPathDecorator(JXPathDecorator.class, "${expression}$s#${nbToken}$d", "#", " - ");
82 assertEquals("%1$s - %2$d", decorator.getExpression());
83 assertDecoratorInternal();
84 assertEquals(2, decorator.contexts.length);
85 decorator.setContextIndex(1);
86 assertEquals("%1$d - %2$s", decorator.getExpression());
87 assertTokens("nbToken", "expression");
88 expected = String.format(decorator.getExpression(), decorator.getNbToken(), decorator.getExpression());
89 result = decorator.toString(decorator);
90 assertEquals(expected, result);
91
92 decorator = DecoratorUtil.newMultiJXPathDecorator(JXPathDecorator.class, "${expression}$s ## ${nbToken}$d", " ## ", " - ");
93 assertEquals("%1$s - %2$d", decorator.getExpression());
94 assertDecoratorInternal();
95 assertEquals(2, decorator.contexts.length);
96 decorator.setContextIndex(1);
97 assertEquals("%1$d - %2$s", decorator.getExpression());
98 assertTokens("nbToken", "expression");
99 expected = String.format(decorator.getExpression(), decorator.getNbToken(), decorator.getExpression());
100 result = decorator.toString(decorator);
101 assertEquals(expected, result);
102 }
103
104 @Test
105 public void testMultiDecorator2() throws Exception {
106
107 decorator = DecoratorUtil.newMultiJXPathDecorator(JXPathDecorator.class, "${expression}$s#${nbToken}$d#${separator}$s", "#", " - ");
108
109 assertEquals("%1$s - %2$d - %3$s", decorator.getExpression());
110 assertTokens("expression", "nbToken", "separator");
111 assertEquals(3, decorator.contexts.length);
112
113 expected = String.format(decorator.getExpression(), decorator.getExpression(), decorator.getNbToken(), decorator.getSeparator());
114 result = decorator.toString(decorator);
115 assertEquals(expected, result);
116
117 decorator.setContextIndex(1);
118 assertEquals("%1$d - %2$s - %3$s", decorator.getExpression());
119 assertTokens("nbToken", "separator", "expression");
120 expected = String.format(decorator.getExpression(), decorator.getNbToken(), decorator.getSeparator(), decorator.getExpression());
121 result = decorator.toString(decorator);
122 assertEquals(expected, result);
123
124 decorator.setContextIndex(2);
125 assertEquals("%1$s - %2$s - %3$d", decorator.getExpression());
126 assertTokens("separator", "expression", "nbToken");
127
128 expected = String.format(decorator.getExpression(), decorator.getSeparator(), decorator.getExpression(), decorator.getNbToken());
129 result = decorator.toString(decorator);
130 assertEquals(expected, result);
131 }
132
133
134 @Test
135 public void testDecoratorEspcapeCharacters() throws Exception {
136
137 decorator = DecoratorUtil.newMultiJXPathDecorator(JXPathDecorator.class, "(${expression}$s)#${nbToken}$d", "#", " - ");
138 assertEquals("(%1$s) - %2$d", decorator.getExpression());
139 assertTokens("expression", "nbToken");
140 assertEquals(2, decorator.contexts.length);
141 expected = String.format(decorator.getExpression(), decorator.getExpression(), decorator.getNbToken());
142 result = decorator.toString(decorator);
143 System.out.println("s=" + result);
144 assertEquals(expected, result);
145
146 decorator = DecoratorUtil.newMultiJXPathDecorator(JXPathDecorator.class, "${nbToken}$d#(${expression}$s)", "#", " - ");
147 assertEquals("%1$d - (%2$s)", decorator.getExpression());
148 assertTokens("nbToken", "expression");
149 assertEquals(2, decorator.contexts.length);
150 expected = String.format(decorator.getExpression(), decorator.getNbToken(), decorator.getExpression());
151 result = decorator.toString(decorator);
152 System.out.println("s=" + result);
153 assertEquals(expected, result);
154
155 DecoratorProvider provider = new MyDummyDecoratorProvider();
156 provider.registerMultiJXPathDecorator(MultiJXPathDecorator.class, "(${expression}$s)#${nbToken}$d", "#", " - ");
157 decorator = (MultiJXPathDecorator<?>) provider.getDecoratorByType(MultiJXPathDecorator.class);
158
159 assertEquals("(%1$s) - %2$d", decorator.getExpression());
160 assertTokens("expression", "nbToken");
161 assertEquals(2, decorator.contexts.length);
162 expected = String.format(decorator.getExpression(), decorator.getExpression(), decorator.getNbToken());
163 result = decorator.toString(decorator);
164 System.out.println("s=" + result);
165 assertEquals(expected, result);
166
167 }
168
169 @Test
170 public void testMultiDecoratorWithMultiRef() throws Exception {
171
172 decorator = DecoratorUtil.newMultiJXPathDecorator(JXPathDecorator.class, "${expression}$s#${nbToken}$d#${separator}$s %3$s", "#", " - ");
173
174 assertEquals("%1$s - %2$d - %3$s %3$s", decorator.getExpression());
175 assertTokens("expression", "nbToken", "separator");
176 assertEquals(3, decorator.contexts.length);
177
178 expected = String.format(decorator.getExpression(), decorator.getExpression(), decorator.getNbToken(), decorator.getSeparator());
179 result = decorator.toString(decorator);
180 assertEquals(expected, result);
181
182 decorator.setContextIndex(1);
183 assertEquals("%1$d - %2$s %2$s - %3$s", decorator.getExpression());
184 assertTokens("nbToken", "separator", "expression");
185 expected = String.format(decorator.getExpression(), decorator.getNbToken(), decorator.getSeparator(), decorator.getExpression());
186 result = decorator.toString(decorator);
187 assertEquals(expected, result);
188
189 decorator.setContextIndex(2);
190 assertEquals("%1$s %1$s - %2$s - %3$d", decorator.getExpression());
191 assertTokens("separator", "expression", "nbToken");
192
193 expected = String.format(decorator.getExpression(), decorator.getSeparator(), decorator.getExpression(), decorator.getNbToken());
194 result = decorator.toString(decorator);
195 assertEquals(expected, result);
196 }
197
198 @Test
199 public void testMultiDecoratorWithMultiRefKeepingOrder() throws Exception {
200
201 decorator = DecoratorUtil.newMultiJXPathDecoratorKeepingOrder(JXPathDecorator.class, "${expression}$s#${nbToken}$d#${separator}$s %3$s", "#", " - ");
202
203 assertEquals("%1$s - %2$d - %3$s %3$s", decorator.getExpression());
204 assertTokens("expression", "nbToken", "separator");
205 assertEquals(3, decorator.contexts.length);
206
207 expected = String.format(decorator.getExpression(), decorator.getExpression(), decorator.getNbToken(), decorator.getSeparator());
208 result = decorator.toString(decorator);
209 assertEquals(expected, result);
210
211 decorator.setContextIndex(1);
212 assertEquals("%1$d - %2$s - %3$s %3$s", decorator.getExpression());
213 assertTokens("nbToken", "expression", "separator");
214 expected = String.format(decorator.getExpression(), decorator.getNbToken(), decorator.getExpression(), decorator.getSeparator());
215 result = decorator.toString(decorator);
216 assertEquals(expected, result);
217
218 decorator.setContextIndex(2);
219 assertEquals("%1$s %1$s - %2$s - %3$d", decorator.getExpression());
220 assertTokens("separator", "expression", "nbToken");
221
222 expected = String.format(decorator.getExpression(), decorator.getSeparator(), decorator.getExpression(), decorator.getNbToken());
223 result = decorator.toString(decorator);
224 assertEquals(expected, result);
225 }
226
227 @Test
228 public void testSort() throws Exception {
229
230 List<Data> datas = Data.generate(10);
231
232 MultiJXPathDecorator<Data> d = DecoratorUtil.newMultiJXPathDecorator(Data.class, "${pos}$d-${name}$s", "-");
233
234 List<Data> sortData = new ArrayList<Data>(datas);
235 DecoratorUtil.sort(d, sortData, 0);
236 for (int i = 0; i < datas.size(); i++) {
237 Data data = datas.get(i);
238 Data sData = sortData.get(i);
239 assertEquals(data, sData);
240 }
241 Collections.sort(datas, new Comparator<Data>() {
242
243 @Override
244 public int compare(Data o1, Data o2) {
245 return o1.name.compareTo(o2.name);
246 }
247 });
248 d.setContextIndex(1);
249 DecoratorUtil.sort(d, sortData, 1);
250 for (int i = 0; i < datas.size(); i++) {
251 Data data = datas.get(i);
252 Data sData = sortData.get(i);
253 assertEquals(data, sData);
254 }
255 }
256
257 public void assertDecoratorInternal(String... tokens) {
258 assertTokens(tokens);
259 expected = String.format(decorator.getExpression(), decorator.getExpression(), decorator.getNbToken());
260 result = decorator.toString(decorator);
261 assertEquals(expected, result);
262 }
263
264 private void assertTokens(String... tokens) {
265 if (tokens.length == 0) {
266 tokens = new String[]{"expression", "nbToken"};
267 }
268 assertEquals(tokens.length, decorator.nbToken);
269 assertEquals(tokens.length, decorator.getTokens().length);
270 for (int i = 0; i < tokens.length; i++) {
271 assertEquals(tokens[i], decorator.getTokens()[i]);
272 }
273 }
274
275 private static class MyDummyDecoratorProvider extends DecoratorProvider {
276
277 @Override
278 protected void loadDecorators() {
279 }
280
281 }
282 }