Scalaのコンビネーター解析フレームワークで遊んでいるときに、浮動小数点数を解析するときに次の問題に遭遇しました。
import scala.util.parsing.combinator.JavaTokenParsers
import org.junit.runner.RunWith
import org.scalatest.FlatSpec
import org.scalatest.junit.ShouldMatchersForJUnit
import org.scalatest.junit.JUnitRunner
@RunWith(classOf[JUnitRunner])
class SandboxSpec extends FlatSpec with ShouldMatchersForJUnit {
"A java token parser" should "parse a float" in {
class Parser extends JavaTokenParsers {
def realValue: Parser[Float] = floatingPointNumber ^^ {
s => s.toFloat
}
}
val p = new Parser()
val result = p.parseAll(p.realValue, "5.4") match {
case p.Success(x, _) => x
case p.Failure(msg, _) => fail(msg)
}
result should equal (5.4f plusOrMinus 0.0001f)
}
}
このテストでは、次のエラーが発生します。
5.4 did not equal FloatTolerance(5.4,1.0E-4)
フロートのようなものではないものを生成するパーサーコードなのか(デバッガーで見ると、明らかにJava Floatなのか)、ScalaTestマッチャーの問題なのかはわかりません。
何かご意見は?