/* * Copyright 2005-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.wamblee.persistence; import static junit.framework.Assert.*; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.persistence.Id; import javax.persistence.Version; import org.junit.Test; public class JpaMergeSupportTest { private static class X1 { @Id int id; @Version int version; private String value; public X1() { value = ""; } public X1(String aValue) { value = aValue; } public String getValue() { return value; } @Override public boolean equals(Object aObj) { if (aObj == null) { return false; } if (!(aObj instanceof X1)) { return false; } return value.equals(((X1) aObj).getValue()); } } private static class X2 { @Id int id; private List list; public X2() { list = new ArrayList(); } public List getList() { return list; } } private static class X3 { @Id int id; private Set set; public X3() { set = new HashSet(); } public Set getSet() { return set; } } private static class X4 { @Id int id; private Map map; public X4() { map = new HashMap(); } public Map getMap() { return map; } } private static class X5 { @Id int id; private X1[] array; public X5() { // Empty. } public void setArray(X1[] aArray) { array = aArray; } public X1[] getArray() { return array; } } private static class X6 { @Id int id; public X1 getNotaGetter(String aMessage) { return null; } public void getNotaGetter2() { } } private static class X7 { @Id int id; private void getX() { fail("Private getters should not be used"); } } @Test public void testSimple() { X1 x = new X1(); x.id = 10; x.version = 20; X1 y = new X1(); JpaMergeSupport.merge(x, y); assertEquals(x.id, y.id); assertEquals(x.version, y.version); } @Test(expected = IllegalArgumentException.class) public void testSimplePkMismatch() { X1 x = new X1(); x.id = 10; x.version = 20; X1 y = new X1(); y.id = 5; JpaMergeSupport.merge(x, y); } @Test public void testTraverseList() { X2 x = new X2(); x.id = 10; X1 a = new X1(); a.id = 20; a.version = 21; X1 b = new X1(); b.id = 30; b.version = 31; x.getList().add(a); x.getList().add(b); X2 y = new X2(); y.getList().add(new X1()); y.getList().add(new X1()); JpaMergeSupport.merge(x, y); assertEquals(x.id, y.id); assertEquals(x.getList().get(0).id, y.getList().get(0).id); assertEquals(x.getList().get(1).id, y.getList().get(1).id); assertEquals(x.getList().get(0).version, y.getList().get(0).version); assertEquals(x.getList().get(1).version, y.getList().get(1).version); } @Test(expected = IllegalArgumentException.class) public void testTraverseListWrongSize() { X2 x = new X2(); x.id = 10; X1 a = new X1(); a.id = 20; a.version = 21; X1 b = new X1(); b.id = 30; b.version = 31; x.getList().add(a); x.getList().add(b); X2 y = new X2(); y.getList().add(new X1()); JpaMergeSupport.merge(x, y); } @Test public void testTraverseSet() { X3 x = new X3(); x.id = 10; X1 a = new X1("a"); a.id = 20; a.version = 21; X1 b = new X1("b"); b.id = 30; b.version = 21; x.getSet().add(a); x.getSet().add(b); X3 y = new X3(); X1 ya = new X1("a"); X1 yb = new X1("b"); y.getSet().add(ya); y.getSet().add(yb); JpaMergeSupport.merge(x, y); assertEquals(x.id, y.id); assertEquals(a.id, ya.id); assertEquals(a.version, ya.version); assertEquals(b.version, yb.version); } @Test(expected = IllegalArgumentException.class) public void testTraverseSetWrongSize() { X3 x = new X3(); x.id = 10; X1 a = new X1("a"); a.id = 20; a.version = 21; X1 b = new X1("b"); b.id = 30; b.version = 21; x.getSet().add(a); x.getSet().add(b); X3 y = new X3(); X1 ya = new X1("a"); X1 yb = new X1("b"); y.getSet().add(ya); JpaMergeSupport.merge(x, y); } @Test public void testTraverseMap() { X4 x = new X4(); x.id = 10; X1 a = new X1("a"); a.id = 20; a.version = 21; X1 b = new X1("b"); b.id = 30; b.version = 21; x.getMap().put("a", a); x.getMap().put("b", b); X4 y = new X4(); X1 ya = new X1("a"); X1 yb = new X1("b"); y.getMap().put("a", ya); y.getMap().put("b", yb); JpaMergeSupport.merge(x, y); assertEquals(x.id, y.id); assertEquals(a.id, ya.id); assertEquals(a.version, ya.version); assertEquals(b.version, yb.version); } @Test(expected = IllegalArgumentException.class) public void testTraverseMapWrongKey() { X4 x = new X4(); x.id = 10; X1 a = new X1("a"); a.id = 20; a.version = 21; X1 b = new X1("b"); b.id = 30; b.version = 21; x.getMap().put("a", a); x.getMap().put("b", b); X4 y = new X4(); X1 ya = new X1("a"); X1 yb = new X1("b"); y.getMap().put("a", ya); y.getMap().put("c", yb); JpaMergeSupport.merge(x, y); } @Test(expected = IllegalArgumentException.class) public void testTraverseMapWrongSize() { X4 x = new X4(); x.id = 10; X1 a = new X1("a"); a.id = 20; a.version = 21; X1 b = new X1("b"); b.id = 30; b.version = 21; x.getMap().put("a", a); x.getMap().put("b", b); X4 y = new X4(); X1 ya = new X1("a"); X1 yb = new X1("b"); y.getMap().put("a", ya); JpaMergeSupport.merge(x, y); } @Test public void testTraverseArray() { X5 x = new X5(); x.id = 10; X1 a = new X1("a"); a.id = 20; a.version = 21; X1 b = new X1("b"); b.id = 30; b.version = 21; x.setArray(new X1[] { a, b }); X5 y = new X5(); X1 ya = new X1("a"); X1 yb = new X1("b"); y.setArray(new X1[] { ya, yb }); JpaMergeSupport.merge(x, y); assertEquals(x.id, y.id); assertEquals(a.id, ya.id); assertEquals(a.version, ya.version); assertEquals(b.version, yb.version); } @Test(expected = IllegalArgumentException.class) public void testTraverseArrayWrongSize() { X5 x = new X5(); x.id = 10; X1 a = new X1("a"); a.id = 20; a.version = 21; X1 b = new X1("b"); b.id = 30; b.version = 21; x.setArray(new X1[] { a, b }); X5 y = new X5(); X1 ya = new X1("a"); y.setArray(new X1[] { ya }); JpaMergeSupport.merge(x, y); } @Test public void testNotAGetter() { X6 x = new X6(); x.id = 100; X6 y = new X6(); JpaMergeSupport.merge(x,y); assertEquals(x.id, y.id); } @Test public void testPrivateGetter() { X7 x = new X7(); x.id = 100; X7 y = new X7(); JpaMergeSupport.merge(x,y); assertEquals(x.id, y.id); } }