ScalaTest Scalactic-具有公差的自定义Double Equal,包括Double.NaN大小写

时间:2018-07-31 10:53:39

标签: scala nan equality scalatest scalactic

我正在尝试创建一个自定义匹配器,该匹配器将考虑Double.NaN并将对非nan值使用容差。

AndroidManifest.xml

不幸的是,它不起作用。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

如果在断言中输入公差,则如果存在NaN,则失败。

import org.scalactic.{Equality, TolerantNumerics}
import org.scalatest.Matchers

trait MoreMatchers extends Matchers {

  implicit def doubleEqWithNaNAndTol: Equality[Double] = new Equality[Double] {

    implicit val tolerance: Equality[Double] = TolerantNumerics.tolerantDoubleEquality(1e-6)

    def areEqual(expected: Double, actual: Any): Boolean = actual match {
      case number: Double if number.isNaN => expected.isNaN
      case _: Double => actual === expected
      case _ => false
    }

  }

如果我只是像下面这样称呼它,那么它将起作用。

assert(0.00226685508536916 === 0.0022668550853691587)  // failure - doesn't use tolerance
assert (Double.NaN === Double.NaN )  // success

然后将其称为:

assert(0.00226685508536916 === 0.0022668550853691587 +- 1e-6)  // success
assert (Double.NaN === Double.NaN  +- 1e-6)  // failure - can't use tolerance when NaN

我想知道是否有可能使用第一种方法使其工作。您以前遇到过这种情况吗?您能提出任何解决方案吗?任何帮助将不胜感激:)

谢谢, ele

1 个答案:

答案 0 :(得分:0)

非常感谢eirikr @ d6 :),请参阅custom equality gist中的解决方案

基本上,在上面的代码中,比较非nan双精度数时需要使用all=,以便能够使用该比较中隐含的公差。

tolerance.areEqual(expected, number)

关于, ele