2014-10-05 50 views
0

我試圖測試一個編譯器在球拍中的標記器/解析器組合,並且我有一個函數parse-string,契約類型爲(-> string? ast:IntExp)(我知道,我應該重命名我的但我正在試驗打字球拍一小會兒 無論如何,我有一個測試銀行寫了 (check-equal? (parse-string "4") (ast:IntExp 4))這樣的東西,所有的測試都失敗了,即使經過人工檢查,他們看起來應該是他們應該通過我所有的結構都與define-struct/contract定義,所有的人都標誌着#:transparent。 什麼事錯在這裏?Rackunit等式檢查結構

好了,對不起,不包括enoug氫源是有幫助的:

下面是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 ING:

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

實際解析器代碼是一種我覺得這不是問題的根源,因爲我的所有測試都是以這種方式失敗的(檢查結果看起來是正確的)。我敢打賭,我在rackunit中做了一件非常愚蠢的事情。

+0

因此,你有一個過程'parse-string',它的結果是一個結構,而另一個結構的版本是用'parse-string'使用的相同的值初始化的,你會得到'#f'作爲'check-equal?'它們之間?如果您需要更多幫助,我認爲您需要提供更多代碼。 – Sylwester 2014-10-05 20:43:00

回答

0

球拍正在使用引用相等,因爲所涉及的結構從不透明的結構類型繼承。根據the docs,要麼使不透明的父結構透明,要麼添加一個比較底層結構的方法。