mirror of
https://github.com/jlengrand/atrium.git
synced 2026-03-10 08:01:19 +00:00
Merge pull request #938 from wordhou/fail-explanatory-group-on-empty-assertionCreator
Fail explanatory assertion group on empty assertionCreator
This commit is contained in:
@@ -1,20 +1,40 @@
|
||||
// TODO 1.0.0 at the latest: use type ExplanatoryGroup.FinalStep when ExplanatoryAssertionGroupFinalStep is removed
|
||||
@file:Suppress("DEPRECATION")
|
||||
|
||||
package ch.tutteli.atrium.logic.creating.collectors
|
||||
|
||||
import ch.tutteli.atrium.assertions.AssertionGroup
|
||||
import ch.tutteli.atrium.assertions.ExplanatoryAssertionGroupType
|
||||
import ch.tutteli.atrium.assertions.builders.AssertionsOption
|
||||
import ch.tutteli.atrium.assertions.builders.ExplanatoryAssertionGroupFinalStep
|
||||
import ch.tutteli.atrium.core.None
|
||||
import ch.tutteli.atrium.core.Option
|
||||
import ch.tutteli.atrium.creating.AssertionContainer
|
||||
import ch.tutteli.atrium.creating.CollectingExpect
|
||||
import ch.tutteli.atrium.creating.Expect
|
||||
import ch.tutteli.atrium.creating.ExperimentalComponentFactoryContainer
|
||||
import ch.tutteli.atrium.logic.collectForCompositionBasedOnSubject
|
||||
|
||||
/**
|
||||
* Collects the assertions [assertionCreator] creates and uses them as [AssertionGroup.assertions].
|
||||
*
|
||||
* //TODO 0.18.0 in case we somehow incorporate the current container in AssertionsOptions, then remove container as parameter
|
||||
*
|
||||
* TODO 1.0.0 at the latest: use type ExplanatoryGroup.FinalStep when ExplanatoryAssertionGroupFinalStep is removed
|
||||
*/
|
||||
fun <T, G : ExplanatoryAssertionGroupType, R> AssertionsOption<G, R>.collectAssertions(
|
||||
@Suppress("DEPRECATION" /* OptIn is only available since 1.3.70 which we cannot use if we want to support 1.2 */)
|
||||
@UseExperimental(ExperimentalComponentFactoryContainer::class)
|
||||
fun <T, G : ExplanatoryAssertionGroupType, R: ExplanatoryAssertionGroupFinalStep> AssertionsOption<G, R>.collectAssertions(
|
||||
container: AssertionContainer<*>,
|
||||
maybeSubject: Option<T>,
|
||||
assertionCreator: Expect<T>.() -> Unit
|
||||
): R = withAssertions(container.collectForCompositionBasedOnSubject(maybeSubject, assertionCreator))
|
||||
): ExplanatoryAssertionGroupFinalStep {
|
||||
val collectingExpect = CollectingExpect<T>(None, container.components)
|
||||
// not using addAssertionsCreatedBy on purpose so that we don't append a failing assertion
|
||||
collectingExpect.assertionCreator()
|
||||
return withAssertions(container.collectForCompositionBasedOnSubject(maybeSubject, assertionCreator))
|
||||
.let {
|
||||
if(collectingExpect.getAssertions().isEmpty()) it.failing
|
||||
else it
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,8 +94,6 @@ class InAnyOrderEntriesAssertionCreator<E : Any, T : IterableLike>(
|
||||
val featureAssertion = featureFactory(count, DescriptionIterableAssertion.NUMBER_OF_OCCURRENCES)
|
||||
val assertions = mutableListOf<Assertion>(explanatoryGroup)
|
||||
if (searchBehaviour is NotSearchBehaviour) {
|
||||
createEmptyAssertionHintIfNecessary(multiConsumableContainer, searchCriterion, count)
|
||||
?.let { assertions.add(it) }
|
||||
val mismatches = createIndexAssertions(list) { (_, element) ->
|
||||
allCreatedAssertionsHold(multiConsumableContainer, element, searchCriterion)
|
||||
}
|
||||
@@ -118,27 +116,4 @@ class InAnyOrderEntriesAssertionCreator<E : Any, T : IterableLike>(
|
||||
val count = list.count { allCreatedAssertionsHold(container, it, assertionCreatorOrNull) }
|
||||
return group to count
|
||||
}
|
||||
|
||||
//TODO 0.18.0 check if this is still state of the art to add a hint that no assertion was created
|
||||
// in the assertionCreator-lambda, maybe it is a special case and needs to be handled like this,
|
||||
// maybe it would be enough to collect
|
||||
@Suppress("DEPRECATION" /* OptIn is only available since 1.3.70 which we cannot use if we want to support 1.2 */)
|
||||
@UseExperimental(ExperimentalComponentFactoryContainer::class)
|
||||
private fun createEmptyAssertionHintIfNecessary(
|
||||
container: AssertionContainer<*>,
|
||||
searchCriterion: (Expect<E>.() -> Unit)?,
|
||||
count: Int
|
||||
): Assertion? {
|
||||
if (searchCriterion != null && count == 0) {
|
||||
val collectingExpect = CollectingExpect<E>(None, container.components)
|
||||
// not using addAssertionsCreatedBy on purpose so that we don't append a failing assertion
|
||||
collectingExpect.searchCriterion()
|
||||
val collectedAssertions = collectingExpect.getAssertions()
|
||||
if (collectedAssertions.isEmpty()) {
|
||||
// no assertion created in the lambda, so return the failing assertion containing the hint
|
||||
return container.collectBasedOnSubject(None, searchCriterion)
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user