use super::{chat, child, commit, seat, step, steps};
use crate::rail::{Rail, build};
#[test]
fn one_notch_per_step_carries_that_steps_read_state_commit() {
let rail = build(
"root",
&[commit("aaaa1111", 10), commit("bbbb2222", 20)],
&steps(vec![
step("001", Some("aaaa1111"), 5),
step("002", Some("bbbb2222"), 7),
step("003", None, 0),
]),
&chat(3),
&[],
);
let seqs: Vec<&str> = rail.notches.iter().map(|n| n.seq.as_str()).collect();
assert_eq!(seqs, ["001", "002", "003"]);
let shorts: Vec<String> = rail
.notches
.iter()
.map(super::super::Notch::short)
.collect();
assert_eq!(shorts, ["aaaa111", "bbbb222", "—"]);
assert_eq!(rail.notches.get(2).and_then(|n| n.commit.clone()), None);
}
#[test]
fn nothing_dispatched_leaves_the_chat_exactly_as_it_was() {
let one = build(
"root",
&[commit("aaaa1111", 10)],
&steps(vec![step("001", Some("aaaa1111"), 5)]),
&chat(1),
&[],
);
assert!(one.cards.is_empty());
assert_eq!(one.rules().get(&seat(0)), Some(&0));
assert!(Rail::default().rules().is_empty());
}
#[test]
fn a_fork_child_wears_both_edges_and_reads_from_here() {
let parent = vec![commit("aaaa1111", 10), commit("bbbb2222", 20)];
let forked = child(
"hare",
vec![
commit("aaaa1111", 10),
commit("bbbb2222", 20),
commit("cccc3333", 30),
],
);
let rail = build(
"storeroom",
&parent,
&steps(vec![
step("001", Some("aaaa1111"), 0),
step("002", Some("bbbb2222"), 0),
]),
&chat(2),
&[forked],
);
let card = rail.cards.first().expect("the fork has a card");
assert_eq!(card.provenance_notch, 1);
assert_eq!(card.fork, "from here");
}
#[test]
fn a_fork_from_an_older_notch_splits_the_two_edges() {
let parent = vec![
commit("aaaa1111", 10),
commit("bbbb2222", 20),
commit("cccc3333", 30),
];
let forked = child("hare", vec![commit("aaaa1111", 10), commit("dddd4444", 40)]);
let rail = build(
"storeroom",
&parent,
&steps(vec![
step("001", Some("aaaa1111"), 0),
step("002", Some("bbbb2222"), 0),
step("003", Some("cccc3333"), 0),
]),
&chat(3),
&[forked],
);
let card = rail.cards.first().expect("the fork has a card");
assert_eq!(card.provenance_notch, 2);
assert_eq!(card.fork, "from storeroom@aaaa111");
}
#[test]
fn a_clean_child_has_provenance_only_and_names_its_config_branch() {
let parent = vec![commit("aaaa1111", 10), commit("bbbb2222", 20)];
let mut clean = child("mole", vec![commit("ffff9999", 25)]);
clean.config_label = Some("default".to_owned());
let rail = build(
"storeroom",
&parent,
&steps(vec![
step("001", Some("aaaa1111"), 0),
step("002", Some("bbbb2222"), 0),
]),
&chat(2),
&[clean],
);
let card = rail.cards.first().expect("the clean child has a card");
assert_eq!(card.provenance_notch, 1);
assert_eq!(card.fork, "from config/default");
}
#[test]
fn a_clean_child_with_no_named_branch_says_so() {
let rail = build(
"storeroom",
&[commit("aaaa1111", 10), commit("bbbb2222", 20)],
&steps(vec![
step("001", Some("aaaa1111"), 0),
step("002", Some("bbbb2222"), 0),
]),
&chat(2),
&[child("mole", vec![commit("ffff9999", 5)])],
);
let card = rail.cards.first().expect("the clean child has a card");
assert_eq!(card.fork, "from a config commit");
assert_eq!(card.provenance_notch, 0);
}