对结构进行Rackunit等式检查

时间:2014-10-05 17:46:21

标签: testing scheme racket

我正在尝试为球拍中的编译器测试一个标记器/解析器组合,我有一个函数parse-string,契约类型为(-> string? ast:IntExp)(我知道,我应该重命名我的结构,但我正在尝试使用打字球拍一段时间。 无论如何,我有一个测试银行写了类似的东西 (check-equal? (parse-string "4") (ast:IntExp 4)),并且所有测试都失败了,即使经过人工检查,它们看起来也应该通过。我的所有结构都使用define-struct/contract定义,并且所有结构都标记为#:transparent。 这里出了什么问题?

好的,抱歉没有提供足够的资源来提供帮助:

以下是IntExp的结构定义: (define-struct/contract (IntExp Exp) ([val integer?]) #:transparent) 这是测试:(check-equal? (parse-string "4") (ast:IntExp 4)) 这是Rackunit给出的投诉:

-------------------- FAILURE actual: #(struct:IntExp ... 4) expected: #(struct:IntExp ... 4) name: check-equal? location: (#<path:/Users/clem/dev/tiger/parser-lexer-tests.rkt> 8 0 139 48) expression: (check-equal? (parse-string "4") (ast:IntExp 4)) 而且,以防万一,这是我require的依赖关系:

(require "lexer.rkt" "parser.rkt" parser-tools/lex (prefix-in ast: "ast.rkt") rackunit)

实际的解析器代码有点大,我有一种预感,它不是问题的根源,因为我的所有测试都以这种方式失败(结果,经过检查,似乎是正确的)。我敢打赌,我在rackunit做了一件非常愚蠢的事。

1 个答案:

答案 0 :(得分:2)

Racket使用引用相等,因为有问题的结构继承自不透明的struct-type。根据{{​​3}},要么使不透明的父结构透明,要么添加一个 equal?-recur方法,用于比较基础结构。