テストケース
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 を使った方が良いのだろうかどうだろうか (悩