package tests.parseTreeToAST;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.junit.Test;
import parsing.TokenSubStream;
import parsing.C.Modules.ANTLRCModuleParserDriver;
import antlr.C.ModuleLexer;
import ast.ASTNode;
import ast.declarations.ClassDefStatement;
import ast.declarations.IdentifierDecl;
import ast.expressions.Identifier;
import ast.functionDef.FunctionDef;
import ast.functionDef.Parameter;
import ast.functionDef.ParameterType;
import ast.statements.IdentifierDeclStatement;
public class ModuleBuildersTest
{
@Test
public void testNestedStructs()
{
String input = "struct x{ struct y { struct z{}; }; }; abc";
List<ASTNode> codeItems = parseInput(input);
ClassDefStatement classDef = (ClassDefStatement) codeItems.get(0);
ClassDefStatement yClass = (ClassDefStatement) classDef.content
.getStatements().get(0);
ClassDefStatement zClass = (ClassDefStatement) yClass.content
.getStatements().get(0);
assertTrue(codeItems.size() == 1);
assertTrue(yClass.getName().getEscapedCodeStr().equals("y"));
assertTrue(zClass.getName().getEscapedCodeStr().equals("z"));
}
@Test
public void testStructName()
{
String input = "struct foo{};";
List<ASTNode> codeItems = parseInput(input);
ClassDefStatement codeItem = (ClassDefStatement) codeItems.get(0);
assertTrue(codeItem.name.getEscapedCodeStr().equals("foo"));
}
@Test
public void testUnnamedStruct()
{
String input = "struct {int x; } a;";
List<ASTNode> codeItems = parseInput(input);
ClassDefStatement codeItem = (ClassDefStatement) codeItems.get(0);
assertTrue(codeItem.name.getEscapedCodeStr().equals("<unnamed>"));
}
@Test
public void testStructContent()
{
String input = "struct foo{};";
List<ASTNode> codeItems = parseInput(input);
ClassDefStatement codeItem = (ClassDefStatement) codeItems.get(0);
assertTrue(codeItem.content != null);
}
@Test
public void testFunctionInClass()
{
String input = "class foo{ bar(){} };";
List<ASTNode> codeItems = parseInput(input);
ClassDefStatement codeItem = (ClassDefStatement) codeItems.get(0);
FunctionDef funcItem = (FunctionDef) codeItem.content.getStatements()
.get(0);
assertTrue(funcItem.name.getEscapedCodeStr().equals("bar"));
}
@Test
public void testDecl()
{
String input = "int foo;";
List<ASTNode> codeItems = parseInput(input);
IdentifierDeclStatement codeItem = (IdentifierDeclStatement) codeItems
.get(0);
IdentifierDecl decl = (IdentifierDecl) codeItem.getIdentifierDeclList()
.get(0);
assertTrue(decl.getName().getEscapedCodeStr().equals("foo"));
}
@Test
public void testDeclListAfterClass()
{
String input = "class foo{int x;} y;";
List<ASTNode> codeItems = parseInput(input);
IdentifierDeclStatement codeItem = (IdentifierDeclStatement) codeItems
.get(codeItems.size() - 1);
IdentifierDecl decl = (IdentifierDecl) codeItem.getIdentifierDeclList()
.get(0);
System.out.println(decl.getName().getEscapedCodeStr());
assertTrue(decl.getName().getEscapedCodeStr().equals("y"));
}
@Test
public void testClassDefBeforeContent()
{
String input = "class foo{int x;}";
List<ASTNode> codeItems = parseInput(input);
ClassDefStatement classCodeItem = (ClassDefStatement) codeItems.get(0);
IdentifierDeclStatement identifierCodeItem = (IdentifierDeclStatement) classCodeItem.content
.getStatements().get(0);
IdentifierDecl decl = (IdentifierDecl) identifierCodeItem
.getIdentifierDeclList().get(0);
assertTrue(classCodeItem.name.getEscapedCodeStr().equals("foo"));
assertTrue(decl.getName().getEscapedCodeStr().equals("x"));
}
@Test
public void testFuncName()
{
String input = "void foo(){};";
List<ASTNode> codeItems = parseInput(input);
FunctionDef codeItem = (FunctionDef) codeItems.get(0);
assertTrue(codeItem.name.getEscapedCodeStr().equals("foo"));
}
@Test
public void testFuncSignature()
{
String input = "void foo(int x, char **ptr){};";
List<ASTNode> codeItems = parseInput(input);
FunctionDef codeItem = (FunctionDef) codeItems.get(0);
System.out.println(codeItem.getEscapedCodeStr());
assertTrue(codeItem.getEscapedCodeStr().equals(
"foo (int x , char * * ptr)"));
}
@Test
public void testSimpleParamList()
{
String input = "int foo(int x){}";
List<ASTNode> codeItems = parseInput(input);
FunctionDef codeItem = (FunctionDef) codeItems.get(0);
System.out.println(codeItem.getChildCount());
assertTrue(codeItem.getChildCount() == 3);
}
@Test
public void testParamListGetCodeStr()
{
String input = "int foo(char *myParam, myType x){}";
List<ASTNode> codeItems = parseInput(input);
FunctionDef codeItem = (FunctionDef) codeItems.get(0);
String codeStr = codeItem.getParameterList().getEscapedCodeStr();
System.out.println(codeStr);
assertTrue(codeStr.equals("char * myParam , myType x"));
}
@Test
public void testParamGetCodeStr()
{
String input = "int foo(char *myParam, myType x){}";
List<ASTNode> codeItems = parseInput(input);
FunctionDef codeItem = (FunctionDef) codeItems.get(0);
Parameter parameter = codeItem.getParameterList().getParameters()
.get(0);
String codeStr = parameter.getEscapedCodeStr();
System.out.println(codeStr);
assertTrue(codeStr.equals("char * myParam"));
}
@Test
public void testParamName()
{
String input = "int foo(myType myParam){}";
List<ASTNode> codeItems = parseInput(input);
FunctionDef codeItem = (FunctionDef) codeItems.get(0);
Identifier name = codeItem.getParameterList().getParameters().get(0).name;
assertTrue(name.getEscapedCodeStr().equals("myParam"));
}
@Test
public void testParamType()
{
String input = "int foo(char *myParam){}";
List<ASTNode> codeItems = parseInput(input);
FunctionDef codeItem = (FunctionDef) codeItems.get(0);
ParameterType type = codeItem.getParameterList().getParameters().get(0).type;
System.out.println(type.getEscapedCodeStr());
assertTrue(type.getEscapedCodeStr().equals("char *"));
}
@Test
public void testFunctionPtrParam()
{
String input = "int foo(void (*ptr)(char *)){}";
List<ASTNode> codeItems = parseInput(input);
FunctionDef codeItem = (FunctionDef) codeItems.get(0);
System.out.println(codeItem.getEscapedCodeStr());
assertTrue(codeItem.name.getEscapedCodeStr().equals("foo"));
}
@Test
public void testEmptyParamList()
{
String input = "int foo(){}";
List<ASTNode> codeItems = parseInput(input);
FunctionDef codeItem = (FunctionDef) codeItems.get(0);
assertTrue(codeItem.getChildCount() == 3);
assertTrue(codeItem.getParameterList().getEscapedCodeStr().equals(""));
}
@Test
public void testEmptyParamListLocation()
{
String input = "int foo(){}";
List<ASTNode> codeItems = parseInput(input);
FunctionDef codeItem = (FunctionDef) codeItems.get(0);
assertTrue(codeItem.getParameterList().getParameters().size() == 0);
}
private List<ASTNode> parseInput(String input)
{
ANTLRCModuleParserDriver parser = new ANTLRCModuleParserDriver();
TestASTWalker testProcessor = new TestASTWalker();
parser.addObserver(testProcessor);
ANTLRInputStream inputStream = new ANTLRInputStream(input);
ModuleLexer lex = new ModuleLexer(inputStream);
TokenSubStream tokens = new TokenSubStream(lex);
parser.parseAndWalkTokenStream(tokens);
return testProcessor.codeItems;
}
}