Advertisement
DanFloyd

Test for Functional Language Interpreter

Aug 9th, 2015
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 7.89 KB | None | 0 0
  1. (* These are the tests for the functional language interpreter *)
  2.  
  3. open Interpreter;;
  4. open Assert;;
  5. open Printf;;
  6.  
  7. let environment = empty_env               (* funzione che identifica l'ambiente vuoto *)
  8. let execute (e:exp) = eval  e environment;; (* helper per la valutazione delle espressioni su ambiente vuoto *)
  9.  
  10. (* TEST SU INTERI *)
  11.  
  12. printf "*** Integer test ***\n";;
  13.  
  14. (* test assegnamento e somma -> risultato atteso : Int(42) *)
  15. let t1() = let e1 = Let("x",EInt(40),Op("+",Ide("x"),EInt(2))) in execute e1 = Int(42);;
  16. run_test "Test1 - assignment and summation \t\t" t1;;
  17.  
  18. (* test assegnamento e sottrazione -> risultato atteso : Int(42) *)
  19. let t2() = let e1 = Let("x",EInt(44),Op("-",Ide("x"),EInt(2))) in execute e1 = Int(42);;
  20. run_test "Test2 - assignment and subtraction \t\t" t2;;
  21.  
  22. (* test assegnamento e moltiplicazione -> risultato atteso : Int(42) *)
  23. let t3() = let e1 = Let("x",EInt(21),Op("*",Ide("x"),EInt(2))) in execute e1 = Int(42);;
  24. run_test "Test3 - assignment and multiplication \t\t" t3;;
  25.  
  26. (* test assegnamento e divisione -> risultato atteso : Int(42) *)
  27. let t4() = let e1 = Let("x",EInt(84),Op("/",Ide("x"),EInt(2))) in execute e1 = Int(42);;
  28. run_test "Test4 - assignment and division \t\t" t4;;
  29.  
  30. (* TEST SU FUNZIONI ED ASSEGNAMENTI *)
  31.  
  32. printf "*** Functions test ***\n";;
  33.  
  34. (* test assegnamento funzione ed applicazione -> risultato atteso : Int(42) *)
  35. let t5() = let e1 = Let("f",FunDec("x",Op("*",Ide("x"),EInt(2))),FunApp(Ide("f"),EInt(21))) in execute e1 = Int(42);;
  36. run_test "Test5 - function definition and application \t" t5;;
  37.  
  38. (* test assegnamento funzione esprimibile -> risultato atteso : fun x -> x + 2 *)
  39. let t6() = let e1 = Let("f",FunDec("x",FunDec("y",Op("+",Ide("x"),Ide("y")))),FunApp(Ide("f"),EInt(2)))
  40.   in execute (FunApp(e1,EInt(40))) = Int(42);;
  41. run_test "Test6 - expressible function \t\t\t" t6;;
  42.  
  43. (* test assegnamento doppio con somma -> risultato atteso : Int(42) *)
  44. let t7() = let e1 = Let("x",EInt(40),Let("y",EInt(2),Op("+",Ide("x"),Ide("y")))) in execute e1 = Int(42);;
  45. run_test "Test7 - double assignment and sum\t\t" t7;;
  46.  
  47. (* TEST DI VISIBILITA' STATICA *)
  48.  
  49. printf "*** Scoping test ***\n";;
  50.  
  51. (* test scoping statico -> risultato atteso : Int(42) *)
  52. let t8() = let e1 = Let("y",EInt(40),Let("f",FunDec("x",Op("+",Ide("x"),Ide("y"))),Let("y",EInt(200),
  53.   FunApp(Ide("f"),EInt(2))))) in execute e1 = Int(42);;
  54. run_test "Test8 - static scoping test\t\t\t" t8;;
  55.  
  56. (* TEST SU BOOLEANI *)
  57.  
  58. printf "*** Boolean test ***\n";;
  59.  
  60. (* test assegnamento e and logico -> risultato atteso : Bool(false) *)
  61. let t9() = let e1 = Let("x",EBool(true),And(Ide("x"),EBool(true))) in execute e1 = Bool(true);;
  62. run_test "Test9 - assignment and logical and\t\t" t9;;
  63.  
  64. (* test assegnamento e or logico -> risultato atteso : Bool(false) *)
  65. let t10() = let e1 = Let("x",EBool(false),And(Ide("x"),EBool(false))) in execute e1 = Bool(false);;
  66. run_test "Test10 - assignment and logical or\t\t" t10;;
  67.  
  68. (* test assegnamento e not -> risultato atteso : Bool(false) *)
  69. let t11() = let e1 = Let("x",EBool(true),Not(Ide("x"))) in execute e1 = Bool(false);;
  70. run_test "Test11 - assignment and logical negation\t" t11;;
  71.  
  72. (* TEST IF THEN ELSE & EQUIVALENZE *)
  73.  
  74. printf "*** if-then-else and equivalences test ***\n";;
  75.  
  76. (* test assegnamento, uguaglianza e costrutto if -> risultato atteso : Int(42) *)
  77. let t12() = let e1 = Let("x",EInt(2),If(Op("=",Ide("x"),EInt(0)),EInt(24),EInt(42))) in execute e1 = Int(42);;
  78. run_test "Test12 - if-then-else and equality test\t" t12;;
  79.  
  80. (* test assegnamento, maggiore o uguale e costrutto if -> risultato atteso : Int(42)  *)
  81. let t13() = let e1 = Let("x",EInt(2),If(Op(">=",Ide("x"),EInt(0)),EInt(42),EInt(24))) in execute e1 = Int(42);;
  82. run_test "Test13 - if-then-else and greater or equal test" t13;;
  83.  
  84. (* test assegnamento, minore o uguale e costrutto if -> risultato atteso : Int(42)  *)
  85. let t14() = let e1 = Let("x",EInt(0),If(Op(">=",Ide("x"),EInt(0)),EInt(42),EInt(24))) in execute e1 = Int(42);;
  86. run_test "Test14 - if-then-else and lesser or equal test\t" t14;;
  87.  
  88. (* test assegnamento, maggiore e costrutto if -> risultato atteso : Int(42) *)
  89. let t15() = let e1 = Let("x",EInt(-2),If(Op(">",Ide("x"),EInt(0)),EInt(24),EInt(42))) in execute e1 = Int(42);;
  90. run_test "Test15 - if-then-else and greater test\t\t" t15;;
  91.  
  92. (* test assegnamento, minore e costrutto if -> risultato atteso : Int(42) *)
  93. let t16() = let e1 = Let("x",EInt(-2),If(Op("<",Ide("x"),EInt(0)),EInt(42),EInt(24))) in execute e1 = Int(42);;
  94. run_test "Test16 - if-then-else and lesser test\t\t" t16;;
  95.  
  96. (* TEST SU PATTERN MATCHING *)
  97.  
  98. printf "*** Pattern matching test ***\n";;
  99.  
  100. (* test assegnamento e patten matching composto -> risultato atteso : Int(42) *)
  101. (*
  102.   pseudo codice:
  103.   let z = 40 in
  104.     let w = 2 in
  105.       try x with (+,z,w) in
  106.         (x = 0  -> 99)::
  107.         (x = 42 -> 42)::
  108.         ( _     -> 88)
  109. *)
  110. let t17() = let e1 = Let("z",EInt(40),Let("w",EInt(2),Try("x",Op("+",Ide("z"),Ide("w")),
  111.   Comp(Op("=",Ide("x"),EInt(0)),EInt(99),Comp(Op("=",Ide("x"),EInt(42)),EInt(42),Default(EInt(88))))))) in execute e1 = Int(42);;
  112. run_test "Test17 - assignment and pattern matching\t" t17;;
  113.  
  114. (* test contenuto nelle specifiche -> risultato atteso : Int(42) *)
  115. (*
  116.   pseudo codice:
  117.   let z = 40 in
  118.     let w = 1 in
  119.       try x with (+,z,w) in
  120.         (x > 0 -> let succ x = x + 1 in succ x )::
  121.         (x < 0 -> let abs x = if x >= 0 then x * 1 else x * -1 in abs x)::
  122.         ( _    -> x)
  123.  
  124.   le variabili z, w sono state assegnate per semplicità, come si nota dallo pseudo codice e dal codice effettivo,
  125.   questo test mira anche a controllare l'efficacia e la correttezza dello scoping dichiarando la variabile 'x' come
  126.   parametro formale sia di 'try' che di 'succ' e 'abs'
  127. *)
  128. let t18() = let e1 =
  129.   Let("z",EInt(40),
  130.     Let("w",EInt(1),
  131.       Try("x",Op("+",Ide("z"),Ide("w")),
  132.         Comp(Op(">",Ide("x"),EInt(0)),
  133.           Let("succ",FunDec("x",Op("+",Ide("x"),EInt(1))),FunApp(Ide("succ"),Ide("x"))),
  134.             Comp(Op("<",Ide("x"),EInt(0)),
  135.               Let("abs",FunDec("x",If(Op(">=",Ide("x"),EInt(0)),Op("*",Ide("x"),EInt(1)),Op("*",Ide("x"),EInt(-1)))),
  136.               FunApp(Ide("abs"),Ide("x"))),
  137.                 Default(Op("*",Ide("x"),EInt(1)))))))) in execute e1 = Int(42);;
  138. run_test "Test18 - test contained in the specs\t\t" t18;;
  139.  
  140. (* TEST DELLE ECCEZIONI *)
  141.  
  142. printf "*** Failures test ***\n";;
  143. printf "*** N.B. THE FOLLOWING TESTS MUST THROWS EXCEPTIONS !!! ***\n";;
  144.  
  145. (* test operazione non riconosciuta *)
  146. let t19() = let e1 = Op("foo_sum",EInt(2),EInt(40)) in execute e1 = Int(42);;
  147. run_test "Test19 - unrecognized operation test" t19;;
  148.  
  149. (* test assenza di binding *)
  150. let t20() = let e1 = Ide("x") in
  151.   if execute e1 = Novalue then failwith "unbound identificator" else failwith "SEVERE ERROR";;
  152. run_test "Test20 - unbound identificator test" t20;;
  153.  
  154. (* test divisione per zero *)
  155. let t21() = let e1 = Op("/",EInt(1),EInt(0)) in execute e1 = Int(42);;
  156. run_test "Test21 - division by zero" t21;;
  157.  
  158. (* test parametri non booleani *)
  159. let t22() = let e1 = And(EInt(42),EInt(42)) in execute e1 = Int(42);;
  160. run_test "Test22 - non boolean parameters" t22;;
  161.  
  162. (* test parametri non interi *)
  163. let t23() = let e1 = Op("+",EBool(false),EBool(false)) in execute e1 = Int(42);;
  164. run_test "Test23 - non integer parameters" t23;;
  165.  
  166. (* test applicazione di funzione su identificatore non funzione *)
  167. let t24() = let e1 = Let("f",FunDec("x",Op("+",Ide("x"),EInt(1))),FunApp(EInt(42),EInt(42))) in execute e1 = Int(43);;
  168. run_test "Test24 - function application on non-function ide" t24;;
  169.  
  170. (* test valore non esprimibile *)
  171. let t25() = let e1 = Op("=",EInt(42),EBool(false)) in execute e1 = Int(42);;
  172. run_test "Test25 - unexpressible value" t25;;
  173.  
  174. (* test pattern non coincidente *)
  175. let t26() = let e1 = Try("x",Op("+",EInt(-1),EInt(-1)),Elem(Op("=",Ide("x"),EInt(0)),EInt(42)))
  176.   in execute e1 = Int(42);;
  177. run_test "Test26 - unmatched pattern" t26;;
  178.  
  179. printf "*** TEST END ***\n";;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement