Jpa merge support is now available.
[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     @Test
132     public void testSimple() {
133         X1 x = new X1();
134         x.id = 10;
135         x.version = 20;
136
137         X1 y = new X1();
138
139         JpaMergeSupport.merge(x, y);
140
141         assertEquals(x.id, y.id);
142         assertEquals(x.version, y.version);
143     }
144
145     @Test(expected = IllegalArgumentException.class)
146     public void testSimplePkMismatch() {
147         X1 x = new X1();
148         x.id = 10;
149         x.version = 20;
150
151         X1 y = new X1();
152         y.id = 5;
153         JpaMergeSupport.merge(x, y);
154     }
155
156     @Test
157     public void testTraverseList() {
158         X2 x = new X2();
159         x.id = 10;
160         X1 a = new X1();
161         a.id = 20;
162         a.version = 21;
163         X1 b = new X1();
164         b.id = 30;
165         b.version = 31;
166
167         x.getList().add(a);
168         x.getList().add(b);
169
170         X2 y = new X2();
171         y.getList().add(new X1());
172         y.getList().add(new X1());
173
174         JpaMergeSupport.merge(x, y);
175
176         assertEquals(x.id, y.id);
177         assertEquals(x.getList().get(0).id, y.getList().get(0).id);
178         assertEquals(x.getList().get(1).id, y.getList().get(1).id);
179         assertEquals(x.getList().get(0).version, y.getList().get(0).version);
180         assertEquals(x.getList().get(1).version, y.getList().get(1).version);
181     }
182
183     @Test(expected = IllegalArgumentException.class)
184     public void testTraverseListWrongSize() {
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
200         JpaMergeSupport.merge(x, y);
201     }
202
203     @Test
204     public void testTraverseSet() {
205         X3 x = new X3();
206         x.id = 10;
207         X1 a = new X1("a");
208         a.id = 20;
209         a.version = 21;
210         X1 b = new X1("b");
211         b.id = 30;
212         b.version = 21;
213         x.getSet().add(a);
214         x.getSet().add(b);
215
216         X3 y = new X3();
217         X1 ya = new X1("a");
218         X1 yb = new X1("b");
219
220         y.getSet().add(ya);
221         y.getSet().add(yb);
222         JpaMergeSupport.merge(x, y);
223         assertEquals(x.id, y.id);
224         assertEquals(a.id, ya.id);
225         assertEquals(a.version, ya.version);
226         assertEquals(b.version, yb.version);
227     }
228
229     @Test(expected = IllegalArgumentException.class)
230     public void testTraverseSetWrongSize() {
231         X3 x = new X3();
232         x.id = 10;
233         X1 a = new X1("a");
234         a.id = 20;
235         a.version = 21;
236         X1 b = new X1("b");
237         b.id = 30;
238         b.version = 21;
239         x.getSet().add(a);
240         x.getSet().add(b);
241
242         X3 y = new X3();
243         X1 ya = new X1("a");
244         X1 yb = new X1("b");
245
246         y.getSet().add(ya);
247         JpaMergeSupport.merge(x, y);
248     }
249
250     @Test
251     public void testTraverseMap() {
252         X4 x = new X4();
253         x.id = 10;
254         X1 a = new X1("a");
255         a.id = 20;
256         a.version = 21;
257         X1 b = new X1("b");
258         b.id = 30;
259         b.version = 21;
260         x.getMap().put("a", a);
261         x.getMap().put("b", b);
262
263         X4 y = new X4();
264         X1 ya = new X1("a");
265         X1 yb = new X1("b");
266
267         y.getMap().put("a", ya);
268         y.getMap().put("b", yb);
269         JpaMergeSupport.merge(x, y);
270         assertEquals(x.id, y.id);
271         assertEquals(a.id, ya.id);
272         assertEquals(a.version, ya.version);
273         assertEquals(b.version, yb.version);
274
275     }
276
277     @Test(expected = IllegalArgumentException.class)
278     public void testTraverseMapWrongKey() {
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("c", yb);
296         JpaMergeSupport.merge(x, y);
297     }
298
299     @Test(expected = IllegalArgumentException.class)
300     public void testTraverseMapWrongSize() {
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         JpaMergeSupport.merge(x, y);
318     }
319
320     @Test
321     public void testTraverseArray() {
322         X5 x = new X5();
323         x.id = 10;
324         X1 a = new X1("a");
325         a.id = 20;
326         a.version = 21;
327         X1 b = new X1("b");
328         b.id = 30;
329         b.version = 21;
330         x.setArray(new X1[] { a, b });
331
332         X5 y = new X5();
333         X1 ya = new X1("a");
334         X1 yb = new X1("b");
335
336         y.setArray(new X1[] { ya, yb });
337         JpaMergeSupport.merge(x, y);
338         assertEquals(x.id, y.id);
339         assertEquals(a.id, ya.id);
340         assertEquals(a.version, ya.version);
341         assertEquals(b.version, yb.version);
342     }
343
344     @Test(expected = IllegalArgumentException.class)
345     public void testTraverseArrayWrongSize() {
346         X5 x = new X5();
347         x.id = 10;
348         X1 a = new X1("a");
349         a.id = 20;
350         a.version = 21;
351         X1 b = new X1("b");
352         b.id = 30;
353         b.version = 21;
354         x.setArray(new X1[] { a, b });
355
356         X5 y = new X5();
357         X1 ya = new X1("a");
358
359         y.setArray(new X1[] { ya });
360         JpaMergeSupport.merge(x, y);
361     }
362
363 }