使用JavaTokenParsers后,无法在Scalatest中解析和比较float

时间:2012-12-08 20:32:22

标签: scala scalatest

在使用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匹配器的问题。

有什么想法吗?

1 个答案:

答案 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, _) =>