|
| 1 | +package proovieksam; |
| 2 | + |
| 3 | +import org.junit.FixMethodOrder; |
| 4 | +import org.junit.Test; |
| 5 | +import org.junit.runners.MethodSorters; |
| 6 | +import proovieksam.ast.EstologDef; |
| 7 | +import proovieksam.ast.EstologNode; |
| 8 | +import proovieksam.ast.EstologProg; |
| 9 | + |
| 10 | +import java.util.Arrays; |
| 11 | +import java.util.List; |
| 12 | +import java.util.NoSuchElementException; |
| 13 | + |
| 14 | +import static org.junit.Assert.assertEquals; |
| 15 | +import static proovieksam.ast.EstologNode.*; |
| 16 | + |
| 17 | +@FixMethodOrder(MethodSorters.NAME_ASCENDING) |
| 18 | +public class EstologEvaluatorTest { |
| 19 | + |
| 20 | + private static final List<EstologDef> allDefs = Arrays.asList( |
| 21 | + def("x", lit(false)), |
| 22 | + def("y", lit(true)), |
| 23 | + def("z", lit(true)), |
| 24 | + def("a", lit(true)), |
| 25 | + def("b", lit(false)), |
| 26 | + def("c", lit(true)) |
| 27 | + ); |
| 28 | + |
| 29 | + @Test |
| 30 | + public void test01_literals() { |
| 31 | + checkEval(prog(lit(false)), false); // 0 |
| 32 | + checkEval(prog(lit(true)), true); // 1 |
| 33 | + } |
| 34 | + |
| 35 | + @Test |
| 36 | + public void test02_operators() { |
| 37 | + checkEval(prog(ja(lit(false), lit(true))), false); // (0 JA 1) |
| 38 | + checkEval(prog(ja(lit(true), lit(true))), true); // (1 JA 1) |
| 39 | + checkEval(prog(voi(lit(false), lit(true))), true); // (0 VOI 1) |
| 40 | + checkEval(prog(voi(lit(false), lit(false))), false); // (0 VOI 0) |
| 41 | + checkEval(prog(vordus(lit(false), lit(true))), false); // (0 = 1) |
| 42 | + checkEval(prog(vordus(lit(false), lit(false))), true); // (0 = 0) |
| 43 | + } |
| 44 | + |
| 45 | + @Test |
| 46 | + public void test03_variables() { |
| 47 | + checkEval(prog(var("x"), def("x", lit(false))), false); // x |
| 48 | + checkEval(prog(var("y"), def("y", lit(true))), true); // y |
| 49 | + checkEval(prog(vordus(var("x"), lit(false)), def("x", lit(false))), true); // (x = 0) |
| 50 | + checkEval(prog(vordus(var("x"), var("c")), def("x", lit(false)), def("c", lit(true))), false); // (x = c) |
| 51 | + |
| 52 | + // same with allDefs |
| 53 | + checkEvalAllDefsProg(var("x"), false); // x |
| 54 | + checkEvalAllDefsProg(var("y"), true); // y |
| 55 | + checkEvalAllDefsProg(vordus(var("x"), lit(false)), true); // (x = 0) |
| 56 | + checkEvalAllDefsProg(vordus(var("x"), var("c")), false); // (x = c) |
| 57 | + } |
| 58 | + |
| 59 | + @Test |
| 60 | + public void test04_kui() { |
| 61 | + checkEvalAllDefsProg(kui(lit(true), lit(true), lit(false)), true); // (KUI 1 SIIS 1 MUIDU 0) |
| 62 | + checkEvalAllDefsProg(kui(lit(false), lit(true), lit(false)), false); // (KUI 0 SIIS 1 MUIDU 0) |
| 63 | + checkEvalAllDefsProg(kui(lit(true), var("x"), var("z")), false); // (KUI 1 SIIS x MUIDU z) |
| 64 | + |
| 65 | + // nested |
| 66 | + checkEvalAllDefsProg(kui(var("a"), kui(var("a"), lit(true), lit(false)), lit(false)), true); // (KUI a SIIS (KUI a SIIS 1 MUIDU 0) MUIDU 0) |
| 67 | + checkEvalAllDefsProg(kui(var("a"), kui(var("b"), lit(false), lit(true)), lit(false)), true); // (KUI a SIIS (KUI b SIIS 0 MUIDU 1) MUIDU 0) |
| 68 | + checkEvalAllDefsProg(kui(var("b"), kui(var("b"), lit(false), lit(false)), lit(true)), true); // (KUI b SIIS (KUI b SIIS 0 MUIDU 0) MUIDU 1) |
| 69 | + } |
| 70 | + |
| 71 | + @Test |
| 72 | + public void test05_all() { |
| 73 | + checkEvalAllDefsProg(kui(var("b"), voi(var("x"), var("y")), ja(var("x"), lit(true))), false); // (KUI b SIIS (x VOI y) MUIDU (x JA 1)) |
| 74 | + checkEvalAllDefsProg(kui(var("b"), voi(var("x"), var("y")), ja(var("x"), var("y"))), false); // (KUI b SIIS (x VOI y) MUIDU (x JA y)) |
| 75 | + checkEvalAllDefsProg(kui(ja(var("b"), vordus(lit(false), lit(true))), voi(var("x"), var("y")), vordus(var("x"), var("y"))), false); // (KUI (b JA (0 = 1)) SIIS (x VOI y) MUIDU (x = y)) |
| 76 | + checkEvalAllDefsProg(voi(voi(ja(var("x"), var("y")), ja(var("a"), var("z"))), ja(var("b"), var("c"))), true); // (((x JA y) VOI (a JA z)) VOI (b JA c)) |
| 77 | + checkEvalAllDefsProg(voi(voi(ja(var("x"), var("y")), vordus(var("a"), var("z"))), ja(var("b"), var("c"))), true); // (((x JA y) VOI (a = z)) VOI (b JA c)) |
| 78 | + } |
| 79 | + |
| 80 | + @Test |
| 81 | + public void test06_defines() { |
| 82 | + // non-literal define |
| 83 | + checkEval(prog(var("x"), def("x", vordus(lit(false), lit(false)))), true); // x := (0 = 0); x |
| 84 | + |
| 85 | + // dependent define |
| 86 | + checkEval(prog(var("y"), def("x", lit(false)), def("y", vordus(var("x"), lit(false)))), true); // x := 0; y := (x = 0); y |
| 87 | + |
| 88 | + // redefine |
| 89 | + checkEval(prog(var("x"), def("x", lit(true)), def("x", lit(false))), false); // x := 1; x := 0; x |
| 90 | + |
| 91 | + // dependent redefine |
| 92 | + checkEval(prog(var("x"), def("x", lit(false)), def("x", vordus(var("x"), lit(false)))), true); // x := 0; x := (x = 0); x |
| 93 | + } |
| 94 | + |
| 95 | + @Test |
| 96 | + public void test07_kui_without_muidu() { |
| 97 | + checkEvalAllDefsProg(kui(lit(true), lit(false)), false); // (KUI 1 SIIS 0) |
| 98 | + checkEvalAllDefsProg(kui(lit(false), lit(false)), true); // (KUI 0 SIIS 0) |
| 99 | + checkEvalAllDefsProg(kui(lit(true), var("x")), false); // (KUI 1 SIIS x) |
| 100 | + checkEvalAllDefsProg(kui(lit(false), var("x")), true); // (KUI 0 SIIS x) |
| 101 | + |
| 102 | + checkEvalAllDefsProg(kui(var("b"), voi(lit(false), var("y"))), true); // (KUI b SIIS (0 VOI y)) |
| 103 | + checkEvalAllDefsProg(kui(var("b"), voi(var("x"), var("y"))), true); // (KUI b SIIS (x VOI y)) |
| 104 | + } |
| 105 | + |
| 106 | + @Test(expected = NoSuchElementException.class) |
| 107 | + public void test08_variable_undefined() { |
| 108 | + EstologEvaluator.eval(prog(var("y"), def("x", lit(true)))); // x := 1; y |
| 109 | + } |
| 110 | + |
| 111 | + private void checkEval(EstologProg prog, boolean expected) { |
| 112 | + assertEquals(expected, EstologEvaluator.eval(prog)); |
| 113 | + } |
| 114 | + |
| 115 | + private void checkEvalAllDefsProg(EstologNode node, boolean expected) { |
| 116 | + checkEval(prog(node, allDefs), expected); |
| 117 | + } |
| 118 | +} |
0 commit comments