You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
4.5 KiB

  1. package parser;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertTrue;
  4. import org.junit.Test;
  5. import expression.*;
  6. import parser.Parser.Operator;
  7. import program.*;
  8. import java.util.Optional;
  9. public class ParserTest {
  10. final String loopCode = "while (a) { r := r + b ; a := a - 1 }";
  11. final Loop loop = new Loop(new Identifier("a"), new Composition(new Assignment(new Identifier("r"), new Addition(new Identifier("r"), new Identifier("b"))), new Assignment(new Identifier("a"), new Subtraction(new Identifier("a"), new Int(1)))));
  12. final String assignmentCode = "a := 2";
  13. final Assignment assignment = new Assignment(new Identifier("a"), new Int(2));
  14. final String compositionCode = assignmentCode + " ; b := bar";
  15. final Composition composition = new Composition(assignment, new Assignment(new Identifier("b"), new Identifier("bar")));
  16. final String conditionalCode = "if (foo - bar) then { x := 5 } else { x := x }";
  17. final Conditional conditional = new Conditional(new Subtraction(new Identifier("foo"), new Identifier("bar")), new Assignment(new Identifier("x"), new Int(5)), new Assignment(new Identifier("x"), new Identifier("x")));
  18. final String programCode = compositionCode + " ; " + loopCode + " ; " + conditionalCode;
  19. final Program program = new Composition(new Composition(composition, loop), conditional);
  20. @Test
  21. public void testParse() {
  22. Parser parser = new Parser(programCode);
  23. assertEquals(program, parser.parse());
  24. }
  25. @Test
  26. public void testProgram() {
  27. Parser parser = new Parser(programCode);
  28. assertEquals(Optional.of(program), parser.program());
  29. }
  30. @Test
  31. public void testStatementAssignment() {
  32. Parser parser = new Parser(assignmentCode);
  33. assertEquals(Optional.of(assignment), parser.statement());
  34. }
  35. @Test
  36. public void testStatementConditional() {
  37. Parser parser = new Parser(conditionalCode);
  38. assertEquals(Optional.of(conditional), parser.statement());
  39. }
  40. @Test
  41. public void testStatementLoop() {
  42. Parser parser = new Parser(loopCode);
  43. assertEquals(Optional.of(loop), parser.statement());
  44. }
  45. @Test
  46. public void testAssignment() {
  47. Parser parser = new Parser(assignmentCode);
  48. assertEquals(Optional.of(assignment), parser.assignment());
  49. }
  50. @Test
  51. public void testConditional() {
  52. Parser parser = new Parser(conditionalCode);
  53. assertEquals(Optional.of(conditional), parser.conditional());
  54. }
  55. @Test
  56. public void testLoop() {
  57. Parser parser = new Parser(loopCode);
  58. assertEquals(Optional.of(loop), parser.loop());
  59. }
  60. final String expressionCode = "a+b - (c - 56) + -47";
  61. final Expression expression = new Addition(new Subtraction(new Addition(new Identifier("a"), new Identifier("b")), new Subtraction(new Identifier("c"), new Int(56))), new Int(-47));
  62. @Test
  63. public void testExpression() {
  64. Parser parser = new Parser(expressionCode);
  65. assertEquals(Optional.of(expression), parser.expression());
  66. }
  67. @Test
  68. public void testOperatorMinus() {
  69. Parser parser = new Parser("-");
  70. assertEquals(Operator.MINUS, parser.operator());
  71. }
  72. @Test
  73. public void testOperatorPlus() {
  74. Parser parser = new Parser("+");
  75. assertEquals(Operator.PLUS, parser.operator());
  76. }
  77. @Test
  78. public void testAtomExpression() {
  79. Parser parser = new Parser("(" + expressionCode + ")");
  80. assertEquals(Optional.of(expression), parser.atom());
  81. }
  82. @Test
  83. public void testAtomNumber() {
  84. Parser parser = new Parser("37658");
  85. assertEquals(Optional.of(new Int(37658)), parser.atom());
  86. }
  87. @Test
  88. public void testAtomIdentifier() {
  89. Parser parser = new Parser("egjfd");
  90. assertEquals(Optional.of(new Identifier("egjfd")), parser.atom());
  91. }
  92. @Test
  93. public void testNumber() {
  94. Parser parser = new Parser("37658");
  95. assertEquals(Optional.of(new Int(37658)), parser.integer());
  96. }
  97. @Test
  98. public void testIdentifier() {
  99. Parser parser = new Parser("egjfd");
  100. assertEquals(Optional.of(new Identifier("egjfd")), parser.identifier());
  101. }
  102. @Test
  103. public void testWhitespace() {
  104. Parser parser = new Parser(" \n\t x");
  105. parser.whitespace();
  106. assertEquals('x', parser.input.charAt(parser.position));
  107. }
  108. @Test
  109. public void testToken() {
  110. Parser parser = new Parser("gehjfwdk");
  111. assertTrue(parser.token("gehjfwdk"));
  112. }
  113. }