Skip to content

Commit

Permalink
print-duplicates (#33) (#3883)
Browse files Browse the repository at this point in the history
for both `shouldBeUnique` and `shouldNotContainDuplicates` for failures,
print duplicates, such as:
instead of "Sequence should be Unique", print "Sequence should be
Unique, __but has duplicates: [1, 2, 3]__"
  • Loading branch information
AlexCue987 committed Feb 19, 2024
1 parent e134c2c commit 7a16bba
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package io.kotest.matchers.sequences
import io.kotest.assertions.eq.eq
import io.kotest.assertions.print.print
import io.kotest.matchers.*
import io.kotest.matchers.collections.duplicates

/*
How should infinite sequences be detected, and how should they be dealt with?
Expand Down Expand Up @@ -199,10 +200,10 @@ fun <T> Sequence<T>.shouldBeUnique() = this should beUnique()
fun <T> Sequence<T>.shouldNotBeUnique() = this shouldNot beUnique()
fun <T> beUnique() = object : Matcher<Sequence<T>> {
override fun test(value: Sequence<T>): MatcherResult {
val valueAsList = value.toList()
val duplicates = value.toList().duplicates()
return MatcherResult(
valueAsList.toSet().size == valueAsList.size,
{ "Sequence should be Unique" },
duplicates.isEmpty(),
{ "Sequence should be Unique, but has duplicates: ${duplicates.print().value}" },
{ "Sequence should contain at least one duplicate element" }
)
}
Expand All @@ -212,11 +213,11 @@ fun <T> Sequence<T>.shouldContainDuplicates() = this should containDuplicates()
fun <T> Sequence<T>.shouldNotContainDuplicates() = this shouldNot containDuplicates()
fun <T> containDuplicates() = object : Matcher<Sequence<T>> {
override fun test(value: Sequence<T>): MatcherResult {
val valueAsList = value.toList()
val duplicates = value.toList().duplicates()
return MatcherResult(
valueAsList.toSet().size < valueAsList.size,
duplicates.isNotEmpty(),
{ "Sequence should contain duplicates" },
{ "Sequence should not contain duplicates" }
{ "Sequence should not contain duplicates, but has some: ${duplicates.print().value}" }
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import io.kotest.matchers.sequences.shouldNotBeSortedWith
import io.kotest.matchers.sequences.shouldNotBeUnique
import io.kotest.matchers.sequences.shouldNotContain
import io.kotest.matchers.sequences.shouldNotContainAllInAnyOrder
import io.kotest.matchers.sequences.shouldNotContainDuplicates
import io.kotest.matchers.sequences.shouldNotContainExactly
import io.kotest.matchers.sequences.shouldNotContainNoNulls
import io.kotest.matchers.sequences.shouldNotContainNull
Expand All @@ -42,6 +43,7 @@ import io.kotest.matchers.sequences.shouldNotHaveCount
import io.kotest.matchers.sequences.shouldNotHaveElementAt
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
import io.kotest.matchers.throwable.shouldHaveMessage

class SequenceMatchersTest : WordSpec() {

Expand Down Expand Up @@ -844,12 +846,16 @@ class SequenceMatchersTest : WordSpec() {
sampleData.single.shouldBeUnique()
}

fail("with repeated nulls") {
sampleData.sparse.shouldBeUnique()
"fail with repeated nulls" {
shouldThrowAny {
sampleData.sparse.shouldBeUnique()
}.shouldHaveMessage("Sequence should be Unique, but has duplicates: [<null>]")
}

fail("with repeats") {
sampleData.repeating.shouldBeUnique()
"fail with repeats" {
shouldThrowAny {
sampleData.repeating.shouldBeUnique()
}.shouldHaveMessage("Sequence should be Unique, but has duplicates: [1, 2, 3]")
}

succeed("for multiple unique") {
Expand Down Expand Up @@ -899,6 +905,12 @@ class SequenceMatchersTest : WordSpec() {
fail("for multiple unique") {
sampleData.countup.shouldContainDuplicates()
}

"fail with repeats" {
shouldThrowAny {
sampleData.repeating.shouldNotContainDuplicates()
}.shouldHaveMessage("Sequence should not contain duplicates, but has some: [1, 2, 3]")
}
}

/* comparable */
Expand Down

0 comments on commit 7a16bba

Please sign in to comment.