initial commit, template added
This commit is contained in:
880
MicroJava Tests/tests/ssw/mj/test/CodeGenerationTest.java
Normal file
880
MicroJava Tests/tests/ssw/mj/test/CodeGenerationTest.java
Normal file
@@ -0,0 +1,880 @@
|
||||
package ssw.mj.test;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import ssw.mj.test.support.BaseCompilerTestCase;
|
||||
|
||||
import static ssw.mj.Errors.Message.*;
|
||||
|
||||
public class CodeGenerationTest extends BaseCompilerTestCase {
|
||||
|
||||
/**
|
||||
* Symbol table for most examples of this test class.
|
||||
*/
|
||||
private void expectExampleSymTab() {
|
||||
expectSymTabUniverse();
|
||||
expectSymTab("Program A:");
|
||||
expectSymTab(" Constant: int max = 12");
|
||||
expectSymTab(" Global Variable 0: char c");
|
||||
expectSymTab(" Global Variable 1: int i");
|
||||
expectSymTab(" Type B: class (2 fields)");
|
||||
expectSymTab(" Local Variable 0: int x");
|
||||
expectSymTab(" Local Variable 1: int y");
|
||||
expectSymTab(" Method: void main (3 locals, 0 parameters)");
|
||||
expectSymTab(" Local Variable 0: int[] iarr");
|
||||
expectSymTab(" Local Variable 1: class (2 fields) b");
|
||||
expectSymTab(" Local Variable 2: int n");
|
||||
}
|
||||
|
||||
private void expectSymTabWithSum() {
|
||||
expectSymTabUniverse();
|
||||
expectSymTab("Program A:");
|
||||
expectSymTab(" Constant: int max = 12");
|
||||
expectSymTab(" Global Variable 0: char c");
|
||||
expectSymTab(" Global Variable 1: int i");
|
||||
expectSymTab(" Type B: class (2 fields)");
|
||||
expectSymTab(" Local Variable 0: int x");
|
||||
expectSymTab(" Local Variable 1: int y");
|
||||
expectSymTab(" Method: void main (4 locals, 0 parameters)");
|
||||
expectSymTab(" Local Variable 0: int[] iarr");
|
||||
expectSymTab(" Local Variable 1: class (2 fields) b");
|
||||
expectSymTab(" Local Variable 2: int n");
|
||||
expectSymTab(" Local Variable 3: int sum");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bsp11() {
|
||||
initCode("program A" + LF + //
|
||||
" final int max = 12;" + LF + //
|
||||
" char c; int i;" + LF + //
|
||||
" class B { int x, y; }" + LF + //
|
||||
"{" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" int[] iarr; B b; int n;" + LF + //
|
||||
" {" + LF + //
|
||||
" read(i); " + LF + //
|
||||
" if (i <= n) n = 1;" + LF + //
|
||||
" print(n); " + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
expectExampleSymTab();
|
||||
addExpectedRun("0", "1");
|
||||
addExpectedRun("1", "0");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bsp12() {
|
||||
initCode("program A" + LF + //
|
||||
" final int max = 12;" + LF + //
|
||||
" char c; int i;" + LF + //
|
||||
" class B { int x, y; }" + LF + //
|
||||
"{" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" int[] iarr; B b; int n;" + LF + //
|
||||
" {" + LF + //
|
||||
" read(i); " + LF + //
|
||||
" n = 1; " + LF + //
|
||||
" if (i <= n && n < 0) n = 2;" + LF + //
|
||||
" print(n); " + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
expectExampleSymTab();
|
||||
addExpectedRun("0", "1");
|
||||
addExpectedRun("2", "1");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bsp13() {
|
||||
initCode("program A" + LF + //
|
||||
" final int max = 12;" + LF + //
|
||||
" char c; int i;" + LF + //
|
||||
" class B { int x, y; }" + LF + //
|
||||
"{" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" int[] iarr; B b; int n;" + LF + //
|
||||
" {" + LF + //
|
||||
" read(i); " + LF + //
|
||||
" n = 1; " + LF + //
|
||||
" if (i <= n || i < 10) n = 2;" + LF + //
|
||||
" print(n); " + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
expectExampleSymTab();
|
||||
addExpectedRun("0", "2");
|
||||
addExpectedRun("2", "2");
|
||||
addExpectedRun("20", "1");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bsp14() {
|
||||
initCode("program A" + LF + //
|
||||
" final int max = 12;" + LF + //
|
||||
" char c; int i;" + LF + //
|
||||
" class B { int x, y; }" + LF + //
|
||||
"{" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" int[] iarr; B b; int n;" + LF + //
|
||||
" {" + LF + //
|
||||
" read(i); " + LF + //
|
||||
" n = 1; " + LF + //
|
||||
" if (i <= n || i < 10 && i > 5) n = 2;" + LF + //
|
||||
" print(n); " + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
expectExampleSymTab();
|
||||
addExpectedRun("0", "2");
|
||||
addExpectedRun("2", "1");
|
||||
addExpectedRun("6", "2");
|
||||
addExpectedRun("20", "1");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bsp15() {
|
||||
initCode("program A" + LF + //
|
||||
" final int max = 12;" + LF + //
|
||||
" char c; int i;" + LF + //
|
||||
" class B { int x, y; }" + LF + //
|
||||
"{" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" int[] iarr; B b; int n;" + LF + //
|
||||
" {" + LF + //
|
||||
" read(n); " + LF + //
|
||||
" while (i <= n) { i++; }" + LF + //
|
||||
" print(i); " + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
expectExampleSymTab();
|
||||
addExpectedRun("0", "1");
|
||||
addExpectedRun("-1", "0");
|
||||
addExpectedRun("1", "2");
|
||||
addExpectedRun("10", "11");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bsp16() {
|
||||
initCode("program A" + LF + //
|
||||
" final int max = 12;" + LF + //
|
||||
" char c; int i;" + LF + //
|
||||
" class B { int x, y; }" + LF + //
|
||||
"{" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" int[] iarr; B b; int n;" + LF + //
|
||||
" {" + LF + //
|
||||
" read(i); " + LF + //
|
||||
" if (i <= max) n = 1; else n = 2;" + LF + //
|
||||
" print(n); " + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
expectExampleSymTab();
|
||||
addExpectedRun("0", "1");
|
||||
addExpectedRun("13", "2");
|
||||
addExpectedRun("12", "1");
|
||||
addExpectedRun("-1", "1");
|
||||
addExpectedRun("-13", "1");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bsp17() {
|
||||
initCode("program A" + LF + //
|
||||
" final int max = 12;" + LF + //
|
||||
" char c; int i;" + LF + //
|
||||
" class B { int x, y; }" + LF + //
|
||||
"{" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" int[] iarr; B b; int n; int sum;" + LF + //
|
||||
" {" + LF + //
|
||||
" read(n); " + LF + //
|
||||
" sum = 0; " + LF + //
|
||||
" while (i <= n) { sum += i; i++; }" + LF + //
|
||||
" print(sum); " + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
expectSymTabWithSum();
|
||||
addExpectedRun("0", "0");
|
||||
addExpectedRun("-1", "0");
|
||||
addExpectedRun("1", "1");
|
||||
addExpectedRun("10", "55");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bsp18() {
|
||||
initCode("program A" + LF + //
|
||||
" final int max = 12;" + LF + //
|
||||
" char c; int i;" + LF + //
|
||||
" class B { int x, y; }" + LF + //
|
||||
"{" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" int[] iarr; B b; int n; int sum;" + LF + //
|
||||
" {" + LF + //
|
||||
" read(n); " + LF + //
|
||||
" sum = 0; " + LF + //
|
||||
" i = 2;" + LF + //
|
||||
" while (i <= n) { sum += i; i++; }" + LF + //
|
||||
" print(sum); " + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
expectSymTabWithSum();
|
||||
addExpectedRun("0", "0");
|
||||
addExpectedRun("-1", "0");
|
||||
addExpectedRun("1", "0");
|
||||
addExpectedRun("10", "54");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void methodCall() {
|
||||
initCode("program A" + LF + // 1
|
||||
"{" + LF + // 2
|
||||
" void bar() {" + LF + // 3
|
||||
" print('b');" + LF + // 4
|
||||
" print('a');" + LF + // 5
|
||||
" print('r');" + LF + // 6
|
||||
" }" + LF + // 7
|
||||
" void foo() {" + LF + // 8
|
||||
" print('f');" + LF + // 9
|
||||
" print('o');" + LF + // 10
|
||||
" print('o');" + LF + // 11
|
||||
" }" + LF + // 12
|
||||
" void main () {" + LF + // 13
|
||||
" foo();" + LF + // 14
|
||||
" }" + LF + // 15
|
||||
"}"); // 16
|
||||
|
||||
addExpectedRun("", "foo");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fib() {
|
||||
initCode("program A" + LF + //
|
||||
"{" + LF + //
|
||||
" int fib(int n) {" + LF + //
|
||||
" if (n <= 1) return 1; " + LF + //
|
||||
" return fib(n-1) + fib(n-2); " + LF + //
|
||||
" }" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" int n;" + LF + //
|
||||
" {" + LF + //
|
||||
" read(n); " + LF + //
|
||||
" print(fib(n)); " + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
addExpectedRun("-1", "1");
|
||||
addExpectedRun("0", "1");
|
||||
addExpectedRun("1", "1");
|
||||
addExpectedRun("2", "2");
|
||||
addExpectedRun("3", "3");
|
||||
addExpectedRun("4", "5");
|
||||
addExpectedRun("5", "8");
|
||||
addExpectedRun("6", "13");
|
||||
addExpectedRun("7", "21");
|
||||
addExpectedRun("8", "34");
|
||||
addExpectedRun("9", "55");
|
||||
addExpectedRun("10", "89");
|
||||
addExpectedRun("11", "144");
|
||||
addExpectedRun("22", "28657");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void fibDyn() {
|
||||
initCode("program A" + LF + //
|
||||
" int[] matrix; " + LF + //
|
||||
"{" + LF + //
|
||||
" int fib(int n) int r; {" + LF + //
|
||||
" if (n <= 1) return 1; " + LF + //
|
||||
" if(matrix[n] != 0) return matrix[n]; " + LF + //
|
||||
" r = fib(n-1) + fib(n-2); " + LF + //
|
||||
" matrix[n] = r; " + LF + //
|
||||
" return r; " + LF + //
|
||||
" }" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" int n;" + LF + //
|
||||
" {" + LF + //
|
||||
" matrix = new int[1000]; " + LF + //
|
||||
" read(n); " + LF + //
|
||||
" print(fib(n)); " + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
addExpectedRun("-1", "1");
|
||||
addExpectedRun("0", "1");
|
||||
addExpectedRun("1", "1");
|
||||
addExpectedRun("2", "2");
|
||||
addExpectedRun("3", "3");
|
||||
addExpectedRun("4", "5");
|
||||
addExpectedRun("5", "8");
|
||||
addExpectedRun("6", "13");
|
||||
addExpectedRun("7", "21");
|
||||
addExpectedRun("8", "34");
|
||||
addExpectedRun("9", "55");
|
||||
addExpectedRun("10", "89");
|
||||
addExpectedRun("11", "144");
|
||||
addExpectedRun("22", "28657");
|
||||
addExpectedRun("30", "1346269");
|
||||
addExpectedRun("40", "165580141");
|
||||
addExpectedRun("45", "1836311903");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testElseIf() {
|
||||
initCode("program Test {" + LF + // 1
|
||||
" void main() int i; {" + LF + // 2
|
||||
" read(i);" + LF + // 3
|
||||
" if (i == 1) print(9);" + LF + // 4
|
||||
" else if (i == 2) print(8);" + LF + // 5
|
||||
" else print(7);" + LF + // 6
|
||||
" }" + LF + // 7
|
||||
"}");
|
||||
addExpectedRun("1", "9");
|
||||
addExpectedRun("2", "8");
|
||||
addExpectedRun("3", "7");
|
||||
addExpectedRun("4", "7");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void mainVar() {
|
||||
initCode("program Test" + LF + //
|
||||
" int main;" + LF + //
|
||||
"{" + LF + //
|
||||
"}");
|
||||
expectError(4, 2, MAIN_NOT_FOUND);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void mainNotVoid() {
|
||||
initCode("program Test {" + LF + //
|
||||
" char main() { }" + LF + //
|
||||
"}");
|
||||
expectError(2, 15, MAIN_NOT_VOID);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void noLoop() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void main() {" + LF + //
|
||||
" break;" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(3, 10, BREAK_OUTSIDE_LOOP);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void returnVoid() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void test() {" + LF + //
|
||||
" return 5;" + LF + //
|
||||
" }" + LF + //
|
||||
" void main() {}" + LF + //
|
||||
"}");
|
||||
expectError(3, 12, UNEXPECTED_RETURN_VALUE);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void wrongReturnType() {
|
||||
initCode("program Test {" + LF + //
|
||||
" int test() {" + LF + //
|
||||
" return 'x';" + LF + //
|
||||
" }" + LF + //
|
||||
" void main() {}" + LF + //
|
||||
"}");
|
||||
expectError(3, 15, RETURN_TYPE_MISMATCH);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void wrongReturnTypeNull() {
|
||||
initCode("program Test {" + LF + //
|
||||
" int test() {" + LF + //
|
||||
" return null;" + LF + //
|
||||
" }" + LF + //
|
||||
" void main() {}" + LF + //
|
||||
"}");
|
||||
expectError(3, 16, RETURN_TYPE_MISMATCH);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void noReturnVal() {
|
||||
initCode("program Test {" + LF + //
|
||||
" int test() {" + LF + //
|
||||
" return;" + LF + //
|
||||
" }" + LF + //
|
||||
" void main() {}" + LF + //
|
||||
"}");
|
||||
expectError(3, 11, MISSING_RETURN_VALUE);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void wrongReturnTypeArr() {
|
||||
initCode("program Test {" + LF + //
|
||||
" int[] test() {" + LF + //
|
||||
" return new int[10];" + LF + //
|
||||
" }" + LF + //
|
||||
" void main() {}" + LF + //
|
||||
"}");
|
||||
expectError(2, 9, ILLEGAL_METHOD_RETURN_TYPE);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void wrongReturnClass() {
|
||||
initCode("program Test" + LF + //
|
||||
" class C1 { }" + LF + //
|
||||
"{" + LF + //
|
||||
" C1 test() {" + LF + //
|
||||
" return new C1;" + LF + //
|
||||
" }" + LF + //
|
||||
" void main() {}" + LF + //
|
||||
"}");
|
||||
expectError(4, 6, ILLEGAL_METHOD_RETURN_TYPE);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void noMeth() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void main() int i; {" + LF + //
|
||||
" i(10);" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(3, 7, CALL_TO_NON_METHOD);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void paramType() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void method(int x) { }" + LF + //
|
||||
" void main() {" + LF + //
|
||||
" method('a');" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(4, 15, ARGUMENT_TYPE_MISMATCH);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void paramTypeArr() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void method(int[] x) { }" + LF + //
|
||||
" void main() {" + LF + //
|
||||
" method(new char[10]);" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(4, 24, ARGUMENT_TYPE_MISMATCH);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void paramTypeClass() {
|
||||
initCode("program Test" + LF + //
|
||||
" class C1 { }" + LF + //
|
||||
" class C2 { }" + LF + //
|
||||
"{" + LF + //
|
||||
" void method(C1 c1) { }" + LF + //
|
||||
" void main() {" + LF + //
|
||||
" method(new C2);" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(7, 18, ARGUMENT_TYPE_MISMATCH);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void moreParams() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void method(int x, char c) { }" + LF + //
|
||||
" void main() {" + LF + //
|
||||
" method(1, 'a', 1);" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(4, 21, WRONG_ARGUMENT_COUNT);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lessParams() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void method(int x, char c) { }" + LF + //
|
||||
" void main() {" + LF + //
|
||||
" method(1);" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(4, 13, WRONG_ARGUMENT_COUNT);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void incompTypesCond() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void main() int i; { " + LF + //
|
||||
" if (i > null) { }" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(3, 17, INCOMPATIBLE_TYPES);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void incompTypesCondArr() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void main() int[] ia; char[] ca; { " + LF + //
|
||||
" if (ia > ca) { }" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(3, 16, INCOMPATIBLE_TYPES);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void incompTypesCondClass() {
|
||||
initCode("program Test" + LF + //
|
||||
" class C1 { }" + LF + //
|
||||
"{" + LF + //
|
||||
" void main() C1 c1; int i; { " + LF + //
|
||||
" if (c1 > i) { };" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(5, 15, INCOMPATIBLE_TYPES);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void wrongEqCheck() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void main() int[] ia1, ia2; {" + LF + //
|
||||
" if (ia1 > ia2) { }" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(3, 18, ILLEGAL_REFERENCE_COMPARISON);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleBreak() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void main() {" + LF + //
|
||||
" while(42 > 0) /* while(true) */" + LF + //
|
||||
" {" + LF + //
|
||||
" break;" + LF + //
|
||||
" }" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBreak() {
|
||||
initCode("program A" + LF + //
|
||||
" int i;" + LF + //
|
||||
"{" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" int n;" + LF + //
|
||||
" {" + LF + //
|
||||
" read(n); " + LF + //
|
||||
" while (i <= n) { while(1 < 2) { if(1 == 1) { break; } } if(i == 5) break; i++; }"
|
||||
+ LF + //
|
||||
" print(i); " + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
addExpectedRun("10", "5");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNestedBreak() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void main() " + LF + //
|
||||
" int n, o;" + LF + //
|
||||
" {" + LF + //
|
||||
" o = 21;" + LF + //
|
||||
" while(83 < 84)" + LF + //
|
||||
" {" + LF + //
|
||||
" while(167 < 168)" + LF + //
|
||||
" {" + LF + //
|
||||
" break;" + LF + //
|
||||
" }" + LF + //
|
||||
" break;" + LF + //
|
||||
" }" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void lenTest() {
|
||||
initCode("program A" + LF + //
|
||||
" class A { int[] x; }" + LF + //
|
||||
" class B { A a; }" + LF + //
|
||||
" class C { B b; }" + LF + //
|
||||
"{" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" C[] c;" + LF + //
|
||||
" {" + LF + //
|
||||
" c = new C[5];" + LF + //
|
||||
" print(len(c));" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
addExpectedRun("5");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void basicOrdChrTest() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void main() int i; char c; {" + LF + //
|
||||
" i = ord('A');" + LF + //
|
||||
" print(i);" + LF + //
|
||||
" i = ord('*');" + LF + //
|
||||
" print(i);" + LF + //
|
||||
" c = chr(49);" + LF + //
|
||||
" print(c);" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
addExpectedRun("65421");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void trappingOrdChrTest() {
|
||||
initCode("program Test {" + LF + //
|
||||
" int trap() {" + LF + //
|
||||
" print(7 * 7);" + LF + //
|
||||
" }" + LF + //
|
||||
" void main() int i; char c; {" + LF + //
|
||||
" ord('!');" + LF + //
|
||||
" chr(42);" + LF + //
|
||||
" i = ord('!');" + LF + //
|
||||
" c = chr(42);" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
addExpectedRun("");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void unusedReturnVal() {
|
||||
initCode("program Test {" + LF + //
|
||||
" int getUnused() {" + LF + //
|
||||
" return 351;" + LF + //
|
||||
" }" + LF + //
|
||||
" int polluteAndGet() {" + LF + //
|
||||
" getUnused();" + LF + //
|
||||
" return 42;" + LF + //
|
||||
" }" + LF + //
|
||||
" void main() {" + LF + //
|
||||
" print(932 + polluteAndGet());" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
addExpectedRun("974");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void coverUniverseMethod() {
|
||||
initCode("program Test {" + LF + //
|
||||
" int cast(char c) { return ord(c); }" + LF + //
|
||||
" int ord(char c) { return cast(c) - 30; }" + LF + //
|
||||
" void main() {" + LF + //
|
||||
" print(chr(ord('A')));" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
addExpectedRun("#");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void paramType2() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void method(int x, int y) { }" + LF + //
|
||||
" void main() {" + LF + //
|
||||
" method(1, 'a');" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(4, 18, ARGUMENT_TYPE_MISMATCH);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void paramTypeArr2() {
|
||||
initCode("program Test {" + LF + //
|
||||
" void method(int[] x, int y) { }" + LF + //
|
||||
" void main() {" + LF + //
|
||||
" method(new int[10], new char[10]);" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(4, 37, ARGUMENT_TYPE_MISMATCH);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void paramTypeClass2() {
|
||||
initCode("program Test" + LF + //
|
||||
" class C1 { }" + LF + //
|
||||
" class C2 { }" + LF + //
|
||||
"{" + LF + //
|
||||
" void method(C1 c1, C2 c2) { }" + LF + //
|
||||
" void main() {" + LF + //
|
||||
" method(new C1, new C1);" + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
expectError(7, 26, ARGUMENT_TYPE_MISMATCH);
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRelops() {
|
||||
initFile("relops.mj");
|
||||
addExpectedRun("0", "!=,<,<=,");
|
||||
addExpectedRun("1", "==,<=,>=,");
|
||||
addExpectedRun("2", "!=,>,>=,");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testAnimals() {
|
||||
initFile("animals.mj");
|
||||
addExpectedRun("0", "cat");
|
||||
addExpectedRun("1", "dog");
|
||||
addExpectedRun("2", "octopus");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void compareNeg() {
|
||||
initCode("program A" + LF + //
|
||||
"{" + LF + //
|
||||
" void main ()" + LF + //
|
||||
" int neg;" + LF + //
|
||||
" {" + LF + //
|
||||
" neg = -42;" + LF + //
|
||||
" if (neg == -42) print(42);" + LF + //
|
||||
" else print(neg); " + LF + //
|
||||
" }" + LF + //
|
||||
"}");
|
||||
|
||||
addExpectedRun("42");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
// index from end tests
|
||||
@Test
|
||||
public void arrayFromEndWithFunctionCall() {
|
||||
initCode("""
|
||||
program Test
|
||||
final int len = 2;
|
||||
{
|
||||
int const1() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
void main() int[] a; {
|
||||
a = new int[len];
|
||||
a[0] = 13;
|
||||
a[~const1()] = 42;
|
||||
print(a[~const1()]);
|
||||
}
|
||||
}""");
|
||||
addExpectedRun("42");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createPalindrom() {
|
||||
initCode("""
|
||||
program Test {
|
||||
void toPalindrom(char[] in, char[] out) int i, l; {
|
||||
l = len(in);
|
||||
i = 0;
|
||||
while (i < l) {
|
||||
out[i] = in[i];
|
||||
out[~(i + 1)] = in[i];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
void printText(char[] text) int i; {
|
||||
i = 0;
|
||||
while (i < len(text)) {
|
||||
print(text[i]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
void main() char[] a, out; int i; {
|
||||
a = new char[5];
|
||||
a[0] = 'l';
|
||||
a[1] = 'a';
|
||||
a[2] = 'g';
|
||||
a[3] = 'e';
|
||||
a[4] = 'r';
|
||||
|
||||
out = new char[10];
|
||||
|
||||
toPalindrom(a, out);
|
||||
printText(out);
|
||||
|
||||
a = new char[2];
|
||||
a[0] = 'o';
|
||||
a[1] = 't';
|
||||
|
||||
out = new char[4];
|
||||
|
||||
toPalindrom(a, out);
|
||||
printText(out);
|
||||
}
|
||||
}""");
|
||||
addExpectedRun("lagerregalotto");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void iterateArrayFromEnd() {
|
||||
initCode("""
|
||||
program Test
|
||||
final int len = 3;
|
||||
{
|
||||
void main() int[] a; int i; {
|
||||
a = new int[len];
|
||||
a[0] = 1;
|
||||
a[1] = 2;
|
||||
a[2] = 3;
|
||||
i = 1;
|
||||
while (i <= len) {
|
||||
print(a[~i]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}""");
|
||||
addExpectedRun("321");
|
||||
parseVerifyVisualize();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user