(**************************************************************************
 * You can add new test cases by adding new elements to the following lists
 * Format is:
 * TEST<X>ARG(<weight>, <function_name>, <arg1>, <arg2>, ..., <argX>)
 *
 * <X> is the number of argument that the function being tested takes.
 **************************************************************************)
open Mp5common
open Mp5eval

let evalAll a b = (eval_exp (LetExp (a,(AppExp ( AppExp (VarExp "list_all",FnExp ("x", BinOpAppExp (EqOp,(VarExp "x"), ConstExp (IntConst 1)))),(BinOpAppExp (ConsOp,ConstExp (IntConst 1),BinOpAppExp (ConsOp,ConstExp (IntConst 2),ConstExp NilConst)))))), [])) = (eval_exp (LetExp (b,(AppExp ( AppExp (VarExp "list_all",FnExp ("x", BinOpAppExp (EqOp,(VarExp "x"), ConstExp (IntConst 1)))),(BinOpAppExp (ConsOp,ConstExp (IntConst 1),BinOpAppExp (ConsOp,ConstExp (IntConst 2),ConstExp NilConst)))))), []))
(* This list is for regular problems *)
let rubric =
[
  TEST1ARG(1, import_list, [("a",1);("b",2);("c",3)]);
  TEST0ARG(1, list_all);
  TEST1ARG(1, cal_max_exp_height, (BinOpAppExp (ConsOp,
BinOpAppExp (CommaOp, ConstExp (StringConst "a"), ConstExp (IntConst 1)),
BinOpAppExp (ConsOp,
BinOpAppExp (CommaOp, ConstExp (StringConst "b"), ConstExp (IntConst 2)),
BinOpAppExp (ConsOp,
BinOpAppExp (CommaOp, ConstExp (StringConst "c"), ConstExp (IntConst 3)),
ConstExp NilConst)))));
  TEST1ARG(1, freeVarsInExp, (VarExp "x"));
  TEST1ARG(1, freeVarsInExp, (IfExp(ConstExp (BoolConst true), VarExp "x", VarExp "y")));
  TEST1ARG(1, freeVarsInExp, (FnExp("x", VarExp "x")));
  TEST1ARG(1, freeAndBindingVarsInDec,
  (Rec ("f", "x", BinOpAppExp(IntPlusOp, VarExp "x",
                                   AppExp(VarExp  "f", VarExp "y")))));
  TEST1ARG(1, freeVarsInExp, (LetExp(Val("x", VarExp "y"), VarExp "x")));
  TEST1ARG(1, freeVarsInExp, (LetExp(Rec("f","x",AppExp(VarExp "f",VarExp "x")),
                                    (AppExp(VarExp "f",VarExp "y")))));
  TEST3ARG(1, cps_exp, (VarExp "x"), (ContVarCPS 0), 1);
  TEST3ARG(1, cps_exp, (IfExp (VarExp "b", ConstExp (IntConst 2),
                                         ConstExp (IntConst 5))),
                                 (ContVarCPS 0), 1);
  TEST3ARG(1, cps_exp, (AppExp (VarExp "f", VarExp "x")),
                         (ContVarCPS 0), 1);
  TEST3ARG(1, cps_exp, (BinOpAppExp (IntPlusOp, ConstExp(IntConst 5),
                                              ConstExp(IntConst 1))),
                          (ContVarCPS 3), 4);
  TEST3ARG(1, cps_exp, (MonOpAppExp (HdOp, ConstExp NilConst)),
                                 (ContVarCPS 0), 1);
  TEST3ARG(1, cps_exp, (FnExp ("x", VarExp "x")),
                                 (ContVarCPS 0), 1);
  TEST3ARG(1, cps_dec, (Val ("x", ConstExp(IntConst 2))),
                                 (VarCPS (ContVarCPS 0, "x")), 1);
  TEST3ARG(1, cps_dec, (Seq (Val ("x", ConstExp(IntConst 2)),
                                       Val ("y", VarExp "x"))),
                                 (VarCPS (ContVarCPS 0, "x")), 1);
  TEST3ARG(1, cps_exp, (LetExp (Val ("x", ConstExp(IntConst 2)), VarExp "x")),
                      (ContVarCPS 0), 1)
]


let extra_rubric = [ 
  TEST3ARG(1, cps_exp, (LetExp (Rec("f", "x",VarExp "x"),
                                  ConstExp (IntConst 4))),
                                 (ContVarCPS 1), 2)
]
