/*******************************************************************************
* Copyright (c) 2004, 2007 IBM Corporation 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:
* IBM Rational Software - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.model.tests;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IEnumeration;
import org.eclipse.cdt.core.model.IEnumerator;
import org.eclipse.cdt.core.model.IField;
import org.eclipse.cdt.core.model.IFunction;
import org.eclipse.cdt.core.model.IFunctionDeclaration;
import org.eclipse.cdt.core.model.IFunctionTemplateDeclaration;
import org.eclipse.cdt.core.model.IInclude;
import org.eclipse.cdt.core.model.IMacro;
import org.eclipse.cdt.core.model.IMethod;
import org.eclipse.cdt.core.model.IMethodDeclaration;
import org.eclipse.cdt.core.model.IMethodTemplateDeclaration;
import org.eclipse.cdt.core.model.INamespace;
import org.eclipse.cdt.core.model.IParent;
import org.eclipse.cdt.core.model.ISourceRange;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.IStructure;
import org.eclipse.cdt.core.model.IStructureTemplate;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.ITypeDef;
import org.eclipse.cdt.core.model.IVariable;
import org.eclipse.cdt.core.model.IVariableDeclaration;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.CTestPlugin;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
public class StructuralCModelElementsTests extends TestCase {
private ICProject fCProject;
private IFile headerFile;
private IFile includedFile;
private NullProgressMonitor monitor;
public static Test suite() {
TestSuite suite= new TestSuite(StructuralCModelElementsTests.class.getName());
suite.addTest(new StructuralCModelElementsTests("testCModelElements")); //$NON-NLS-1$
return suite;
}
public StructuralCModelElementsTests(String name) {
super(name);
}
protected void setUp() throws Exception {
monitor = new NullProgressMonitor();
fCProject= CProjectHelper.createCCProject("TestProject1", "bin", IPDOMManager.ID_FAST_INDEXER); //$NON-NLS-1$ //$NON-NLS-2$
headerFile = fCProject.getProject().getFile("CModelElementsTest.h"); //$NON-NLS-1$
includedFile = fCProject.getProject().getFile("included.h"); //$NON-NLS-1$
if (!headerFile.exists()) {
try{
FileInputStream fileIn = new FileInputStream(
CTestPlugin.getDefault().getFileInPlugin(new Path("resources/cfiles/CModelElementsTestStart.h"))); //$NON-NLS-1$
headerFile.create(fileIn,false, monitor);
FileInputStream includedFileIn = new FileInputStream(
CTestPlugin.getDefault().getFileInPlugin(new Path("resources/cfiles/included.h"))); //$NON-NLS-1$
includedFile.create(includedFileIn,false, monitor);
} catch (CoreException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
CCorePlugin.getIndexManager().joinIndexer(10000, new NullProgressMonitor());
}
protected void tearDown() {
CProjectHelper.delete(fCProject);
}
public void testCModelElements() throws CModelException{
ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(headerFile);
// turn on the structural parse mode
tu.close();
CCorePlugin.getDefault().setStructuralParseMode(true);
// tu ---> include
checkInclude(tu);
// tu ---> macro
checkMacro(tu);
// tu ---> namespace: MyPackage
List tuPackages = tu.getChildrenOfType(ICElement.C_NAMESPACE);
INamespace namespace = (INamespace) tuPackages.get(0);
assertEquals(namespace.getElementName(), new String("MyPackage")); //$NON-NLS-1$
checkElementOffset(namespace);
checkLineNumbers(namespace, 8, 130);
checkClass(namespace);
checkEnums(namespace);
checkVariables(namespace);
checkVariableDeclarations(namespace);
checkFunctions(namespace);
checkStructs(namespace);
checkTemplates(namespace);
checkArrays(tu);
// turn off the structural parse mode
CCorePlugin.getDefault().setStructuralParseMode(false);
}
private void checkInclude(IParent tu) throws CModelException{
List tuIncludes = tu.getChildrenOfType(ICElement.C_INCLUDE);
IInclude inc1 = (IInclude) tuIncludes.get(0);
assertEquals(inc1.getElementName(), new String("included.h")); //$NON-NLS-1$
checkElementOffset(inc1);
checkLineNumbers(inc1, 2, 2);
}
private void checkMacro(IParent tu) throws CModelException{
List tuMacros = tu.getChildrenOfType(ICElement.C_MACRO);
IMacro mac1 = (IMacro) tuMacros.get(0);
assertEquals(mac1.getElementName(), new String("PRINT")); //$NON-NLS-1$
checkElementOffset(mac1);
checkLineNumbers(mac1, 5, 5);
}
private void checkClass(IParent namespace) throws CModelException{
// MyPackage ---> class: Hello
List nsClasses = namespace.getChildrenOfType(ICElement.C_CLASS);
IStructure classHello = (IStructure) nsClasses.get(0);
assertEquals(classHello.getElementName(), new String("Hello")); //$NON-NLS-1$
checkElementOffset(classHello);
checkLineNumbers(classHello, 12, 53);
// Hello --> field: int x
List helloFields = classHello.getChildrenOfType(ICElement.C_FIELD);
IField intX = (IField) helloFields.get(0);
assertEquals(intX.getElementName(), new String("x")); //$NON-NLS-1$
checkElementOffset(intX);
assertEquals(intX.getTypeName(), new String("int")); //$NON-NLS-1$
checkLineNumbers(intX, 17, 17);
ASTAccessVisibility xVisibility = intX.getVisibility();
if (xVisibility != ASTAccessVisibility.PROTECTED)
fail("visibility should be protected!"); //$NON-NLS-1$
// Hello ---> method: void setX(int X)
List helloMethods = classHello.getChildrenOfType(ICElement.C_METHOD);
IMethod setX = (IMethod) helloMethods.get(0);
assertEquals(setX.getElementName(), new String("setX")); //$NON-NLS-1$
checkElementOffset(setX);
assertEquals(setX.getReturnType(), new String("void")); //$NON-NLS-1$
checkLineNumbers(setX, 19, 22);
int setXNumOfParam = setX.getNumberOfParameters();
if(setXNumOfParam != 1)
fail("setX should have one parameter!"); //$NON-NLS-1$
String[] setXParamTypes = setX.getParameterTypes();
String firstParamType = setXParamTypes[0];
assertEquals(firstParamType, new String("int")); //$NON-NLS-1$
// TODO : check for the inline here
checkNestedNamespace(classHello);
}
private void checkNestedNamespace(IParent classHello) throws CModelException{
// Hello ---> namespace: MyNestedPackage
List helloNamespaces = classHello.getChildrenOfType(ICElement.C_NAMESPACE);
INamespace myNestedPackage = (INamespace) helloNamespaces.get(0);
assertEquals(myNestedPackage.getElementName(), new String("MyNestedPackage")); //$NON-NLS-1$
checkElementOffset(myNestedPackage);
checkLineNumbers(myNestedPackage, 25, 52);
checkParentNestedClass(myNestedPackage);
checkDerivedNestedClass(myNestedPackage);
}
private void checkParentNestedClass(IParent myNestedPackage) throws CModelException{
// MyNestedPackage ---> class: Y
List nestedClasses = myNestedPackage.getChildrenOfType(ICElement.C_CLASS);
IStructure classY = (IStructure) nestedClasses.get(0);
assertEquals(classY.getElementName(), new String("Y")); //$NON-NLS-1$
checkElementOffset(classY);
checkLineNumbers(classY, 28, 35);
// Y ---> constructor: Y
List yMethods = classY.getChildrenOfType(ICElement.C_METHOD_DECLARATION);
IMethodDeclaration constructor = (IMethodDeclaration) yMethods.get(0);
assertEquals(constructor.getElementName(), new String("Y")); //$NON-NLS-1$
checkElementOffset(constructor);
assertTrue (constructor.isConstructor());
checkLineNumbers(constructor, 32, 32);
// Y ---> destructor: ~Y
IMethodDeclaration destructor = (IMethodDeclaration) yMethods.get(1);
assertEquals(destructor.getElementName(), new String("~Y")); //$NON-NLS-1$
checkElementOffset(destructor);
assertTrue (destructor.isDestructor());
checkLineNumbers(destructor, 34, 34);
// TODO: check for virtual on destructors
}
private void checkDerivedNestedClass(IParent myNestedPackage) throws CModelException{
// MyNestedPackage ---> class: X public Y
List nestedClasses = myNestedPackage.getChildrenOfType(ICElement.C_CLASS);
IStructure classX = (IStructure) nestedClasses.get(1);
assertEquals(classX.getElementName(), new String("X")); //$NON-NLS-1$
checkElementOffset(classX);
checkLineNumbers(classX, 38, 51);
// TODO : Check for base classes here
// X --> field: B b
List xFieldChildren = classX.getChildrenOfType(ICElement.C_FIELD);
IField bB = (IField) xFieldChildren.get(0);
assertEquals(bB.getElementName(), new String("b")); //$NON-NLS-1$
checkElementOffset(bB);
assertEquals(bB.getTypeName(), new String("B")); //$NON-NLS-1$
checkLineNumbers(bB, 42, 42);
ASTAccessVisibility bVisibility = bB.getVisibility();
if (bVisibility != ASTAccessVisibility.PRIVATE)
fail("visibility should be private!"); //$NON-NLS-1$
// X ---> constructor chain: X
List xMethodChildren = classX.getChildrenOfType(ICElement.C_METHOD);
IMethod xconstructor = (IMethod) xMethodChildren.get(0);
assertEquals(xconstructor.getElementName(), new String("X")); //$NON-NLS-1$
checkElementOffset(xconstructor);
assertTrue (xconstructor.isConstructor());
checkLineNumbers(xconstructor, 46, 48);
// X ---> method declaration: doNothing
List xMethodDeclarations = classX.getChildrenOfType(ICElement.C_METHOD_DECLARATION);
IMethodDeclaration xDoNothing = (IMethodDeclaration) xMethodDeclarations.get(0);
assertEquals(xDoNothing.getElementName(), new String("doNothing")); //$NON-NLS-1$
checkElementOffset(xDoNothing);
assertEquals(xDoNothing.getReturnType(), new String("int")); //$NON-NLS-1$
checkLineNumbers(xDoNothing, 50, 50);
}
private void checkEnums(IParent namespace) throws CModelException{
// MyPackage ---> enum: Noname
List nsEnums = namespace.getChildrenOfType(ICElement.C_ENUMERATION);
IEnumeration enumarate = (IEnumeration) nsEnums.get(0);
assertEquals(enumarate.getElementName(), new String("")); //$NON-NLS-1$
checkElementOffset(enumarate);
checkLineNumbers(enumarate, 57, 61);
// enum ---> enumerator: first = 1
List enumEnumerators = enumarate.getChildrenOfType(ICElement.C_ENUMERATOR);
IEnumerator first = (IEnumerator) enumEnumerators.get(0);
assertEquals(first.getElementName(), new String("first")); //$NON-NLS-1$
assertEquals("1", first.getConstantExpression()); //$NON-NLS-1$
checkElementOffset(first);
// enum ---> enumerator: second
IEnumerator second = (IEnumerator) enumEnumerators.get(1);
assertEquals(second.getElementName(), new String("second")); //$NON-NLS-1$
checkElementOffset(second);
// enum ---> enumerator: third
IEnumerator third = (IEnumerator) enumEnumerators.get(2);
checkElementOffset(third);
assertEquals(third.getElementName(), new String("third")); //$NON-NLS-1$
checkElementOffset(third);
// MyPackage ---> enum: MyEnum
IEnumeration myEnum = (IEnumeration) nsEnums.get(1);
assertEquals(myEnum.getElementName(), new String("MyEnum")); //$NON-NLS-1$
checkElementOffset(myEnum);
checkLineNumbers(myEnum, 64, 67);
// enum ---> enumerator: first
List myEnumEnumerators = myEnum.getChildrenOfType(ICElement.C_ENUMERATOR);
IEnumerator f = (IEnumerator) myEnumEnumerators.get(0);
assertEquals(f.getElementName(), new String("f")); //$NON-NLS-1$
checkElementOffset(f);
// enum ---> enumerator: second
IEnumerator s = (IEnumerator) myEnumEnumerators.get(1);
assertEquals(s.getElementName(), new String("s")); //$NON-NLS-1$
checkElementOffset(s);
// enum ---> enumerator: third
IEnumerator t = (IEnumerator) myEnumEnumerators.get(2);
assertEquals(t.getElementName(), new String("t")); //$NON-NLS-1$
checkElementOffset(t);
}
private void checkVariables(IParent namespace) throws CModelException{
// MyPackage ---> int v
List nsVars = namespace.getChildrenOfType(ICElement.C_VARIABLE);
IVariable var1 = (IVariable) nsVars.get(0);
assertEquals(var1.getElementName(), new String("v")); //$NON-NLS-1$
checkElementOffset(var1);
assertEquals(var1.getTypeName(), new String("int")); //$NON-NLS-1$
checkLineNumbers(var1, 71, 71);
// MyPackage ---> unsigned long vuLong
IVariable var2 = (IVariable) nsVars.get(1);
assertEquals(var2.getElementName(), new String("vuLong")); //$NON-NLS-1$
checkElementOffset(var2);
assertEquals(var2.getTypeName(), new String("unsigned long")); //$NON-NLS-1$
checkLineNumbers(var2, 73, 73);
// MyPackage ---> unsigned short vuShort
IVariable var3 = (IVariable) nsVars.get(2);
assertEquals(var3.getElementName(), new String("vuShort")); //$NON-NLS-1$
checkElementOffset(var3);
assertEquals(var3.getTypeName(), new String("unsigned short")); //$NON-NLS-1$
checkLineNumbers(var3, 75, 75);
// MyPackage ---> function pointer: orig_malloc_hook
IVariable vDecl2 = (IVariable) nsVars.get(3);
assertEquals(vDecl2.getElementName(), new String("orig_malloc_hook")); //$NON-NLS-1$
checkElementOffset(vDecl2);
assertEquals(vDecl2.getTypeName(), new String ("void*(*)(const char*, int, int)")); //$NON-NLS-1$
checkLineNumbers(vDecl2, 81, 81);
}
private void checkVariableDeclarations(IParent namespace) throws CModelException{
// MyPackage ---> extern int evar
List nsVarDecls = namespace.getChildrenOfType(ICElement.C_VARIABLE_DECLARATION);
IVariableDeclaration vDecl1 = (IVariableDeclaration) nsVarDecls.get(0);
assertEquals(vDecl1.getElementName(), new String("evar")); //$NON-NLS-1$
checkElementOffset(vDecl1);
assertEquals(vDecl1.getTypeName(), new String("int")); //$NON-NLS-1$
checkLineNumbers(vDecl1, 79, 79);
}
private void checkFunctions(IParent namespace) throws CModelException{
List nsFunctionDeclarations = namespace.getChildrenOfType(ICElement.C_FUNCTION_DECLARATION);
// MyPackage ---> function: void foo()
IFunctionDeclaration f1 = (IFunctionDeclaration) nsFunctionDeclarations.get(0);
assertEquals(f1.getElementName(), new String("foo")); //$NON-NLS-1$
checkElementOffset(f1);
assertEquals(f1.getReturnType(), new String("void")); //$NON-NLS-1$
checkLineNumbers(f1, 85, 85);
// MyPackage ---> function: char* foo(int&, char**)
IFunctionDeclaration f2 = (IFunctionDeclaration) nsFunctionDeclarations.get(1);
assertEquals(f2.getElementName(), new String("foo")); //$NON-NLS-1$
checkElementOffset(f2);
assertEquals(f2.getReturnType(), new String("char*")); //$NON-NLS-1$
checkLineNumbers(f2, 87, 88);
int fooNumOfParam = f2.getNumberOfParameters();
if(fooNumOfParam != 2)
fail("foo should have two parameter!"); //$NON-NLS-1$
String[] paramTypes = f2.getParameterTypes();
assertEquals(paramTypes[0], new String("int&")); //$NON-NLS-1$
assertEquals(paramTypes[1], new String("char**")); //$NON-NLS-1$
// MyPackage ---> function: void boo() {}
List nsFunctions = namespace.getChildrenOfType(ICElement.C_FUNCTION);
IFunction f3 = (IFunction) nsFunctions.get(0);
assertEquals(f3.getElementName(), new String("boo")); //$NON-NLS-1$
checkElementOffset(f3);
assertEquals(f3.getReturnType(), new String("void")); //$NON-NLS-1$
checkLineNumbers(f3, 90, 92);
}
private void checkStructs(IParent namespace) throws CModelException{
// struct with name
List nsStructs = namespace.getChildrenOfType(ICElement.C_STRUCT);
IStructure struct1 = (IStructure) nsStructs.get(0);
assertEquals(struct1.getElementName(), new String ("MyStruct")); //$NON-NLS-1$
checkElementOffset(struct1);
checkLineNumbers(struct1, 95, 97);
List struct1Fields = struct1.getChildrenOfType(ICElement.C_FIELD);
IField field1 = (IField) struct1Fields.get(0);
assertEquals(field1.getElementName(), new String("sint")); //$NON-NLS-1$
checkElementOffset(field1);
assertEquals(field1.getTypeName(), new String("int")); //$NON-NLS-1$
checkLineNumbers(field1, 96, 96);
if(field1.getVisibility() != ASTAccessVisibility.PUBLIC)
fail("field visibility should be public!"); //$NON-NLS-1$
// struct no name
IStructure struct2;
List nsTypeDefs = namespace.getChildrenOfType(ICElement.C_TYPEDEF);
ITypeDef td = (ITypeDef) nsTypeDefs.get(1);
if (td instanceof IParent) {
// nested in typedef decl
struct2 = (IStructure) ((IParent)td).getChildren()[0];
} else {
struct2 = (IStructure) nsStructs.get(1);
}
assertEquals(struct2.getElementName(), new String ("")); //$NON-NLS-1$
checkElementOffset(struct2);
checkLineNumbers(struct2, 101, 103);
List struct2Fields = struct2.getChildrenOfType(ICElement.C_FIELD);
IField field2 = (IField) struct2Fields.get(0);
assertEquals(field2.getElementName(), new String("ss")); //$NON-NLS-1$
checkElementOffset(field2);
assertEquals(field2.getTypeName(), new String("int")); //$NON-NLS-1$
checkLineNumbers(field2, 102, 102);
if(field2.getVisibility() != ASTAccessVisibility.PUBLIC)
fail("field visibility should be public!"); //$NON-NLS-1$
// typedefs
ITypeDef td1 = (ITypeDef) nsTypeDefs.get(0);
assertEquals(td1.getElementName(), new String ("myStruct")); //$NON-NLS-1$
checkElementOffset(td1);
assertEquals(td1.getTypeName(), new String ("struct MyStruct")); //$NON-NLS-1$
checkLineNumbers(td1, 99, 99);
ITypeDef td2 = (ITypeDef) nsTypeDefs.get(1);
assertEquals(td2.getElementName(), new String ("myTypedef")); //$NON-NLS-1$
checkElementOffset(td2);
assertEquals(td2.getTypeName(), new String ("struct")); //$NON-NLS-1$
checkLineNumbers(td2, 103, 103);
// union
List nsUnions = namespace.getChildrenOfType(ICElement.C_UNION);
IStructure u0 = (IStructure) nsUnions.get(0);
assertEquals(u0.getElementName(), new String("U")); //$NON-NLS-1$
checkElementOffset(u0);
checkLineNumbers(u0, 105, 107);
List u0Fields = u0.getChildrenOfType(ICElement.C_FIELD);
IField field3 = (IField) u0Fields.get(0);
assertEquals(field3.getElementName(), new String("U1")); //$NON-NLS-1$
checkElementOffset(field3);
assertEquals(field3.getTypeName(), new String("int")); //$NON-NLS-1$
checkLineNumbers(field3, 106, 106);
if(field3.getVisibility() != ASTAccessVisibility.PUBLIC)
fail("field visibility should be public!"); //$NON-NLS-1$
}
private void checkTemplates(IParent namespace) throws CModelException{
// template function
List functionTemplates = namespace.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION_DECLARATION);
IFunctionTemplateDeclaration ft = (IFunctionTemplateDeclaration)functionTemplates.get(0);
assertEquals(ft.getElementName(), new String("aTemplatedFunction")); //$NON-NLS-1$
checkElementOffset(ft);
ft.getTemplateSignature();
assertEquals(ft.getTemplateSignature(), new String("aTemplatedFunction<A, B>(B) : A")); //$NON-NLS-1$
checkLineNumbers(ft, 112, 113);
// template method
List nsClasses = namespace.getChildrenOfType(ICElement.C_CLASS);
IStructure enclosingClass = (IStructure) nsClasses.get(1);
checkLineNumbers(enclosingClass, 115, 120);
List methodTemplates = enclosingClass.getChildrenOfType(ICElement.C_TEMPLATE_METHOD_DECLARATION);
IMethodTemplateDeclaration mt = (IMethodTemplateDeclaration)methodTemplates.get(0);
assertEquals(mt.getElementName(), new String("aTemplatedMethod")); //$NON-NLS-1$
checkElementOffset(mt);
assertEquals(mt.getTemplateSignature(), new String("aTemplatedMethod<A, B>(B) : A")); //$NON-NLS-1$
checkLineNumbers(mt, 118, 119 );
assertEquals(mt.getVisibility(), ASTAccessVisibility.PUBLIC);
// template class
List classTemplates = namespace.getChildrenOfType(ICElement.C_TEMPLATE_CLASS);
IStructureTemplate ct = (IStructureTemplate)classTemplates.get(0);
assertEquals(ct.getElementName(), new String("myarray")); //$NON-NLS-1$
checkElementOffset(ct);
assertEquals(ct.getTemplateSignature(), new String("myarray<T, Tibor>")); //$NON-NLS-1$
checkLineNumbers(ct, 122, 123);
// template struct
List structTemplates = namespace.getChildrenOfType(ICElement.C_TEMPLATE_STRUCT);
IStructureTemplate st = (IStructureTemplate)structTemplates.get(0);
assertEquals(st.getElementName(), new String("mystruct")); //$NON-NLS-1$
checkElementOffset(st);
assertEquals(st.getTemplateSignature(), new String("mystruct<T, Tibor>")); //$NON-NLS-1$
checkLineNumbers(st, 125, 126);
// moved to failed tests
// also commented in the source file
// template variable
// ArrayList variableTemplates = namespace.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE);
// VariableTemplate vt = (VariableTemplate)variableTemplates.get(0);
// assertEquals(vt.getElementName(), new String("default_alloc_template<__threads,__inst>::_S_start_free"));
// checkElementOffset((CElement)mac1);
// assertEquals(vt.getTemplateSignature(), new String("default_alloc_template<__threads,__inst>::_S_start_free<bool, int> : char*"));
// checkLineNumbers((CElement)vt, 128, 129);
}
private void checkArrays(IParent tu) throws CModelException{
// array variable
List variables = tu.getChildrenOfType(ICElement.C_VARIABLE);
IVariable arrayVar = (IVariable) variables.get(0);
assertEquals(arrayVar.getElementName(), new String("myArray")); //$NON-NLS-1$
checkElementOffset(arrayVar);
assertEquals(arrayVar.getTypeName(), new String("int[][]")); //$NON-NLS-1$
checkLineNumbers(arrayVar, 133, 133);
// array parameter in function main
List functions = tu.getChildrenOfType(ICElement.C_FUNCTION);
IFunction mainFunction = (IFunction) functions.get(0);
assertEquals(mainFunction.getElementName(), new String("main")); //$NON-NLS-1$
checkElementOffset(mainFunction);
assertEquals(mainFunction.getReturnType(), new String("int")); //$NON-NLS-1$
checkLineNumbers(mainFunction, 134, 136);
int NumOfParam = mainFunction.getNumberOfParameters();
if(NumOfParam != 2)
fail("main should have two parameter!"); //$NON-NLS-1$
String[] paramTypes = mainFunction.getParameterTypes();
assertEquals(paramTypes[0], new String("int")); //$NON-NLS-1$
assertEquals(paramTypes[1], new String("char*[]")); //$NON-NLS-1$
}
private void checkLineNumbers(ICElement element, int startLine, int endLine) throws CModelException {
ISourceRange range = ((ISourceReference)element).getSourceRange();
assertEquals(startLine, range.getStartLine());
assertEquals(endLine, range.getEndLine());
}
private void checkElementOffset(ICElement element) throws CModelException{
String name = element.getElementName();
ISourceRange range = ((ISourceReference)element).getSourceRange();
if(name.length() > 0 ){
assertTrue (range.getStartPos() <= range.getIdStartPos());
assertEquals (range.getIdLength(), name.length());
} else {
assertEquals (range.getStartPos(), range.getIdStartPos());
if (element instanceof ITypeDef)
assertEquals (range.getIdLength(), ((ITypeDef)element).getTypeName().length());
else if(element instanceof IEnumeration)
assertEquals (range.getIdLength(), ((IEnumeration)element).getTypeName().length());
else if(element instanceof IStructure)
assertEquals (range.getIdLength(), ((IStructure)element).getTypeName().length());
}
}
}