use serde_json::Value;
use crate::merge::conflict::{Conflict, MergeResult};
pub fn merge_replace(path: &str, base: &Value, current: &Value, proposed: &Value) -> MergeResult {
if current == base && proposed == base {
return MergeResult::Merged(base.clone());
}
if current != base && proposed == base {
return MergeResult::Merged(current.clone());
}
if current == base && proposed != base {
return MergeResult::Merged(proposed.clone());
}
if current == proposed {
return MergeResult::Merged(current.clone());
}
MergeResult::Conflicts(vec![Conflict::value_mismatch(
path,
base.clone(),
current.clone(),
proposed.clone(),
)])
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn test_replace_accept_current() {
let result = merge_replace(
"name",
&json!("Luke"),
&json!("Luke Skywalker"),
&json!("Luke"),
);
assert!(result.is_merged());
assert_eq!(result.unwrap_merged(), json!("Luke Skywalker"));
}
#[test]
fn test_replace_accept_proposed() {
let result = merge_replace(
"name",
&json!("Luke"),
&json!("Luke"),
&json!("Luke Skywalker"),
);
assert!(result.is_merged());
assert_eq!(result.unwrap_merged(), json!("Luke Skywalker"));
}
#[test]
fn test_replace_accept_either_when_equal() {
let result = merge_replace(
"name",
&json!("Luke"),
&json!("Luke Skywalker"),
&json!("Luke Skywalker"),
);
assert!(result.is_merged());
assert_eq!(result.unwrap_merged(), json!("Luke Skywalker"));
}
#[test]
fn test_replace_accept_all_equal() {
let result = merge_replace("name", &json!("Luke"), &json!("Luke"), &json!("Luke"));
assert!(result.is_merged());
assert_eq!(result.unwrap_merged(), json!("Luke"));
}
#[test]
fn test_replace_conflict() {
let result = merge_replace(
"name",
&json!("Luke"),
&json!("Luke Skywalker"),
&json!("Anakin"),
);
assert!(result.is_conflict());
let conflicts = result.unwrap_conflicts();
assert_eq!(conflicts.len(), 1);
assert_eq!(conflicts[0].current, json!("Luke Skywalker"));
assert_eq!(conflicts[0].proposed, json!("Anakin"));
}
#[test]
fn test_replace_with_numbers() {
let result = merge_replace("version", &json!(1), &json!(2), &json!(1));
assert!(result.is_merged());
assert_eq!(result.unwrap_merged(), json!(2));
}
#[test]
fn test_replace_with_null() {
let result = merge_replace(
"homeworld",
&json!("Stewjon"),
&json!(Value::Null),
&json!("Stewjon"),
);
assert!(result.is_merged());
assert_eq!(result.unwrap_merged(), Value::Null);
}
}