Scalatest 提供者是否是 NaN 的匹配器?
Does Scalatest provider a matcher for NaN?
Scalatest 是否提供 NaN
和无穷大的匹配器?
如果有办法的话,我想让这些断言更具描述性:
Double.NaN.isNaN shouldBe true
Double.NegativeInfinity.isInfinite shouldBe true
最灵活的处理方法可能是使用 ScalaTest 的 support for symbols to handle boolean matches on properties. 因此,以下测试都有效,并在失败时给出非常有用的错误消息:
class DoubleSpec extends FreeSpec with Matchers {
"NaN should be NaN" in {
Double.box(Double.NaN) shouldBe 'NaN
}
"1 should not be NaN" in {
Double.box(1d) should not be 'NaN
}
"Infinity should be infinite" in {
Double.box(Double.PositiveInfinity) shouldBe 'Infinite
}
"1 should not be infinite" in {
Double.box(1d) should not be 'Infinite
}
}
不幸的是,符号支持仅适用于引用类型 - 需要一个隐式参数 T <:< AnyRef
。我欢迎提出处理此问题的建议,而无需每次都调用 Double.box
。
您也可以为此编写自己的匹配器:
val NaN : BeMatcher[Double] = (left: Double) => MatchResult(
left.isNaN,
s"$left is not NaN",
s"$left is NaN"
)
"NaN should be NaN" in {
Double.NaN shouldBe NaN
}
"1 should not be NaN" in {
1d should not be NaN
}
避免装箱问题并且更 type-safe,但确实需要一些额外的代码行。
根据定义,NaN 不等于任何值 (https://en.wikipedia.org/w/index.php?title=NaN#Comparison_with_NaN)。
出于这个原因,我认为任何 scalatest 匹配器都不会也不应该存在于 NaN 中,你最好像你已经做的那样使用 .isNaN。
至于无限值,你同样可以使用:
val value = -1.0/0.0
value.isNegInfinity shouldBe true
value.isInfinite shouldBe true
value should equal (Double.NegativeInfinity)
Scalatest 是否提供 NaN
和无穷大的匹配器?
如果有办法的话,我想让这些断言更具描述性:
Double.NaN.isNaN shouldBe true
Double.NegativeInfinity.isInfinite shouldBe true
最灵活的处理方法可能是使用 ScalaTest 的 support for symbols to handle boolean matches on properties. 因此,以下测试都有效,并在失败时给出非常有用的错误消息:
class DoubleSpec extends FreeSpec with Matchers {
"NaN should be NaN" in {
Double.box(Double.NaN) shouldBe 'NaN
}
"1 should not be NaN" in {
Double.box(1d) should not be 'NaN
}
"Infinity should be infinite" in {
Double.box(Double.PositiveInfinity) shouldBe 'Infinite
}
"1 should not be infinite" in {
Double.box(1d) should not be 'Infinite
}
}
不幸的是,符号支持仅适用于引用类型 - 需要一个隐式参数 T <:< AnyRef
。我欢迎提出处理此问题的建议,而无需每次都调用 Double.box
。
您也可以为此编写自己的匹配器:
val NaN : BeMatcher[Double] = (left: Double) => MatchResult(
left.isNaN,
s"$left is not NaN",
s"$left is NaN"
)
"NaN should be NaN" in {
Double.NaN shouldBe NaN
}
"1 should not be NaN" in {
1d should not be NaN
}
避免装箱问题并且更 type-safe,但确实需要一些额外的代码行。
根据定义,NaN 不等于任何值 (https://en.wikipedia.org/w/index.php?title=NaN#Comparison_with_NaN)。
出于这个原因,我认为任何 scalatest 匹配器都不会也不应该存在于 NaN 中,你最好像你已经做的那样使用 .isNaN。
至于无限值,你同样可以使用:
val value = -1.0/0.0
value.isNegInfinity shouldBe true
value.isInfinite shouldBe true
value should equal (Double.NegativeInfinity)