io.specmatic.core.pattern.NegativePatternsTemplate.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of specmatic-core Show documentation
Show all versions of specmatic-core Show documentation
Turn your contracts into executable specifications. Contract Driven Development - Collaboratively Design & Independently Deploy MicroServices & MicroFrontends.
package io.specmatic.core.pattern
import io.specmatic.core.Resolver
import io.specmatic.core.pattern.config.NegativePatternConfiguration
abstract class NegativePatternsTemplate {
fun negativeBasedOn(
patternMap: Map,
row: Row,
resolver: Resolver,
config: NegativePatternConfiguration = NegativePatternConfiguration()
): Sequence>> {
val eachKeyMappedToPatternMap: Map> = patternMap.mapValues { patternMap }
val negativePatternsForEachKey: Map>> =
getNegativePatterns(patternMap, resolver, row, config)
val modifiedPatternMap: Map>>?> =
eachKeyMappedToPatternMap.mapValues { (keyToNegate, patterns) ->
val negativePatterns: Sequence> = negativePatternsForEachKey.getValue(keyToNegate)
if(!negativePatterns.any())
return@mapValues null
patterns.mapValues { (key, pattern) ->
when (key) {
keyToNegate -> {
val result: Sequence> = negativePatterns
result
}
else -> newPatternsBasedOn(row, key, pattern, resolver)
}.map {
it.breadCrumb(withoutOptionality(key))
}
}
}
if (modifiedPatternMap.values.isEmpty())
return sequenceOf(HasValue(emptyMap()))
return modifiedPatternMap.values.asSequence().filterNotNull().flatMap {
patternList(it)
}
}
abstract fun getNegativePatterns(
patternMap: Map,
resolver: Resolver,
row: Row,
config: NegativePatternConfiguration = NegativePatternConfiguration()
): Map>>
}