(no commit message)
[utils] / support / general / src / test / java / org / wamblee / persistence / JpaMergeSupportTest.java
1 /*
2  * Copyright 2005-2010 the original author or authors.
3  * 
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.wamblee.persistence;
17
18 import static junit.framework.Assert.*;
19
20 import java.util.ArrayList;
21 import java.util.HashMap;
22 import java.util.HashSet;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Set;
26
27 import javax.persistence.Id;
28 import javax.persistence.Version;
29
30 import org.junit.Test;
31
32 public class JpaMergeSupportTest {
33
34     private static class X1 {
35         @Id
36         private int id;
37
38         @Version
39         private int version;
40
41         private String value;
42
43         public X1() {
44             value = "";
45         }
46
47         public X1(String aValue) {
48             value = aValue;
49         }
50
51         public String getValue() {
52             return value;
53         }
54
55         @Override
56         public boolean equals(Object aObj) {
57             if (aObj == null) {
58                 return false;
59             }
60             if (!(aObj instanceof X1)) {
61                 return false;
62             }
63             return value.equals(((X1) aObj).getValue());
64         }
65         
66         @Override
67         public int hashCode() {
68             return 0;
69         }
70     }
71
72     private static class X2 {
73         @Id
74         private int id;
75
76         private List<X1> list;
77
78         public X2() {
79             list = new ArrayList<X1>();
80         }
81
82         public List<X1> getList() {
83             return list;
84         }
85     }
86
87     private static class X3 {
88         @Id
89         private int id;
90
91         private Set<X1> set;
92
93         public X3() {
94             set = new HashSet<X1>();
95         }
96
97         public Set<X1> getSet() {
98             return set;
99         }
100     }
101
102     private static class X4 {
103         @Id
104         private int id;
105
106         private Map<String, X1> map;
107
108         public X4() {
109             map = new HashMap<String, X1>();
110         }
111
112         public Map<String, X1> getMap() {
113             return map;
114         }
115     }
116
117     private static class X5 {
118         @Id
119         private int id;
120
121         private X1[] array;
122
123         public X5() {
124             // Empty.
125         }
126
127         public void setArray(X1[] aArray) {
128             array = aArray;
129         }
130
131         public X1[] getArray() {
132             return array;
133         }
134     }
135
136     private static class X6 {
137         @Id
138         private int id;
139
140         public X1 getNotaGetter(String aMessage) {
141             return null;
142         }
143
144         public void getNotaGetter2() {
145
146         }
147     }
148
149     private static class X7 {
150         @Id
151         private int id;
152
153         private void getX() {
154             fail("Private getters should not be used");
155         }
156     }
157
158     @Test
159     public void testSimple() {
160         X1 x = new X1();
161         x.id = 10;
162         x.version = 20;
163
164         X1 y = new X1();
165
166         JpaMergeSupport.merge(x, y);
167
168         assertEquals(x.id, y.id);
169         assertEquals(x.version, y.version);
170     }
171
172     @Test(expected = IllegalArgumentException.class)
173     public void testSimplePkMismatch() {
174         X1 x = new X1();
175         x.id = 10;
176         x.version = 20;
177
178         X1 y = new X1();
179         y.id = 5;
180         JpaMergeSupport.merge(x, y);
181     }
182
183     @Test
184     public void testTraverseList() {
185         X2 x = new X2();
186         x.id = 10;
187         X1 a = new X1();
188         a.id = 20;
189         a.version = 21;
190         X1 b = new X1();
191         b.id = 30;
192         b.version = 31;
193
194         x.getList().add(a);
195         x.getList().add(b);
196
197         X2 y = new X2();
198         y.getList().add(new X1());
199         y.getList().add(new X1());
200
201         JpaMergeSupport.merge(x, y);
202
203         assertEquals(x.id, y.id);
204         assertEquals(x.getList().get(0).id, y.getList().get(0).id);
205         assertEquals(x.getList().get(1).id, y.getList().get(1).id);
206         assertEquals(x.getList().get(0).version, y.getList().get(0).version);
207         assertEquals(x.getList().get(1).version, y.getList().get(1).version);
208     }
209
210     @Test(expected = IllegalArgumentException.class)
211     public void testTraverseListWrongSize() {
212         X2 x = new X2();
213         x.id = 10;
214         X1 a = new X1();
215         a.id = 20;
216         a.version = 21;
217         X1 b = new X1();
218         b.id = 30;
219         b.version = 31;
220
221         x.getList().add(a);
222         x.getList().add(b);
223
224         X2 y = new X2();
225         y.getList().add(new X1());
226
227         JpaMergeSupport.merge(x, y);
228     }
229
230     @Test
231     public void testTraverseSet() {
232         X3 x = new X3();
233         x.id = 10;
234         X1 a = new X1("a");
235         a.id = 20;
236         a.version = 21;
237         X1 b = new X1("b");
238         b.id = 30;
239         b.version = 21;
240         x.getSet().add(a);
241         x.getSet().add(b);
242
243         X3 y = new X3();
244         X1 ya = new X1("a");
245         X1 yb = new X1("b");
246
247         y.getSet().add(ya);
248         y.getSet().add(yb);
249         JpaMergeSupport.merge(x, y);
250         assertEquals(x.id, y.id);
251         assertEquals(a.id, ya.id);
252         assertEquals(a.version, ya.version);
253         assertEquals(b.version, yb.version);
254     }
255
256     @Test(expected = IllegalArgumentException.class)
257     public void testTraverseSetWrongSize() {
258         X3 x = new X3();
259         x.id = 10;
260         X1 a = new X1("a");
261         a.id = 20;
262         a.version = 21;
263         X1 b = new X1("b");
264         b.id = 30;
265         b.version = 21;
266         x.getSet().add(a);
267         x.getSet().add(b);
268
269         X3 y = new X3();
270         X1 ya = new X1("a");
271         X1 yb = new X1("b");
272
273         y.getSet().add(ya);
274         JpaMergeSupport.merge(x, y);
275     }
276
277     @Test
278     public void testTraverseMap() {
279         X4 x = new X4();
280         x.id = 10;
281         X1 a = new X1("a");
282         a.id = 20;
283         a.version = 21;
284         X1 b = new X1("b");
285         b.id = 30;
286         b.version = 21;
287         x.getMap().put("a", a);
288         x.getMap().put("b", b);
289
290         X4 y = new X4();
291         X1 ya = new X1("a");
292         X1 yb = new X1("b");
293
294         y.getMap().put("a", ya);
295         y.getMap().put("b", yb);
296         JpaMergeSupport.merge(x, y);
297         assertEquals(x.id, y.id);
298         assertEquals(a.id, ya.id);
299         assertEquals(a.version, ya.version);
300         assertEquals(b.version, yb.version);
301
302     }
303
304     @Test(expected = IllegalArgumentException.class)
305     public void testTraverseMapWrongKey() {
306         X4 x = new X4();
307         x.id = 10;
308         X1 a = new X1("a");
309         a.id = 20;
310         a.version = 21;
311         X1 b = new X1("b");
312         b.id = 30;
313         b.version = 21;
314         x.getMap().put("a", a);
315         x.getMap().put("b", b);
316
317         X4 y = new X4();
318         X1 ya = new X1("a");
319         X1 yb = new X1("b");
320
321         y.getMap().put("a", ya);
322         y.getMap().put("c", yb);
323         JpaMergeSupport.merge(x, y);
324     }
325
326     @Test(expected = IllegalArgumentException.class)
327     public void testTraverseMapWrongSize() {
328         X4 x = new X4();
329         x.id = 10;
330         X1 a = new X1("a");
331         a.id = 20;
332         a.version = 21;
333         X1 b = new X1("b");
334         b.id = 30;
335         b.version = 21;
336         x.getMap().put("a", a);
337         x.getMap().put("b", b);
338
339         X4 y = new X4();
340         X1 ya = new X1("a");
341         X1 yb = new X1("b");
342
343         y.getMap().put("a", ya);
344         JpaMergeSupport.merge(x, y);
345     }
346
347     @Test
348     public void testTraverseArray() {
349         X5 x = new X5();
350         x.id = 10;
351         X1 a = new X1("a");
352         a.id = 20;
353         a.version = 21;
354         X1 b = new X1("b");
355         b.id = 30;
356         b.version = 21;
357         x.setArray(new X1[] { a, b });
358
359         X5 y = new X5();
360         X1 ya = new X1("a");
361         X1 yb = new X1("b");
362
363         y.setArray(new X1[] { ya, yb });
364         JpaMergeSupport.merge(x, y);
365         assertEquals(x.id, y.id);
366         assertEquals(a.id, ya.id);
367         assertEquals(a.version, ya.version);
368         assertEquals(b.version, yb.version);
369     }
370
371     @Test(expected = IllegalArgumentException.class)
372     public void testTraverseArrayWrongSize() {
373         X5 x = new X5();
374         x.id = 10;
375         X1 a = new X1("a");
376         a.id = 20;
377         a.version = 21;
378         X1 b = new X1("b");
379         b.id = 30;
380         b.version = 21;
381         x.setArray(new X1[] { a, b });
382
383         X5 y = new X5();
384         X1 ya = new X1("a");
385
386         y.setArray(new X1[] { ya });
387         JpaMergeSupport.merge(x, y);
388     }
389
390     @Test
391     public void testNotAGetter() {
392         X6 x = new X6();
393         x.id = 100;
394         X6 y = new X6();
395
396         JpaMergeSupport.merge(x, y);
397         assertEquals(x.id, y.id);
398     }
399
400     @Test
401     public void testPrivateGetter() {
402         X7 x = new X7();
403         x.id = 100;
404         X7 y = new X7();
405         JpaMergeSupport.merge(x, y);
406         assertEquals(x.id, y.id);
407     }
408 }