use serde_json::json;
use super::super::Signature;
use super::{mutate, project, spelled, words};
fn signature(entries: &[(&str, u64)]) -> Signature {
entries
.iter()
.map(|(path, stamp)| ((*path).to_owned(), *stamp))
.collect()
}
#[test]
fn a_signature_entry_is_a_path_and_a_type() {
assert_eq!(spelled("/rows/[]/held:null"), ("/rows/[]/held", "null"));
assert_eq!(spelled(":object"), ("", "object"));
assert_eq!(spelled("nonsense"), ("nonsense", ""));
}
#[test]
fn the_word_paths_are_the_string_ones_without_the_discriminant() {
let signature = signature(&[
("/kind:string", 1),
("/rows/[]/state:string", 1),
("/rows/[]/age:number", 1),
("/rows:array", 1),
(":object", 1),
]);
assert_eq!(words(&signature), vec!["/rows/[]/state".to_owned()]);
}
#[test]
fn projection_deletes_only_what_is_stamped_later() {
let signature = signature(&[
("/kind:string", 1),
("/rows/[]/says:string", 1),
("/rows/[]/held:object", 20),
("/rows/[]/held/tool:string", 20),
]);
let frame = json!({
"kind": "follow",
"rows": [
{"says": "one", "held": {"tool": "Bash"}},
{"says": "two"},
],
});
assert_eq!(
project(&frame, &signature, 20),
frame,
"nothing is later than 20"
);
assert_eq!(
project(&frame, &signature, 19),
json!({"kind": "follow", "rows": [{"says": "one"}, {"says": "two"}]}),
);
}
#[test]
fn projecting_an_element_spelling_empties_the_array() {
let signature = signature(&[("/rows/[]/signals/[]:string", 20)]);
let frame = json!({"rows": [{"signals": ["flagged"]}, {"signals": []}]});
assert_eq!(
project(&frame, &signature, 19),
json!({"rows": [{"signals": []}, {"signals": []}]}),
);
}
#[test]
fn projecting_a_path_this_frame_does_not_carry_changes_nothing() {
let signature = signature(&[
("/rows/[]/held/tool:string", 20),
("/absent/deep:string", 20),
(":object", 20),
]);
let frame = json!({"rows": [{"says": "one"}]});
assert_eq!(project(&frame, &signature, 19), frame);
}
#[test]
fn mutation_sets_every_string_the_path_reaches() {
let frame = json!({
"rows": [
{"state": "running", "signals": ["flagged", "truncated"], "age": 3},
{"state": "wound"},
],
});
assert_eq!(
mutate(&frame, "/rows/[]/state", "unheard-of"),
Some(json!({
"rows": [
{"state": "unheard-of", "signals": ["flagged", "truncated"], "age": 3},
{"state": "unheard-of"},
],
})),
);
assert_eq!(
mutate(&frame, "/rows/[]/signals/[]", "unheard-of"),
Some(json!({
"rows": [
{"state": "running", "signals": ["unheard-of", "unheard-of"], "age": 3},
{"state": "wound"},
],
})),
);
assert_eq!(mutate(&frame, "/rows/[]/absent", "unheard-of"), None);
assert_eq!(mutate(&frame, "/rows/[]/age", "unheard-of"), None);
assert_eq!(mutate(&frame, "", "unheard-of"), None);
}