
jvmMain.io.kotest.equals.ReflectionIgnoringFieldsEquality.kt Maven / Gradle / Ivy
package io.kotest.equals
import io.kotest.matchers.equality.beEqualToIgnoringFields
import kotlin.reflect.KProperty
class ReflectionIgnoringFieldsEquality(
private val property: KProperty<*>,
private val others: Array>,
private val ignorePrivateFields: Boolean = true,
) : Equality {
override fun name(): String {
val plural = if (others.isNotEmpty()) "s" else ""
val ignoringPrivate = if (ignorePrivateFields) "ignoring" else "including"
return "reflection equality ignoring field$plural ${(listOf(property) + others).map { it.name }} and $ignoringPrivate private fields"
}
fun includingPrivateFields(): ReflectionIgnoringFieldsEquality {
return withIgnorePrivateFields(false)
}
fun ignoringPrivateFields(): ReflectionIgnoringFieldsEquality {
return withIgnorePrivateFields(true)
}
private fun withIgnorePrivateFields(value: Boolean): ReflectionIgnoringFieldsEquality {
return ReflectionIgnoringFieldsEquality(
property = property,
others = others,
ignorePrivateFields = value,
)
}
override fun verify(actual: T, expected: T): EqualityResult {
val result = beEqualToIgnoringFields(expected, ignorePrivateFields, property, *others).test(actual)
if(result.passed()) return EqualityResult.equal(actual, expected, this)
return EqualityResult.notEqual(actual, expected, this).withDetails { result.failureMessage() }
}
override fun toString(): String = name()
}
fun Equality.Companion.byReflectionIgnoringFields(
property: KProperty<*>,
vararg others: KProperty<*>,
ignorePrivateFields: Boolean = true,
) = ReflectionIgnoringFieldsEquality(
property = property,
others = others,
ignorePrivateFields = ignorePrivateFields
)
© 2015 - 2025 Weber Informatics LLC | Privacy Policy