我試圖測試一個編譯器在球拍中的標記器/解析器組合,並且我有一個函數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中做了一件非常愚蠢的事情。
因此,你有一個過程'parse-string',它的結果是一個結構,而另一個結構的版本是用'parse-string'使用的相同的值初始化的,你會得到'#f'作爲'check-equal?'它們之間?如果您需要更多幫助,我認爲您需要提供更多代碼。 – Sylwester 2014-10-05 20:43:00