/******************************************************************************* * Copyright (c) 2000, 2014 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 *******************************************************************************/ package org.eclipse.cdt.core.model.tests; import java.io.FileNotFoundException; import java.util.ArrayDeque; import java.util.Deque; import junit.framework.TestSuite; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.IInclude; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.core.testplugin.util.ExpectedStrings; /** * @author Peter Graves * * This file contains a set of generic tests for the core C model's TranslationUnit class. * There is nothing exotic here, mostly just sanity type tests. */ public class TranslationUnitTests extends TranslationUnitBaseTest { /* * This is a list of elements in the test .c file. It will be used in a * number of places in the tests */ private static final String[] expectedStringList = { "stdio.h", "unistd.h", "func2p", "globalvar", "myenum", "mystruct_t", "mystruct", "myunion", "mytype", "func1", "func2", "main", "func3" }; public TranslationUnitTests(String name) { super(name); } public static TestSuite suite() { return new TestSuite(TranslationUnitTests.class); } /*************************************************************************** * Simple sanity test to make sure TranslationUnit.isTranslationUnit returns true */ public void testIsTranslationUnit() throws Exception, FileNotFoundException { ITranslationUnit tu = CProjectHelper.findTranslationUnit(testProject, "exetest.c"); assertNotNull(tu); } /*************************************************************************** * Simple sanity tests to make sure TranslationUnit.getChildren seems to basically work. */ public void testGetChildren() throws Exception { ExpectedStrings expectedString = new ExpectedStrings(expectedStringList); ITranslationUnit tu = CProjectHelper.findTranslationUnit(testProject, "exetest.c"); if (tu.hasChildren()) { ICElement[] elements = tu.getChildren(); for (int x = 0; x < elements.length; x++) { expectedString.foundString(elements[x].getElementName()); } } assertTrue("PR:23603 " + expectedString.getMissingString(), expectedString.gotAll()); assertTrue(expectedString.getExtraString(), !expectedString.gotExtra()); } /*************************************************************************** * Simple sanity tests for the getElement() call */ public void testGetElement() throws Exception { Deque<String> missing = new ArrayDeque<String>(); ITranslationUnit tu = CProjectHelper.findTranslationUnit(testProject, "exetest.c"); for (int x = 0; x < expectedStringList.length; x++) { ICElement myElement = tu.getElement(expectedStringList[x]); if (myElement == null) { missing.push(expectedStringList[x]); } else { assertTrue("Expected: \"" + expectedStringList[x] + "\". Got:" + myElement.getElementName(), expectedStringList[x].equals(myElement.getElementName())); } } if (!missing.isEmpty()) { StringBuilder output = new StringBuilder("PR:23603 Could not get elements:"); while (!missing.isEmpty()) { output.append(" ").append(missing.pop()); } assertTrue(output.toString(), false); } } /*************************************************************************** * Simple sanity tests for the getInclude call */ public void testBug23478A() throws Exception { String includes[] = { "stdio.h", "unistd.h" }; ITranslationUnit tu = CProjectHelper.findTranslationUnit(testProject, "exetest.c"); for (int x = 0; x < includes.length; x++) { IInclude include = tu.getInclude(includes[x]); if (include == null) { fail("Unable to get include: " + includes[x]); } else { // Failed test: Include.getIncludeName() always returns ""; // assertTrue assertTrue("PR:23478 Expected: an empty string. Got: " + include.getIncludeName(), includes[x].equals(include.getIncludeName())); } } } /*************************************************************************** * Simple sanity tests for the getIncludes call */ public void testBug23478B() throws Exception { String headers[] = { "stdio.h", "unistd.h" }; ExpectedStrings myExp = new ExpectedStrings(headers); ITranslationUnit tu = CProjectHelper.findTranslationUnit(testProject, "exetest.c"); IInclude[] includes = tu.getIncludes(); for (int x = 0; x < includes.length; x++) { myExp.foundString(includes[x].getIncludeName()); } // Failed test: Include.getIncludeName() always returns ""; // assertTrue assertTrue(myExp.getMissingString(), myExp.gotAll()); assertTrue(myExp.getExtraString(), !myExp.gotExtra()); } /*************************************************************************** * Simple sanity tests for the getElementAtLine() call. */ // This test is disabled due to consistent failure. // public void testGetElementAtLine() throws Exception { // Deque<String> missing = new ArrayDeque<String>(); // ITranslationUnit tu = CProjectHelper.findTranslationUnit(testProject, "exetest.c"); // // for (int x = 0; x < expectedStringList.length; x++) { // ICElement element = tu.getElementAtLine(expectedLines[x]); // if (element == null) { // missing.push(expectedStringList[x]); // } else { // if (expectedStringList[x].equals("mystruct_t")) { // assertTrue("PR:23603 expected: " + expectedStringList[x] // + ". Got: " + element.getElementName(), // expectedStringList[x].equals(element.getElementName())); // } else { // assertTrue("Expected: " + expectedStringList[x] // + ". Got: " + element.getElementName(), // expectedStringList[x].equals(element.getElementName())); // } // } // } // if (!missing.isEmpty()) { // StringBuilder output = new StringBuilder("PR:23603 Could not get elements:"); // while (!missing.isEmpty()) { // output.append(" ").append(missing.pop()); // } // assertTrue(output.toString(), false); // } // } public void testIsValidSourceUnitName() { assertTrue(CoreModel.isValidSourceUnitName(testProject.getProject(), "test.c")); assertFalse(CoreModel.isValidSourceUnitName(testProject.getProject(), "test.h")); assertTrue(CoreModel.isValidSourceUnitName(testProject.getProject(), "test.cc")); assertFalse(CoreModel.isValidSourceUnitName(testProject.getProject(), "test.hh")); } // This test is disabled because it fails consistently due to a collision between content types // "asmSource" defined in org.eclipse.cdt.core and // "org.eclipse.cdt.managedbuilder.llvm.ui.llvmAssemblyCode" defined in // org.eclipse.cdt.managedbuilder.llvm.ui. // public void testAssemblyContentType_Bug186774() { // assertEquals(CCorePlugin.CONTENT_TYPE_ASMSOURCE, CoreModel.getRegistedContentTypeId(testProject.getProject(), "test.s")); // assertEquals(CCorePlugin.CONTENT_TYPE_ASMSOURCE, CoreModel.getRegistedContentTypeId(testProject.getProject(), "test.S")); // } }