package org.springmodules.prevayler.id;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import junit.framework.TestCase;
import org.springmodules.prevayler.test.domain.Employee;
import org.springmodules.prevayler.test.domain.EmployeeImpl;
import org.springmodules.prevayler.test.domain.ManagerImpl;
import org.springmodules.prevayler.test.domain.Office;
import org.springmodules.prevayler.test.domain.OfficeImpl;
import org.springmodules.prevayler.system.PrevalenceInfo;
/**
* @author Sergio Bossa
*/
public class DefaultIdMergerTest extends TestCase {
private DefaultIdMerger merger;
public DefaultIdMergerTest(String testName) {
super(testName);
}
protected void setUp() throws Exception {
PrevalenceInfo info = new PrevalenceInfo();
info.setPrevalentClasses(new Class[]{Employee.class, Office.class});
info.setIdGenerationStrategy(new DefaultLongIdGenerator());
info.setIdResolutionStrategy(new DefaultIdResolver());
this.merger = new DefaultIdMerger(info);
}
public void testMergeObjects() throws Exception {
OfficeImpl o1 = new OfficeImpl("o1", "Office 1");
ManagerImpl m1 = new ManagerImpl("m1");
EmployeeImpl e1 = new EmployeeImpl("e1");
o1.setId(new Long(1));
e1.setId(new Long(2));
e1.setOffice(o1);
m1.setId(new Long(1));
m1.addManagedEmployee(e1);
m1.setOffice(o1);
OfficeImpl o2 = new OfficeImpl("o1", "Office 1");
ManagerImpl m2 = new ManagerImpl("m1");
EmployeeImpl e2 = new EmployeeImpl("e1");
e2.setOffice(o2);
m2.addManagedEmployee(e2);
m2.setOffice(o2);
assertNull(o2.getId());
assertNull(m2.getId());
assertNull(e2.getId());
this.merger.merge(m1, m2);
assertNotNull(o2.getId());
assertEquals(o1.getId(), o2.getId());
assertNotNull(m2.getId());
assertEquals(m1.getId(), m2.getId());
assertNotNull(e2.getId());
assertEquals(e1.getId(), e2.getId());
}
public void testMergeArrays() throws Exception {
OfficeImpl o1 = new OfficeImpl("o1", "Office 1");
ManagerImpl m1 = new ManagerImpl("m1");
EmployeeImpl e1 = new EmployeeImpl("e1");
o1.setId(new Long(1));
e1.setId(new Long(2));
e1.setOffice(o1);
m1.setId(new Long(1));
m1.addManagedEmployee(e1);
m1.setOffice(o1);
OfficeImpl o2 = new OfficeImpl("o1", "Office 1");
ManagerImpl m2 = new ManagerImpl("m1");
EmployeeImpl e2 = new EmployeeImpl("e1");
e2.setOffice(o2);
m2.addManagedEmployee(e2);
m2.setOffice(o2);
assertNull(o2.getId());
assertNull(m2.getId());
assertNull(e2.getId());
Employee[] emps1 = {e1, m1};
Employee[] emps2 = {e2, m2};
this.merger.merge(emps1, emps2);
assertNotNull(o2.getId());
assertEquals(o1.getId(), o2.getId());
assertNotNull(m2.getId());
assertEquals(m1.getId(), m2.getId());
assertNotNull(e2.getId());
assertEquals(e1.getId(), e2.getId());
}
public void testMergeCollections() throws Exception {
OfficeImpl o1 = new OfficeImpl("o1", "Office 1");
ManagerImpl m1 = new ManagerImpl("m1");
EmployeeImpl e1 = new EmployeeImpl("e1");
o1.setId(new Long(1));
e1.setId(new Long(2));
e1.setOffice(o1);
m1.setId(new Long(1));
m1.addManagedEmployee(e1);
m1.setOffice(o1);
OfficeImpl o2 = new OfficeImpl("o1", "Office 1");
ManagerImpl m2 = new ManagerImpl("m1");
EmployeeImpl e2 = new EmployeeImpl("e1");
e2.setOffice(o2);
m2.addManagedEmployee(e2);
m2.setOffice(o2);
assertNull(o2.getId());
assertNull(m2.getId());
assertNull(e2.getId());
Set emps1 = new HashSet(Arrays.asList(new Employee[]{e1, m1}));
Set emps2 = new HashSet(Arrays.asList(new Employee[]{e2, m2}));
this.merger.merge(emps1, emps2);
assertNotNull(o2.getId());
assertEquals(o1.getId(), o2.getId());
assertNotNull(m2.getId());
assertEquals(m1.getId(), m2.getId());
assertNotNull(e2.getId());
assertEquals(e1.getId(), e2.getId());
}
public void testMergeMaps() throws Exception {
OfficeImpl o1 = new OfficeImpl("o1", "Office 1");
ManagerImpl m1 = new ManagerImpl("m1");
EmployeeImpl e1 = new EmployeeImpl("e1");
o1.setId(new Long(1));
e1.setId(new Long(2));
e1.setOffice(o1);
m1.setId(new Long(1));
m1.addManagedEmployee(e1);
m1.setOffice(o1);
OfficeImpl o2 = new OfficeImpl("o1", "Office 1");
ManagerImpl m2 = new ManagerImpl("m1");
EmployeeImpl e2 = new EmployeeImpl("e1");
e2.setOffice(o2);
m2.addManagedEmployee(e2);
m2.setOffice(o2);
assertNull(o2.getId());
assertNull(m2.getId());
assertNull(e2.getId());
Map emps1 = new HashMap();
Map emps2 = new HashMap();
emps1.put(e1.getMatriculationCode(), e1);
emps1.put(m1.getMatriculationCode(), m1);
emps2.put(e2.getMatriculationCode(), e2);
emps2.put(m2.getMatriculationCode(), m2);
this.merger.merge(emps1, emps2);
assertNotNull(o2.getId());
assertNotNull(m2.getId());
assertNotNull(e2.getId());
}
}