在使用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)
我不确定它是否是解析器代码产生的东西不像float一样(但是,用调试器查看它,它显然是一个Java Float),或者它是ScalaTest匹配器的问题。
有什么想法吗?
答案 0 :(得分:2)
在ScalaTest equal
中始终表示==
,因此对象相等。因此,您的代码无法成功,因为5.4
不等于FloatTolerance
的实例。
要更正您的测试用例,请使用be
重载以获取FloatTolerance
的实例:
result should be (5.4f plusOrMinus 0.0001f)
顺便说一句,您的代码会发出警告:
匹配可能并非详尽无遗。它将在以下输入上失败:错误(_,_)
要消除它,请选择case p.NoSuccess(msg, _) =>
而不是case p.Failure(msg, _) =>