Specsを使ってみる。
正規表現クラスのテストをするために、Specs - http://code.google.com/p/specs/ を使ってみる。
基本的には下記の様なスペックコードとRunnerを書けば動く
import org.specs.runner.SpecsFileRunner object SpecsRunner extends SpecsFileRunner("src/**/*.scala", ".*Specification")
SpecsFileRunnerの引数は
- *.scalaファイルの在処、
- クラス名のパターン
さらに、テストされるクラスには、
- 必ず「package」指定が必要
である。(私はこれで30分悩んだ・・・orz)
つまり、SpecsFileRunnerはソースファイルをスキャンして、クラス名とパッケージ名を取得して
テストを実行する。
ちなみに、packageが無いといけないのは以下の部分によるが、
http://specs.googlecode.com/svn/trunk/src/main/scala/org/specs/runner/Specsfinder.scala
def collectSpecifications(result: Queue[String], filePath: String, pattern: String): Unit = { if (!filePath.endsWith(".scala")) return val specPattern = "\\s*object\\s*(" + pattern + ")\\s*extends\\s*.*Spec.*\\s*\\{" val m = Pattern.compile(specPattern).matcher(readFile(filePath)) while (m.find) { result += *1 if (!m.find) "" else m.group(1).replace(";", "").trim }
もしかしたら、上記の一部を
while (m.find) { if (packageName(filePath) == "") result += (m.group(1).trim + "$") else result += ((packageName(filePath) + "." + m.group(1).trim) + "$") }
とすれば、よかったりするかな?
(追記)
思い切って作者に報告したら、直してくれました。
上記は1.2.2以降では修正されているはずです。
*1:packageName(filePath) + "." + m.group(1).trim) + "$") } } /** @return the package declaration at the beginning of a file */ def packageName(path: String) = { val pattern = "\\s*package\\s*(.+)\\s*" val m = Pattern.compile(pattern).matcher(readFile(path