Не прилагая усилий для фактического клонирования JUnit или чего-то подобного, я собираю несколько служебных функций, чтобы помочь протестировать некоторый код SML. Я знаю о QCheck, но он тоже не может этого сделать, да и вообще я не хочу. (Но если вам известна другая среда автоматического тестирования для SML, сообщите об этом.)
Я хотел бы иметь возможность утверждать, что какая-то функция вызовет исключение, например, для данной функции
fun broken x = raise Fail
я бы хотелось бы иметь возможность написать что-то вроде
throws ("ERROR: function is not broken enough!", fn () => broken 1, Fail)
и получить ошибку, если данная функция не вызывает ожидаемое исключение.
Я попытался написать функцию throws
с типом (строка * exn * (unit ->
не определяет равенство по сравнению с исключениями:
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)
Но это немного больше мышления и набора текста.
Итак, есть ли способ написать, что вызывает функцию
в SML?