Не прилагая усилий для фактического клонирования JUnit или чего-то еще, я собираю вместе несколько служебных функций, чтобы помочь протестировать некоторый код SML.Я действительно знаю о QCheck, но он тоже не может сделать это, и это не то, что я хочу в общем.(Но если вам известна другая автоматизированная среда тестирования для SML, пожалуйста, скажите об этом.)
Я бы хотел утверждать, что какая-то функция вызовет исключение, например, с учетом функции
fun broken x = raise Fail
Я хотел бы иметь возможность написать что-то вроде
throws ("ERROR: function is not broken enough!", fn () => broken 1, Fail)
и заставить его выдать ошибку, если данная функция не вызовет ожидаемое исключение.
Я пытался написать throws
функцию с типом (string * exn * (unit -> unit)) -> unit
, например, так:
fun throws (msg, e, func) = func ()
handle e' => if e = e'
then ()
else raise ERROR (SOME msg)
Но это порождает кучу ошибок времени компиляции, по-видимому, потому что ML не определяет равенство надисключения:
sexp-tests.sml:54.31-57.49 Error: types of rules don't agree [equality type required]
earlier rule(s): ''Z -> unit
this rule: exn -> 'Y
in rule:
exn => raise exn
sexp-tests.sml:54.31-57.49 Error: handler domain is not exn [equality type required]
handler domain: ''Z
in expression:
func ()
handle
e' => if e = e' then () else raise (ERROR <exp>)
| exn => raise exn
В качестве обходного пути, я подозреваю, что я мог бы просто повторно использовать существующую assert
функцию, которую я имею:
assert ((broken 1; false) handle Fail => true | _ => false)
Но это немного больше думать и печатать.
Итак, есть ли способ написать эту throws
функцию в SML?