
commonMain.io.kotest.matchers.collections.containExactlyInAnyOrder.kt Maven / Gradle / Ivy
package io.kotest.matchers.collections
import io.kotest.assertions.print.print
import io.kotest.matchers.Matcher
import io.kotest.matchers.MatcherResult
import io.kotest.matchers.neverNullMatcher
import io.kotest.matchers.nulls.shouldNotBeNull
import io.kotest.matchers.should
import io.kotest.matchers.shouldNot
/**
* Verifies that the given collection contains all the specified elements and no others, but in any order.
*
* For example, each of the following examples would pass for a collection [1,2,3].
*
* collection.shouldContainExactlyInAnyOrder(1, 2, 3)
* collection.shouldContainExactlyInAnyOrder(3, 2, 1)
* collection.shouldContainExactlyInAnyOrder(2, 1, 3)
*
* Note: Comparison is via the standard Java equals and hash code methods.
*
* From the javadocs for hashcode: If two objects are equal according to the equals(Object) method,
* then calling the hashCode method on each of the two objects must produce the same integer result.
*
*/
infix fun Array.shouldContainExactlyInAnyOrder(expected: Array): Array {
asList().shouldContainExactlyInAnyOrder(expected.asList())
return this
}
/**
* Verifies that the given collection contains all the specified elements and no others, but in any order.
*
* For example, each of the following examples would pass for a collection [1,2,3].
*
* collection.shouldContainExactlyInAnyOrder(1, 2, 3)
* collection.shouldContainExactlyInAnyOrder(3, 2, 1)
* collection.shouldContainExactlyInAnyOrder(2, 1, 3)
*
* Note: Comparison is via the standard Java equals and hash code methods.
*
* From the javadocs for hashcode: If two objects are equal according to the equals(Object) method,
* then calling the hashCode method on each of the two objects must produce the same integer result.
*
*/
infix fun > C?.shouldContainExactlyInAnyOrder(expected: Collection?): C? {
expected.shouldNotBeNull()
this should containExactlyInAnyOrder(expected)
return this
}
/**
* Verifies that the given collection contains all the specified elements and no others, but in any order.
*
* For example, each of the following examples would pass for a collection [1,2,3].
*
* collection.shouldContainExactlyInAnyOrder(1, 2, 3)
* collection.shouldContainExactlyInAnyOrder(3, 2, 1)
* collection.shouldContainExactlyInAnyOrder(2, 1, 3)
*
* Note: Comparison is via the standard Java equals and hash code methods.
*
* From the javadocs for hashcode: If two objects are equal according to the equals(Object) method,
* then calling the hashCode method on each of the two objects must produce the same integer result.
*
*/
fun > C?.shouldContainExactlyInAnyOrder(vararg expected: T): C? {
this should containExactlyInAnyOrder(*expected)
return this
}
/**
* Verifies that the given collection contains all the specified elements and no others, but in any order.
*
* For example, each of the following examples would pass for a collection [1,2,3].
*
* collection.shouldContainExactlyInAnyOrder(1, 2, 3)
* collection.shouldContainExactlyInAnyOrder(3, 2, 1)
* collection.shouldContainExactlyInAnyOrder(2, 1, 3)
*
* Note: Comparison is via the standard Java equals and hash code methods.
*
* From the javadocs for hashcode: If two objects are equal according to the equals(Object) method,
* then calling the hashCode method on each of the two objects must produce the same integer result.
*
*/
fun containExactlyInAnyOrder(vararg expected: T): Matcher?> =
containExactlyInAnyOrder(expected.asList())
infix fun Array.shouldNotContainExactlyInAnyOrder(expected: Array): Array {
asList().shouldNotContainExactlyInAnyOrder(expected.asList())
return this
}
infix fun > C?.shouldNotContainExactlyInAnyOrder(expected: Collection?): C? {
expected.shouldNotBeNull()
this shouldNot containExactlyInAnyOrder(expected)
return this
}
fun > C?.shouldNotContainExactlyInAnyOrder(vararg expected: T): C? {
this shouldNot containExactlyInAnyOrder(*expected)
return this
}
/** Assert that a collection contains exactly the given values and nothing else, in any order. */
fun > containExactlyInAnyOrder(expected: C): Matcher = neverNullMatcher { value ->
val valueGroupedCounts: Map = value.groupBy { it }.mapValues { it.value.size }
val expectedGroupedCounts: Map = expected.groupBy { it }.mapValues { it.value.size }
val passed = expectedGroupedCounts.size == valueGroupedCounts.size
&& expectedGroupedCounts.all { valueGroupedCounts[it.key] == it.value }
MatcherResult(
passed,
{ "Collection should contain ${expected.print().value} in any order, but was ${value.print().value}" },
{ "Collection should not contain exactly ${expected.print().value} in any order" }
)
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy