c906fb19b92be5584e3f1c5ee45da2c6790e8ac2
[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         int id;
37
38         @Version
39         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
67     private static class X2 {
68         @Id
69         int id;
70
71         private List<X1> list;
72
73         public X2() {
74             list = new ArrayList<X1>();
75         }
76
77         public List<X1> getList() {
78             return list;
79         }
80     }
81
82     private static class X3 {
83         @Id
84         int id;
85
86         private Set<X1> set;
87
88         public X3() {
89             set = new HashSet<X1>();
90         }
91
92         public Set<X1> getSet() {
93             return set;
94         }
95     }
96
97     private static class X4 {
98         @Id
99         int id;
100
101         private Map<String, X1> map;
102
103         public X4() {
104             map = new HashMap<String, X1>();
105         }
106
107         public Map<String, X1> getMap() {
108             return map;
109         }
110     }
111
112     private static class X5 {
113         @Id
114         int id;
115
116         private X1[] array;
117
118         public X5() {
119             // Empty.
120         }
121
122         public void setArray(X1[] aArray) {
123             array = aArray;
124         }
125
126         public X1[] getArray() {
127             return array;
128         }
129     }
130     
131     private static class X6 { 
132         @Id
133         int id; 
134         
135         public X1 getNotaGetter(String aMessage) { 
136             return null; 
137         }
138         
139         public void getNotaGetter2() { 
140             
141         }
142     }
143     
144     private static class X7 { 
145         @Id
146         int id; 
147         
148         private void getX() { 
149             fail("Private getters should not be used");
150         }
151     }
152
153     @Test
154     public void testSimple() {
155         X1 x = new X1();
156         x.id = 10;
157         x.version = 20;
158
159         X1 y = new X1();
160
161         JpaMergeSupport.merge(x, y);
162
163         assertEquals(x.id, y.id);
164         assertEquals(x.version, y.version);
165     }
166
167     @Test(expected = IllegalArgumentException.class)
168     public void testSimplePkMismatch() {
169         X1 x = new X1();
170         x.id = 10;
171         x.version = 20;
172
173         X1 y = new X1();
174         y.id = 5;
175         JpaMergeSupport.merge(x, y);
176     }
177
178     @Test
179     public void testTraverseList() {
180         X2 x = new X2();
181         x.id = 10;
182         X1 a = new X1();
183         a.id = 20;
184         a.version = 21;
185         X1 b = new X1();
186         b.id = 30;
187         b.version = 31;
188
189         x.getList().add(a);
190         x.getList().add(b);
191
192         X2 y = new X2();
193         y.getList().add(new X1());
194         y.getList().add(new X1());
195
196         JpaMergeSupport.merge(x, y);
197
198         assertEquals(x.id, y.id);
199         assertEquals(x.getList().get(0).id, y.getList().get(0).id);
200         assertEquals(x.getList().get(1).id, y.getList().get(1).id);
201         assertEquals(x.getList().get(0).version, y.getList().get(0).version);
202         assertEquals(x.getList().get(1).version, y.getList().get(1).version);
203     }
204
205     @Test(expected = IllegalArgumentException.class)
206     public void testTraverseListWrongSize() {
207         X2 x = new X2();
208         x.id = 10;
209         X1 a = new X1();
210         a.id = 20;
211         a.version = 21;
212         X1 b = new X1();
213         b.id = 30;
214         b.version = 31;
215
216         x.getList().add(a);
217         x.getList().add(b);
218
219         X2 y = new X2();
220         y.getList().add(new X1());
221
222         JpaMergeSupport.merge(x, y);
223     }
224
225     @Test
226     public void testTraverseSet() {
227         X3 x = new X3();
228         x.id = 10;
229         X1 a = new X1("a");
230         a.id = 20;
231         a.version = 21;
232         X1 b = new X1("b");
233         b.id = 30;
234         b.version = 21;
235         x.getSet().add(a);
236         x.getSet().add(b);
237
238         X3 y = new X3();
239         X1 ya = new X1("a");
240         X1 yb = new X1("b");
241
242         y.getSet().add(ya);
243         y.getSet().add(yb);
244         JpaMergeSupport.merge(x, y);
245         assertEquals(x.id, y.id);
246         assertEquals(a.id, ya.id);
247         assertEquals(a.version, ya.version);
248         assertEquals(b.version, yb.version);
249     }
250
251     @Test(expected = IllegalArgumentException.class)
252     public void testTraverseSetWrongSize() {
253         X3 x = new X3();
254         x.id = 10;
255         X1 a = new X1("a");
256         a.id = 20;
257         a.version = 21;
258         X1 b = new X1("b");
259         b.id = 30;
260         b.version = 21;
261         x.getSet().add(a);
262         x.getSet().add(b);
263
264         X3 y = new X3();
265         X1 ya = new X1("a");
266         X1 yb = new X1("b");
267
268         y.getSet().add(ya);
269         JpaMergeSupport.merge(x, y);
270     }
271
272     @Test
273     public void testTraverseMap() {
274         X4 x = new X4();
275         x.id = 10;
276         X1 a = new X1("a");
277         a.id = 20;
278         a.version = 21;
279         X1 b = new X1("b");
280         b.id = 30;
281         b.version = 21;
282         x.getMap().put("a", a);
283         x.getMap().put("b", b);
284
285         X4 y = new X4();
286         X1 ya = new X1("a");
287         X1 yb = new X1("b");
288
289         y.getMap().put("a", ya);
290         y.getMap().put("b", yb);
291         JpaMergeSupport.merge(x, y);
292         assertEquals(x.id, y.id);
293         assertEquals(a.id, ya.id);
294         assertEquals(a.version, ya.version);
295         assertEquals(b.version, yb.version);
296
297     }
298
299     @Test(expected = IllegalArgumentException.class)
300     public void testTraverseMapWrongKey() {
301         X4 x = new X4();
302         x.id = 10;
303         X1 a = new X1("a");
304         a.id = 20;
305         a.version = 21;
306         X1 b = new X1("b");
307         b.id = 30;
308         b.version = 21;
309         x.getMap().put("a", a);
310         x.getMap().put("b", b);
311
312         X4 y = new X4();
313         X1 ya = new X1("a");
314         X1 yb = new X1("b");
315
316         y.getMap().put("a", ya);
317         y.getMap().put("c", yb);
318         JpaMergeSupport.merge(x, y);
319     }
320
321     @Test(expected = IllegalArgumentException.class)
322     public void testTraverseMapWrongSize() {
323         X4 x = new X4();
324         x.id = 10;
325         X1 a = new X1("a");
326         a.id = 20;
327         a.version = 21;
328         X1 b = new X1("b");
329         b.id = 30;
330         b.version = 21;
331         x.getMap().put("a", a);
332         x.getMap().put("b", b);
333
334         X4 y = new X4();
335         X1 ya = new X1("a");
336         X1 yb = new X1("b");
337
338         y.getMap().put("a", ya);
339         JpaMergeSupport.merge(x, y);
340     }
341
342     @Test
343     public void testTraverseArray() {
344         X5 x = new X5();
345         x.id = 10;
346         X1 a = new X1("a");
347         a.id = 20;
348         a.version = 21;
349         X1 b = new X1("b");
350         b.id = 30;
351         b.version = 21;
352         x.setArray(new X1[] { a, b });
353
354         X5 y = new X5();
355         X1 ya = new X1("a");
356         X1 yb = new X1("b");
357
358         y.setArray(new X1[] { ya, yb });
359         JpaMergeSupport.merge(x, y);
360         assertEquals(x.id, y.id);
361         assertEquals(a.id, ya.id);
362         assertEquals(a.version, ya.version);
363         assertEquals(b.version, yb.version);
364     }
365
366     @Test(expected = IllegalArgumentException.class)
367     public void testTraverseArrayWrongSize() {
368         X5 x = new X5();
369         x.id = 10;
370         X1 a = new X1("a");
371         a.id = 20;
372         a.version = 21;
373         X1 b = new X1("b");
374         b.id = 30;
375         b.version = 21;
376         x.setArray(new X1[] { a, b });
377
378         X5 y = new X5();
379         X1 ya = new X1("a");
380
381         y.setArray(new X1[] { ya });
382         JpaMergeSupport.merge(x, y);
383     }
384
385     @Test
386     public void testNotAGetter() { 
387         X6 x = new X6(); 
388         x.id = 100; 
389         X6 y = new X6(); 
390         
391         JpaMergeSupport.merge(x,y);
392         assertEquals(x.id, y.id);
393     }
394     
395     @Test 
396     public void testPrivateGetter() { 
397         X7 x = new X7(); 
398         x.id = 100;
399         X7 y = new X7(); 
400         JpaMergeSupport.merge(x,y);
401         assertEquals(x.id, y.id);
402     }
403 }