2016-11-06 6 views
0

私はラケットと博士ラケットとの古典的なゲーム "スネーク"を構築しようとしています。オブジェクトを使ったラケットのユニットテスト

私は自分のコードの背後にある概念を理解しているかどうかを確認するために単体テストを使うのが好きです。

私は蛇のための2次元(2D)平面に位置する構造定義を作成しました:私はしようと

(define snake-example 
    (snake "up" (list (posn 1 1) (posn 1 2) (posn 1 3)))) 

:その後

(struct snake (dir segs)) 

(struct posn (x y)) 

を、Iは蛇例を作成私のヘビオブジェクトのセグにアクセスするには、私は電話します:

(snake-segs snake-example) 

>> '(#<posn> #<posn> #<posn>) 
(list (posn 1 1) (posn 1 2) (posn 1 3)) 

>> '(#<posn> #<posn> #<posn>) 

私はこれをチェックするためのテストとrackunitを使用してみた場合しかし、それは動作しません:

(require rackunit) 

(check-equal? (snake-segs snake-example) (list (posn 1 1) (posn 1 2) (posn 1 3))) 

私はこの答えを得る:

FAILURE 
actual:  (#<posn> #<posn> #<posn>) 
expected: (#<posn> #<posn> #<posn>) 
name:  check-equal? 
location: (#<path:/home/pedro/Desktop/realm-of-racket/cap-6.rkt> 276 0 8425 81) 
expression: (check-equal? (snake-segs snake-example) (list (posn 1 1) (posn 1 2) (posn 1 3))) 

これはなぜ起こるのでしょうか?

答えて

3

簡単な答えは、デフォルトでラケット構造が不透明であり、不透明構造の等価性によってメンバーが見えないということです。詳細については、Structure Comparisonsを参照してください。応急処置のために

、あなたのPOSN構造を透明にする:

(struct posn (x y) #:transparent) 

問題はcheck-equal?に限定されるものではありません。上記の例を使用すると、equal?もこの動作を示します。

(equal? 
(snake-segs snake-example) 
(list (posn 1 1) (posn 1 2) (posn 1 3))) ; false 
関連する問題