/*******************************************************************************
 *  Copyright (c) 2005, 2008 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
 *******************************************************************************/
/*
 * Created on Jun 9, 2003
 * by bnicolle
 */
package org.eclipse.cdt.core.model.tests;

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.IFunction;
import org.eclipse.cdt.core.model.IFunctionDeclaration;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.ITypeDef;
import org.eclipse.cdt.core.model.IVariable;


/**
 * @author bnicolle
 *
 */
public class DeclaratorsTests extends IntegratedCModelTest {
	/**
	 * @param name
	 */
	public DeclaratorsTests(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 "DeclaratorsTests.cpp";
	}
	
	/**
	 * @returns a test suite named after this class
	 *          containing all its public members named "test*"
	 */
	public static Test suite() {
		TestSuite suite= new TestSuite(DeclaratorsTests.class);
		return suite;
	}


    public void testDeclarators_0001() throws CModelException {
        ITranslationUnit tu = getTU();
        ICElement element = tu.getElement("decl_0001");
        assertNotNull(element);
        assertEquals(element.getElementType(), ICElement.C_FUNCTION_DECLARATION);
        IFunctionDeclaration decl = (IFunctionDeclaration)element;
        assertEquals(decl.getSignature(), "decl_0001(char)");
        assertEquals(decl.getReturnType(), "void");
    }

    public void testDeclarators_0002() throws CModelException {
        ITranslationUnit tu = getTU();
        ICElement element = tu.getElement("decl_0002");
        assertNotNull(element);
        assertEquals(element.getElementType(), ICElement.C_FUNCTION_DECLARATION);
        IFunctionDeclaration decl = (IFunctionDeclaration)element;
        assertEquals(decl.getSignature(), "decl_0002(char)");
        assertEquals(decl.getReturnType(), "void");
    }

	public void testDeclarators_0003() throws CModelException {
		ITranslationUnit tu = getTU();
		ICElement element = tu.getElement("decl_0003");
		assertNotNull(element); 
		assertEquals(element.getElementType(), ICElement.C_FUNCTION_DECLARATION);
		IFunctionDeclaration decl = (IFunctionDeclaration)element;
		assertEquals(decl.getSignature(), "decl_0003(char)");
		assertEquals(decl.getReturnType(), "void");
	  }
	  
    public void testDeclarators_0004() throws CModelException {
        ITranslationUnit tu = getTU();
        ICElement element = tu.getElement("decl_0004");
        assertNotNull(element);
        assertEquals(element.getElementType(), ICElement.C_FUNCTION_DECLARATION);
        IFunctionDeclaration decl = (IFunctionDeclaration)element;
        assertEquals(decl.getSignature(), "decl_0004(char)");
        assertEquals(decl.getReturnType(), "void*");
    }

    public void testDeclarators_0005() throws CModelException {
        ITranslationUnit tu = getTU();
        ICElement element = tu.getElement("decl_0005");
        assertNotNull(element);
        assertEquals(element.getElementType(), ICElement.C_VARIABLE);
        IVariable decl = (IVariable)element;
        assertEquals(decl.getTypeName(), "void(*)(char)");
    }

	public void testDeclarators_0006() throws CModelException {
		ITranslationUnit tu = getTU();
		ICElement element = tu.getElement("decl_0006");
		assertNotNull(element);
		assertEquals(element.getElementType(), ICElement.C_VARIABLE);
		IVariable decl = (IVariable)element;
		assertEquals(decl.getTypeName(), "void(*)(char)");
	}

	public void testDeclarators_0007() throws CModelException {
		ITranslationUnit tu = getTU();
		ICElement element = tu.getElement("decl_0007");
		assertNotNull(element);
		assertEquals(element.getElementType(), ICElement.C_VARIABLE);
		IVariable decl = (IVariable)element;
		assertEquals(decl.getTypeName(), "void(*)(char)");
	}


