我写了这个属性
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
)的类型同义词,这仅用于构建编译器:)。
Symbol有各种构造函数(变量,函数,类型等),Scope
定义了符号定义的范围,我们有文件,类,函数,方法(类中的函数),接口。 / p>
Scope具有名称(文件名,类名等)和上限作用域,对于类,它还具有父作用域(父作为继承)和接口作用域列表(类实现),接口作用域具有父范围及其范围。
函数is_ancestor s1 s2
返回s1是s2的上观(或上 - 上或上 - 上......),还是父范围(或父母 - 父母 - 父母 - 父母 - ... 。)或其中一个接口(或父接口等),我应该提到is_ancestor s s
总是如此。
最后lookupsymbol name table scope
尝试查找名称为name
且范围为s
的符号,其中is_ancestor s scope
为真,其返回类型为Maybe (Scope,Symbol)
,表示它返回找到的符号以及定义符号的范围(当没有找到任何内容时,则返回Nothing。)
我的属性声明:对于任何名称表范围,如果lookupsymbol返回Just (s,_)
,则s
必须是is_ancestor
scope
,但如果它没有返回任何内容,那么它将对is_ancestor
scope
的任何范围都不返回任何内容。