KotlinでTDD(2)

男と女のラブゲームも1日1時間!カワヴェリ名人です。

さて、前回予告した「KotlinでTDD」。
検証対象にも得手不得手がございますので、検証案を色々考えてました。

検証案1:もしも間違いに気が付かなかったら、平行世界の僕はどの辺で暮らしているのか? ⇒羽田沖から地下鉄の地図の隅までまで対象が広く、特定するのが困難。よって今回は見送ります。

検証案2:もう一度遠くへ行け遠くへ行けと、僕の中で誰が歌ってるのか? ⇒実際はないものを証明するのは難しいです(悪魔の証明)。というか毒電波受信してそうで怖いわっ。

検証案3:この手の歌詞引用パロディは、とある権利団体から法外な何かを請求されてしまうのか? ⇒そういう話は本当勘弁してください。。

検証案4:けものはいても、のけものはいないことを証明する …そうだ、テーマはこれで行きましょう!条件も解りやすく証明しやすい。

なので今回はこんなアプリを作ってみます。

Androidアプリ「ようこそJavaりパークへ!」
Androidアプリ「ようこそJavaりパークへ!」
ダウンロードはこちら!
ダウンロードはこちら!

http://hyasynth.com/area51/bin/Javaripark_release.apk ※1

ところで現在まだ正式リリースされてない「Android Studio 3.0」の最新プレビュー版をいち早く入手してみました。
この3.0から公式にサポートされるKotlin言語にて、世界に先駆けた開発してみるよ!
世界の最先端に触れるコント劇団!かっこいいのか悪いのか全然わからないな!

早速DLしたAndroid Studio起動後、「Start a new Android Studio Project」で新規アプリを作成します。
メニュー内「File>New>New Project」でも作れるよ!

新規プロジェクト作成!
新規プロジェクト作成!

Application Name JavariPark Company Domain zico-hihan.sub.jp IncludeKotlinSupport (チェックをONにします) PhoneandTablet API15(Android4.0.3以上)

これで新規プロジェクトが出来上がり。この時点で既に、Android端末で実行可能なアプリが出来上がってます。ようこそJavariParkへ!!

続いて、app>java>jp.sub.zico_hihan.javaripark(test)を覗いてみましょう。

ExampleUnitTest

class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}

今回のもう一人の主役、「テストユニット」でございます。
この中には「4と2+2は同じです」という式が書かれた「addition_isCorrect()」という命令(以後「メソッド」)が書かれてます。
そう、「4」と「2+2」の答えはたぶん同じはず。ぼく算数得意だからすぐ解ったけどね!!

実行したらテスト結果の欄がミントグリーン※2に染まります。テスト成功!やったね!まだ何もしてないけどね!!

Process finished with exit code 0
「Process finished with exit code 0」

では、ちょっとだけ書き換えてみましょう。

@Test
fun けものはいる() {
assertTrue(javariPark.exists(“けもの”))
}

「けものはいる()」というメソッドには、『「JavariPark」というクラス内の「exists()」というメソッドに”けもの”という文字を渡すとTrue(OKって意味)が返ってくる』という式が書かれてます。

ただし「JavariPark」というクラスも「exists()」というメソッドも現時点では存在していないので、当然エラーになります。

なので対応する「JavariPark.kt」というクラスを作ります。
その中に、文字列を引数にして「true」を返す、「exists()」というメソッドも作りましょう。

package jp.sub.zico_hihan.javaripark

class JavariPark {
fun exists(s: String): Boolean {
return true
}
}

これでひとまずエラーはなくなりました。テストを実行するとミントグリーンに戻り、「けものはいる」状態になりましたね。

そこでもう一つのテスト、「のけものはいない()」を追加しましょう。

@Test
fun のけものはいない() {
assertFalse(javariPark.exists(“のけもの”))
}

今度は「けものはいる()」は成功、「のけものはいない()」失敗という結果になりました。
“のけもの”がいるかと聞かれたら、きっぱりNOと答えましょう。優しい世界まであと一歩です。

「JavariPark.exists()」の中を修正します。

fun exists(s: String): Boolean {
if (s == “けもの”) {
return true
}
return false
}

“けもの”がいたらtrueを返し、それ以外はfalseを返します。再テストの結果ミントグリーンに戻りました。

しかし残念ながら”セルリアン”もいるのよね。奴がいてもtrueです。

assertTrue(javariPark.exists(“セルリアン”))

「JavariPark.exists()」にが”セルリアン”でもtrueを返すようにする。

if (s == “セルリアン”) {
return true
}

しかしこの調子でパークの住人が増えていくと、どんどん長く複雑になっていきますよね。
ここら辺でリファクタリング(最適化)してみよう。

val inhabitant = listOf(“けもの”, “セルリアン”)
return s in inhabitant

「inhabitant」リストの中に住人がいるかだけ調べるようにした。超すっきり!
これでラッキービーストさんやかばんちゃんも簡単に追加できるよね!

コメント書いたとこで、いったん完成。
検証したソースコードはGistに公開してます!
https://gist.github.com/kawaveri/22fca08ef6c11c49da0d62b8bcf75b88


※1
インストール時は「設定>セキュリティ>提供元不明のアプリ」をONにしてください。
iPhoneやWindowsMobileの方は端末を一度投げ捨てて、Android4.0.3以降の白ロム端末を入手してから再挑戦してください。

※2
TDD用語では普通に「グリーン」と呼ぶのですが、先週は『夢眠ねむ×蜷川実花「peppermint」』が発売されたばかりですからね。はぁぁねむきゅん可愛いよたぬきゅん!

※3
上記※1の実行アプリにする為にはMainActivityなどをもう少しいじってますが、あくまでコント集団の小ネタにつき、小難しい話は色々端折ってます。ご了承ください。

※4
Q:もひとつ質問いいかな。assertTrue(javariPark.exists(“タナベさん”))の結果がグリーンにならないよ…?
A:…君のような勘のいいフレンズは嫌いだよ。