import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import junit.framework.TestCase;
import org.overture.ast.types.ABracketType;
import org.overture.ast.types.PType;
import org.overture.vdmj.Release;
import org.overture.vdmj.Settings;
import org.overture.vdmj.lex.Dialect;
import org.overture.vdmj.lex.LexException;
import org.overture.vdmj.lex.LexTokenReader;
import org.overture.vdmj.syntax.BindReader;
import org.overture.vdmj.syntax.ClassReader;
import org.overture.vdmj.syntax.ExpressionReader;
import org.overture.vdmj.syntax.ModuleReader;
import org.overture.vdmj.syntax.ParserException;
import org.overture.vdmj.syntax.PatternReader;
import org.overture.vdmj.syntax.StatementReader;
import org.overture.vdmj.syntax.SyntaxReader;
import org.overture.vdmj.syntax.TypeReader;
public abstract class BasicTypeCheckTestCase extends TestCase
{
public enum ParserType
{
Expression, Expressions, Module, Class, Pattern, Type, Statement, Bind
}
public BasicTypeCheckTestCase(String string)
{
super(string);
}
@Override
protected void setUp() throws Exception
{
super.setUp();
Settings.dialect = Dialect.VDM_SL;
Settings.release = Release.VDM_10;
}
public <T> T parse(ParserType type, File file) throws ParserException,
LexException
{
return internal(type, new LexTokenReader(file, Settings.dialect));
}
public <T> T parse(ParserType type, String content) throws ParserException,
LexException
{
return internal(type, new LexTokenReader(content, Settings.dialect));
}
private <T> T internal(ParserType type, LexTokenReader ltr)
throws ParserException, LexException
{
SyntaxReader reader = null;
T result = null;
String errorMessages = "";
try
{
reader = getReader(type, ltr);
result = read(type, reader);
if (reader != null && reader.getErrorCount() > 0)
{
// perrs += reader.getErrorCount();
StringWriter s = new StringWriter();
reader.printErrors(new PrintWriter(s));// new PrintWriter(System.out));
errorMessages = "\n" + s.toString() + "\n";
System.out.println(s.toString());
}
assertEquals(errorMessages, 0, reader.getErrorCount());
if (reader != null && reader.getWarningCount() > 0)
{
// pwarn += reader.getWarningCount();
// reader.printWarnings(new PrintWriter(System.out));
}
return result;
} finally
{
// if (!hasRunBefore())
// {
// setHasRunBefore(true);
// System.out.println("============================================================================================================");
//
// System.out.println("|");
// System.out.println("|\t\t" + getReaderTypeName() + "s");
// // System.out.println("|");
// System.out.println("|___________________________________________________________________________________________________________");
//
// }
// System.out.println(pad("Parsed " + getReaderTypeName(), 20) + " - "
// + pad(getReturnName(result), 35) + ": "
// + pad(result + "", 35).replace('\n', ' ') + " from \""
// + (content + "").replace('\n', ' ') + "\"");
// System.out.flush();
}
}
@SuppressWarnings("unchecked")
private <T> T read(ParserType type, SyntaxReader reader)
throws ParserException, LexException
{
switch (type)
{
case Class:
return (T) ((ClassReader) reader).readClasses();
case Expression:
return (T) ((ExpressionReader) reader).readExpression();
case Expressions:
return (T) ((ExpressionReader) reader).readExpressionList();
case Module:
return (T) ((ModuleReader) reader).readModules();
case Pattern:
return (T) ((PatternReader) reader).readPatternList();
case Statement:
return (T) ((StatementReader) reader).readStatement();
case Type:
return (T) ((TypeReader) reader).readType();
case Bind:
return (T) ((BindReader) reader).readBindList();
}
return null;
}
private SyntaxReader getReader(ParserType type, LexTokenReader ltr)
{
switch (type)
{
case Class:
return new ClassReader(ltr);
case Expression:
return new ExpressionReader(ltr);
case Module:
return new ModuleReader(ltr);
case Pattern:
return new PatternReader(ltr);
case Statement:
return new StatementReader(ltr);
case Type:
return new TypeReader(ltr);
case Bind:
return new BindReader(ltr);
}
return null;
}
protected PType getResultType(String expectedTypeString)
throws ParserException, LexException
{
if (expectedTypeString != null && !expectedTypeString.trim().isEmpty())
{
PType expectedType = parse(ParserType.Type, expectedTypeString);
expectedType = removeBrackets(expectedType);
return expectedType;
}
return null;
}
private PType removeBrackets(PType type)
{
if (type instanceof ABracketType)
{
return removeBrackets(((ABracketType) type).getType());
}
return type;
}
}