/******************************************************************************* * Copyright (c) 2007, 2010 Symbian Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Andrew Ferguson (Symbian) - Initial implementation * James Blackburn (Broadcom Corp.) *******************************************************************************/ package org.eclipse.cdt.core.settings.model; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import junit.framework.TestSuite; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.CoreModelUtil; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.settings.model.extension.impl.CDefaultConfigurationData; import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.core.runtime.CoreException; /** * Test ICConfigurationDescription reference behaviours */ public class CConfigurationDescriptionReferenceTests extends BaseTestCase { ICProject p1, p2, p3, p4; ICConfigurationDescription p1cd1, p1cd2, p1cd3; ICConfigurationDescription p2cd1, p2cd2, p2cd3; ICConfigurationDescription p3cd1, p3cd2, p3cd3; ICConfigurationDescription p4cd1, p4cd2, p4cd3; public static TestSuite suite() { return suite(CConfigurationDescriptionReferenceTests.class, "_"); } @Override protected void setUp() throws Exception { p1 = CProjectHelper.createCCProject("p1", "bin"); p2 = CProjectHelper.createCCProject("p2", "bin"); p3 = CProjectHelper.createCCProject("p3", "bin"); p4 = CProjectHelper.createCCProject("p4", "bin"); CoreModel coreModel = CoreModel.getDefault(); ICProjectDescription des1 = coreModel.getProjectDescription(p1.getProject()); ICProjectDescription des2 = coreModel.getProjectDescription(p2.getProject()); ICProjectDescription des3 = coreModel.getProjectDescription(p3.getProject()); ICProjectDescription des4 = coreModel.getProjectDescription(p4.getProject()); p1cd1 = newCfg(des1, "p1", "cd1"); p1cd2 = newCfg(des1, "p1", "cd2"); p1cd3 = newCfg(des1, "p1", "cd3"); p2cd1 = newCfg(des2, "p2", "cd1"); p2cd2 = newCfg(des2, "p2", "cd2"); p2cd3 = newCfg(des2, "p2", "cd3"); p3cd1 = newCfg(des3, "p3", "cd1"); p3cd2 = newCfg(des3, "p3", "cd2"); p3cd3 = newCfg(des3, "p3", "cd3"); p4cd1 = newCfg(des4, "p4", "cd1"); p4cd2 = newCfg(des4, "p4", "cd2"); p4cd3 = newCfg(des4, "p4", "cd3"); /* * Setup references: * * p1: cd1 cd2 cd3 * \ | / * \|/ * * * /|\ * / | \ * p2: cd1 cd2 cd3 * | | | * p3: cd1 cd2 cd3 * \ | / * \|/ * p4: cd1 cd2 cd3 */ setRefs(p1cd1, new ICConfigurationDescription[] {p2cd3}); setRefs(p1cd2, new ICConfigurationDescription[] {p2cd2}); setRefs(p1cd3, new ICConfigurationDescription[] {p2cd1}); setRefs(p2cd1, new ICConfigurationDescription[] {p3cd1}); setRefs(p2cd2, new ICConfigurationDescription[] {p3cd2}); setRefs(p2cd3, new ICConfigurationDescription[] {p3cd3}); setRefs(p3cd1, new ICConfigurationDescription[] {p4cd2}); setRefs(p3cd2, new ICConfigurationDescription[] {p4cd2}); setRefs(p3cd3, new ICConfigurationDescription[] {p4cd2}); coreModel.setProjectDescription(p1.getProject(), des1); coreModel.setProjectDescription(p2.getProject(), des2); coreModel.setProjectDescription(p3.getProject(), des3); coreModel.setProjectDescription(p4.getProject(), des4); } private void setRefs(ICConfigurationDescription node, ICConfigurationDescription[] refs) { Map p1RefData = new LinkedHashMap<String, String>(); for (ICConfigurationDescription ref : refs) { String projectName = ref.getProjectDescription().getName(); p1RefData.put(projectName, ref.getId()); } node.setReferenceInfo(p1RefData); } private ICConfigurationDescription newCfg(ICProjectDescription des, String project, String config) throws CoreException { CDefaultConfigurationData data= new CDefaultConfigurationData(project+"."+config, project+" "+config+" name", null); data.initEmptyData(); return des.createConfiguration(CCorePlugin.DEFAULT_PROVIDER_ID, data); } public void testConfigurationDescriptionReference() throws CoreException { // references assertEdges(p1cd1, new ICConfigurationDescription[] {p2cd3}, true); assertEdges(p1cd2, new ICConfigurationDescription[] {p2cd2}, true); assertEdges(p1cd3, new ICConfigurationDescription[] {p2cd1}, true); assertEdges(p2cd1, new ICConfigurationDescription[] {p3cd1}, true); assertEdges(p2cd2, new ICConfigurationDescription[] {p3cd2}, true); assertEdges(p2cd3, new ICConfigurationDescription[] {p3cd3}, true); assertEdges(p3cd1, new ICConfigurationDescription[] {p4cd2}, true); assertEdges(p3cd2, new ICConfigurationDescription[] {p4cd2}, true); assertEdges(p3cd3, new ICConfigurationDescription[] {p4cd2}, true); assertEdges(p4cd1, new ICConfigurationDescription[] {}, true); assertEdges(p4cd2, new ICConfigurationDescription[] {}, true); assertEdges(p4cd3, new ICConfigurationDescription[] {}, true); } public void testConfigurationDescriptionReferencing() throws CoreException { // referencing assertEdges(p1cd1, new ICConfigurationDescription[] {}, false); assertEdges(p1cd2, new ICConfigurationDescription[] {}, false); assertEdges(p1cd3, new ICConfigurationDescription[] {}, false); assertEdges(p2cd1, new ICConfigurationDescription[] {p1cd3}, false); assertEdges(p2cd2, new ICConfigurationDescription[] {p1cd2}, false); assertEdges(p2cd3, new ICConfigurationDescription[] {p1cd1}, false); assertEdges(p3cd1, new ICConfigurationDescription[] {p2cd1}, false); assertEdges(p3cd2, new ICConfigurationDescription[] {p2cd2}, false); assertEdges(p3cd3, new ICConfigurationDescription[] {p2cd3}, false); assertEdges(p4cd1, new ICConfigurationDescription[] {}, false); assertEdges(p4cd2, new ICConfigurationDescription[] {p3cd1, p3cd2, p3cd3}, false); assertEdges(p4cd3, new ICConfigurationDescription[] {}, false); } /** * Test that the the referencing mechanism preserves order */ public void testDependencyOrder() throws CoreException { ICProject p1 = null; ICProject p2 = null; ICProject p3 = null; try { String p1Name = "referenceDependency"; String p2Name = "refereeDependency"; String p3Name = "referee2Dependency"; p1 = CProjectHelper.createCCProject(p1Name, "bin"); p2 = CProjectHelper.createCCProject(p2Name, "bin"); p3 = CProjectHelper.createCCProject(p3Name, "bin"); CoreModel coreModel = CoreModel.getDefault(); ICProjectDescription des1 = coreModel.getProjectDescription(p1.getProject()); ICProjectDescription des2 = coreModel.getProjectDescription(p2.getProject()); ICProjectDescription des3 = coreModel.getProjectDescription(p3.getProject()); ICConfigurationDescription p1cd1 = newCfg(des1, p1Name, "p1cd1"); ICConfigurationDescription p2cd1 = newCfg(des2, p2Name, "p2cd1"); ICConfigurationDescription p3cd1 = newCfg(des3, p2Name, "p3cd1"); /* Setup references: * * p1: cd1 * | \ * | \ * p2: cd1 \ * p3: cd1 */ setRefs(p1cd1, new ICConfigurationDescription[] {p2cd1, p3cd1}); coreModel.setProjectDescription(p1.getProject(), des1); coreModel.setProjectDescription(p2.getProject(), des2); coreModel.setProjectDescription(p3.getProject(), des3); // Check that the order is persisted ICConfigurationDescription[] cfgs; cfgs = CoreModelUtil.getReferencedConfigurationDescriptions(p1cd1, false); assertTrue(cfgs.length == 2); assertEquals(cfgs[0].getId(), p2cd1.getId()); assertEquals(cfgs[1].getId(), p3cd1.getId()); // Swap them round and check that the order is still persisted... setRefs(p1cd1, new ICConfigurationDescription[] {p3cd1, p2cd1}); coreModel.setProjectDescription(p1.getProject(), des1); cfgs = CoreModelUtil.getReferencedConfigurationDescriptions(p1cd1, false); assertTrue(cfgs.length == 2); assertEquals(cfgs[0].getId(), p3cd1.getId()); assertEquals(cfgs[1].getId(), p2cd1.getId()); } finally { if (p1 != null) try { p1.getProject().delete(true, npm()); } catch (CoreException e){} if (p2 != null) try { p2.getProject().delete(true, npm()); } catch (CoreException e){} if (p3 != null) try { p3.getProject().delete(true, npm()); } catch (CoreException e){} } } protected void assertEdges(ICConfigurationDescription cfgDes, ICConfigurationDescription[] expected, boolean references) { ICConfigurationDescription[] actual; if(references) { actual= CoreModelUtil.getReferencedConfigurationDescriptions(cfgDes, false); } else { actual= CoreModelUtil.getReferencingConfigurationDescriptions(cfgDes, false); } assertEquals(expected.length, actual.length); List actualIds = new ArrayList(); for (ICConfigurationDescription element : actual) { actualIds.add(element.getId()); } // check for each ID, don't use a Set so we detect duplicates for (ICConfigurationDescription element : expected) { assertTrue(element.getId()+" is missing", actualIds.contains(element.getId())); } } @Override protected void tearDown() throws Exception { for (Object element : Arrays.asList(new ICProject[]{p1,p2,p3,p4})) { ICProject project = (ICProject) element; try { project.getProject().delete(true, npm()); } catch(CoreException ce) { // try next one.. } } } }