2 * Copyright 2005-2010 the original author or authors.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org.wamblee.persistence;
18 import static junit.framework.Assert.*;
20 import javax.persistence.Id;
21 import javax.persistence.Version;
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;
30 public class PersistentFactoryTest {
32 public static class X1 {
40 public void setPk(int aPk) {
44 private void privateSetter(int aPk) {
48 private int privateGetter() {
53 public static class X2 {
61 public void setPk(int aPk) {
66 public static class X3 {
74 private void setPk(int aPk) {
79 public static class X4 {
83 public int getVersion() {
87 public void setVersion(int aVersion) {
91 private void privateSetter(int aVersion) {
95 private int privateGetter() {
100 public static class X5 {
104 public int getVersion() {
108 public void setVersion(int aVersion) {
113 public static class X6 {
117 private int getVersion() {
121 private void setVersion(int aVersion) {
126 public static class X7 {
134 // FieldAccessor test
137 public void testFieldAccessorSet() throws Exception {
138 Accessor<Integer> accessor = new FieldAccessor<Integer>(X1.class
139 .getDeclaredField("pk"));
141 assertEquals(0, x1.getPk());
142 accessor.set(x1, 10);
143 assertEquals(10, x1.getPk());
146 // PropertyAccessor test
148 public void testPropertyAccessorSet() throws Exception {
149 Accessor<Integer> accessor = new PropertyAccessor<Integer>(X1.class
150 .getDeclaredMethod("getPk"), X1.class.getDeclaredMethod("setPk",
153 assertEquals(0, x1.getPk());
154 accessor.set(x1, 10);
155 assertEquals(10, x1.getPk());
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));
164 assertEquals(0, x1.getPk());
165 accessor.set(x1, 10);
166 assertEquals((Integer) 10, accessor.get(x1));
170 // EntityAccessor 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()
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());
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());
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());
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());
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());
247 public void testNoVersionAndNoPk() {
248 EntityAccessor accessor = PersistentFactory
249 .createEntityAccessor(String.class);
250 assertNull(accessor);
254 public void testPkAndVersion() {
255 EntityAccessor accessor = PersistentFactory
256 .createEntityAccessor(X7.class);
257 assertNotNull(accessor.getPk());
258 assertNotNull(accessor.getVersion());
261 assertEquals(0, x.id);
262 assertEquals(0, x.version);
264 accessor.getPk().set(x, 10);
265 accessor.getVersion().set(x, 20);
267 assertEquals(10, x.id);
268 assertEquals(20, x.version);
272 public void testEntityAccessorCache() {
273 EntityAccessor accessor = PersistentFactory
274 .createEntityAccessor(X1.class);
275 EntityAccessor accessor2 = PersistentFactory
276 .createEntityAccessor(X1.class);
278 assertSame(accessor, accessor2);
281 // EntityObjectAccessor test for undefined pk and/or version.
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);