1

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マッチャーの問題なのかはわかりません。

何かご意見は?

4

1 に答える 1

2

ScalaTestでは、equal常にを意味==します。したがって、オブジェクトの同等性を意味します。5.4したがって、はのインスタンスと等しくないため、コードは成功しませんFloatTolerance

テストケースを修正するbeには、を使用します。これは、次のインスタンスを取得するためにオーバーロードされていますFloatTolerance

result should be (5.4f plusOrMinus 0.0001f)

ところで、あなたのコードは警告を投げます:

試合は網羅的ではないかもしれません。次の入力では失敗します:Error(_、_)

それを排除するcase p.NoSuccess(msg, _) =>には、代わりに選択してくださいcase p.Failure(msg, _) =>

于 2012-12-09T01:50:17.257 に答える