com.github.squirrelgrip.scientist4k.comparator.JsonContentTypeComparator.kt Maven / Gradle / Ivy
package com.github.squirrelgrip.scientist4k.comparator
import com.github.squirrelgrip.extension.json.toInstance
import com.github.squirrelgrip.extension.map.flatten
import com.github.squirrelgrip.scientist4k.model.ComparisonResult
import com.github.squirrelgrip.scientist4k.model.ComparisonResult.Companion.SUCCESS
import com.google.common.collect.MapDifference
import com.google.common.collect.Maps
class JsonContentTypeComparator : ContentTypeComparator {
override fun invoke(control: ByteArray, candidate: ByteArray): ComparisonResult {
val controlMap: Map = control.toInstance()
val candidateMap: Map = candidate.toInstance()
val difference: MapDifference = Maps.difference(controlMap.flatten(), candidateMap.flatten())
return if (difference.areEqual()) {
SUCCESS
} else {
ComparisonResult(
*difference.entriesOnlyOnLeft()
.map { (key, _) -> "$key in control, not in candidate" }.toTypedArray(),
*difference.entriesOnlyOnRight()
.map { (key, _) -> "$key in candidate, not in control" }.toTypedArray(),
*difference.entriesDiffering()
.map { (key, value) -> "$key has different values (${value.leftValue()} != ${value.rightValue()})" }.toTypedArray()
)
}
}
}