@Ignore("Failing after 4.3 release")
@Test
public void testMapByReference() throws Exception {
// Map
TestReferenceObject tro = newInstance(TestReferenceObject.class);
TestReferenceFoo foo1 = newInstance(TestReferenceFoo.class);
foo1.setA("a");
TestReferenceFoo foo = newInstance(TestReferenceFoo.class);
foo.setA("a");
foo.setB(null);
foo.setC("c");
List<TestReferenceFoo> list2 = newInstance(ArrayList.class);
list2.add(foo);
tro.setListA(list2);
tro.setArrayToArrayCumulative(new Object[] { foo1 });
TestReferenceFoo foo2 = newInstance(TestReferenceFoo.class);
foo2.setA("a");
foo2.setB(null);
foo2.setC("c");
TestReferenceFoo foo3 = newInstance(TestReferenceFoo.class);
foo3.setA("a");
foo3.setB(null);
foo3.setC("c");
tro.setArrayToArrayNoncumulative(new Object[] { foo2 });
List<String> list3 = newInstance(ArrayList.class);
list3.add("string1");
list3.add("string2");
tro.setListToArray(list3);
int[] pa = { 1, 2, 3 };
tro.setPrimitiveArray(pa);
Integer[] integerArray = { new Integer(1), new Integer(2) };
tro.setPrimitiveArrayWrapper(integerArray);
Set<TestReferenceFoo> set = newInstance(HashSet.class);
TestReferenceFoo foo4 = newInstance(TestReferenceFoo.class);
foo4.setA("a");
set.add(foo4);
tro.setSetToSet(set);
Car car = new Car();
car.setName("myName");
tro.setCars(new Car[] { car });
Car car2 = new Car();
car2.setName("myName");
List<Car> vehicles = newInstance(ArrayList.class);
vehicles.add(car2);
tro.setVehicles(vehicles);
TestReferenceObject toClone = (TestReferenceObject) SerializationUtils.clone(tro);
TestReferencePrimeObject trop = mapper.map(tro, TestReferencePrimeObject.class);
assertEquals("myName", (trop.getVans()[0]).getName());
assertEquals("myName", (trop.getMoreVans()[0]).getName());
TestReferenceFooPrime fooPrime = (TestReferenceFooPrime) trop.getListAPrime().get(0);
fooPrime.setB("b");
TestReferenceFooPrime fooPrime2 = (TestReferenceFooPrime) trop.getArrayToArrayNoncumulative()[0];
fooPrime2.setB("b");
mapper.map(trop, tro);
// make sure we update the array list and didnt lose the value 'c' - non-cumulative
assertEquals("c", ((TestReferenceFoo) tro.getListA().get(0)).getC());
assertEquals("c", ((TestReferenceFoo) tro.getArrayToArrayNoncumulative()[0]).getC());
// cumulative
toClone.setArrayToArrayCumulative(new Object[] { foo1, foo1 });
toClone.setCars(new Car[] { car, car });
Van van = new Van();
van.setName("myName");
toClone.getVehicles().add(van);
// cumulative
toClone.getListToArray().add("string1");
toClone.getListToArray().add("string2");
int[] paClone = { 1, 2, 3, 1, 2, 3 };
toClone.setPrimitiveArray(paClone);
Integer[] integerArrayClone = { new Integer(1), new Integer(2), new Integer(1), new Integer(2) };
toClone.setPrimitiveArrayWrapper(integerArrayClone);
assertEquals(toClone, tro);
}