ClojureでFizzBuzzをテスト付きで書いてみました。Clojure自体がなかなかつかめなくて、さすがにTDDできるほど余裕がなかったです…
; 名前空間の定義と ; test用の関数を使うために:useでclojure.testをロード (ns fizzbuzz (:use clojure.test)) ; 実際のFizzBuzzの関数 (defn fizzbuzz [val] (cond (= (mod val 15) 0) "FizzBuzz" (= (mod val 3) 0) "Fizz" (= (mod val 5) 0) "Buzz" :else (str val))) ; テスト。もっと簡便にも書けるけれど、 ; 失敗時にメッセージが出るように記述 (deftest test-fizzbuzz (testing "fizzbuzzは" (testing "3の倍数とき、Fizzを返す" (is (= (fizzbuzz 3) "Fizz")) (is (= (fizzbuzz 6) "Fizz"))) (testing "5の倍数のとき、Buzzを返す" (is (= (fizzbuzz 5) "Buzz")) (is (= (fizzbuzz 10) "Buzz"))) (testing "3と5の倍数のとき、FizzBuzzを返す" (is (= (fizzbuzz 15) "FizzBuzz")) (is (= (fizzbuzz 30) "FizzBuzz"))) (testing "3と5の倍数でないとき、その数字の文字列を返す" (is (= (fizzbuzz 1) "1")) (is (= (fizzbuzz 4) 4))))) ; ここで失敗するようにしている ; この関数を実行すると、現在の名前空間内のテストを実行する (run-tests)
メッセージ
Testing fizzbuzz FAIL in (test-fizzbuzz) (fizzbuzz.clj:32) fizzbuzzは 3と5の倍数でないとき、その数字の文字列を返す expected: (= (fizzbuzz 4) 4) actual: (not (= "4" 4)) Ran 1 tests containing 8 assertions. 1 failures, 0 errors.
Lisp系の言語は初めて触るので、condというものもはじめて使いました。
テスト自体はメッセージが出力されるようにしました。
テストライブラリとしては表示のされ方も悪くはないですし、失敗時に文章もしっかり表示されるみたいですし、よさそうです。
あとは私自身がClojureとそのテスト環境になれることの方がよっぽど重要ですね。
Lisp系言語が初めてだと、どうしても記号や機能としてかなり目新しいものがあるので悪戦苦闘中。テスト自体やfizzbuzzの実装自体ももう少し綺麗に書けるのかなーと思ったりしてます。でも今までやったことのない形式の言語は楽しいですね。
Clojureで簡単なサーバサイドプログラミングとかできればいいなぁと思ってます。そこまでたどり着けるようにClojure頑張ってみます!(…本当にできるのかな)