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;
27 public class PersistentFactoryTest {
29 public static class X1 {
37 public void setPk(int aPk) {
41 private void privateSetter(int aPk) {
45 private int privateGetter() {
50 public static class X2 {
58 public void setPk(int aPk) {
63 public static class X3 {
71 private void setPk(int aPk) {
76 public static class X4 {
80 public int getVersion() {
84 public void setVersion(int aVersion) {
88 private void privateSetter(int aVersion) {
92 private int privateGetter() {
97 public static class X5 {
101 public int getVersion() {
105 public void setVersion(int aVersion) {
110 public static class X6 {
114 private int getVersion() {
118 private void setVersion(int aVersion) {
123 public static class X7 {
131 // FieldAccessor test
134 public void testFieldAccessorSet() throws Exception {
135 Accessor<Integer> accessor = new FieldAccessor<Integer>(X1.class
136 .getDeclaredField("pk"));
138 assertEquals(0, x1.getPk());
139 accessor.set(x1, 10);
140 assertEquals(10, x1.getPk());
143 // PropertyAccessor test
145 public void testPropertyAccessorSet() throws Exception {
146 Accessor<Integer> accessor = new PropertyAccessor<Integer>(X1.class
147 .getDeclaredMethod("getPk"), X1.class.getDeclaredMethod("setPk",
150 assertEquals(0, x1.getPk());
151 accessor.set(x1, 10);
152 assertEquals(10, x1.getPk());
156 public void testPropertyAccessorPrivate() throws Exception {
157 Accessor<Integer> accessor = new PropertyAccessor<Integer>(X1.class
158 .getDeclaredMethod("privateGetter"), X1.class.getDeclaredMethod("privateSetter",
161 assertEquals(0, x1.getPk());
162 accessor.set(x1, 10);
163 assertEquals((Integer)10, accessor.get(x1));
167 // EntityAccessor test
170 public void testEntityAccessorPkField() {
171 EntityAccessor accessor = PersistentFactory.createEntityAccessor(X1.class);
172 assertNotNull(accessor);
173 assertTrue(accessor.getPk() instanceof FieldAccessor);
174 assertNull(accessor.getVersion());
175 assertEquals("pk", ((FieldAccessor) accessor.getPk()).getField()
180 public void testEntityAccessorPkProperty() {
181 EntityAccessor accessor = PersistentFactory.createEntityAccessor(X2.class);
182 assertNotNull(accessor);
183 assertNotNull(accessor.getPk());
184 assertTrue(accessor.getPk() instanceof PropertyAccessor);
185 assertNull(accessor.getVersion());
186 PropertyAccessor property = (PropertyAccessor) accessor.getPk();
187 assertEquals("getPk", property.getGetter().getName());
188 assertEquals("setPk", property.getSetter().getName());
192 public void testEntityAccessorPkPropertyPrivate() {
193 EntityAccessor accessor = PersistentFactory.createEntityAccessor(X3.class);
194 assertNotNull(accessor);
195 assertNotNull(accessor.getPk());
196 assertTrue(accessor.getPk() instanceof PropertyAccessor);
197 assertNull(accessor.getVersion());
198 PropertyAccessor property = (PropertyAccessor) accessor.getPk();
199 assertEquals("getPk", property.getGetter().getName());
200 assertEquals("setPk", property.getSetter().getName());
204 public void testEntityAccessorVersionField() {
205 EntityAccessor accessor = PersistentFactory.createEntityAccessor(X4.class);
206 assertNotNull(accessor);
207 assertTrue(accessor.getVersion() instanceof FieldAccessor);
208 assertNull(accessor.getPk());
209 assertEquals("version", ((FieldAccessor) accessor.getVersion()).getField()
214 public void testEntityAccessorVersionProperty() {
215 EntityAccessor accessor = PersistentFactory.createEntityAccessor(X5.class);
216 assertNotNull(accessor);
217 assertNotNull(accessor.getVersion());
218 assertTrue(accessor.getVersion() instanceof PropertyAccessor);
219 assertNull(accessor.getPk());
220 PropertyAccessor property = (PropertyAccessor) accessor.getVersion();
221 assertEquals("getVersion", property.getGetter().getName());
222 assertEquals("setVersion", property.getSetter().getName());
226 public void testEntityAccessorVersionPropertyPrivate() {
227 EntityAccessor accessor = PersistentFactory.createEntityAccessor(X6.class);
228 assertNotNull(accessor);
229 assertNotNull(accessor.getVersion());
230 assertTrue(accessor.getVersion() instanceof PropertyAccessor);
231 assertNull(accessor.getPk());
232 PropertyAccessor property = (PropertyAccessor) accessor.getVersion();
233 assertEquals("getVersion", property.getGetter().getName());
234 assertEquals("setVersion", property.getSetter().getName());
238 public void testNoVersionAndNoPk() {
239 EntityAccessor accessor = PersistentFactory.createEntityAccessor(String.class);
240 assertNull(accessor);
244 public void testPkAndVersion() {
245 EntityAccessor accessor = PersistentFactory.createEntityAccessor(X7.class);
246 assertNotNull(accessor.getPk());
247 assertNotNull(accessor.getVersion());
250 assertEquals(0, x.id);
251 assertEquals(0, x.version);
253 accessor.getPk().set(x, 10);
254 accessor.getVersion().set(x, 20);
256 assertEquals(10, x.id);
257 assertEquals(20, x.version);
261 public void testEntityAccessorCache() {
262 EntityAccessor accessor = PersistentFactory.createEntityAccessor(X1.class);
263 EntityAccessor accessor2 = PersistentFactory.createEntityAccessor(X1.class);
265 assertSame(accessor, accessor2);
268 // EntityObjectAccessor test for undefined pk and/or version.
270 public void testEntityObjectAccessorRobustness() {
271 EntityObjectAccessor accessor = new EntityObjectAccessor("hello world",
272 new EntityAccessor(null, null));
273 assertNull(accessor.getPrimaryKey());
274 assertNull(accessor.getPersistedVersion());
275 accessor.setPrimaryKey("bla");
276 accessor.setPersistedVersion(100);