Есть ли у Scalatest поставщик соответствия для NaN? - PullRequest
5 голосов
/ 13 июня 2019

Предоставляет ли Scalatest средство сопоставления для NaN и бесконечностей?

Я хотел бы сделать эти утверждения более наглядными, если есть способ:

Double.NaN.isNaN shouldBe true
Double.NegativeInfinity.isInfinite shouldBe true

Ответы [ 2 ]

6 голосов
/ 13 июня 2019

Наиболее гибкий способ справиться с этим, вероятно, использует поддержку ScalaTest для символов для обработки логических совпадений свойств. Итак, все следующие тесты работают и выдают довольно полезное сообщение об ошибке при ошибке:

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
  }

Избегает проблемы с боксом и больше типа-безопасно, но требует нескольких дополнительных строк кода.

1 голос
/ 13 июня 2019

По определению, NaN не равен ничему (https://en.wikipedia.org/w/index.php?title=NaN#Comparison_with_NaN).

По этой причине я не думаю, что для NaN существовал бы и должен существовать какой-либо самый масштабный сопоставитель, и вам лучше использовать .isNaN, как вы уже сделали.

Что касается бесконечных значений, вы можете в равной степени использовать:

val value = -1.0/0.0
value.isNegInfinity shouldBe true
value.isInfinite shouldBe true
value should equal (Double.NegativeInfinity)
...