Использование ocaml OUnit2 assert_raise - PullRequest
1 голос
/ 20 июня 2020

Я прохожу задачу трассировки лучей и пытаюсь утверждать, что возникает исключение при добавлении одной точки к другой (точки имеют w = 1).

В основном это то, что я получил :

tuple.ml

type tuple = {x: float; y: float; z: float; w: float}

let point a b c =
  {x = a; y = b; z = c; w = 1.0}

exception AddingPoints of string

let (+..) a b =
  if ((a.w =. 1.0 && b.w =. 1.0) = false) 
  then raise (AddingPoints "Cannot add points")
  else 
    { 
      x = a.x +. b.x ;
      y = a.y +. b.y ;
      z = a.z +. b.z ;
      w = a.w +. b.w ;
    }

tuple_test.ml

open OUnit2

let p = point 4.3 (-4.2) 3.1

let test_add_point_point_should_fail = "testing adding point to point, it should fail" >::: [
  let p2 = fun () -> p +.. p in
  assert_raises (AddingPoints "Cannot add points") p2;
]

После запуска: ocamlbuild -use-ocamlfind -tag debug tuple_test.byte

Я получаю:

File "tuple_test.ml", line 41, characters 2-53:
41 |   assert_raises (AddingPoints "Cannot add points") p2;
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Error: This expression has type unit but an expression was expected of type
         OUnit2.test = OUnitTest.test

Command exited with code 2.

Я новичок ie в ocaml, может ли кто-нибудь сказать мне, что мне не хватает?

1 Ответ

1 голос
/ 21 июня 2020

В выражении assert_raises (AddingPoints "Cannot add points") p2 нет ничего плохого, это больше касается кода вокруг него. Вы используете (>:::) и, возможно, пытаетесь создать тест с меткой. В документации вы можете увидеть, что val (>:::) : string -> test list -> test, что означает, что вы не должны передавать ему unit, как выделено выражение, а test.

Вы можете использовать OUnit2.test_case для создайте тест и используйте (>:), чтобы создать для него метку:

open OUnit2

let tst = OUnit2.test_case (fun _test_ctx -> assert_raises (Failure "hd") (fun () -> List.hd []));;

let tst_with_label = "extracting head of an empty list throws an exception" >: tst

Вы также можете быть заинтересованы в OUnit2.test_list, который похож на функцию для составления тестов.

Там довольно хорошие документы доступны .

...