1

我写了这个属性

prop_lookupsymbol = forAll $ \name table scope -> case lookupsymbol name table scope of
                                                  Just (s,_) -> property $ is_ancestor s scope
                                                  Nothing ->  forAll $ \s->is_ancestor s ==> (lookupsymbol name table s) == Nothing

并运行它smallCheck 3 prop_lookupsymbol,结果是:

完成了 9000 次测试,没有失败。
但是 9000 不满足 ==> 条件。

我知道它指的是==>调用属性,但它是什么意思did not meet?我应该担心这个吗?如果是,那么我如何获得不符合条件的测试?

编辑

我在is_ancestor缺少第二个参数的地方犯了一个错误,所以现在的属性是这样的:

   prop_lookupsymbol = forAll $ \name table scope -> case lookupsymbol name table scope of
                                                  Just (s,_) -> property $ is_ancestor s scope
                                                  Nothing ->  forAll $ \s->is_ancestor s scope ==> (lookupsymbol name table s) == Nothing

但从 9000 起有 8340 不符合条件。

以下是上述类型和功能的解释:

SymbolTableHashMap (Scope,String) SymbolHashMap.Strict来自 unordered-containers 包)的类型同义词,这只是用于构建编译器:)。

Symbol 有多种构造函数(变量、函数、类型等)并Scope定义了符号的定义范围,我们有文件、类、函数、方法(类中的函数)、接口。

作用域有名称(文件名、类名等)和上层作用域,对于一个类它也有父作用域(继承中的父作用域)和接口作用域列表(类实现),接口作用域有一个父作用域范围及其上范围。

该函数is_ancestor s1 s2返回 s1 是 s2 的上层作用域(或 upper-upperscope 或 upper-upper-upper...)还是父作用域(或 parent-parent 或 parent-parent-...)或接口之一(或父母的接口等),我应该提到这is_ancestor s s总是正确的。

最后lookupsymbol name table scope尝试找到一个符号,其名称为,name作用域为真,其返回类型意味着它返回找到的符号以及定义符号的作用域(如果没有找到任何内容,则返回 Nothing)。sis_ancestor s scopeMaybe (Scope,Symbol)

我的属性说明了这一点:对于任何名称表范围,如果 lookupsymbol 返回,Just (s,_)s必须is_ancestorscope,但如果它不返回任何内容,那么对于任何范围,它将不返回任何is_ancestor内容scope

4

0 回答 0