11

I was wondering, in Kotlin, is there the possibility to call the equivalent of the java method:

assertEquals(double expected, double actual, double precision)

because everytime I'm getting this method instead

assertEquals(expected: T, actual: T, message: String)

And i can't find the one with the precision parameter. Calling the Java one should be fine too I guess.

My call to the method:

assertEquals(5000.00, calculateCouponAmount(basicFaceValue, basicInterestRate, amortizationBullet, couponNumber1), 0.01)

I'm getting an error because 0.01 gets in the "message" field

Adonis
  • 4,670
  • 3
  • 37
  • 57
Stefano.Maffullo
  • 801
  • 8
  • 21

4 Answers4

8

I have figured it out!

This is how it's done

import org.junit.*
import Kotlin.Test.assertEquals

Assert.assertEquals(expected, actual, precision) // to use the jUnit standard one
assertEquals(expected, actual, message) // to use the Kotlin one
Stefano.Maffullo
  • 801
  • 8
  • 21
4

I couldn't find one, so I created my own set of functions:

import java.math.BigDecimal
import kotlin.math.abs
import kotlin.test.asserter

internal fun assertEquals(expected: Double, actual: Double?, epsilon: Double, message: String? = null) {
    asserter.assertNotNull(null, actual)
    asserter.assertTrue({ messagePrefix(message) + "Expected <$expected>, actual <$actual>, should differ no more than <$epsilon>." },
            abs(expected - actual!!) <= epsilon)
}

internal fun assertEquals(expected: BigDecimal, actual: BigDecimal?, epsilon: Double, message: String? = null) {
    asserter.assertNotNull(null, actual)
    asserter.assertTrue({ messagePrefix(message) + "Expected <$expected>, actual <$actual>, should differ no more than <$epsilon>." },
            (expected - actual!!).abs().toDouble() <= epsilon)
}

internal fun assertEquals(expected: Double, actual: BigDecimal?, epsilon: Double, message: String? = null) {
    asserter.assertNotNull(null, actual)
    asserter.assertTrue({ messagePrefix(message) + "Expected <$expected>, actual <$actual>, should differ no more than <$epsilon>." },
            abs(expected - actual!!.toDouble()) <= epsilon)
}

internal fun messagePrefix(message: String?) = if (message == null) "" else "$message. "
Bruno Medeiros
  • 2,251
  • 21
  • 34
2

Just check to make sure you're importing the correct class that has the desired assertEquals method on it. Other than that you may want to verify that the calculateCouponAmount() method returns a Double.

Paolo Forgia
  • 6,572
  • 8
  • 46
  • 58
John Aqel
  • 31
  • 2
  • 2
2

It is now included in the official API for Double and Float:

fun assertEquals(
    expected: Double,
    actual: Double,
    absoluteTolerance: Double,
    message: String? = null
): Unit

fun assertEquals(
    expected: Float,
    actual: Float,
    absoluteTolerance: Float,
    message: String? = null
): Unit

See https://kotlinlang.org/api/latest/kotlin.test/kotlin.test/assert-equals.html

JM Lord
  • 1,031
  • 1
  • 13
  • 29