package org.erlide.erlang;
import org.eclipse.xtext.junit4.InjectWith;
import org.eclipselabs.xtext.utils.unittesting.XtextRunner2;
import org.eclipselabs.xtext.utils.unittesting.XtextTest;
import org.erlide.ErlangInjectorProvider;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(XtextRunner2.class)
@InjectWith(ErlangInjectorProvider.class)
public class RulesTest extends XtextTest {
@Test
public void keywords() {
testParserRule("spec", "NAME");
testParserRule("type", "Expression");
testParserRule("opaque", "Expression");
testParserRule("record", "Expression");
testParserRule("define", "Expression");
}
@Test
public void numbers() {
testParserRule("33", "INTEGER");
testParserRule("5#33", "INTEGER");
testParserRule("33.4", "FLOAT");
testParserRule("33.1e4", "FLOAT");
testParserRule("33.1e+4", "FLOAT");
testParserRule("33.1E-4", "FLOAT");
testParserRuleErrors("33e4", "FLOAT", "mismatched input");
testParserRuleErrors("33e+4", "FLOAT", "mismatched input");
}
@Test
public void names() {
testParserRule("?aa", "ExprMax");
testParserRule("aa", "ExprMax");
testParserRule("AAa", "ExprMax");
}
@Test
public void macros() {
testParserRule("?AA", "MacroLiteral");
testParserRule("? AA", "MacroLiteral");
// testParserRuleErrors("? AA", "Macro",
// "no viable alternative at input ' '");
testParserRule("?aa", "MacroLiteral");
testParserRule("?_A", "MacroLiteral");
testParserRule("??A", "MacroLiteral");
}
@Test
public void funRefs() {
testParserRule("fun aa/2", "FunExpr");
testParserRule("fun mm:aa/2", "FunExpr");
testParserRule("fun ?mm:aa/2", "FunExpr");
testParserRule("fun mm:?aa/2", "FunExpr");
testParserRule("fun Mmm:Aaa/2", "FunExpr");
}
@Test
public void strings() {
testParserRule("\"hej\"", "StringLiteral");
testParserRule("\"hej\"\n \"hej\"", "StringLiteral");
testParserRule("\"hej\"\"hej\"", "StringLiteral");
testParserRule("\"hej\" \"hej\"", "StringLiteral");
testParserRule("\"hej\" ?m \"hej\"", "StringLiteral");
}
@Test
public void records() {
testParserRule("#rec{}", "Expr700");
testParserRule("#rec{a=2}", "Expr700");
testParserRule("V#rec{}", "Expr700");
testParserRule("Z#rec.a", "Expr700");
testParserRule("Z#Rec.a", "Expr700");
testParserRule("#rec{}", "Expr700");
testParserRule("#rec.a#rec{}", "Expr700");
testParserRule("X#rec.a#rec{}", "Expression");
}
@Test
public void funCalls() {
testParserRule("aa()", "Expr700");
testParserRule("aa:bb()", "Expr700");
testParserRule("aa(2,?X3,4)", "Expr700");
testParserRule("?M:aa()", "Expr700");
testParserRule("?M:aa()", "Expression");
testParserRule("aa:?F()", "Expr700");
testParserRule("aa:?F()", "Expression");
testParserRule("ZZ:aa()", "Expr700");
testParserRule("aa:AA()", "Expr700");
testParserRule("(A#aa.f)()", "Expr700");
testParserRule("?X()", "Expr700");
testParserRule("?X(x)(y)", "Expr700");
}
@Test
public void exprs() {
testParserRule("{a}", "Tuple");
testParserRule("{?a}", "Tuple");
testParserRule("?X()", "MacroCall");
}
@Test
public void types() {
testParserRule("-type a() :: b(). ", "Attribute");
testParserRule("-type(a()::b()). ", "Attribute");
}
@Test
public void lists() {
testParserRule("[]", "List");
testParserRule("[2]", "List");
testParserRule("[2,3,4]", "List");
testParserRule("[2,3|5]", "List");
testParserRule("[2,3|5]", "Expression");
testParserRule("[X || X<-K, Y<-[]]", "ListComprehension");
testParserRule("[X || X<-K, Y<-[]]", "Expression");
}
@Test
public void binaries() {
testParserRule("<<>>", "Binary");
testParserRule("<<X>>", "Binary");
testParserRule("<<2,4,6>>", "Binary");
testParserRule("<<2,<<4,6>> >>", "Binary");
testParserRule("<<2,<<4,6>> >>", "Expression");
testParserRule("<<\"2,4\",6>>", "Binary");
testParserRule("<< X || Y<=x:y() >>", "BinaryComprehension");
testParserRule("<< X || X<=x:y() >>", "Expression");
testParserRule("<< ?X || X<=?x:y(3) >>", "BinaryComprehension");
testParserRule("<<2:8,4,6>>", "Binary");
testParserRule("<<2,4/integer,6>>", "Binary");
testParserRule("<<2,4:X/integer-signed-unit:4,6>>", "Binary");
testParserRule("<<2,4:X/integer-unit:4-signed,6>>", "Binary");
}
@Test
public void tryExpr() {
testParserRule("try x catch X -> ok end", "TryExpr");
testParserRule("try x catch throw:X -> ok end", "TryExpr");
testParserRule("try x catch _:X -> ok end", "TryExpr");
testParserRule("try x catch _:#r{} -> ok end", "TryExpr");
}
@Test
public void receiveExpr() {
testParserRule("receive after 100 -> ok end", "ReceiveExpr");
testParserRule("receive Msg -> ok end", "ReceiveExpr");
testParserRule("receive msg -> ok; _ -> ok end", "ReceiveExpr");
testParserRule("receive Msg -> ok after Z -> ok end", "ReceiveExpr");
}
}