我写了这个属性
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 不符合条件。
以下是上述类型和功能的解释:
SymbolTable
是HashMap (Scope,String) Symbol
(HashMap.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)。s
is_ancestor s scope
Maybe (Scope,Symbol)
我的属性说明了这一点:对于任何名称表范围,如果 lookupsymbol 返回,Just (s,_)
则s
必须is_ancestor
为scope
,但如果它不返回任何内容,那么对于任何范围,它将不返回任何is_ancestor
内容scope
。