diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/AllCProjectDescriptionTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/AllCProjectDescriptionTests.java index e7273319696..14835d9cd96 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/AllCProjectDescriptionTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/AllCProjectDescriptionTests.java @@ -26,6 +26,7 @@ public class AllCProjectDescriptionTests { suite.addTest(CConfigurationDescriptionReferenceTests.suite()); suite.addTest(ExternalSettingsProviderTests.suite()); suite.addTest(CfgSettingsTests.suite()); + suite.addTest(CProjectDescriptionDeltaTests.suite()); suite.addTest(ProjectCreationStateTests.suite()); suite.addTest(BackwardCompatibilityTests.suite()); suite.addTest(CProjectDescriptionBasicTests.suite()); diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionDeltaTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionDeltaTests.java new file mode 100644 index 00000000000..f5570cf8310 --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionDeltaTests.java @@ -0,0 +1,998 @@ +/******************************************************************************* + * Copyright (c) 2009, 2009 Andrew Gvozdev (Quoin Inc.) 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 Gvozdev (Quoin Inc.) - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.settings.model; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import junit.framework.TestSuite; + +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.internal.errorparsers.tests.ResourceHelper; +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.settings.model.util.CDataUtil; +import org.eclipse.cdt.core.testplugin.util.BaseTestCase; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; + +public class CProjectDescriptionDeltaTests extends BaseTestCase{ + + private Listener listener; + + private class Listener implements ICProjectDescriptionListener { + private boolean fIsNotified; + private String fProjName; + private ICDescriptionDelta fDelta; + + public Listener(String projName){ + fProjName = projName; + fIsNotified = false; + fDelta = null; + } + + public void handleEvent(CProjectDescriptionEvent event) { + if(!event.getProject().getName().equals(fProjName)) + return; + fIsNotified = true; + fDelta = event.getProjectDelta(); + } + + boolean isNotified(){ + return fIsNotified; + } + + void resetNotified(){ + fIsNotified = false; + fDelta = null; + } + + public ICDescriptionDelta getDelta() { + return fDelta; + } + } + + public static TestSuite suite() { + return suite(CProjectDescriptionDeltaTests.class, "_"); + } + + protected void setUp() throws Exception { + } + + protected void tearDown() throws Exception { + ResourceHelper.cleanUp(); + } + + + private void initListener(String projName){ + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + if(listener != null) + mngr.removeCProjectDescriptionListener(listener); + listener = new Listener(projName); + mngr.addCProjectDescriptionListener(listener, CProjectDescriptionEvent.APPLIED); + + assertFalse(listener.isNotified()); + + } + + private static List findDeltas(ICDescriptionDelta delta, int type) { + List list = new ArrayList(); + if ((delta.getChangeFlags()&type)!=0) { + list.add(delta); + } + + ICDescriptionDelta[] children = delta.getChildren(); + for (ICDescriptionDelta d : children) { + list.addAll(findDeltas(d, type)); + } + return list; + } + + public void testDelta_ACTIVE_CFG() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProject(projName, null, + new String[] {"test.configuration.1", "test.configuration.2"}); + + // Get writable project description and its configurations + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + assertEquals(2, prjDescription.getConfigurations().length); + + ICConfigurationDescription cfgDescription0 = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription0); + assertSame(cfgDescription0, prjDescription.getActiveConfiguration()); + + ICConfigurationDescription cfgDescription1 = prjDescription.getConfigurations()[1]; + assertNotNull(cfgDescription1); + assertNotSame(cfgDescription1, prjDescription.getActiveConfiguration()); + + // ACTIVE_CFG: Change active configuration + prjDescription.setActiveConfiguration(cfgDescription1); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.ACTIVE_CFG); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICProjectDescription); + ICProjectDescription oldSetting = (ICProjectDescription)delta.getOldSetting(); + assertEquals(cfgDescription0.getName(), oldSetting.getActiveConfiguration().getName()); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICProjectDescription); + ICProjectDescription newSetting = (ICProjectDescription)delta.getNewSetting(); + assertEquals(cfgDescription1.getName(), newSetting.getActiveConfiguration().getName()); + } + + public void testDelta_NAME() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + String oldName = cfgDescription.getName(); + + // Modification ICDescriptionDelta.NAME + String newName = "New name"; + cfgDescription.setName(newName); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.NAME); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.NAME, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription oldSetting = (ICConfigurationDescription)delta.getOldSetting(); + assertEquals(oldName, oldSetting.getName()); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription newSetting = (ICConfigurationDescription)delta.getNewSetting(); + assertEquals(newName, newSetting.getName()); + } + + public void testDelta_DESCRIPTION() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + String oldDescription = cfgDescription.getDescription(); + + // Modification ICDescriptionDelta.DESCRIPTION + cfgDescription.setDescription("New description"); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.DESCRIPTION); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.DESCRIPTION, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription oldSetting = (ICConfigurationDescription)delta.getOldSetting(); + assertEquals(oldDescription, oldSetting.getDescription()); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription newSetting = (ICConfigurationDescription)delta.getNewSetting(); + assertEquals(cfgDescription.getDescription(), newSetting.getDescription()); + + } + + public void testDelta_LANGUAGE_ID() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + IFile file = ResourceHelper.createFile(project, "test.cpp"); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification LANGUAGE_ID + ICLanguageSetting langSetting = cfgDescription.getLanguageSettingForFile(file.getProjectRelativePath(), false); + String oldLanguageId = langSetting.getLanguageId(); + String newLanguageId = "test.language.id"; + assertTrue(!newLanguageId.equals(oldLanguageId)); + langSetting.setLanguageId(newLanguageId); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.LANGUAGE_ID); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.LANGUAGE_ID, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICLanguageSetting); + ICLanguageSetting oldSetting = (ICLanguageSetting)delta.getOldSetting(); + assertEquals(oldLanguageId, oldSetting.getLanguageId()); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICLanguageSetting); + ICLanguageSetting newSetting = (ICLanguageSetting)delta.getNewSetting(); + assertEquals(newLanguageId, newSetting.getLanguageId()); + + } + + public void testDelta_SOURCE_CONTENT_TYPE() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + IFile file = ResourceHelper.createFile(project, "test.cpp"); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification SOURCE_CONTENT_TYPE + final String testContentType = "test.content.type"; + ICLanguageSetting langSetting = cfgDescription.getLanguageSettingForFile(file.getProjectRelativePath(), false); + langSetting.setSourceContentTypeIds(new String[] {testContentType}); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.SOURCE_CONTENT_TYPE); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICLanguageSetting); + ICLanguageSetting oldSetting = (ICLanguageSetting)delta.getOldSetting(); + List oldContentTypes = Arrays.asList(oldSetting.getSourceContentTypeIds()); + assertTrue(!oldContentTypes.contains(testContentType)); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICLanguageSetting); + ICLanguageSetting newSetting = (ICLanguageSetting)delta.getNewSetting(); + List newContentTypes = Arrays.asList(newSetting.getSourceContentTypeIds()); + assertTrue(newContentTypes.contains(testContentType)); + + } + + public void testDelta_SOURCE_EXTENSIONS() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + IFile file = ResourceHelper.createFile(project, "test.cpp"); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification SOURCE_ENTENSIONS + ICLanguageSetting langSetting = cfgDescription.getLanguageSettingForFile(file.getProjectRelativePath(), false); + final String testContentType = CCorePlugin.CONTENT_TYPE_ASMSOURCE; + langSetting.setSourceContentTypeIds(new String[] {testContentType}); + String[] exts = CDataUtil.getExtensionsFromContentTypes(project, new String[] {testContentType}); + assertTrue(exts.length>0); + final String testSourceExtension = exts[0]; + + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.SOURCE_ENTENSIONS); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); +// assertEquals(ICDescriptionDelta.SOURCE_ENTENSIONS, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICLanguageSetting); + ICLanguageSetting oldSetting = (ICLanguageSetting)delta.getOldSetting(); + List oldSourceExtensions = Arrays.asList(oldSetting.getSourceExtensions()); + assertTrue(!oldSourceExtensions.contains(testSourceExtension)); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICLanguageSetting); + ICLanguageSetting newSetting = (ICLanguageSetting)delta.getNewSetting(); + List newSourceExtensions = Arrays.asList(newSetting.getSourceExtensions()); + assertTrue(newSourceExtensions.contains(testSourceExtension)); + + } + + public void testDelta_SETTING_ENTRIES() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + IFile file = ResourceHelper.createFile(project, "test.cpp"); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification SETTING_ENTRIES + ICLanguageSettingEntry testSettingEntry = new CIncludePathEntry("/path", 0); + ICLanguageSetting langSetting = cfgDescription.getLanguageSettingForFile(file.getProjectRelativePath(), false); + ICLanguageSettingEntry[] entries = new ICLanguageSettingEntry[] {testSettingEntry}; + langSetting.setSettingEntries(ICSettingEntry.INCLUDE_PATH, entries); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.SETTING_ENTRIES); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.SETTING_ENTRIES, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICLanguageSetting); + ICLanguageSetting oldSetting = (ICLanguageSetting)delta.getOldSetting(); + List oldSettingEntries = oldSetting.getSettingEntriesList(ICSettingEntry.INCLUDE_PATH); + assertTrue(!oldSettingEntries.contains(testSettingEntry)); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICLanguageSetting); + ICLanguageSetting newSetting = (ICLanguageSetting)delta.getNewSetting(); + List newSettingEntries = newSetting.getSettingEntriesList(ICSettingEntry.INCLUDE_PATH); + assertTrue(newSettingEntries.contains(testSettingEntry)); + } + + public void testDelta_BINARY_PARSER_IDS() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification BINARY_PARSER_IDS + final String testBinaryParserId = "test.binary.parser.id"; + ICTargetPlatformSetting targetPlatformSetting = cfgDescription.getTargetPlatformSetting(); + targetPlatformSetting.setBinaryParserIds(new String[] {testBinaryParserId}); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.BINARY_PARSER_IDS); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.BINARY_PARSER_IDS, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICTargetPlatformSetting); + ICTargetPlatformSetting oldSetting = (ICTargetPlatformSetting)delta.getOldSetting(); + List oldBinaryParserIds = Arrays.asList(oldSetting.getBinaryParserIds()); + assertTrue(!oldBinaryParserIds.contains(testBinaryParserId)); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICTargetPlatformSetting); + ICTargetPlatformSetting newSetting = (ICTargetPlatformSetting)delta.getNewSetting(); + List newBinaryParserIds = Arrays.asList(newSetting.getBinaryParserIds()); + assertTrue(newBinaryParserIds.contains(testBinaryParserId)); + + } + + public void testDelta_ERROR_PARSER_IDS() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification ERROR_PARSER_IDS + String testErrorParserId = "test.error.parser.id"; + cfgDescription.getBuildSetting().setErrorParserIDs(new String[] {testErrorParserId}); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.ERROR_PARSER_IDS); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.ERROR_PARSER_IDS, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICBuildSetting); + ICBuildSetting oldSetting = (ICBuildSetting)delta.getOldSetting(); + List oldErrorParserIds = Arrays.asList(oldSetting.getErrorParserIDs()); + assertTrue(!oldErrorParserIds.contains(testErrorParserId)); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICBuildSetting); + ICBuildSetting newSetting = (ICBuildSetting)delta.getNewSetting(); + List newErrorParserIds = Arrays.asList(newSetting.getErrorParserIDs()); + assertTrue(newErrorParserIds.contains(testErrorParserId)); + + } + + public void testDelta_EXCLUDE() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + IFile file = ResourceHelper.createFile(project, "test.cpp"); + + { + // Prepare file descriptions + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + cfgDescription.createFileDescription(file.getProjectRelativePath(),cfgDescription.getRootFolderDescription()); + ICFileDescription[] fileDescriptions = cfgDescription.getFileDescriptions(); + assertTrue(fileDescriptions.length>0); + + mngr.setProjectDescription(project, prjDescription); + } + + { + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification EXCLUDE + ICFileDescription[] fileDescriptions = cfgDescription.getFileDescriptions(); + assertTrue(fileDescriptions.length>0); + ICFileDescription fileDescription = fileDescriptions[0]; + fileDescription.setExcluded(true); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.EXCLUDE); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.EXCLUDE, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICFileDescription); + ICFileDescription oldSetting = (ICFileDescription)delta.getOldSetting(); + assertTrue(!oldSetting.isExcluded()); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICFileDescription); + ICFileDescription newSetting = (ICFileDescription)delta.getNewSetting(); + assertTrue(newSetting.isExcluded()); + } + + } + + public void testDelta_SOURCE_ADDED() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification SOURCE_ADDED + List sourceEntries = new ArrayList(Arrays.asList(cfgDescription.getSourceEntries())); + ICSourceEntry testSourceEntry = new CSourceEntry(project.getFullPath().append("test_src"), null, ICSettingEntry.RESOLVED); + sourceEntries.add(testSourceEntry); + cfgDescription.setSourceEntries(sourceEntries.toArray(new ICSourceEntry[0])); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.SOURCE_ADDED); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); +// assertEquals(ICDescriptionDelta.SOURCE_ADDED, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription oldSetting = (ICConfigurationDescription)delta.getOldSetting(); + List oldSourceEntries = Arrays.asList(oldSetting.getSourceEntries()); + assertTrue(!oldSourceEntries.contains(testSourceEntry)); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription newSetting = (ICConfigurationDescription)delta.getNewSetting(); + List newSourceEntries = Arrays.asList(newSetting.getSourceEntries()); + assertTrue(newSourceEntries.contains(testSourceEntry)); + } + + public void testDelta_SOURCE_REMOVED() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + + ICSourceEntry testSourceEntry = new CSourceEntry(project.getFullPath().append("test_src"), null, ICSettingEntry.RESOLVED); + { + // Add some source entry to remove it during the test + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + List sourceEntries = new ArrayList(Arrays.asList(cfgDescription.getSourceEntries())); + sourceEntries.add(testSourceEntry); + cfgDescription.setSourceEntries(sourceEntries.toArray(new ICSourceEntry[0])); + + mngr.setProjectDescription(project, prjDescription); + } + + { + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification SOURCE_REMOVED + cfgDescription.setSourceEntries(new ICSourceEntry[0]); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.SOURCE_REMOVED); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); +// assertEquals(ICDescriptionDelta.SOURCE_REMOVED, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription oldSetting = (ICConfigurationDescription)delta.getOldSetting(); + List oldSourceEntries = Arrays.asList(oldSetting.getSourceEntries()); + assertTrue(oldSourceEntries.contains(testSourceEntry)); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription newSetting = (ICConfigurationDescription)delta.getNewSetting(); + List newSourceEntries = Arrays.asList(newSetting.getSourceEntries()); + assertTrue(!newSourceEntries.contains(testSourceEntry)); + } + + } + + public void testDelta_EXTERNAL_SETTINGS_ADDED() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification EXTERNAL_SETTINGS_ADDED + ICSettingEntry testSettingEntry = new CIncludePathEntry("/path", 0); + ICExternalSetting testExternalSetting = cfgDescription.createExternalSetting(null, null, null, new ICSettingEntry[] {testSettingEntry}); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.EXTERNAL_SETTINGS_ADDED); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.EXTERNAL_SETTINGS_ADDED, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription oldSetting = (ICConfigurationDescription)delta.getOldSetting(); + List oldExternalSettings = Arrays.asList(oldSetting.getExternalSettings()); + assertEquals(0, oldExternalSettings.size()); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription newSetting = (ICConfigurationDescription)delta.getNewSetting(); + List newExternalSettings = Arrays.asList(newSetting.getExternalSettings()); + assertEquals(1, newExternalSettings.size()); + List newSettingEntries = Arrays.asList(newExternalSettings.get(0).getEntries()); + assertTrue(newSettingEntries.contains(testSettingEntry)); + } + + public void testDelta_EXTERNAL_SETTINGS_REMOVED() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + ICSettingEntry testSettingEntry = new CIncludePathEntry("/path", 0); + + { + // Add some external setting to remove it during the test + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + ICExternalSetting testExternalSetting = cfgDescription.createExternalSetting(null, null, null, new ICSettingEntry[] {testSettingEntry}); + mngr.setProjectDescription(project, prjDescription); + } + + { + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification EXTERNAL_SETTINGS_REMOVED + cfgDescription.removeExternalSettings(); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.EXTERNAL_SETTINGS_REMOVED); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.EXTERNAL_SETTINGS_REMOVED, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription oldSetting = (ICConfigurationDescription)delta.getOldSetting(); + List oldExternalSettings = Arrays.asList(oldSetting.getExternalSettings()); + assertEquals(1, oldExternalSettings.size()); + List oldSettingEntries = Arrays.asList(oldExternalSettings.get(0).getEntries()); + assertTrue(oldSettingEntries.contains(testSettingEntry)); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription newSetting = (ICConfigurationDescription)delta.getNewSetting(); + List newExternalSettings = Arrays.asList(newSetting.getExternalSettings()); + assertEquals(0, newExternalSettings.size()); + } + + } + + public void testDelta_CFG_REF_ADDED() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification CFG_REF_ADDED + String testKey = "key"; + String testValue = "value"; + Map refs = new HashMap(); + refs.put(testKey, testValue); + cfgDescription.setReferenceInfo(refs); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.CFG_REF_ADDED); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.CFG_REF_ADDED, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription oldSetting = (ICConfigurationDescription)delta.getOldSetting(); + Map oldReferenceInfo = oldSetting.getReferenceInfo(); + assertEquals(0, oldReferenceInfo.size()); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription newSetting = (ICConfigurationDescription)delta.getNewSetting(); + Map newReferenceInfo = newSetting.getReferenceInfo(); + assertEquals(1, newReferenceInfo.size()); + assertEquals(testValue, newReferenceInfo.get(testKey)); + } + + public void testDelta_CFG_REF_REMOVED() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + String testKey = "key"; + String testValue = "value"; + + { + // Add some reference info to remove it during the test + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + Map refs = new HashMap(); + refs.put(testKey, testValue); + cfgDescription.setReferenceInfo(refs); + mngr.setProjectDescription(project, prjDescription); + } + + { + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification CFG_REF_REMOVED + cfgDescription.setReferenceInfo(new HashMap()); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.CFG_REF_REMOVED); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.CFG_REF_REMOVED, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription oldSetting = (ICConfigurationDescription)delta.getOldSetting(); + Map oldReferenceInfo = oldSetting.getReferenceInfo(); + assertEquals(1, oldReferenceInfo.size()); + assertEquals(testValue, oldReferenceInfo.get(testKey)); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription newSetting = (ICConfigurationDescription)delta.getNewSetting(); + Map newReferenceInfo = newSetting.getReferenceInfo(); + assertEquals(0, newReferenceInfo.size()); + } + + } + + public void testDelta_EXT_REF() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProjectWithConfig(projName); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + ICConfigurationDescription cfgDescription = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription); + + // Modification EXT_REF, currently binary parsers are represented as CConfigExtensionReference + final String testBinaryParserId = "test.binary.parser.id"; + ICTargetPlatformSetting targetPlatformSetting = cfgDescription.getTargetPlatformSetting(); + targetPlatformSetting.setBinaryParserIds(new String[] {testBinaryParserId}); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.EXT_REF); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.EXT_REF, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription oldSetting = (ICConfigurationDescription)delta.getOldSetting(); + ICTargetPlatformSetting oldTargetPlatformSetting = oldSetting.getTargetPlatformSetting(); + List oldBinaryParserIds = Arrays.asList(oldTargetPlatformSetting.getBinaryParserIds()); + assertTrue(!oldBinaryParserIds.contains(testBinaryParserId)); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICConfigurationDescription); + ICConfigurationDescription newSetting = (ICConfigurationDescription)delta.getNewSetting(); + ICTargetPlatformSetting newTargetPlatformSetting = newSetting.getTargetPlatformSetting(); + List newBinaryParserIds = Arrays.asList(newTargetPlatformSetting.getBinaryParserIds()); + assertTrue(newBinaryParserIds.contains(testBinaryParserId)); + } + + public void testDelta_INDEX_CFG() throws Exception { + String projName = getName(); + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + initListener(projName); + IProject project = ResourceHelper.createCDTProject(projName, null, + new String[] {"test.configuration.1", "test.configuration.2"}); + + // Get writable project description and its configuration + ICProjectDescription prjDescription = mngr.getProjectDescription(project, true); + assertNotNull(prjDescription); + assertEquals(2, prjDescription.getConfigurations().length); + + ICConfigurationDescription cfgDescription0 = prjDescription.getConfigurations()[0]; + assertNotNull(cfgDescription0); + assertSame(cfgDescription0, prjDescription.getDefaultSettingConfiguration()); + + ICConfigurationDescription cfgDescription1 = prjDescription.getConfigurations()[1]; + assertNotNull(cfgDescription1); + assertNotSame(cfgDescription1, prjDescription.getDefaultSettingConfiguration()); + + // Modification INDEX_CFG + prjDescription.setDefaultSettingConfiguration(cfgDescription1); + + // Write project description + listener.resetNotified(); + mngr.setProjectDescription(project, prjDescription); + assertEquals(true, listener.isNotified()); + + // Analyze delta + ICDescriptionDelta rootDelta = listener.getDelta(); + assertNotNull(rootDelta); + List deltas = findDeltas(rootDelta, ICDescriptionDelta.INDEX_CFG); + assertEquals(1, deltas.size()); + ICDescriptionDelta delta = deltas.get(0); + assertNotNull(delta); + assertEquals(ICDescriptionDelta.INDEX_CFG, delta.getChangeFlags()); + + // Check old setting + assertTrue(delta.getOldSetting() instanceof ICProjectDescription); + ICProjectDescription oldSetting = (ICProjectDescription)delta.getOldSetting(); + assertEquals(cfgDescription0.getName(), oldSetting.getDefaultSettingConfiguration().getName()); + + // Check new setting + assertTrue(delta.getNewSetting() instanceof ICProjectDescription); + ICProjectDescription newSetting = (ICProjectDescription)delta.getNewSetting(); + assertEquals(cfgDescription1.getName(), newSetting.getDefaultSettingConfiguration().getName()); + } + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java index 527ff7e819e..e5c0321907e 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java @@ -56,6 +56,7 @@ import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.settings.model.CExternalSetting; import org.eclipse.cdt.core.settings.model.CProjectDescriptionEvent; +import org.eclipse.cdt.core.settings.model.ICBuildSetting; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICDescriptionDelta; import org.eclipse.cdt.core.settings.model.ICFileDescription; @@ -1446,6 +1447,10 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { } } + CProjectDescriptionDelta bsDelta = createDelta(newCfg.getBuildSetting(), oldCfg.getBuildSetting()); + if(bsDelta != null) + delta.addChild(bsDelta); + CProjectDescriptionDelta tpsDelta = createDelta(newCfg.getTargetPlatformSetting(), oldCfg.getTargetPlatformSetting()); if(tpsDelta != null) delta.addChild(tpsDelta); @@ -1454,6 +1459,10 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { delta.addChangeFlags(ICDescriptionDelta.NAME); } + if (!CDataUtil.objectsEqual(newCfg.getDescription(), oldCfg.getDescription())) { + delta.addChangeFlags(ICDescriptionDelta.DESCRIPTION); + } + ICSourceEntry newEntries[] = newCfg.getSourceEntries(); ICSourceEntry oldEntries[] = oldCfg.getSourceEntries(); @@ -1753,6 +1762,9 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { CProjectDescriptionDelta delta = new CProjectDescriptionDelta(newLs, oldLs); if(delta.getDeltaKind() == ICDescriptionDelta.CHANGED){ + if (!CDataUtil.objectsEqual(newLs.getLanguageId(), oldLs.getLanguageId())) + delta.addChangeFlags(ICDescriptionDelta.LANGUAGE_ID); + int kinds[] = KindBasedStore.getLanguageEntryKinds(); int kind; int addedKinds = 0; @@ -1873,6 +1885,14 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { return true; } */ + private CProjectDescriptionDelta createDelta(ICBuildSetting newBuildSetting, ICBuildSetting oldBuildSetting){ + CProjectDescriptionDelta delta = new CProjectDescriptionDelta(newBuildSetting, oldBuildSetting); + if(!Arrays.equals(newBuildSetting.getErrorParserIDs(), oldBuildSetting.getErrorParserIDs())) + delta.addChangeFlags(ICDescriptionDelta.ERROR_PARSER_IDS); + + return delta.isEmpty() ? null : delta; + } + private CProjectDescriptionDelta createDelta(ICTargetPlatformSetting newTPS, ICTargetPlatformSetting oldTPS){ CProjectDescriptionDelta delta = new CProjectDescriptionDelta(newTPS, oldTPS); if(!Arrays.equals(newTPS.getBinaryParserIds(), oldTPS.getBinaryParserIds()))