Files
exercise03/MicroJava Tests/tests/ssw/mj/test/RecoverTest.java

178 lines
4.9 KiB
Java

package ssw.mj.test;
import org.junit.jupiter.api.Test;
import ssw.mj.Errors.Message;
import ssw.mj.test.support.BaseCompilerTestCase;
import static ssw.mj.Errors.Message.*;
public class RecoverTest extends BaseCompilerTestCase {
@Test
public void wrongGlobalDecl() {
initCode("program Test" + LF + //
" 123;" + LF + //
"{ void main() { } }");
expectError(2, 3, DECLARATION_RECOVERY);
parseVerifyVisualize();
}
@Test
public void wrongMethDecl1() {
initCode("program Test {" + LF + //
" void main() { }" + LF + //
" program wrong1() { " + LF + //
" if (1>2);" + LF + //
" }" + LF + //
"}");
expectError(3, 3, METHOD_DECL_RECOVERY);
parseVerifyVisualize();
}
@Test
public void wrongMethDecl2() {
initCode("program Test {" + LF + //
" program wrong1() { " + LF + //
" if (1>2);" + LF + //
" }" + LF + //
" void main() { }" + LF + //
" program wrong2() {" + LF + //
" if (1>2);" + LF + //
" }" + LF + //
"}");
expectError(2, 3, METHOD_DECL_RECOVERY);
expectError(6, 3, METHOD_DECL_RECOVERY);
parseVerifyVisualize();
}
@Test
public void wrongMethDecl3() {
initCode("program Test {" + LF + //
" program wrong1() { }" + LF + //
" void main() { }" + LF + //
" program wrong2() { }" + LF + //
"}");
expectError(2, 3, METHOD_DECL_RECOVERY);
expectError(4, 3, METHOD_DECL_RECOVERY);
parseVerifyVisualize();
}
@Test
public void wrongStat() {
initCode("program Test {" + LF + //
" void main() { " + LF + //
" 123;" + LF + //
" }" + LF + //
"}");
expectError(3, 5, STATEMENT_RECOVERY);
parseVerifyVisualize();
}
@Test
public void multipleErrors() {
initCode("program Test " + LF + //
" int x" + LF + //
"{" + LF + //
" void main( {" + LF + //
" if (1 x 2);" + LF + //
" }" + LF + //
"}");
expectError(3, 1, TOKEN_EXPECTED, ";");
expectError(4, 14, TOKEN_EXPECTED, ")");
expectError(5, 11, INVALID_REL_OP);
parseVerifyVisualize();
}
// ---- multiple errors & recovery
@Test
public void noRecover1() {
initCode("program Test {" + LF + //
" void main this method will never recover");
expectError(2, 13, TOKEN_EXPECTED, "(");
parseVerifyVisualize();
}
@Test
public void noRecover2() {
initCode("program Test {" + LF + //
" void main() { " + LF + //
" if this method will never recover");
expectError(3, 8, TOKEN_EXPECTED, "(");
parseVerifyVisualize();
}
@Test
public void recoverDecl1() {
initCode("program Test" + LF + //
" int i1, if" + LF + //
" in i2;" + LF + //
" final int i3 = 0;" + LF + //
"{" + LF + //
" void main() { " + LF + //
" if (i1 < i3);" + LF + //
" }" + LF + //
"}");
expectError(2, 11, TOKEN_EXPECTED, "identifier");
parseVerifyVisualize();
}
@Test
public void recoverDecl2() {
initCode("program Test" + LF + //
" int i1, if" + LF + //
" in i2;" + LF + //
" int i3;" + LF + //
"{" + LF + //
" void main() { " + LF + //
" if (i1 < i3);" + LF + //
" }" + LF + //
"}");
expectError(2, 11, TOKEN_EXPECTED, "identifier");
parseVerifyVisualize();
}
@Test
public void recoverStat() {
initCode("program Test {" + LF + //
" void main() { " + LF + //
" 567 since distance stays too small no follow up errors here;" + LF + //
" if (1 < 2);" + LF + //
" if (1 x 2);" + LF + //
" }" + LF + //
"}");
expectError(3, 5, STATEMENT_RECOVERY);
expectError(5, 11, INVALID_REL_OP);
parseVerifyVisualize();
}
@Test
public void resetErrDist() {
initCode("program Test {" + LF + //
" void main() {" + LF + //
" if () if () if();" + LF + //
" }" + LF + //
"}");
expectError(3, 9, INVALID_FACTOR);
expectError(3, 15, INVALID_FACTOR);
expectError(3, 20, INVALID_FACTOR);
parseVerifyVisualize();
}
@Test
public void illegalMethodStart() {
initCode("program Test" + LF + // 1
"{" + LF + // 2
" void foo()" + LF + // 3
" void foo(char x) { }" + LF + // 4
" void main() { }" + LF + // 5
"}" + LF // 6
);
expectError(4, 3, Message.TOKEN_EXPECTED, "{");
parseVerifyVisualize();
}
}