(no commit message)
[utils] / support / general / src / test / java / org / wamblee / persistence / PersistentFactoryTest.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 javax.persistence.Id;
21 import javax.persistence.Version;
22
23 import org.junit.Test;
24 import org.wamblee.persistence.PersistentFactory.EntityAccessor;
25 import org.wamblee.persistence.PersistentFactory.EntityObjectAccessor;
26 import org.wamblee.reflection.Accessor;
27 import org.wamblee.reflection.FieldAccessor;
28 import org.wamblee.reflection.PropertyAccessor;
29
30 public class PersistentFactoryTest {
31
32     public static class X1 {
33         @Id
34         private int pk;
35
36         public int getPk() {
37             return pk;
38         }
39
40         public void setPk(int aPk) {
41             pk = aPk;
42         }
43
44         private void privateSetter(int aPk) {
45             pk = aPk;
46         }
47
48         private int privateGetter() {
49             return pk;
50         }
51     }
52
53     public static class X2 {
54         private int pk;
55
56         @Id
57         public int getPk() {
58             return pk;
59         }
60
61         public void setPk(int aPk) {
62             pk = aPk;
63         }
64     }
65
66     public static class X3 {
67         private int pk;
68
69         @Id
70         private int getPk() {
71             return pk;
72         }
73
74         private void setPk(int aPk) {
75             pk = aPk;
76         }
77     }
78
79     public static class X4 {
80         @Version
81         private int version;
82
83         public int getVersion() {
84             return version;
85         }
86
87         public void setVersion(int aVersion) {
88             version = aVersion;
89         }
90
91         private void privateSetter(int aVersion) {
92             version = aVersion;
93         }
94
95         private int privateGetter() {
96             return version;
97         }
98     }
99
100     public static class X5 {
101         private int version;
102
103         @Version
104         public int getVersion() {
105             return version;
106         }
107
108         public void setVersion(int aVersion) {
109             version = aVersion;
110         }
111     }
112
113     public static class X6 {
114         private int version;
115
116         @Version
117         private int getVersion() {
118             return version;
119         }
120
121         private void setVersion(int aVersion) {
122             version = aVersion;
123         }
124     }
125
126     public static class X7 {
127         @Id
128         public int id;
129
130         @Version
131         public int version;
132     }
133
134     // FieldAccessor test
135
136     @Test
137     public void testFieldAccessorSet() throws Exception {
138         Accessor<Integer> accessor = new FieldAccessor<Integer>(X1.class
139             .getDeclaredField("pk"));
140         X1 x1 = new X1();
141         assertEquals(0, x1.getPk());
142         accessor.set(x1, 10);
143         assertEquals(10, x1.getPk());
144     }
145
146     // PropertyAccessor test
147     @Test
148     public void testPropertyAccessorSet() throws Exception {
149         Accessor<Integer> accessor = new PropertyAccessor<Integer>(X1.class
150             .getDeclaredMethod("getPk"), X1.class.getDeclaredMethod("setPk",
151             int.class));
152         X1 x1 = new X1();
153         assertEquals(0, x1.getPk());
154         accessor.set(x1, 10);
155         assertEquals(10, x1.getPk());
156     }
157
158     @Test
159     public void testPropertyAccessorPrivate() throws Exception {
160         Accessor<Integer> accessor = new PropertyAccessor<Integer>(X1.class
161             .getDeclaredMethod("privateGetter"), X1.class.getDeclaredMethod(
162             "privateSetter", int.class));
163         X1 x1 = new X1();
164         assertEquals(0, x1.getPk());
165         accessor.set(x1, 10);
166         assertEquals((Integer) 10, accessor.get(x1));
167
168     }
169
170     // EntityAccessor test
171
172     @Test
173     public void testEntityAccessorPkField() {
174         EntityAccessor accessor = PersistentFactory
175             .createEntityAccessor(X1.class);
176         assertNotNull(accessor);
177         assertTrue(accessor.getPk() instanceof FieldAccessor);
178         assertNull(accessor.getVersion());
179         assertEquals("pk", ((FieldAccessor) accessor.getPk()).getField()
180             .getName());
181     }
182
183     @Test
184     public void testEntityAccessorPkProperty() {
185         EntityAccessor accessor = PersistentFactory
186             .createEntityAccessor(X2.class);
187         assertNotNull(accessor);
188         assertNotNull(accessor.getPk());
189         assertTrue(accessor.getPk() instanceof PropertyAccessor);
190         assertNull(accessor.getVersion());
191         PropertyAccessor property = (PropertyAccessor) accessor.getPk();
192         assertEquals("getPk", property.getGetter().getName());
193         assertEquals("setPk", property.getSetter().getName());
194     }
195
196     @Test
197     public void testEntityAccessorPkPropertyPrivate() {
198         EntityAccessor accessor = PersistentFactory
199             .createEntityAccessor(X3.class);
200         assertNotNull(accessor);
201         assertNotNull(accessor.getPk());
202         assertTrue(accessor.getPk() instanceof PropertyAccessor);
203         assertNull(accessor.getVersion());
204         PropertyAccessor property = (PropertyAccessor) accessor.getPk();
205         assertEquals("getPk", property.getGetter().getName());
206         assertEquals("setPk", property.getSetter().getName());
207     }
208
209     @Test
210     public void testEntityAccessorVersionField() {
211         EntityAccessor accessor = PersistentFactory
212             .createEntityAccessor(X4.class);
213         assertNotNull(accessor);
214         assertTrue(accessor.getVersion() instanceof FieldAccessor);
215         assertNull(accessor.getPk());
216         assertEquals("version", ((FieldAccessor) accessor.getVersion())
217             .getField().getName());
218     }
219
220     @Test
221     public void testEntityAccessorVersionProperty() {
222         EntityAccessor accessor = PersistentFactory
223             .createEntityAccessor(X5.class);
224         assertNotNull(accessor);
225         assertNotNull(accessor.getVersion());
226         assertTrue(accessor.getVersion() instanceof PropertyAccessor);
227         assertNull(accessor.getPk());
228         PropertyAccessor property = (PropertyAccessor) accessor.getVersion();
229         assertEquals("getVersion", property.getGetter().getName());
230         assertEquals("setVersion", property.getSetter().getName());
231     }
232
233     @Test
234     public void testEntityAccessorVersionPropertyPrivate() {
235         EntityAccessor accessor = PersistentFactory
236             .createEntityAccessor(X6.class);
237         assertNotNull(accessor);
238         assertNotNull(accessor.getVersion());
239         assertTrue(accessor.getVersion() instanceof PropertyAccessor);
240         assertNull(accessor.getPk());
241         PropertyAccessor property = (PropertyAccessor) accessor.getVersion();
242         assertEquals("getVersion", property.getGetter().getName());
243         assertEquals("setVersion", property.getSetter().getName());
244     }
245
246     @Test
247     public void testNoVersionAndNoPk() {
248         EntityAccessor accessor = PersistentFactory
249             .createEntityAccessor(String.class);
250         assertNull(accessor);
251     }
252
253     @Test
254     public void testPkAndVersion() {
255         EntityAccessor accessor = PersistentFactory
256             .createEntityAccessor(X7.class);
257         assertNotNull(accessor.getPk());
258         assertNotNull(accessor.getVersion());
259
260         X7 x = new X7();
261         assertEquals(0, x.id);
262         assertEquals(0, x.version);
263
264         accessor.getPk().set(x, 10);
265         accessor.getVersion().set(x, 20);
266
267         assertEquals(10, x.id);
268         assertEquals(20, x.version);
269     }
270
271     @Test
272     public void testEntityAccessorCache() {
273         EntityAccessor accessor = PersistentFactory
274             .createEntityAccessor(X1.class);
275         EntityAccessor accessor2 = PersistentFactory
276             .createEntityAccessor(X1.class);
277
278         assertSame(accessor, accessor2);
279     }
280
281     // EntityObjectAccessor test for undefined pk and/or version.
282     @Test
283     public void testEntityObjectAccessorRobustness() {
284         EntityObjectAccessor accessor = new EntityObjectAccessor("hello world",
285             new EntityAccessor(null, null));
286         assertNull(accessor.getPrimaryKey());
287         assertNull(accessor.getPersistedVersion());
288         accessor.setPrimaryKey("bla");
289         accessor.setPersistedVersion(100);
290
291     }
292 }