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