/**********************************************************************
 * Copyright (c) 2002,2003 Rational Software Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Common Public License v0.5
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v05.html
 * 
 * Contributors: 
 * IBM Rational Software - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.core.parser.failedTests;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTFunction;
import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTVariable;
import org.eclipse.cdt.core.parser.tests.BaseASTTest;
/**
 * @author jcamelon
 *
 */
public class ASTFailedTests extends BaseASTTest
{
 
    public ASTFailedTests(String name)
    {
        super(name);
    }
    public void testBug36730() throws Exception
    {
        assertCodeFailsParse("FUNCTION_MACRO( 1, a )\n	int i;");
    }

    
    //Here C99-specific section ends
    //Here GCC-specific section starts
    public void testBug39676() throws Exception
    {
        assertCodeFailsParse("struct { int e1, e2; } v = { e2: 0 }");
    }
    public void testBug39677() throws Exception
    {
        assertCodeFailsParse("B::B() : a(({ 1; })) {}");
    }

    public void testBug39679() throws Exception
    {
        assertCodeFailsParse("Foo blat() return f(4) {}");
    }
    public void testBug39681() throws Exception
    {
        Writer code = new StringWriter();
        try
        {
            code.write("double\n");
            code.write("foo (double a, double b)\n");
            code.write("{\n");
            code.write("  double square (double z) { return z * z; }\n");
            code.write("  return square (a) + square (b);\n");
            code.write("}\n");
        }
        catch (IOException ioe)
        {
        }
        parse(code.toString());
    }
    
    public void testBug39682() throws Exception
    {
        IASTTypedefDeclaration typedef = (IASTTypedefDeclaration)parse("typedef name = (a+1);").getDeclarations().next();
        assertFalse(
            "The expected error did not occur.",
            typedef.getName().equals( "name" ) );
    }
    public void testBug39684() throws Exception
    {
        assertCodeFailsParse("typeof(foo(1)) bar () { return foo(1); }");
    }
    public void testBug39686() throws Exception
    {
        Writer code = new StringWriter();
        try
        {
            code.write("__complex__ double x; // complex double\n");
            code.write("__complex__ short int a; // complex short int\n");
            code.write("x = 2.5fi; // 2.5 imaginary float literal\n");
            code.write("a = 3i; // imaginary integer literal\n");
            code.write("double v = __real__ x; // real part of expression\n");
            code.write(
                "double w = __imag__ x; // imaginary part of expression\n");
        }
        catch (IOException ioe)
        {
        }
        assertCodeFailsParse(code.toString());
    }
    public void testBug39687() throws Exception
    {
        assertCodeFailsParse("struct entry tester (int len; char data[len][len], int len) {}");
    }
    public void testBug39688() throws Exception
    {
        Writer code = new StringWriter();
        try
        {
            code.write("#define decl(type, vars...)  \\\n");
            code.write(" type vars ;\n");
            code.write("decl(int, x, y)\n");
        }
        catch (IOException ioe)
        {
        }
        assertCodeFailsParse(code.toString());
    }
    public void testBug39694() throws Exception
    {
        IASTVariable variable = (IASTVariable)parse("int ab$cd = 1;").getDeclarations().next();
        assertFalse(
            "The expected error did not occur.",
            variable.equals("ab$cd"));
    }
    public void testBug39695() throws Exception
    {
        assertCodeFailsParse("int a = __alignof__ (int);");
    }
    public void testBug39695A() throws Exception
    {
        assertCodeFailsParse("int foo asm (\"myfoo\") = 2;");
    }
    public void testBug39695B() throws Exception
    {
        assertCodeFailsParse("extern func () asm (\"FUNC\");");
    }
    public void testBug39695C() throws Exception
    {
        assertCodeFailsParse("register int *foo asm (\"a5\");");
    }
    public void testBug39698A() throws Exception
    {
        assertCodeFailsParse("int c = a <? b;");
    }
    public void testBug39698B() throws Exception
    {
        assertCodeFailsParse("int c = a >? b;");
    }
    public void testBug39701A() throws Exception
    {
        assertCodeFailsParse("extern template int max (int, int);");
    }
    public void testBug39701B() throws Exception
    {
        assertCodeFailsParse("inline template class Foo<int>;");
    }
    public void testBug39701C() throws Exception
    {
        assertCodeFailsParse("static template class Foo<int>;");
    }
    public void testBug39702() throws Exception
    {
        Writer code = new StringWriter();
        try
        {
            code.write("signature T	{\n");
            code.write("  int f (int);\n");
            code.write("  int f0 () { return f (0); };\n");
            code.write("};\n");
        }
        catch (IOException ioe)
        {
        }
        assertCodeFailsFullParse(code.toString());
    }
    public void testBug39703() throws Exception
    {
        Writer code = new StringWriter();
        try
        {
            code.write(
                "/* __extension__ enables GNU C mode for the duration of the declaration.  */\n");
            code.write("__extension__ struct G {\n");
            code.write("  struct { char z; };\n");
            code.write("  char g;\n");
            code.write("};\n");
        }
        catch (IOException ioe)
        {
        }
       	IASTAbstractTypeSpecifierDeclaration abs = (IASTAbstractTypeSpecifierDeclaration)assertSoleDeclaration(code.toString());
       	assertEquals( ((IASTClassSpecifier)abs.getTypeSpecifier()).getName(), "G" ); 
    }
    public void testBug39704A() throws Exception
    {
        assertCodeFailsParse("__declspec (dllimport) int foo;");
    }
    
    
    public void testBug39704B() throws Exception
    {
    	try
    	{
			IASTVariable d = (IASTVariable)assertSoleDeclaration("extern int (* import) (void) __attribute__((dllimport));");
			assertEquals( d.getName(), "__attribute__"); // false assertion 
    	}
    	catch( ClassCastException cce )
    	{
			failedAsExpected();
    	}
    }
    public void testBug39704C() throws Exception
    {
    	try
    	{
			IASTFunction f = (IASTFunction)assertSoleDeclaration("int func2 (void) __attribute__((dllexport));");
			assertNotReached();
			assertEquals( f.getName(), "func2");
    	} catch( ClassCastException cce )
    	{
    	}
    }
    public void testBug39704D() throws Exception
    {
        assertCodeFailsParse("__declspec(dllexport) int func1 (int a) {}");
    }
    public void testBug39705() throws Exception
    {
        assertCodeFailsParse("#ident \"@(#)filename.c   1.3 90/02/12\"");
    }

    
	public void testBug40422() throws Exception {
		// Parse and get the translaton unit
		parse("int A::* x = 0;").getDeclarations().next();
	}
    
}
