在SML中创建数据类型的测试

时间:2019-01-01 23:47:01

标签: sml

我想为我用SML编写的程序创建单元测试。

考虑一个功能

val foo = fn : int -> int seq

对于foo 5,它将返回:val it = foo (5,fn) : int seq。 (seq是某种数据类型。

它的作用并不重要,我只想创建检查元组左侧项目的测试。

我尝试过:

val test = ((foo 5) = (seq (5,_)));

val test = ((foo 5) = (seq (5,fn)));

但是他们没有用。我可以编写一个单行测试来验证左元组是否包含5吗?

2 个答案:

答案 0 :(得分:1)

您可以使用模式匹配的let-binding;

val test = let val seq (x,_) = foo 5 in x = 5 end;

答案 1 :(得分:0)

您可能想测试访问此数据类型的抽象接口。如果使用'a seq(我假设这是'a的惰性流),则可以使用take函数并对其进行测试。例如,

datatype 'a seq = Cons of 'a * (unit -> 'a seq)

fun from n = Cons (n, fn () => from (n+1))

fun take 0 _ = []
  | take n (Cons (x, f)) = x :: take (n-1) (f ())

take的测试可能像这样:

val nats = from 0

val test_take_1 = take 0 nats = []
val test_take_2 = take 1 nats = [0]
val test_take_3 = take 3 nats = [0,1,2]
val test_take_4 = ( take ~1 nats ; false )
                  handle Out_of_memory => true
                       | _             => false

在这里,我正在测试take为负时,n是否按预期失败。

如果它没有失败,或者除了Out_of_memory之外还有其他异常失败,则测试失败。


所以:

  1. 定义您的数据类型,

  2. 定义访问它的抽象接口,

  3. 测试该抽象接口。