(**************************************************************************
 * 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.
 **************************************************************************)


let example_1 = "class  Example  {  public  int  main(String  []  a){  int  b;  b  =  (new  Foo()).start();  return  0;  }  }  class  Foo  {  public  int  start(){  return  1;  }  }";;

let example_2 = "class  Example  {  static  int  g;  public  int  main(String  []  a){  boolean  []  b;  b  =  new  boolean  [2];  b[0]  =  true;  return  0;  }  public  int  sub(){  int  a;  {  a  =  0;  }  return  0;  }  }";;

let example_3 = "class  Example  {  int  g;  int  h;  public  int  main(String  []  a){  while(true)  if(false)  break;  else  continue;  return  0;  }  }";;

let example_4 = "class  Example  {  public  int  main(String  []  a){  float  b;  float  c;  b  =  3.4;  return  0;  }  }";;

let example_5 = "class  Factorial  {  public  int  main(String  []  a){  System.out.println((new  Fac()).ComputeFac(10));  return  0;  }  }  class  Fac  {  public  int  ComputeFac(int  num){  int  numaux;  if((1)  <  (num))  num  =  1;  else  num  =  (num)  *  ((this).ComputeFac((num)  -  (1)));  return  numaux;  }  }";;

let example_6 = "class  Example  {  public  int  main(String  []  a){  System.out.println((new  Class1()).Method1(10,  10));  return  0;  }  }  class  Class1  {  int  v1;  int  v2;  public  int  Method1(int  v3,  int  v4){  int  v5;  boolean  v6;  int  []  v7;  switch(v1)  {  case  1:  System.out.println(1);  break;  case  2:  System.out.println(2);  break;  default:  System.out.println(0);  }  return  v3;  }  }";;

let example_7 = "class  Example  {  public  int  main(String  []  a){  System.out.println((new  Class1()).Method1(10,  10));  return  0;  }  }  class  Class1  {  int  v1;  int  v2;  public  int  Method1(int  v3,  int  v4){  int  v5;  boolean  v6;  int  []  v7; if((v5)  <  (1))  v6  =  true;  else  v7  =  new  int  [10];  return  v3;  }\
public  int  Method2(int  v8){  int  v9;  boolean  v10;  int  []  v11;  if((v9)  <  (1))  v10  =  true;  else  v11  =  new  int  [10];  return  v9;  }  }  class  Class2  extends  Class1  {  int  v12;  public  int  Method3(int  v13){  int  v14;  boolean  v15;  if((v14)  <  (1))  v15  =  true;  else  v15  =  false;  return  v1;  }\
}";;

let example_1_extra = example_5;;
let example_2_extra = example_6;;
let example_3_extra = example_7;;

let parse s = Minijavaparse.program Minijavalex.tokenize (Lexing.from_string s);;

let p1_sol p = (parse (Solution.pretty_print (parse p)));;
let p1_stu p = (parse (Student.pretty_print (parse p)));;

let p1b_sol p = (*print_endline ((Solution.pretty_print (parse p)));*) (p1_canon2 (Solution.pretty_print (parse p)));;
let p1b_stu p = (*print_endline ((Student.pretty_print (parse p)));*) (p1_canon2 (Student.pretty_print (parse p)));;

let p2_sol p = (p2_canon (Solution.symboltable (parse p)));;
let p2_stu p = (p2_canon (Student.symboltable (parse p)));;

let p2extra_sol p = (p2_canon (Solution.symboltable2 (parse p)));;
let p2extra_stu p = (p2_canon (Student.symboltable2 (parse p)));;

parse (example_7);; 

(* This list is for regular problems *)
let rubric =
[
     TEST1ARG_TWOFUN(1, p1_sol, p1_stu, example_1);
     TEST1ARG_TWOFUN(1, p1_sol, p1_stu, example_2);
     TEST1ARG_TWOFUN(1, p1_sol, p1_stu, example_3);
     TEST1ARG_TWOFUN(1, p1_sol, p1_stu, example_4);
     TEST1ARG_TWOFUN(1, p1_sol, p1_stu, example_5);

     TEST1ARG_TWOFUN(1, p2_sol, p2_stu, example_1);
     TEST1ARG_TWOFUN(1, p2_sol, p2_stu, example_2);
     TEST1ARG_TWOFUN(1, p2_sol, p2_stu, example_3);
     TEST1ARG_TWOFUN(1, p2_sol, p2_stu, example_4);
     TEST1ARG_TWOFUN(1, p2_sol, p2_stu, example_5) 
]
(* Note: the last entry should not be followed by a semicolon. *)

(* This list is for extra credit problems *)
let extra_rubric = [
     TEST1ARG_TWOFUN(1, p1b_sol, p1b_stu, (example_1_extra)); (* problem 1 extra *)
     TEST1ARG_TWOFUN(1, p1_sol, p1_stu, example_2_extra); (* problem 2 extra *)

     TEST1ARG_TWOFUN(1, p2extra_sol, p2extra_stu, example_3_extra) (* problem 3 extra *)
]

