gaunit を使ってみる

SICP の問題 2.5 で gaunit を使った試験をしてみる事に。参考にしたのは (GaUnit)チュートリアル です。(ちょっと素材が違いますが ...
まず、ディレクトリを掘る。

$ mkdir 2.5
$ mkdir 2.5/lib
$ mkdir 2.5/test
$ ls 2.5
lib  test
$

次に run-test.scm を lib 配下に作成。とりあえず、tarball ん中のヤツをコピる。test 配下にあるようです。こんな感じだった。

#!/usr/bin/env gosh

(add-load-path "./lib")

(use gauche.interactive)
(use file.util)
(use test.unit)

(if (and (symbol-bound? 'main)
         (not (symbol-bound? '_main)))
  (define _main main))

(define (main args)
  (let ((dir (sys-dirname (car args))))
    (for-each (lambda (test-script)
                (load (string-join (list dir test-script) "/")))
              (directory-list dir
                              :filter (lambda (x)
                                        (rxmatch #/^test-.+\.scm$/ x))))
    (if (symbol-bound? '_main)
      (_main `(,(car args) "-vp" ,@(cdr args)))
      (run-all-test))))

add-load-path で ./lib をナニしてる、とゆー事は実行はこんな感じか。
# ちなみに(GaUnit)チュートリアルにて紹介されている run-test.scm は
# ./lib と . も load-path に追加しているようです。
# それ以外は上記と同一な模様。(蛇足

$ ls
2.5
$ cd 2.5
$ test/run-test.scm
(略
$

あ、実行権限が必要との事。
次は試験用のファイルを作成ですか。名前は 2.5-test.scm という名前にしとく。チュートリアルによると、とりあえず以下のような感じ。ソースファイルは 2.5.scm にしとこう。

#!/usr/bin/env gosh
 
(use test.unit)
(require "2.5")

で、実行、と。

$ test/run-test.scm
$

あら??
# ちなみにディレクトリは正しい位置に居るものとします。

ってよく見りゃ、試験のファイル名にシバリがあるやっさ。(とほほ
リネイムして再度実行。

$ mv test/2.5.scm test/test-2.5.scm
$ test/run-test.scm
*** ERROR: Compile Error: cannot find file "2.5.scm" in *load-path* ("." "./lib" "./test" "/usr/share/gauche/site/lib" "/usr/share/gauche/0.8.7/lib")
"./test/test-2.5.scm":4:(require "2.5")
(以下略

イケマセン ... (とほほ

気をとりなおして、ファイル作成して実行。

$ touch lib/2.5.scm
$ test/run-test.scm
$

何も出力されませんが、ここはとりあえずスルーしておこう。では、テストファーストとゆー事で試験から書きます。

(cons 0 0) は 2 ^ 0 * 3 ^ 0 なので 1 ね。

#!/usr/bin/env gosh
 
(use test.unit)
(require "2.5")

(define-test-case "cons procedure test"
  ("base test"
   (assert-equal 1 (cons 0 0))))

実行。

$ test/run-test.scm

 expected:<1>
  but was:<(0 . 0)> in base test

$

当たり前ですが試験には通りません。とりあえず、試験に通るナニを書いてみよう。以下は lib/2.5.scm です。

(define (cons x y)
  1
)

ダメダメですが、実行。

$ test/run-test.scm
.
$

出力に少々色気が無いなぁ。と思ったら -vv というオプションを発見。試してみる。

$ test/run-test.scm -vv
- (test suite) Default test suite
-- (test case) cons procedure test: .

1 tests, 1 assertions, 1 successes, 0 failures, 0 errors
Testing time: 1.77e-4
$

おお。なんかヤッてる感満点だな。(何
とりあえず、通常ならばここでおやつ等をほおばる場面らしいが、別な方向に走ってみたりなんかして (を

追記

色々試験を作りながら問題 2.5 の解を見てたんですが、条件式とか微妙だなぁ、と。ただ、試験してみる中で問題なさげな事が判明したのでびっくりしてます。(を
とりあえず今後の問題については TDD な取り組みで (以下略