/*******************************************************************************
* Copyright (c) 2005, 2012 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.model.tests;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.IField;
import org.eclipse.cdt.core.model.IMethodDeclaration;
import org.eclipse.cdt.core.model.IStructure;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
/**
* @author bnicolle
*/
public class IStructureTests extends IntegratedCModelTest {
/**
* @param name
*/
public IStructureTests(String name) {
super(name);
}
/**
* @see org.eclipse.cdt.internal.core.model.IntegratedCModelTest
*/
@Override
public String getSourcefileSubdir() {
return "resources/cmodel/";
}
/**
* @see org.eclipse.cdt.internal.core.model.IntegratedCModelTest
*/
@Override
public String getSourcefileResource() {
return "IStructure.cpp";
}
/**
* @returns a test suite named after this class
* containing all its public members named "test*"
*/
public static Test suite() {
TestSuite suite= new TestSuite(IStructureTests.class.getName());
// TODO check C-only behaviour using C_NATURE vs CC_NATURE
// Interface tests:
suite.addTest(new IStructureTests("testGetChildrenOfTypeStruct"));
suite.addTest(new IStructureTests("testGetChildrenOfTypeClass")); // C++ only
suite.addTest(new IStructureTests("testGetFields"));
//Bug# 38985: solved. suite.addTest(new IStructureTests("testGetFieldsHack"));
suite.addTest(new IStructureTests("testGetField"));
suite.addTest(new IStructureTests("testGetMethods")); // C++ only
//Bug# 38985: solved. suite.addTest(new IStructureTests("testGetMethodsHack")); // C++ only
suite.addTest(new IStructureTests("testGetMethod")); // C++ only
suite.addTest(new IStructureTests("testIsStruct"));
suite.addTest(new IStructureTests("testIsClass")); // C++ only
suite.addTest(new IStructureTests("testIsUnion"));
suite.addTest(new IStructureTests("testIsAbstract")); // C++ only
suite.addTest(new IStructureTests("testGetBaseTypes")); // C++ only
suite.addTest(new IStructureTests("testGetAccessControl")); // C++ only
// Language Specification tests:
suite.addTest(new IStructureTests("testAnonymousStructObject"));
suite.addTest(new IStructureTests("testInnerStruct"));
return suite;
}
public void testGetChildrenOfTypeStruct() throws CModelException {
ITranslationUnit tu = getTU();
List arrayStructs = tu.getChildrenOfType(ICElement.C_STRUCT);
String[] myExpectedStructs = {
"testStruct1", "testStruct2", "testStruct3", "testStruct4NoSemicolon",
/* 2 anonymous structs */ "", "", "testStruct7",
"testStruct8"
};
assertEquals(myExpectedStructs.length,arrayStructs.size());
for (int i= 0; i < myExpectedStructs.length; i++) {
IStructure myIStruct = (IStructure) arrayStructs.get(i);
assertNotNull("Failed on " + i, myIStruct);
assertEquals(myExpectedStructs[i], myIStruct.getElementName());
}
}
public void testGetChildrenOfTypeClass() throws CModelException {
ITranslationUnit tu = getTU();
List arrayClasses = tu.getChildrenOfType(ICElement.C_CLASS);
String[] myExpectedClasses = {
"testClass1", "testClass2NoSemicolon", "testClass3", "testClass4Abstract",
"testClass5", "testClass6" };
assertEquals(myExpectedClasses.length,arrayClasses.size());
for (int i= 0; i < myExpectedClasses.length; i++) {
IStructure myIStruct = (IStructure) arrayClasses.get(i);
assertNotNull("Failed on " + i, myIStruct);
assertEquals(myExpectedClasses[i], myIStruct.getElementName());
}
}
public void testGetFields() throws CModelException {
ITranslationUnit tu = getTU();
List myArrayStructs = tu.getChildrenOfType(ICElement.C_STRUCT);
IStructure myIStruct = (IStructure) myArrayStructs.get(0);
IField[] myArrayIField = myIStruct.getFields();
String[] myExpectedFields = {
"m_field1","m_field2","m_field3",
"m_field4","m_field5","m_field6",
};
assertEquals(myExpectedFields.length, myArrayIField.length);
for (int i= 0; i < myArrayIField.length; i++) {
assertNotNull("Failed on " + i, myArrayIField[i]);
assertEquals("Failed on " + i,
myExpectedFields[i], myArrayIField[i].getElementName());
}
}
// TODO Bug# 38985: remove testGetFieldsHack()
public void testGetFieldsHack() throws CModelException {
ITranslationUnit tu = getTU();
List myArrayStructs = tu.getChildrenOfType(ICElement.C_STRUCT);
IStructure myIStruct = (IStructure) myArrayStructs.get(0);
String[] myExpectedFields = {
"m_field1","m_field2","m_field3",
"m_field4","m_field5","m_field6",
};
List myArrayIField = myIStruct.getChildrenOfType(ICElement.C_FIELD);
assertEquals(myExpectedFields.length, myArrayIField.size());
for (int i= 0; i < myArrayIField.size(); i++) {
IField myIField = (IField) myArrayIField.get(i);
assertNotNull("Failed on " + i, myIField);
assertEquals("Failed on " + i,
myExpectedFields[i], myIField.getElementName());
}
}
public void testGetField() throws CModelException {
ITranslationUnit tu = getTU();
List myArrayStructs = tu.getChildrenOfType(ICElement.C_STRUCT);
IStructure myIStruct = (IStructure) myArrayStructs.get(0);
String[] myExpectedFields = {
"m_field1","m_field2","m_field3",
"m_field4","m_field5","m_field6",
};
for (int i= 0; i < myExpectedFields.length; i++) {
IField myIField = myIStruct.getField(myExpectedFields[i]);
assertNotNull("Failed on " + i, myIField);
}
String[] myUnexpectedFields = {
"m_field7","m_field8","m_field9",
};
for (int i= 0; i < myUnexpectedFields.length; i++) {
IField myIField = myIStruct.getField(myUnexpectedFields[i]);
assertNull("Failed on " + i, myIField);
}
}
public void testGetMethods() throws CModelException {
ITranslationUnit tu = getTU();
List myArrayStructs = tu.getChildrenOfType(ICElement.C_STRUCT);
IStructure myIStruct = (IStructure) myArrayStructs.get(0);
IMethodDeclaration[] myArrayIMethod = myIStruct.getMethods();
String[] myExpectedMethods = {
"method1","method2","testStruct1","~testStruct1"
};
assertEquals(myExpectedMethods.length, myArrayIMethod.length);
for (int i= 0; i < myArrayIMethod.length; i++) {
assertNotNull("Failed on " + i, myArrayIMethod[i]);
assertEquals("Failed on " + i,
myExpectedMethods[i], myArrayIMethod[i].getElementName());
}
}
// TODO Bug# 38985: remove testGetMethodsHack()
public void testGetMethodsHack() throws CModelException {
ITranslationUnit tu = getTU();
List myArrayStructs = tu.getChildrenOfType(ICElement.C_STRUCT);
IStructure myIStruct = (IStructure) myArrayStructs.get(0);
List myArrayIMethod = myIStruct.getChildrenOfType(ICElement.C_METHOD_DECLARATION);
myArrayIMethod.addAll(myIStruct.getChildrenOfType(ICElement.C_METHOD));
String[] myExpectedMethods = {
"method1","method2","testStruct1","~testStruct1"
};
assertEquals(myExpectedMethods.length, myArrayIMethod.size());
for (int i= 0; i < myArrayIMethod.size(); i++) {
IMethodDeclaration myIMethod = (IMethodDeclaration) myArrayIMethod.get(i);
assertNotNull("Failed on " + i, myIMethod);
assertEquals("Failed on " + i,
myExpectedMethods[i], myIMethod.getElementName());
}
}
public void testGetMethod() throws CModelException {
ITranslationUnit tu = getTU();
List myArrayStructs = tu.getChildrenOfType(ICElement.C_STRUCT);
IStructure myIStruct = (IStructure) myArrayStructs.get(0);
String[] myExpectedMethods = {
"method1","method2","testStruct1","~testStruct1"
};
for (int i= 0; i < myExpectedMethods.length; i++) {
IMethodDeclaration myIMethod = myIStruct.getMethod(myExpectedMethods[i]);
assertNotNull("Failed on " + i, myIMethod);
}
String[] myUnexpectedMethods = {
"method7","method8","method9",
};
for (int i= 0; i < myUnexpectedMethods.length; i++) {
IMethodDeclaration myIMethod = myIStruct.getMethod(myUnexpectedMethods[i]);
assertNull("Failed on " + i, myIMethod);
}
}
public void testIsUnion() throws CModelException {
ITranslationUnit tu = getTU();
ICElement myElementUnion = null;
ICElement myElementNonUnion = null;
try {
myElementUnion = tu.getElement("testUnion1");
myElementNonUnion = tu.getElement("testStruct1");
} catch (CModelException e) {
assertNotNull("CModelException thrown", e);
}
assertNotNull(myElementUnion);
assertTrue(myElementUnion.getElementType() == ICElement.C_UNION);
IStructure myStructUnion = (IStructure) myElementUnion;
assertNotNull(myStructUnion);
assertTrue(myStructUnion.isUnion());
assertNotNull(myElementNonUnion);
assertTrue(myElementNonUnion.getElementType() != ICElement.C_UNION);
IStructure myStructNonUnion = (IStructure) myElementNonUnion;
assertNotNull(myStructNonUnion);
assertFalse(myStructNonUnion.isUnion());
}
public void testIsStruct() throws CModelException {
ITranslationUnit tu = getTU();
ICElement myElementStruct = null;
ICElement myElementNonStruct = null;
try {
myElementStruct = tu.getElement("testStruct1");
myElementNonStruct = tu.getElement("testClass1");
} catch (CModelException e) {
assertNotNull("CModelException thrown", e);
}
assertNotNull(myElementStruct);
assertTrue(myElementStruct.getElementType() == ICElement.C_STRUCT);
IStructure myStructStruct = (IStructure) myElementStruct;
assertNotNull(myStructStruct);
assertTrue(myStructStruct.isStruct());
assertNotNull(myElementNonStruct);
assertTrue(myElementNonStruct.getElementType() != ICElement.C_STRUCT);
IStructure myStructNonStruct = (IStructure) myElementNonStruct;
assertNotNull(myStructNonStruct);
assertFalse(myStructNonStruct.isStruct());
}
public void testIsClass() throws CModelException {
ITranslationUnit tu = getTU();
ICElement myElementClass = null;
ICElement myElementNonClass = null;
try {
myElementClass = tu.getElement("testClass1");
myElementNonClass = tu.getElement("testStruct1");
} catch (CModelException e) {
assertNotNull("CModelException thrown", e);
}
assertNotNull(myElementClass);
assertTrue(myElementClass.getElementType() == ICElement.C_CLASS);
IStructure myStructClass = (IStructure) myElementClass;
assertNotNull(myStructClass);
assertTrue(myStructClass.isClass());
assertNotNull(myElementNonClass);
assertTrue(myElementNonClass.getElementType() != ICElement.C_CLASS);
IStructure myStructNonClass = (IStructure) myElementNonClass;
assertNotNull(myStructNonClass);
assertFalse(myStructNonClass.isClass());
}
public void testIsAbstract() throws CModelException {
ITranslationUnit tu = getTU();
ICElement myElementAbstract = null;
ICElement myElementNonAbstract = null;
try {
myElementAbstract = tu.getElement("testClass4Abstract");
myElementNonAbstract = tu.getElement("testClass1");
} catch (CModelException e) {
assertNotNull("CModelException thrown", e);
}
assertNotNull(myElementAbstract);
assertTrue(myElementAbstract.getElementType() == ICElement.C_CLASS);
IStructure myStructAbstract = (IStructure) myElementAbstract;
assertNotNull(myStructAbstract);
assertTrue(myStructAbstract.isAbstract());
assertNotNull(myElementNonAbstract);
assertTrue(myElementNonAbstract.getElementType() == ICElement.C_CLASS);
IStructure myStructNonAbstract = (IStructure) myElementNonAbstract;
assertNotNull(myStructNonAbstract);
assertFalse(myStructNonAbstract.isAbstract());
}
// IInheritance
public void testGetBaseTypes() throws CModelException {
ITranslationUnit tu = getTU();
ICElement myElementDerived = null;
String[] myBaseTypes = null;
try {
myElementDerived = tu.getElement("testClass5"); // throws
assertNotNull(myElementDerived);
assertTrue(myElementDerived.getElementType() == ICElement.C_CLASS);
IStructure myStructDerived = (IStructure) myElementDerived;
assertNotNull(myStructDerived);
myBaseTypes = myStructDerived.getSuperClassesNames();
} catch (CModelException e) {
assertNotNull("CModelException thrown", e);
}
String[] myExpectedBaseTypes = {
"testClass1", "testClass3","testClass4Abstract"
};
assertEquals(myExpectedBaseTypes.length, myBaseTypes.length);
for (int i= 0; i < myBaseTypes.length; i++) {
assertEquals("Failed on " + i, myExpectedBaseTypes[i], myBaseTypes[i]);
}
}
// IInheritance
public void testGetAccessControl() throws CModelException {
ITranslationUnit tu = getTU();
ICElement myElementDerived = null;
String[] myBaseTypes = null;
try {
myElementDerived = tu.getElement("testClass5"); // throws
assertNotNull(myElementDerived);
assertTrue(myElementDerived.getElementType() == ICElement.C_CLASS);
IStructure myStructDerived = (IStructure) myElementDerived;
assertNotNull(myStructDerived);
myBaseTypes = myStructDerived.getSuperClassesNames();
ASTAccessVisibility[] myExpectedAccessControl = {
// TODO #38986: expect appropriate access control tags
ASTAccessVisibility.PUBLIC,
ASTAccessVisibility.PROTECTED,
ASTAccessVisibility.PRIVATE
};
assertEquals(myExpectedAccessControl.length, myBaseTypes.length);
for (int i= 0; i < myBaseTypes.length; i++) {
ASTAccessVisibility myAccessControl = myStructDerived.getSuperClassAccess(myBaseTypes[i]);
assertEquals("Failed on " + i, myExpectedAccessControl[i], myAccessControl);
}
} catch (CModelException e) {
assertNotNull("CModelException thrown", e);
}
}
// getStructureInfo
public void testGetStructureInfo() {
}
// TODO: Not tested; Bug# 38958. public void testGetInitializer()
// TODO: Not tested; Bug# 38958. public void testGetTypeName()
// TODO: Not tested; Bug# 38958. public void testIsConst()
// TODO: Not tested; Bug# 38958. public void testIsStatic()
// TODO: Not tested; Bug# 38958. public void testIsVolatile()
// TODO: Not tested; Bug# 38958. public void testGetAccessControl_Void()
//
// Language Specification Tests
//
public void testAnonymousStructObject() throws CModelException {
ITranslationUnit tu = getTU();
ICElement myElement = null;
try {
myElement = tu.getElement("testAnonymousStructObject1");
} catch (CModelException e) {
assertNotNull("CModelException thrown", e);
}
assertNotNull(myElement);
assertEquals(ICElement.C_VARIABLE, myElement.getElementType());
}
public void testInnerStruct() throws CModelException {
ITranslationUnit tu = getTU();
ICElement myElement = null;
try {
myElement = tu.getElement("testStruct8");
} catch (CModelException e) {
assertNotNull("CModelException thrown", e);
}
assertNotNull(myElement);
IStructure myIStruct = (IStructure) myElement;
assertNotNull(myIStruct);
String[] myExpectedInnerStructs = {
"testStruct9Inner", "testStruct10Inner"
};
List myInnerStructs = myIStruct.getChildrenOfType(ICElement.C_STRUCT);
assertEquals(myExpectedInnerStructs.length, myInnerStructs.size());
for (int i= 0; i < myExpectedInnerStructs.length; i++) {
IStructure myInnerStruct = (IStructure) myInnerStructs.get(i);
assertNotNull("Failed on " + i, myInnerStruct);
assertEquals("Failed on " + i, myExpectedInnerStructs[i], myInnerStruct.getElementName());
}
}
}