|
1 | 1 | package liquidjava.rj_language.ast; |
2 | 2 |
|
3 | 3 | import static org.junit.jupiter.api.Assertions.assertEquals; |
| 4 | + |
4 | 5 | import org.junit.jupiter.api.Test; |
5 | 6 |
|
| 7 | +import liquidjava.rj_language.parsing.RefinementsParser; |
| 8 | + |
6 | 9 | class ExpressionFormatterTest { |
7 | 10 |
|
| 11 | + private static Expression parse(String refinement) { |
| 12 | + return RefinementsParser.createAST(refinement, ""); |
| 13 | + } |
| 14 | + |
8 | 15 | @Test |
9 | 16 | void formatsUnaryAtoms() { |
10 | | - assertEquals("!x", new UnaryExpression("!", new Var("x")).toDisplayString()); |
11 | | - assertEquals("!false", new UnaryExpression("!", new LiteralBoolean(false)).toDisplayString()); |
| 17 | + assertEquals("!x", parse("!x").toDisplayString()); |
| 18 | + assertEquals("!false", parse("!false").toDisplayString()); |
12 | 19 | } |
13 | 20 |
|
14 | 21 | @Test |
15 | 22 | void formatsInternalVariables() { |
16 | | - assertEquals("x", new Var("x").toDisplayString()); |
17 | | - assertEquals("x²", new Var("#x_2").toDisplayString()); |
18 | | - assertEquals("#fresh¹²", new Var("#fresh_12").toDisplayString()); |
19 | | - assertEquals("#ret³", new Var("#ret_3").toDisplayString()); |
20 | | - assertEquals("this#Class", new Var("this#Class").toDisplayString()); |
| 23 | + assertEquals("x", parse("x").toDisplayString()); |
| 24 | + assertEquals("x²", parse("#x_2").toDisplayString()); |
| 25 | + assertEquals("#fresh¹²", parse("#fresh_12").toDisplayString()); |
| 26 | + assertEquals("#ret³", parse("#ret_3").toDisplayString()); |
| 27 | + assertEquals("this#Class", parse("this#Class").toDisplayString()); |
21 | 28 | } |
22 | 29 |
|
23 | 30 | @Test |
24 | 31 | void formatsEnums() { |
25 | | - assertEquals("Color.RED", new Enum("Color", "RED").toDisplayString()); |
| 32 | + assertEquals("Color.RED", parse("Color.RED").toDisplayString()); |
26 | 33 | } |
27 | 34 |
|
28 | 35 | @Test |
29 | 36 | void formatsUnaryCompounds() { |
30 | | - Expression comparison = new BinaryExpression(new Var("x"), ">", new LiteralInt(0)); |
31 | | - |
32 | | - assertEquals("x > 0", comparison.toDisplayString()); |
33 | | - assertEquals("!(x > 0)", new UnaryExpression("!", comparison).toDisplayString()); |
34 | | - assertEquals("-(-x)", new UnaryExpression("-", new GroupExpression(new UnaryExpression("-", new Var("x")))) |
35 | | - .toDisplayString()); |
| 37 | + assertEquals("x > 0", parse("x > 0").toDisplayString()); |
| 38 | + assertEquals("!(x > 0)", parse("!(x > 0)").toDisplayString()); |
| 39 | + assertEquals("-(-x)", parse("-(-x)").toDisplayString()); |
36 | 40 | } |
37 | 41 |
|
38 | 42 | @Test |
39 | 43 | void formatsBinaryPrecedence() { |
40 | | - Expression sum = new BinaryExpression(new Var("a"), "+", new Var("b")); |
41 | | - Expression product = new BinaryExpression(new Var("b"), "*", new Var("c")); |
| 44 | + assertEquals("(a + b) * c", parse("(a + b) * c").toDisplayString()); |
| 45 | + assertEquals("a * (a + b)", parse("a * (a + b)").toDisplayString()); |
| 46 | + assertEquals("a + b * c", parse("a + b * c").toDisplayString()); |
| 47 | + assertEquals("a - (a + b)", parse("a - (a + b)").toDisplayString()); |
| 48 | + assertEquals("a + b + c", parse("a + b + c").toDisplayString()); |
| 49 | + assertEquals("b * c * c", parse("b * c * c").toDisplayString()); |
| 50 | + } |
42 | 51 |
|
43 | | - assertEquals("(a + b) * c", new BinaryExpression(sum, "*", new Var("c")).toDisplayString()); |
44 | | - assertEquals("a * (a + b)", new BinaryExpression(new Var("a"), "*", sum).toDisplayString()); |
45 | | - assertEquals("a + b * c", new BinaryExpression(new Var("a"), "+", product).toDisplayString()); |
46 | | - assertEquals("a - (a + b)", new BinaryExpression(new Var("a"), "-", sum).toDisplayString()); |
47 | | - assertEquals("a + b + c", new BinaryExpression(sum, "+", new Var("c")).toDisplayString()); |
48 | | - assertEquals("b * c * c", new BinaryExpression(product, "*", new Var("c")).toDisplayString()); |
| 52 | + @Test |
| 53 | + void omitsUnnecessaryGroupParentheses() { |
| 54 | + assertEquals("x", parse("(x)").toDisplayString()); |
| 55 | + assertEquals("x", parse("((x))").toDisplayString()); |
| 56 | + assertEquals("1", parse("(1)").toDisplayString()); |
| 57 | + assertEquals("a > 0", parse("(a > 0)").toDisplayString()); |
| 58 | + assertEquals("a + b + c", parse("a + (b + c)").toDisplayString()); |
| 59 | + assertEquals("a + b * c", parse("a + (b * c)").toDisplayString()); |
| 60 | + assertEquals("a && b > 0", parse("a && (b > 0)").toDisplayString()); |
| 61 | + assertEquals("a && b && c", parse("a && (b && c)").toDisplayString()); |
| 62 | + assertEquals("size(stack²⁹⁴) > 0", parse("(size(#stack_294) > 0)").toDisplayString()); |
| 63 | + assertEquals("size(stack²⁹⁴) > 0 && ready", parse("(size(#stack_294) > 0) && ready").toDisplayString()); |
| 64 | + assertEquals("ready && size(stack²⁹⁴) > 0", parse("ready && (size(#stack_294) > 0)").toDisplayString()); |
49 | 65 | } |
50 | 66 |
|
51 | 67 | @Test |
52 | 68 | void formatsRightGrouping() { |
53 | | - Expression groupedSum = new GroupExpression(new BinaryExpression(new Var("b"), "+", new Var("c"))); |
54 | | - Expression groupedComparison = new GroupExpression( |
55 | | - new BinaryExpression(new LiteralInt(1), ">", new LiteralInt(0))); |
56 | | - |
57 | | - assertEquals("a - (b + c)", new BinaryExpression(new Var("a"), "-", groupedSum).toDisplayString()); |
58 | | - assertEquals("x == (1 > 0)", new BinaryExpression(new Var("x"), "==", groupedComparison).toDisplayString()); |
| 69 | + assertEquals("a - (b + c)", parse("a - (b + c)").toDisplayString()); |
| 70 | + assertEquals("a - (b - c)", parse("a - (b - c)").toDisplayString()); |
| 71 | + assertEquals("a / (b * c)", parse("a / (b * c)").toDisplayString()); |
| 72 | + assertEquals("(a || b) && c", parse("(a || b) && c").toDisplayString()); |
| 73 | + assertEquals("x == (1 > 0)", parse("x == (1 > 0)").toDisplayString()); |
| 74 | + assertEquals("a == (b == c)", parse("a == (b == c)").toDisplayString()); |
59 | 75 | } |
60 | 76 |
|
61 | 77 | @Test |
62 | 78 | void formatsLogicalExpressions() { |
63 | | - Expression andExpression = new BinaryExpression(new Var("a"), "&&", new Var("b")); |
64 | | - Expression orExpression = new BinaryExpression(new Var("b"), "||", new Var("c")); |
65 | | - Expression implication = new BinaryExpression(new Var("b"), "-->", new Var("c")); |
66 | | - |
67 | | - assertEquals("a && b || c", new BinaryExpression(andExpression, "||", new Var("c")).toDisplayString()); |
68 | | - assertEquals("a && (b || c)", new BinaryExpression(new Var("a"), "&&", orExpression).toDisplayString()); |
69 | | - assertEquals("a --> (b --> c)", new BinaryExpression(new Var("a"), "-->", implication).toDisplayString()); |
70 | | - assertEquals("a && b && c", new BinaryExpression(andExpression, "&&", new Var("c")).toDisplayString()); |
71 | | - assertEquals("a || b || c", |
72 | | - new BinaryExpression(new BinaryExpression(new Var("a"), "||", new Var("b")), "||", new Var("c")) |
73 | | - .toDisplayString()); |
| 79 | + assertEquals("a && b || c", parse("a && b || c").toDisplayString()); |
| 80 | + assertEquals("a && (b || c)", parse("a && (b || c)").toDisplayString()); |
| 81 | + assertEquals("a --> (b --> c)", parse("a --> b --> c").toDisplayString()); |
| 82 | + assertEquals("a --> (b --> c)", parse("a --> (b --> c)").toDisplayString()); |
| 83 | + assertEquals("a --> (b --> (c --> d))", parse("a --> b --> c --> d").toDisplayString()); |
| 84 | + assertEquals("(a --> b) --> c", parse("(a --> b) --> c").toDisplayString()); |
| 85 | + assertEquals("a && b && c", parse("a && b && c").toDisplayString()); |
| 86 | + assertEquals("a || b || c", parse("a || b || c").toDisplayString()); |
74 | 87 | } |
75 | 88 |
|
76 | 89 | @Test |
77 | 90 | void formatsTernaryExpressions() { |
78 | | - Expression ite = new Ite(new Var("a"), new Var("b"), new Var("c")); |
79 | | - Expression nestedElse = new Ite(new Var("c"), new Var("d"), new Var("e")); |
80 | | - |
81 | | - assertEquals("(a ? b : c) + d", new BinaryExpression(ite, "+", new Var("d")).toDisplayString()); |
82 | | - assertEquals("(a ? b : c) ? d : e", new Ite(ite, new Var("d"), new Var("e")).toDisplayString()); |
83 | | - assertEquals("a ? (b ? c : d) : e", |
84 | | - new Ite(new Var("a"), new Ite(new Var("b"), new Var("c"), new Var("d")), new Var("e")) |
85 | | - .toDisplayString()); |
86 | | - assertEquals("a ? b : c ? d : e", new Ite(new Var("a"), new Var("b"), nestedElse).toDisplayString()); |
87 | | - assertEquals("(a ? b : c) ? d : e", |
88 | | - new Ite(new GroupExpression(ite), new Var("d"), new Var("e")).toDisplayString()); |
89 | | - assertEquals("a ? b : (c ? d : e)", |
90 | | - new Ite(new Var("a"), new Var("b"), new GroupExpression(nestedElse)).toDisplayString()); |
91 | | - assertEquals("a ? b : c", new Ite(new Var("a"), new Var("b"), new Var("c")).toDisplayString()); |
| 91 | + assertEquals("(a ? b : c) + d", parse("(a ? b : c) + d").toDisplayString()); |
| 92 | + assertEquals("(a ? b : c) ? d : e", parse("(a ? b : c) ? d : e").toDisplayString()); |
| 93 | + assertEquals("a ? (b ? c : d) : e", parse("a ? (b ? c : d) : e").toDisplayString()); |
| 94 | + assertEquals("a ? b : (c ? d : e)", parse("a ? b : c ? d : e").toDisplayString()); |
| 95 | + assertEquals("(a ? b : c) ? d : e", parse("(a ? b : c) ? d : e").toDisplayString()); |
| 96 | + assertEquals("a ? b : (c ? d : e)", parse("a ? b : (c ? d : e)").toDisplayString()); |
| 97 | + assertEquals("a ? b : (c ? d : (e ? f : g))", parse("a ? b : c ? d : e ? f : g").toDisplayString()); |
| 98 | + assertEquals("a ? b : c", parse("a ? b : c").toDisplayString()); |
92 | 99 | } |
93 | 100 | } |
0 commit comments