/******************************************************************************* * Copyright (c) 2002, 2007 QNX 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: * QNX Software Systems - Initial API and implementation * Markus Schorn (Wind River Systems) * IBM Corporation *******************************************************************************/ package org.eclipse.cdt.core.model.tests; import java.util.HashSet; import java.util.Set; import junit.framework.TestSuite; import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ElementChangedEvent; import org.eclipse.cdt.core.model.ICElementDelta; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.IContainerEntry; import org.eclipse.cdt.core.model.IElementChangedListener; import org.eclipse.cdt.core.model.IPathEntry; import org.eclipse.cdt.core.model.IPathEntryContainer; import org.eclipse.cdt.core.settings.model.CSourceEntry; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.ICSourceEntry; import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceDescription; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; /* * CPathEntryTest */ public class CPathEntryTest extends BaseTestCase { IWorkspace workspace; IWorkspaceRoot root; IProject project_c, project_cc; NullProgressMonitor monitor; String pluginRoot; class CElementListener implements IElementChangedListener { int count = 0; void processDelta(ICElementDelta delta) { if (delta == null) { return ; } int flags = delta.getFlags(); int kind = delta.getKind(); if (kind == ICElementDelta.CHANGED ) { if ((flags & ICElementDelta.F_CHANGED_PATHENTRY_INCLUDE) != 0) { count++; } } ICElementDelta[] affectedChildren= delta.getAffectedChildren(); for (int i= 0; i < affectedChildren.length; i++) { processDelta(affectedChildren[i]); } } /* * (non-Javadoc) * * @see org.eclipse.cdt.core.model.IElementChangedListener#elementChanged(org.eclipse.cdt.core.model.ElementChangedEvent) */ public void elementChanged(ElementChangedEvent event) { processDelta(event.getDelta()); } } /** * Constructor for CModelTests. * * @param name */ public CPathEntryTest(String name) { super(name); } /** * Sets up the test fixture. * * Called before every test case method. * */ protected void setUp() throws CoreException { /*************************************************************************************************************************** * The test of the tests assume that they have a working workspace and workspace root object to use to create * projects/files in, so we need to get them setup first. */ IWorkspaceDescription desc; workspace = ResourcesPlugin.getWorkspace(); root = workspace.getRoot(); monitor = new NullProgressMonitor(); if (workspace == null) fail("Workspace was not setup"); if (root == null) fail("Workspace root was not setup"); pluginRoot = CTestPlugin.getDefault().find(new Path("/")).getFile(); desc = workspace.getDescription(); desc.setAutoBuilding(false); workspace.setDescription(desc); } /** * Tears down the test fixture. * * Called after every test case method. */ protected void tearDown() { // release resources here and clean-up } public static TestSuite suite() { return suite(CPathEntryTest.class); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } /******************************************************************************************************************************* * Check if the PathEntry's are generated. * * @see CProjectHelper#createCProject */ public void testCPathEntries() throws CoreException { ICProject testProject; testProject = CProjectHelper.createCProject("cpathtest", "none", IPDOMManager.ID_NO_INDEXER); if (testProject == null) { fail("Unable to create project"); } IPathEntry[] entries = testProject.getResolvedPathEntries(); // We always have at least two entries: // 1) the default sourceEntry becomes the project // 2) the default outputEntry becomes the project assertTrue("No cpathentries", entries.length == 2); entries = new IPathEntry[3]; entries[0] = CoreModel.newIncludeEntry(new Path(""), null, new Path("/usr/include"), true); entries[1] = CoreModel.newIncludeEntry(new Path("cpaththest/foo.c"), null, new Path("/usr/include"), true); entries[2] = CoreModel.newLibraryEntry(new Path(""), null, new Path("/usr/lib/libc.so.1"), null, null, null, false); testProject.setRawPathEntries(entries, new NullProgressMonitor()); entries = testProject.getResolvedPathEntries(); // We always have at least two entries: // 1) the default sourceEntry becomes the project // 2) the default outputEntry becomes the project assertTrue("Expecting 5 pathentries", entries.length == (3 + 2)); testProject.setRawPathEntries(null, null); } /******************************************************************************************************************************* * Check if the PathEntry's are generated. * * @see CProjectHelper#createCProject */ public void testCPathEntriesDelta() throws CoreException { ICProject testProject; testProject = CProjectHelper.createCProject("cpathtest", "none", IPDOMManager.ID_NO_INDEXER); if (testProject == null) { fail("Unable to create project"); } CProjectHelper.addCContainer(testProject, "foo"); IPathEntry[] entries = new IPathEntry[3]; entries[0] = CoreModel.newIncludeEntry(new Path(""), null, new Path("/usr/include"), true); entries[1] = CoreModel.newIncludeEntry(new Path("foo"), null, new Path("/usr/include"), true); entries[2] = CoreModel.newLibraryEntry(new Path(""), null, new Path("/usr/lib/libc.so.1"), null, null, null, false); CElementListener listener = new CElementListener(); CoreModel.getDefault().addElementChangedListener(listener); testProject.setRawPathEntries(entries, new NullProgressMonitor()); entries = testProject.getResolvedPathEntries(); //CoreModel.getDefault().removeElementChangedListener(listener); testProject.setRawPathEntries(null, null); assertTrue("Expecting 3 pathEntries deltas", listener.count > 1); } /** * Check the IPathEntryContainer. */ public void testPathEntryContainer() throws CoreException { ICProject testProject; testProject = CProjectHelper.createCProject("cpathtest", "none", IPDOMManager.ID_NO_INDEXER); if (testProject == null) { fail("Unable to create project"); } final IPath containerID = new Path("Testing/Container"); IContainerEntry containerEntry = CoreModel.newContainerEntry(containerID); IPathEntryContainer container = new IPathEntryContainer() { public IPathEntry[] getPathEntries() { IPathEntry[] entries = new IPathEntry[3]; entries[0] = CoreModel.newIncludeEntry(new Path(""), null, new Path("/usr/include"), true); entries[1] = CoreModel.newIncludeEntry(new Path("foo.c"), null, new Path("/usr/include"), true); entries[2] = CoreModel.newLibraryEntry(new Path(""), null, new Path("/usr/lib/libc.so.1"), null, null, null, true); return entries; } public String getDescription() { return "Testing container"; //$NON-NLS-1$ } public IPath getPath() { return containerID; } }; CoreModel.setRawPathEntries(testProject, new IPathEntry[]{containerEntry}, new NullProgressMonitor()); CoreModel.setPathEntryContainer(new ICProject[]{testProject}, container, new NullProgressMonitor()); IPathEntry[] entries = testProject.getResolvedPathEntries(); // We always have at least two entries: // 1) the default sourceEntry becomes the project // 2) the default outputEntry becomes the project assertTrue("Expecting 3 pathentries from container", entries.length == (3 + 2)); } public void testSetExclusionFilter_Bug197486() throws Exception { ICProject testProject = null; try { testProject = CProjectHelper.createCProject("cpathtest", "none", IPDOMManager.ID_NO_INDEXER); } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (testProject == null) { fail("Unable to create project"); } // get project description ICProjectDescription prjDesc= CoreModel.getDefault().getProjectDescription(testProject.getProject(), true); ICConfigurationDescription activeCfg= prjDesc.getActiveConfiguration(); assertNotNull(activeCfg); // add filter to source entry ICSourceEntry[] entries = activeCfg.getSourceEntries(); final String sourceEntryName = entries[0].getName(); final IPath[] exclusionPatterns = new IPath[] { new Path("dummy*"), new Path("dummy2/*") }; ICSourceEntry entry = new CSourceEntry(sourceEntryName, exclusionPatterns, entries[0].getFlags()); activeCfg.setSourceEntries(new ICSourceEntry[] {entry}); // check the modified configuration for the exclusion patterns checkExclusionPatterns(sourceEntryName, exclusionPatterns, activeCfg); // store the changed configuration CoreModel.getDefault().setProjectDescription(testProject.getProject(), prjDesc); // check again. prjDesc= CoreModel.getDefault().getProjectDescription(testProject.getProject(), false); ICConfigurationDescription[] allConfigs= prjDesc.getConfigurations(); assertEquals(1, allConfigs.length); checkExclusionPatterns(sourceEntryName, exclusionPatterns, allConfigs[0]); activeCfg= prjDesc.getActiveConfiguration(); checkExclusionPatterns(sourceEntryName, exclusionPatterns, activeCfg); } private void checkExclusionPatterns(String sourceEntryName, IPath[] exclusionPatterns, ICConfigurationDescription cfg) { assertNotNull(cfg); ICSourceEntry[] entries = cfg.getSourceEntries(); assertEquals(1, entries.length); assertEquals(sourceEntryName, entries[0].getName()); IPath[] actualExclusionPatterns = entries[0].getExclusionPatterns(); assertEquals(exclusionPatterns.length, actualExclusionPatterns.length); assertEquals(toSet(exclusionPatterns), toSet(actualExclusionPatterns)); } private Set toSet(Object[] array) { HashSet set = new HashSet(); for (int i = 0; i < array.length; i++) { set.add(array[i]); } return set; } }