View Javadoc
1   /*
2    * #%L
3    * Nuiton Decorator
4    * %%
5    * Copyright (C) 2011 CodeLutin, Tony Chemit
6    * %%
7    * This program is free software: you can redistribute it and/or modify
8    * it under the terms of the GNU Lesser General Public License as 
9    * published by the Free Software Foundation, either version 3 of the 
10   * License, or (at your option) any later version.
11   * 
12   * This program is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   * GNU General Lesser Public License for more details.
16   * 
17   * You should have received a copy of the GNU General Lesser Public 
18   * License along with this program.  If not, see
19   * <http://www.gnu.org/licenses/lgpl-3.0.html>.
20   * #L%
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   * @author tchemit <chemit@codelutin.com>
36   * @since 2.3
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 }