【问题标题】:Rackunit equality-checking for structsRackunit 结构的相等性检查
【发布时间】:2014-10-05 17:46:21
【问题描述】:

我正在尝试为球拍中的编译器测试标记器/解析器组合,并且我有一个函数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)) 而且,以防万一,这是我 requireing 的依赖项:

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

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

【问题讨论】:

  • 所以你有一个过程parse-string,它评估为一个结构,并且使用相同的值parse-string初始化的另一个版本的结构,你会在它们之间得到#f for check-equal??如果您需要更多帮助,我认为您需要提供更多代码。

标签: testing scheme racket


【解决方案1】:

Racket 使用引用相等,因为有问题的结构继承自不透明的结构类型。根据the docs,要么使不透明的父结构透明,要么添加一个 equal?-recur 比较底层结构的方法。

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2010-12-07
    • 2015-08-09
    • 1970-01-01
    • 2015-11-23
    相关资源
    最近更新 更多