	public void testDeclarators_0011() throws CModelException {
		ITranslationUnit tu = getTU();
		ICElement element = tu.getElement("decl_0011");
		assertNotNull(element);
		assertEquals(element.getElementType(), ICElement.C_TYPEDEF);
		ITypeDef decl = (ITypeDef)element;
		assertEquals(decl.getTypeName(), "void(char)");
	}

	public void testDeclarators_0012() throws CModelException {
		ITranslationUnit tu = getTU();
		ICElement element = tu.getElement("decl_0012");
		assertNotNull(element);
		assertEquals(element.getElementType(), ICElement.C_TYPEDEF);
		ITypeDef decl = (ITypeDef)element;
		assertEquals(decl.getTypeName(), "void(char)");
	}

	public void testDeclarators_0013() throws CModelException {
		ITranslationUnit tu = getTU();
		ICElement element = tu.getElement("decl_0013");
		assertNotNull(element);
		assertEquals(element.getElementType(), ICElement.C_TYPEDEF);
		ITypeDef decl = (ITypeDef)element;
		assertEquals(decl.getTypeName(), "void(char)");
	}

	public void testDeclarators_0014() throws CModelException {
		ITranslationUnit tu = getTU();
		ICElement element = tu.getElement("decl_0014");
		assertNotNull(element);
		assertEquals(element.getElementType(), ICElement.C_TYPEDEF);
		ITypeDef decl = (ITypeDef)element;
		assertEquals(decl.getTypeName(), "void*(char)");
	}

    public void testDeclarators_0015() throws CModelException {
    	ITranslationUnit tu = getTU();
    	ICElement element = tu.getElement("decl_0015");
    	assertNotNull(element);
    	assertEquals(element.getElementType(), ICElement.C_TYPEDEF);
    	ITypeDef decl = (ITypeDef)element;
    	assertEquals(decl.getTypeName(), "void(*)(char)");
    }
    
	public void testDeclarators_0016() throws CModelException {
		ITranslationUnit tu = getTU();
		ICElement element = tu.getElement("decl_0016");
		assertNotNull(element);
		assertEquals(element.getElementType(), ICElement.C_TYPEDEF);
		ITypeDef decl = (ITypeDef)element;
		assertEquals(decl.getTypeName(), "void(*)(char)");
	}

	public void testDeclarators_0017() throws CModelException {
		ITranslationUnit tu = getTU();
		ICElement element = tu.getElement("decl_0017");
		assertNotNull(element);
		assertEquals(element.getElementType(), ICElement.C_TYPEDEF);
		ITypeDef decl = (ITypeDef)element;
		assertEquals(decl.getTypeName(), "void(*)(char)");
	}
	    
	public void testDeclarators_0023() throws CModelException {
		ITranslationUnit tu = getTU();
		ICElement element = tu.getElement("decl_0023");
		assertNotNull(element);
		assertEquals(element.getElementType(), ICElement.C_FUNCTION);
		IFunction decl = (IFunction)element;
		assertEquals(decl.getSignature(), "decl_0023(int)");
		assertEquals(decl.getReturnType(), "void(**)(char)");
	}    

	public void testDeclarators_0024() throws CModelException {
		ITranslationUnit tu = getTU();
		ICElement element = tu.getElement("decl_0024");
		assertNotNull(element);
		assertEquals(element.getElementType(), ICElement.C_VARIABLE);
		IVariable decl = (IVariable)element;
		assertEquals(decl.getTypeName(), "void(*(*(*)(int))(float))(char)");
	}    

    public void testDeclarators_0031() throws CModelException {
    	ITranslationUnit tu = getTU();
    	ICElement element = tu.getElement("decl_0031");
    	assertNotNull(element);
    	assertEquals(element.getElementType(), ICElement.C_VARIABLE);
    	IVariable decl = (IVariable)element;
    	assertEquals(decl.getTypeName(), "int(*)(char(*)(bool))");
    } 
}
