/******************************************************************************* * 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.ArrayList; 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.ITemplate; import org.eclipse.cdt.core.model.ITranslationUnit; /** * @author hamer * */ public class StructuralTemplateTests extends ITemplateTests { /** * @param name */ public StructuralTemplateTests(String name) { super(name); } public static Test suite() { TestSuite suite= new TestSuite( StructuralTemplateTests.class.getName() ); // Interface tests: suite.addTest( new StructuralTemplateTests("testGetChildrenOfTypeTemplate")); suite.addTest( new StructuralTemplateTests("testGetNumberOfTemplateParameters")); suite.addTest( new StructuralTemplateTests("testGetTemplateParameterTypes")); suite.addTest( new StructuralTemplateTests("testGetTemplateSignature")); return suite; } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.tests.ITemplateTests#testGetChildrenOfTypeTemplate() */ @Override public void testGetChildrenOfTypeTemplate() throws CModelException { setStructuralParse(true); ITranslationUnit tu = getTU(); { List arrayElements = tu.getChildrenOfType(ICElement.C_TEMPLATE_STRUCT); String[] myExpectedValues = { "Map" }; assertEquals(myExpectedValues.length, arrayElements.size()); for(int i=0; i<myExpectedValues.length; i++) { ICElement celement = (ICElement) arrayElements.get(i); ITemplate myITemplate = (ITemplate)celement; assertNotNull( "Failed on "+i, myITemplate); assertEquals("Failed on "+i, myExpectedValues[i], celement.getElementName()); } } { List arrayElements = tu.getChildrenOfType(ICElement.C_TEMPLATE_CLASS); String[] myExpectedValues = { "nonVector" }; assertEquals(myExpectedValues.length, arrayElements.size()); for(int i=0; i<myExpectedValues.length; i++) { ICElement celement = (ICElement) arrayElements.get(i); ITemplate myITemplate = (ITemplate)celement; assertNotNull( "Failed on "+i, myITemplate); assertEquals("Failed on "+i, myExpectedValues[i], celement.getElementName()); } } { List arrayElements = tu.getChildrenOfType(ICElement.C_TEMPLATE_UNION); String[] myExpectedValues = { "ArrayOverlay" }; assertEquals(myExpectedValues.length, arrayElements.size()); for(int i=0; i<myExpectedValues.length; i++) { ICElement celement = (ICElement) arrayElements.get(i); ITemplate myITemplate = (ITemplate)celement; assertNotNull( "Failed on "+i, myITemplate); assertEquals("Failed on "+i, myExpectedValues[i], celement.getElementName()); } } { // Methods and Functions are tested together as // Function declarations in Quick Parse mode // are considered Method Declarations in Structural parse mode List arrayElements = getTemplateMethods(tu); arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_METHOD)); arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION)); arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION_DECLARATION)); String[] myExpectedValues = { "fum", "scrum", "nonVector<T>::first", "Foo::fum", "IsGreaterThan", }; assertEquals(myExpectedValues.length, arrayElements.size()); for(int i=0; i<myExpectedValues.length; i++) { ICElement celement = (ICElement) arrayElements.get(i); ITemplate myITemplate = (ITemplate)celement; assertNotNull( "Failed on "+i, myITemplate); assertEquals("Failed on "+i, myExpectedValues[i], celement.getElementName()); } } } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.tests.ITemplateTests#testGetNumberOfTemplateParameters() */ @Override public void testGetNumberOfTemplateParameters() throws CModelException { setStructuralParse(true); ITranslationUnit tu = getTU(); ArrayList arrayElements = new ArrayList(); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_STRUCT ) ); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_CLASS ) ); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_UNION ) ); arrayElements.addAll( getTemplateMethods(tu) ); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION ) ); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION_DECLARATION ) ); arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_METHOD)); // TEMPLATE_VARIABLE moved to failed tests //arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE ) ); int[] myExpectedNumbers = { // 3,1,3,1,1,3 3,1,3,1,1,1,1,1/*,2*/ }; assertEquals(myExpectedNumbers.length, arrayElements.size()); for(int i=0; i<myExpectedNumbers.length; i++) { ITemplate myTemplate = (ITemplate) arrayElements.get(i); assertNotNull( "Failed on "+i, myTemplate ); assertEquals( "Failed on "+i, myExpectedNumbers[i], myTemplate.getNumberOfTemplateParameters()); } } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.tests.ITemplateTests#testGetTemplateParameterTypes() */ @Override public void testGetTemplateParameterTypes() throws CModelException { setStructuralParse(true); ITranslationUnit tu = getTU(); ArrayList arrayElements = new ArrayList(); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_STRUCT ) ); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_CLASS ) ); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_UNION ) ); arrayElements.addAll( getTemplateMethods(tu) ); arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_METHOD)); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION ) ); arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION_DECLARATION)); // TEMPLATE_VARIABLE moved to failed tests //arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE ) ); String[][] myExpectedValues = { //"Map" {"Key", "Value", "SortAlgorithm"}, //"nonVector" {"T"}, //"ArrayOverlay" {"X","Y","int=16"}, //"TemplateContainer::fum" {"Bar"}, //"TemplateParameter::scrum" {"int"}, //"nonVector::first" {"T"}, //"Foo::fum" {"Bar"}, //"IsGreaterThan" {"X"}, /* //"default_alloc_template::S_start_free" {"bool", "int"},*/ }; assertEquals(myExpectedValues.length, arrayElements.size()); for(int i=0; i<myExpectedValues.length; i++) { ITemplate myTemplate = (ITemplate) arrayElements.get(i); assertNotNull( "Failed on "+i, myTemplate ); String[] myExpectedParams = myExpectedValues[i]; String[] myParams = myTemplate.getTemplateParameterTypes(); assertEquals( "Failed on "+i, myExpectedParams.length, myParams.length ); for(int j=0; j<myExpectedParams.length; j++) { assertEquals( "Failed on "+i+","+j, myExpectedParams[j], myParams[j] ); } } } /* (non-Javadoc) * @see org.eclipse.cdt.core.model.tests.ITemplateTests#testGetTemplateSignature() */ @Override public void testGetTemplateSignature() throws CModelException { setStructuralParse(true); ITranslationUnit tu = getTU(); ArrayList arrayElements = new ArrayList(); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_STRUCT ) ); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_CLASS ) ); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_UNION ) ); arrayElements.addAll( getTemplateMethods(tu) ); arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_METHOD)); arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION ) ); arrayElements.addAll(tu.getChildrenOfType(ICElement.C_TEMPLATE_FUNCTION_DECLARATION)); // TEMPLATE_VARIABLE moved to failed tests //arrayElements.addAll( tu.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE ) ); String[] myExpectedValues = { "Map<Key, Value, SortAlgorithm>", "nonVector<T>", "ArrayOverlay<X, Y, int=16>", "fum<Bar>(int) : void", "scrum<int>(void) : void", // TODO: deduce the rules of () versus (void), compare below. "nonVector<T>::first<T>() const : const T&", // TODO: where should <T> be? "Foo::fum<Bar>(int) : void", "IsGreaterThan<X>(X, X) : bool", /*"default_alloc_template<threads,inst>::S_start_free<bool, int> : char*",*/ }; assertEquals(myExpectedValues.length, arrayElements.size()); for(int i=0; i<myExpectedValues.length; i++) { ITemplate myTemplate = (ITemplate) arrayElements.get(i); assertNotNull( "Failed on "+i, myTemplate ); assertEquals( "Failed on "+i, myExpectedValues[i], myTemplate.getTemplateSignature() ); } } }