407 lines
11 KiB
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();
|
|
}
|
|
}
|