Files
exercise02/MicroJava Tests/tests/ssw/mj/test/ParserTest.java

407 lines
11 KiB
Java

package ssw.mj.test;
import org.junit.jupiter.api.Test;
import ssw.mj.scanner.Token;
import ssw.mj.test.support.BaseCompilerTestCase;
import static ssw.mj.Errors.Message.*;
public class ParserTest extends BaseCompilerTestCase {
@Test
public void testWorkingFinalDecls() {
initCode("program Test" + LF + // 1
" final int i = 1;" + LF + // 2
" final int j = 1;" + LF + // 3
" final int k = 1;" + LF + // 4
"{ void main() { } }"); // 5
parseVerifyVisualize();
}
@Test
public void testWorkingDecls() {
initCode("program Test" + LF + // 1
" int i;" + LF + // 2
" int j, k;" + LF + // 3
"{ void main() { } }"); // 4
parseVerifyVisualize();
}
@Test
public void testWorkingMethods() {
initCode("program Test" + LF + // 1
" int i;" + LF + // 2
" int j, k;" + LF + // 3
"{" + LF + // 4
" void foo() { }" + LF + // 5
" void bar() { }" + LF + // 6
" void main() { }" + LF + // 7
" }" + LF // 8
);
parseVerifyVisualize();
}
@Test
public void testWorkingMethodsWithParameters() {
initCode("program Test" + LF + // 1
"{" + LF + // 2
" void foo(int i) { }" + LF + // 3
" void bar(int i, char c) { }" + LF + // 4
" void main() { }" + LF + // 5
" }" + LF // 6
);
parseVerifyVisualize();
}
@Test
public void testWorkingMethodsWithLocals() {
initCode("program Test" + LF + // 1
"{" + LF + // 2
" void foo() int i; { }" + LF + // 3
" void bar() int i; char c; { }" + LF + // 4
" void main() { }" + LF + // 5
" }" + LF // 6
);
parseVerifyVisualize();
}
@Test
public void testWorkingMethodsWithParametersAndLocals() {
initCode("program Test" + LF + // 1
"{" + LF + // 2
" void foo(char ch) int i; { }" + LF + // 3
" void bar(int x, int y) int i; char c; { }" + LF + // 4
" void main() { }" + LF + // 5
" }" + LF // 6
);
parseVerifyVisualize();
}
@Test
public void testWorkingMethodCall() {
initCode("program Test" + LF + // 1
"{" + LF + // 2
" void foo(char ch) int i; { }" + LF + // 3
" void main() { foo('a'); }" + LF + // 4
" }" + LF // 5
);
parseVerifyVisualize();
}
@Test
public void testWorkingMethodCallTwoParams() {
initCode("program Test" + LF + // 1
"{" + LF + // 2
" void foo(char ch, int x) int i; { }" + LF + // 3
" void main() { foo('a', 1); }" + LF + // 4
" }" + LF // 5
);
parseVerifyVisualize();
}
@Test
public void testWorkingMethodCallThreeParams() {
initCode("program Test" + LF + // 1
"{" + LF + // 2
" void foo(char ch, int x, char ch2) int i; { }" + LF + // 3
" void main() { foo('a', 1, 'b'); }" + LF + // 4
" }" + LF // 5
);
parseVerifyVisualize();
}
@Test
public void testWorkingClass() {
initCode("program Test" + LF + // 1
"class X { int i; int j; }" + LF + // 2
"{" + LF + // 3
" void main() X x; { x = new X; }" + LF + // 4
"}" + LF // 5
);
parseVerifyVisualize();
}
@Test
public void testWorkingArray() {
initCode("program Test" + LF + // 1
"{" + LF + // 2
" void main() int[] x; { x = new int[10]; }" + LF + // 3
"}" + LF // 4
);
parseVerifyVisualize();
}
@Test
public void testWorkingIncDec() {
initCode("program Test" + LF + // 1
"{" + LF + // 2
" void main() int i; { i--; i++; }" + LF + // 3
" }" + LF // 4
);
parseVerifyVisualize();
}
@Test
public void testWorkingElseIf() {
initCode("program Test {" + LF + // 1
" void main() int i; {" + LF + // 2
" if (i > 10) i++;" + LF + // 3
" else if (i < 5) i--;" + LF + // 4
" else i += 8;" + LF + // 5
" }" + LF + // 6
"}");
parseVerifyVisualize();
}
@Test
public void testWorkingLoop() {
initCode("program Test {" + LF + // 1
" void main () int i; {" + LF + // 2
" i = 0;" + LF + // 3
" while (i < 42) {" + LF + // 4
" i++;" + LF + // 5
" }" + LF + // 6
" }" + LF + // 7
"}");
parseVerifyVisualize();
}
@Test
public void mulAssign() {
initCode("program Test {" + LF + //
" void main() int i; {" + LF + //
" i = 2;" + LF + //
" i *= 2;" + LF + //
" }" + LF + //
"}");
parseVerifyVisualize();
}
@Test
public void returnExpr() {
initCode("program Test {" + LF + //
" void main() { }" + LF + //
" int wrong1() { " + LF + //
" return 2 + 3;" + LF + //
" }" + LF + //
"}");
parseVerifyVisualize();
}
@Test
public void wrongConstDecl() {
initCode("program Test" + LF + //
" final int i = a;" + LF + //
"{ void main() { } }");
expectError(2, 17, INVALID_CONST_TYPE);
parseVerifyVisualize();
}
@Test
public void wrongDesignFollow() {
initCode("program Test {" + LF + //
" void main() int i; {" + LF + //
" i**;" + LF + //
" }" + LF + //
"}");
expectError(3, 6, INVALID_DESIGNATOR_STATEMENT);
parseVerifyVisualize();
}
@Test
public void wrongFactor() {
initCode("program Test {" + LF + //
" void main () int i; { " + LF + //
" i = i + if;" + LF + //
" }" + LF + //
"}");
expectError(3, 13, INVALID_FACTOR);
parseVerifyVisualize();
}
@Test
public void wrongRelOp() {
initCode("program Test {" + LF + //
" void main() int i; {" + LF + //
" if (i x 5);" + LF + //
" }" + LF + //
"}");
expectError(3, 11, INVALID_REL_OP);
parseVerifyVisualize();
}
@Test
public void wrongStart() {
initCode("noprogram Test { }");
expectError(1, 1, TOKEN_EXPECTED, "program");
parseVerifyVisualize();
}
@Test
public void noProgName() {
initCode("program { }");
expectError(1, 9, TOKEN_EXPECTED, "identifier");
parseVerifyVisualize();
}
@Test
public void wrongVarDecl() {
initCode("program Test " + LF + //
"int var1,,,,var2;" + LF + //
"{ void main() { } }");
expectError(2, 10, TOKEN_EXPECTED, Token.Kind.ident.label());
parseVerifyVisualize();
}
@Test
public void eofExpected() {
initCode("program Test {" + LF + //
" void main() {}" + LF + //
"}moretext");
expectError(3, 2, TOKEN_EXPECTED, "end of file");
parseVerifyVisualize();
}
@Test
public void invalidEOF1() {
initCode("program Test {" + LF + //
" void main() {");
expectError(2, 16, TOKEN_EXPECTED, "}");
parseVerifyVisualize();
}
@Test
public void invalidEOF2() {
initCode("program Test {" + LF + //
" void main() {" + LF + //
" if ()");
expectError(3, 9, INVALID_FACTOR);
parseVerifyVisualize();
}
@Test
public void invalidEOF3() {
initCode("program Test" + LF + //
" class C {" + LF + //
" int i");
expectError(3, 10, TOKEN_EXPECTED, ";");
parseVerifyVisualize();
}
@Test
public void testWorkingReadAndPrint() {
initCode("program Test {" + LF + // 1
" void main() int i; {" + LF + // 2
" read(i);" + LF +
" print(i);" + LF +
" }" + LF + //3
"}");//4
parseVerifyVisualize();
}
// index from end tests
@Test
public void wrongTildeInExpr() {
initCode("""
program Test {
void main() int i; {
i = ~1;
}
}""");
expectError(3, 9, INVALID_FACTOR);
parseVerifyVisualize();
}
@Test
public void wrongTildeCompoundAssign() {
initCode("""
program Test {
void main() int i; {
i ~= 2;
}
}""");
expectError(3, 7, INVALID_DESIGNATOR_STATEMENT);
parseVerifyVisualize();
}
@Test
public void wrongDoubleTilde() {
initCode("""
program Test {
void main() int[] a; int i; {
i = a[~~1];
}
}
""");
expectError(3, 12, INVALID_FACTOR);
parseVerifyVisualize();
}
@Test
public void constantArrayAccessFromEnd() {
initCode("""
program Test {
void main() int[] a; int i; {
a = new int[3];
a[~1] = 3;
a[~2] = 2;
a[~3] = 1;
i = a[~1];
print(i);
}
}""");
parseVerifyVisualize();
}
@Test
public void computedArrayAccessFromEnd() {
initCode("""
program Test {
void main() int[] a; int i; {
a = new int[3];
a[~(2 * 6 - 11)] = 3;
a[~(9 - 11 + 4)] = 2;
a[~(-(-3))] = 1;
i = a[~(a[0] + 2 * 6 - 11)];
print(i);
}
}""");
parseVerifyVisualize();
}
@Test
public void dynamicArrayAccessFromEnd() {
initCode("""
program Test {
void main() int[] a; int i; {
read(i);
a = new int[i];
a[~i] = 1;
a[~(i - 1)] = 2;
a[~(i - 2)] = 3;
i = a[~i];
print(i);
}
}""");
parseVerifyVisualize();
}
@Test
public void globalArrayAccessFromEnd() {
initCode("""
program Test
final int len = 3;
{
void main() int[] a; int i; {
a = new int[len];
a[~len] = 1;
a[~(len - 1)] = 2;
a[~(len - 2)] = 3;
i = a[~len];
print(i);
}
}""");
parseVerifyVisualize();
}
}