/**
   * Author the generated AST.
   *
   * <pre>
   *              OR
   *    p1>0                  AND
   *              p2<=10.2            =
   *                          p1-p2        5
   * </pre>
   *
   * TODO: add tests for DateLiteral, other operators, paranthesys etc
   */
  public void testAST() {
    SQLQuery query =
        SQLQueryParser.parse("SELECT p1, p2 FROM table WHERE p1 > 0 OR p2 <= 10.2 AND p1 - p2 = 5");

    SelectList select = query.getSelectClause().elements;
    assertEquals(2, select.size());

    Expression where = query.getWhereClause().predicate;
    assertEquals(Operator.OR, where.operator);

    Expression expr = (Expression) where.lvalue;
    assertEquals(Operator.GT, expr.operator);
    assertEquals("p1", ((Reference) expr.lvalue).name);
    assertEquals(0, ((IntegerLiteral) expr.rvalue).value);

    // root expr
    expr = (Expression) where.rvalue;
    assertEquals(Operator.AND, expr.operator);

    Expression expr1 = (Expression) expr.lvalue;
    assertEquals(Operator.LTEQ, expr1.operator);
    assertEquals("p2", ((Reference) expr1.lvalue).name);
    assertEquals(10.2, ((DoubleLiteral) expr1.rvalue).value);

    Expression expr2 = (Expression) expr.rvalue;
    assertEquals(Operator.EQ, expr2.operator);
    assertEquals(5, ((IntegerLiteral) expr2.rvalue).value);

    Expression expr3 = (Expression) expr2.lvalue;
    assertEquals(Operator.SUB, expr3.operator);
    assertEquals("p1", ((Reference) expr3.lvalue).name);
    assertEquals("p2", ((Reference) expr3.rvalue).name);
  }