Advertisement
Guest User

Untitled

a guest
Oct 16th, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.20 KB | None | 0 0
  1. open ComplexNumbers;;
  2. open OUnit2;;
  3.  
  4. (* unit tests
  5. these test add/mult with specific inputs and outputs *)
  6.  
  7. (* write a unit test for cadd *)
  8. let cadd_test1 _test_ctxt =
  9. assert_equal (CI(1,1)) (cadd (CI(1,0)) (CI(0,1)));;
  10.  
  11. (* write another unit test for cadd *)
  12. let cadd_test2 _test_ctxt =
  13. (* TODO *)
  14. assert_equal (CI(2,2)) (cadd (CI(2,0)) (CI(0,2)));;
  15.  
  16. (* write a unit test for cmult *)
  17. let cmult_test1 _test_ctxt =
  18. assert_equal (CI(-11,23)) (cmult (CI(3,2)) (CI(1,7)));;
  19.  
  20. (* write another unit test for cmult *)
  21. let cmult_test2 _test_ctxt =
  22. (* TODO *)
  23. assert_equal (CI(-2,10)) (cmult (CI(2,3)) (CI(2,2)));;
  24.  
  25. (* write another unit test for cmult *)
  26. let cmult_test3 _test_ctxt =
  27. (* TODO *)
  28. assert_equal (CI(0,5)) (cmult (CI(1,2)) (CI(2,1)));;
  29.  
  30. (* write another unit test for cmult *)
  31. let cmult_test4 _test_ctxt =
  32. (* TODO *)
  33. assert_equal (CI(0,104)) (cmult (CI(10,2)) (CI(2,10)));;
  34.  
  35.  
  36. (* list of unit tests *)
  37. let unit_tests =
  38. ["cadd_test1">:: cadd_test1;
  39. "cadd_test2">:: cadd_test2;
  40. "cmult_test1">:: cmult_test1;
  41. "cmult_test2">:: cmult_test2;
  42. "cmult_test3">:: cmult_test3;
  43. "cmult_test4">:: cmult_test4;
  44. ];;
  45.  
  46. (* property tests
  47. * these check algebraic laws for complex numbers
  48. *
  49. * using some algebraic laws from
  50. https://proofwiki.org/wiki/Properties_of_Complex_Numbers *)
  51.  
  52. (* complex number generator *)
  53. let complex_number_gen =
  54. (QCheck.Gen.map (fun (x,y) -> CI (x,y))
  55. QCheck.Gen.(pair small_nat small_nat));;
  56.  
  57. (* complex number pretty printers to show counter examples discovered
  58. * by quick check *)
  59.  
  60. let show_complex_numbers1 (CI(a,b)) =
  61. "Pair (" ^ string_of_int a ^ "," ^ string_of_int b ^ ")\n" ;;
  62.  
  63. let show_complex_numbers2 (CI(a,b),CI(c,d)) =
  64. "Pair (" ^ string_of_int a ^ "," ^ string_of_int b ^ ")\n"
  65. ^ "Pair (" ^ string_of_int c ^ "," ^ string_of_int d ^ ")\n" ;;
  66.  
  67. let show_complex_numbers3 (CI(a,b),CI(c,d),CI(e,f)) =
  68. "Pair (" ^ string_of_int a ^ "," ^ string_of_int b ^ ")\n"
  69. ^ "Pair (" ^ string_of_int c ^ "," ^ string_of_int d ^ ")\n"
  70. ^ "Pair (" ^ string_of_int e ^ "," ^ string_of_int f ^ ")\n" ;;
  71.  
  72. (* add is commutative:
  73. z1 + z2 = z2 + z1 *)
  74. let add_commutative =
  75. QCheck.Test.make ~name:"cadd_commutative" ~count:10000
  76. QCheck.(make
  77. ~print:show_complex_numbers2
  78. (Gen.pair complex_number_gen complex_number_gen))
  79. (fun (ci1,ci2) -> cadd ci1 ci2 = cadd ci2 ci1);;
  80.  
  81. (* mult is commutative:
  82. z1 * z2 = z2 * z1 *)
  83. let mult_commutative =
  84. QCheck.Test.make ~name:"cmult_commutative" ~count:10000
  85. QCheck.(make
  86. ~print:show_complex_numbers2
  87. (Gen.pair complex_number_gen complex_number_gen))
  88. (* TODO *)
  89. (fun (ci1,ci2) -> (cmult ci1 ci2) = (cmult ci2 ci1));;
  90.  
  91. (* add is associative:
  92. * z1 + (z2 + z3) = (z1 + z2) + z3 *)
  93. let add_associative =
  94. QCheck.Test.make ~name:"cadd_associative" ~count:10000
  95. QCheck.(make
  96. ~print:show_complex_numbers3
  97. (Gen.triple complex_number_gen complex_number_gen complex_number_gen))
  98. (fun (ci1,ci2,ci3) ->
  99. (cadd ci1 (cadd ci2 ci3)) = (cadd (cadd ci1 ci2) ci3));;
  100.  
  101. (* Associative law for multiplication:
  102. * z1 * (z2 * z3) = (z1 * z2) * z3 *)
  103. let mult_associative =
  104. QCheck.Test.make ~name:"mult_associative" ~count:10000
  105. QCheck.(make
  106. ~print:show_complex_numbers3
  107. (Gen.triple complex_number_gen complex_number_gen complex_number_gen))
  108. (* TODO *)
  109. (fun (ci1,ci2,ci3) ->
  110. (cmult ci1 (cmult ci2 ci3)) = (cmult (cmult ci1 ci2) ci3));;
  111.  
  112. (* Multiplication is distributive with respect to addition:
  113. * z1 * (z2 + z3) = z1 * z2 + z1 * z3 *)
  114. let mult_distributive =
  115. QCheck.Test.make ~name:"mult_distributive" ~count:10000
  116. QCheck.(make
  117. ~print:show_complex_numbers3
  118. (Gen.triple complex_number_gen
  119. complex_number_gen
  120. complex_number_gen))
  121. (* TODO *)
  122. (fun (ci1,ci2,ci3) ->
  123. (cmult ci1 (cadd ci2 ci3)) = (cmult (cadd ci1 ci2) ci3));;
  124.  
  125. (* numeric property tests *)
  126.  
  127. (* cmult of any complex number applied to CI(0,0) should be CI(0,0)
  128. * Check with operands in either order i.e.
  129. * `cmult ci1 (CI(0,0))` and `cmult (CI(0,0)) ci1`
  130. *)
  131. let mult_zero =
  132. QCheck.Test.make ~name:"cmult_zero" ~count:10000
  133. QCheck.(make
  134. ~print:show_complex_numbers1
  135. (complex_number_gen))
  136. (fun ci1 ->
  137. cmult (CI(0,0)) ci1 = (CI(0,0))
  138. && cmult ci1 (CI(0,0)) = (CI(0,0)));;
  139.  
  140. (* cadd of any complex number applied to CI(0,0) should be that
  141. * complex number. Check with operands in either order i.e.
  142. * `cadd ci1 (CI(0,0))` and `cadd ci1 (CI(0,0))`
  143. *)
  144. let add_identity =
  145. QCheck.Test.make ~name:"cadd_identity" ~count:10000
  146. QCheck.(make
  147. ~print:show_complex_numbers1
  148. (complex_number_gen))
  149. (* TODO *)
  150. (fun ci1 ->
  151. cadd ci1 (CI(0,0)) = ci1
  152. && cadd (CI(0,0)) ci1 = ci1);;
  153.  
  154. (* list of all property tests *)
  155. let property_tests =
  156. List.map QCheck_ounit.to_ounit2_test
  157. [ add_commutative
  158. ; mult_commutative
  159. ; add_associative
  160. ; mult_associative
  161. ; mult_distributive
  162. ; mult_zero
  163. ; add_identity
  164. ];;
  165.  
  166. (* run the unit and property based tests *)
  167. let () =
  168. run_test_tt_main
  169. ("complex_number_tests">:::
  170. (List.append unit_tests property_tests));;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement