LispParserTest.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package migl.lisp;
  2. import static org.junit.Assert.assertEquals;
  3. import java.math.BigInteger;
  4. import org.junit.Test;
  5. import migl.util.ConsList;
  6. import migl.util.ConsListFactory;
  7. /**
  8. * The aim of those tests is to check that a basic lisp String can be translated
  9. * into a list of Java objects.
  10. *
  11. * The main issue here is to be able to return the proper Java type for each
  12. * object. Note that Lisp using arbitrary precision arithmetic, it is important
  13. * to use the BigInteger and Double classes to represent numbers.
  14. *
  15. * Note that all inputs are valid for now. Invalid inputs will be tested in
  16. * future test cases.
  17. *
  18. * @author leberre
  19. *
  20. */
  21. public class LispParserTest extends AbstractTDD {
  22. @Test
  23. public void testParsingSingleElement() throws LispError {
  24. assertEquals("r", lisp.parse("r"));
  25. assertEquals(BigInteger.valueOf(18), lisp.parse("18"));
  26. assertEquals(Double.valueOf("-3.14E12"), lisp.parse("-3.14E12"));
  27. }
  28. @Test
  29. public void testParsingSingleElementInList() throws LispError {
  30. ConsList<Object> expected = ConsListFactory.nil().prepend("r");
  31. assertEquals(expected, lisp.parse("(r)"));
  32. expected = ConsListFactory.nil().prepend(BigInteger.valueOf(18));
  33. assertEquals(expected, lisp.parse("(18)"));
  34. expected = ConsListFactory.nil().prepend(Double.valueOf("-3.14E12"));
  35. assertEquals(expected, lisp.parse("(-3.14E12)"));
  36. }
  37. @Test
  38. public void testParsingSingleExpression() throws LispError {
  39. ConsList<Object> expected = ConsListFactory.nil().prepend("r").prepend("r").prepend("+");
  40. assertEquals(expected, lisp.parse("(+ r r)"));
  41. expected = ConsListFactory.nil().prepend(BigInteger.valueOf(2)).prepend("x").prepend(">");
  42. assertEquals(expected, lisp.parse("(> x 2)"));
  43. expected = ConsListFactory.nil().prepend(BigInteger.valueOf(10)).prepend("z").prepend("define");
  44. assertEquals(expected, lisp.parse("(define z 10)"));
  45. }
  46. @Test
  47. public void testParsingSimpleImbricatedExpressions() throws LispError {
  48. ConsList<Object> l1 = ConsListFactory.nil().prepend("r").prepend("r").prepend("+");
  49. ConsList<Object> expected = ConsListFactory.nil().prepend(BigInteger.valueOf(10)).prepend(l1).prepend("*");
  50. assertEquals(expected, lisp.parse("(* (+ r r) 10)"));
  51. l1 = ConsListFactory.nil().prepend(BigInteger.valueOf(2)).prepend(BigInteger.valueOf(1)).prepend("+");
  52. expected = ConsListFactory.nil().prepend(l1).prepend("quote");
  53. assertEquals(expected, lisp.parse("(quote (+ 1 2))"));
  54. }
  55. @Test
  56. public void testParsingOtherLispKeyworkds() throws LispError {
  57. ConsList<Object> l1 = ConsListFactory.nil().prepend(BigInteger.valueOf(2)).prepend(BigInteger.valueOf(1))
  58. .prepend(">");
  59. ConsList<Object> expected = ConsListFactory.nil().prepend(BigInteger.valueOf(5)).prepend(BigInteger.valueOf(3))
  60. .prepend(l1).prepend("if");
  61. assertEquals(expected, lisp.parse("(if (> 1 2) 3 5)"));
  62. expected = ConsListFactory.nil().prepend(BigInteger.valueOf(15)).prepend("bb8").prepend("define");
  63. assertEquals(expected, lisp.parse("(define bb8 15)"));
  64. }
  65. @Test
  66. public void testTypeOfTheObjectsInTheList() throws LispError {
  67. @SuppressWarnings("unchecked")
  68. ConsList<Object> objects = (ConsList<Object>) lisp.parse("(+ 1 2.0)");
  69. assertEquals(3, objects.size());
  70. assertEquals(String.class, objects.car().getClass());
  71. assertEquals(BigInteger.class, objects.cdr().car().getClass());
  72. assertEquals(Double.class, objects.cdr().cdr().car().getClass());
  73. }
  74. @Test
  75. public void testTypeOfBooleanConstants() throws LispError {
  76. @SuppressWarnings("unchecked")
  77. ConsList<Object> objects = (ConsList<Object>) lisp.parse("(or #t #f)");
  78. assertEquals(3, objects.size());
  79. assertEquals(String.class, objects.car().getClass());
  80. assertEquals(LispBoolean.class, objects.cdr().car().getClass());
  81. assertEquals(LispBoolean.TRUE, objects.cdr().car());
  82. assertEquals(LispBoolean.class, objects.cdr().cdr().car().getClass());
  83. assertEquals(LispBoolean.FALSE, objects.cdr().cdr().car());
  84. }
  85. @Test
  86. public void testParsingSingleExpressionMHachinLikesSpaces() throws LispError {
  87. ConsList<Object> expected = ConsListFactory.nil().prepend("r").prepend("r").prepend("+");
  88. assertEquals(expected, lisp.parse("(+ r r)"));
  89. expected = ConsListFactory.nil().prepend(BigInteger.valueOf(2)).prepend("x").prepend(">");
  90. assertEquals(expected, lisp.parse("(> x 2) "));
  91. expected = ConsListFactory.nil().prepend(BigInteger.valueOf(10)).prepend("z").prepend("define");
  92. assertEquals(expected, lisp.parse(" (define z 10)"));
  93. assertEquals(expected, lisp.parse(" (define z 10) "));
  94. assertEquals(expected, lisp.parse(" ( define z 10 ) "));
  95. }
  96. }