(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("privateSetter",
162             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.createEntityAccessor(X1.class);
175         assertNotNull(accessor);
176         assertTrue(accessor.getPk() instanceof FieldAccessor);
177         assertNull(accessor.getVersion());
178         assertEquals("pk", ((FieldAccessor) accessor.getPk()).getField()
179             .getName());
180     }
181
182     @Test
183     public void testEntityAccessorPkProperty() {
184         EntityAccessor accessor = PersistentFactory.createEntityAccessor(X2.class);
185         assertNotNull(accessor);
186         assertNotNull(accessor.getPk());
187         assertTrue(accessor.getPk() instanceof PropertyAccessor);
188         assertNull(accessor.getVersion());
189         PropertyAccessor property = (PropertyAccessor) accessor.getPk();
190         assertEquals("getPk", property.getGetter().getName());
191         assertEquals("setPk", property.getSetter().getName());
192     }
193     
194     @Test
195     public void testEntityAccessorPkPropertyPrivate() {
196         EntityAccessor accessor = PersistentFactory.createEntityAccessor(X3.class);
197         assertNotNull(accessor);
198         assertNotNull(accessor.getPk());
199         assertTrue(accessor.getPk() instanceof PropertyAccessor);
200         assertNull(accessor.getVersion());
201         PropertyAccessor property = (PropertyAccessor) accessor.getPk();
202         assertEquals("getPk", property.getGetter().getName());
203         assertEquals("setPk", property.getSetter().getName());
204     }
205
206     @Test
207     public void testEntityAccessorVersionField() {
208         EntityAccessor accessor = PersistentFactory.createEntityAccessor(X4.class);
209         assertNotNull(accessor);
210         assertTrue(accessor.getVersion() instanceof FieldAccessor);
211         assertNull(accessor.getPk());
212         assertEquals("version", ((FieldAccessor) accessor.getVersion()).getField()
213             .getName());
214     }
215
216     @Test
217     public void testEntityAccessorVersionProperty() {
218         EntityAccessor accessor = PersistentFactory.createEntityAccessor(X5.class);
219         assertNotNull(accessor);
220         assertNotNull(accessor.getVersion());
221         assertTrue(accessor.getVersion() instanceof PropertyAccessor);
222         assertNull(accessor.getPk());
223         PropertyAccessor property = (PropertyAccessor) accessor.getVersion();
224         assertEquals("getVersion", property.getGetter().getName());
225         assertEquals("setVersion", property.getSetter().getName());
226     }
227     
228     @Test
229     public void testEntityAccessorVersionPropertyPrivate() {
230         EntityAccessor accessor = PersistentFactory.createEntityAccessor(X6.class);
231         assertNotNull(accessor);
232         assertNotNull(accessor.getVersion());
233         assertTrue(accessor.getVersion() instanceof PropertyAccessor);
234         assertNull(accessor.getPk());
235         PropertyAccessor property = (PropertyAccessor) accessor.getVersion();
236         assertEquals("getVersion", property.getGetter().getName());
237         assertEquals("setVersion", property.getSetter().getName());
238     }
239     
240     @Test
241     public void testNoVersionAndNoPk() { 
242         EntityAccessor accessor = PersistentFactory.createEntityAccessor(String.class);
243         assertNull(accessor);
244     }
245
246     @Test
247     public void testPkAndVersion() { 
248         EntityAccessor accessor = PersistentFactory.createEntityAccessor(X7.class);
249         assertNotNull(accessor.getPk());
250         assertNotNull(accessor.getVersion());
251         
252         X7 x = new X7();
253         assertEquals(0, x.id);
254         assertEquals(0, x.version);
255         
256         accessor.getPk().set(x, 10); 
257         accessor.getVersion().set(x, 20);
258         
259         assertEquals(10, x.id);
260         assertEquals(20, x.version);
261     }
262     
263     @Test 
264     public void testEntityAccessorCache() { 
265         EntityAccessor accessor = PersistentFactory.createEntityAccessor(X1.class);
266         EntityAccessor accessor2 = PersistentFactory.createEntityAccessor(X1.class);
267         
268         assertSame(accessor, accessor2);
269     }
270     
271     // EntityObjectAccessor test for undefined pk and/or version. 
272     @Test
273     public void testEntityObjectAccessorRobustness() { 
274         EntityObjectAccessor accessor =  new EntityObjectAccessor("hello world", 
275             new EntityAccessor(null, null));
276         assertNull(accessor.getPrimaryKey());
277         assertNull(accessor.getPersistedVersion());
278         accessor.setPrimaryKey("bla");
279         accessor.setPersistedVersion(100);
280         
281     }
282 }