Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Assert equals doubles #192

Merged
merged 9 commits into from
Oct 1, 2020
36 changes: 35 additions & 1 deletion munit/shared/src/main/scala/munit/Assertions.scala
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ trait Assertions extends MacroCompat.CompileErrorMacro {
)(implicit loc: Location, ev: A =:= B): Unit = {
StackTraces.dropInside {
if (obtained == expected) {
fail(munitPrint(clue))
fail(s"${munitPrint(clue)} expected same: $expected was not: $obtained")
}
}
}
Expand Down Expand Up @@ -120,6 +120,40 @@ trait Assertions extends MacroCompat.CompileErrorMacro {
}
}

/**
* Asserts that two doubles or floats are equal to within a positive delta.
* If the expected value is infinity then the delta value is ignored.
* NaNs are considered equal: assertEquals(Double.NaN, Double.NaN, *) passes.
*/
def assertEquals(
obtained: Double,
expected: Double,
delta: Double
)(implicit loc: Location): Unit = {
val defaultClue = "values are not the same"
assertEquals(obtained, expected, delta, defaultClue)
}

/**
* Asserts that two doubles or floats are equal to within a positive delta.
* If the expected value is infinity then the delta value is ignored.
* NaNs are considered equal: assertEquals(Double.NaN, Double.NaN, *, *) passes.
*/
def assertEquals(
obtained: Double,
expected: Double,
delta: Double,
clue: => Any
)(implicit loc: Location): Unit = {
StackTraces.dropInside {
val exactlyTheSame = java.lang.Double.compare(expected, obtained) == 0
val almostTheSame = Math.abs(expected - obtained) <= delta
if (!exactlyTheSame && !almostTheSame) {
fail(s"${munitPrint(clue)} expected: $expected but was: $obtained")
}
}
}

def intercept[T <: Throwable](
body: => Any
)(implicit T: ClassTag[T], loc: Location): T = {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package munit

class DoubleAssertionsFrameworkSuite extends BaseSuite {
test("Assert Equals NaN Fails".fail) {
assertEquals(1.234, Double.NaN, 0.0)
}

test("Assert NaN Equals Fails".fail) {
assertEquals(Double.NaN, 1.234, 0.0)
}

test("Assert NaN Equals NaN") {
assertEquals(Double.NaN, Double.NaN, 0.0)
}

test("Assert Pos Infinity Not Equals Neg Infinity".fail) {
assertEquals(Double.PositiveInfinity, Double.NegativeInfinity, 0.0)
}

test("Assert Pos Infinity Not Equals".fail) {
assertEquals(Double.PositiveInfinity, 1.23, 0.0)
}

test("Assert Pos Infinity Equals Infinity") {
assertEquals(Double.PositiveInfinity, Double.PositiveInfinity, 0.0)
}

test("Assert Neg Infinity Equals Infinity") {
assertEquals(Double.NegativeInfinity, Double.NegativeInfinity, 0.0)
}

test("All Infinities") {
assertEquals(
Double.PositiveInfinity,
Double.NegativeInfinity,
Double.PositiveInfinity
)
}

// And now, the same with floats...
test("Assert Equals NaN Fails".fail) {
assertEquals(1.234f, Float.NaN, 0.0)
}

test("Assert NaN Equals Fails".fail) {
assertEquals(Float.NaN, 1.234f, 0.0)
}

test("Assert NaN Equals NaN") {
assertEquals(Float.NaN, Float.NaN, 0.0)
}

test("Assert Pos Infinity Not Equals Neg Infinity".fail) {
assertEquals(Float.PositiveInfinity, Float.NegativeInfinity, 0.0)
}

test("Assert Pos Infinity Not Equals".fail) {
assertEquals(Float.PositiveInfinity, 1.23f, 0.0)
}

test("Assert Pos Infinity Equals Infinity") {
assertEquals(Float.PositiveInfinity, Float.PositiveInfinity, 0.0)
}

test("Assert Neg Infinity Equals Infinity") {
assertEquals(Float.NegativeInfinity, Float.NegativeInfinity, 0.0)
}

test("All Infinities") {
assertEquals(
Float.PositiveInfinity,
Float.NegativeInfinity,
Float.PositiveInfinity
)
}
}

object DoubleAssertionsFrameworkSuite
extends FrameworkTest(
classOf[DoubleAssertionsFrameworkSuite],
"""|==> success munit.DoubleAssertionsFrameworkSuite.Assert Equals NaN Fails
|==> success munit.DoubleAssertionsFrameworkSuite.Assert NaN Equals Fails
|==> success munit.DoubleAssertionsFrameworkSuite.Assert NaN Equals NaN
|==> success munit.DoubleAssertionsFrameworkSuite.Assert Pos Infinity Not Equals Neg Infinity
|==> success munit.DoubleAssertionsFrameworkSuite.Assert Pos Infinity Not Equals
|==> success munit.DoubleAssertionsFrameworkSuite.Assert Pos Infinity Equals Infinity
|==> success munit.DoubleAssertionsFrameworkSuite.Assert Neg Infinity Equals Infinity
|==> success munit.DoubleAssertionsFrameworkSuite.All Infinities
|==> success munit.DoubleAssertionsFrameworkSuite.Assert Equals NaN Fails-1
|==> success munit.DoubleAssertionsFrameworkSuite.Assert NaN Equals Fails-1
|==> success munit.DoubleAssertionsFrameworkSuite.Assert NaN Equals NaN-1
|==> success munit.DoubleAssertionsFrameworkSuite.Assert Pos Infinity Not Equals Neg Infinity-1
|==> success munit.DoubleAssertionsFrameworkSuite.Assert Pos Infinity Not Equals-1
|==> success munit.DoubleAssertionsFrameworkSuite.Assert Pos Infinity Equals Infinity-1
|==> success munit.DoubleAssertionsFrameworkSuite.Assert Neg Infinity Equals Infinity-1
|==> success munit.DoubleAssertionsFrameworkSuite.All Infinities-1
|""".stripMargin
)
1 change: 1 addition & 0 deletions tests/shared/src/test/scala/munit/FrameworkSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class FrameworkSuite extends BaseFrameworkSuite {
FullStackTraceFrameworkSuite,
SmallStackTraceFrameworkSuite,
AssertionsFrameworkSuite,
DoubleAssertionsFrameworkSuite,
ScalaCheckExceptionFrameworkSuite
)
tests.foreach { t => check(t) }
Expand Down