main.kotlin.ch.tutteli.atrium.logic.featureExtensions.kt Maven / Gradle / Ivy
package ch.tutteli.atrium.logic
import ch.tutteli.atrium.core.ExperimentalNewExpectTypes
import ch.tutteli.atrium.core.None
import ch.tutteli.atrium.creating.AssertionContainer
import ch.tutteli.atrium.logic.creating.feature.MetaFeature
import ch.tutteli.atrium.logic.creating.transformers.FeatureExtractorBuilder
import ch.tutteli.atrium.reporting.Text
import ch.tutteli.atrium.reporting.translating.Untranslatable
import ch.tutteli.atrium.reporting.translating.Translatable
import ch.tutteli.atrium.translations.ErrorMessages
/**
* Convenience method to pass a [String] as [description] which is wrapped into an [Untranslatable] instead of passing
* a [Translatable].
*/
fun AssertionContainer.manualFeature(
description: String,
provider: T.() -> R
): FeatureExtractorBuilder.ExecutionStep = manualFeature(Untranslatable(description), provider)
fun AssertionContainer.genericSubjectBasedFeature(
provider: (T) -> MetaFeature
): FeatureExtractorBuilder.ExecutionStep =
genericFeature(this, maybeSubject.fold(::createFeatureSubjectNotDefined) { provider(it) })
private fun createFeatureSubjectNotDefined(): MetaFeature =
MetaFeature(
ErrorMessages.DESCRIPTION_BASED_ON_SUBJECT,
ErrorMessages.REPRESENTATION_BASED_ON_SUBJECT_NOT_DEFINED,
None
)
private fun genericFeature(
container: AssertionContainer,
metaFeature: MetaFeature
): FeatureExtractorBuilder.ExecutionStep {
val representation: Any = metaFeature.representation ?: Text.NULL
@Suppress("DEPRECATION" /* OptIn is only available since 1.3.70 which we cannot use if we want to support 1.2 */)
@UseExperimental(ExperimentalNewExpectTypes::class)
return container.extractFeature
.withDescription(metaFeature.description)
.withRepresentationForFailure(representation)
.withFeatureExtraction { metaFeature.maybeSubject }
.withOptions { withRepresentation { representation } }
.build()
}