テストケース

SICP 読み (63) 2.5.2 異る型のデータの統合 なエントリを起こした後、気がついた事がある。
テストケースの名前とテストの名前が全部同じものがあったり、テストの名前に何も考えていないものを指定してたり。試験はドキュメント、という観点から言うとダウト確定だな。例えば上記エントリだと以下のようなコードを出している。

 ("coercion test"
 (setup (lambda ()
          (install-scheme-number-package)
          (install-complex-package)
          (install-rectangular-package)))
 ("put-coercion test (1)"
  (assert-equal 'ok
                (put-coercion 'scheme-number 'complex scheme-number->complex))
  )

 ("put-coercion test (2)"
  (let ((dummy (put-coercion 'scheme-number 'complex scheme-number->complex)))
    (assert-false (get-coercion 'complex 'complex))
    (assert-false (get-coercion 'scheme-number 'scheme-number))
    (assert-equal scheme-number->complex
                  (get-coercion 'scheme-number 'complex))
    (assert-equal (make-complex-from-real-imag 1 0)
                  ((get-coercion 'scheme-number 'complex) 1)))
  )
 )

とか

 ("apply-generic-R test"
 (setup (lambda ()
          (install-scheme-number-package)
          (install-complex-package)
          (install-rational-package)
          (install-rectangular-package)
          (put-coercion 'scheme-number 'complex scheme-number->complex)))
 ("apply-generic-R test"
  (assert-equal 3
                (apply-generic 'add
                               (make-scheme-number 1)
                               (make-scheme-number 2)))
  (assert-error (lambda ()
                  (apply-generic 'add
                                 (make-scheme-number 1)
                                 (make-complex-from-real-imag 1 1)
                                 (make-complex-from-real-imag 1 1))))
  (assert-error (lambda ()
                  (apply-generic 'add
                                 (make-scheme-number 1)
                                 (make-rational 1 1))))
  (assert-error (lambda ()
                  (apply-generic 'add
                                 (make-rational 1 1)
                                 (make-scheme-number 1))))
  (assert-equal (make-complex-from-real-imag 2 1)
                (apply-generic 'add
                               (make-scheme-number 1)
                               (make-complex-from-real-imag 1 1)))
  (assert-equal (make-complex-from-real-imag 2 1)
                (apply-generic 'add
                               (make-complex-from-real-imag 1 1)
                               (make-scheme-number 1)))
  )
 )

とか。
上の例だとテストケース名は coercion test で良いかもしれんが、テストの名前とか切り分け方にもう少し気を使うべきだろうな。例えば以下か。

 ("coercion test"
 (setup (lambda ()
          (install-scheme-number-package)
          (install-complex-package)
          (install-rectangular-package)))
 ("return of put-coercion is 'ok"
  (assert-equal 'ok
                (put-coercion 'scheme-number 'complex scheme-number->complex))
  )

 ("no _'complex 'complex_ member in local-table (coercion)"
  (let ((dummy (put-coercion 'scheme-number 'complex scheme-number->complex)))
    (assert-false (get-coercion 'complex 'complex)))
  )

 ("no _'scheme-number 'scheme-number_ member in local-table (coercion)"
  (let ((dummy (put-coercion 'scheme-number 'complex scheme-number->complex)))
    (assert-false (get-coercion 'scheme-number 'scheme-number)))
  )

 ("_'scheme-number 'complex_ member exists in local-table (coercion)"
  (let ((dummy (put-coercion 'scheme-number 'complex scheme-number->complex)))
    (assert-equal scheme-number->complex
                  (get-coercion 'scheme-number 'complex)))
  )

 ("coercion succeed"
  (let ((dummy (put-coercion 'scheme-number 'complex scheme-number->complex)))
    (assert-equal (make-complex-from-real-imag 1 0)
                  ((get-coercion 'scheme-number 'complex) 1)))
  )
 )

試験はパスしている事を確認。let とかいちいち面倒臭い上に英語が微妙ですが、テスト名がドキュメントにはなる。ついでに下のも手を入れてみる。

 ("apply-generic-R test"
 (setup (lambda ()
          (install-scheme-number-package)
          (install-complex-package)
          (install-rational-package)
          (install-rectangular-package)
          (put-coercion 'scheme-number 'complex scheme-number->complex)))

 ("normal (same data type)"
  (assert-equal 3
                (apply-generic 'add
                               (make-scheme-number 1)
                               (make-scheme-number 2)))
  )

 ("deny 3 arguments"
  (assert-error (lambda ()
                  (apply-generic 'add
                                 (make-scheme-number 1)
                                 (make-complex-from-real-imag 1 1)
                                 (make-complex-from-real-imag 1 1))))
  )

 ("unregistered coercion (rational <=> scheme-number"
  (assert-error (lambda ()
                  (apply-generic 'add
                                 (make-scheme-number 1)
                                 (make-rational 1 1))))
  )

 ("unregistered coercion (rational <=> scheme-number"
  (assert-error (lambda ()
                  (apply-generic 'add
                                 (make-rational 1 1)
                                 (make-scheme-number 1))))
  )

 ("coercion succeed"
  (assert-equal (make-complex-from-real-imag 2 1)
                (apply-generic 'add
                               (make-scheme-number 1)
                               (make-complex-from-real-imag 1 1)))
  )

 ("coercion succeed"
  (assert-equal (make-complex-from-real-imag 2 1)
                (apply-generic 'add
                               (make-complex-from-real-imag 1 1)
                               (make-scheme-number 1)))
  )
 )

冗長ですが、こちらの方がドキュメントとしては良さげ。(内容はさて置き)
手法として define-test-suite を使っていますが、define-test-case を使った方が良いのだろうかどうだろうか (悩