use super::{chat, commit, step, steps};
use crate::rail::{build, pin, transcript_as_of};
use crate::transcript::{Entry, EntryKind, Transcript};
fn rail() -> crate::rail::Rail {
build(
"storeroom",
&[commit("aaaa1111", 10), commit("bbbb2222", 20)],
&steps(vec![
step("001", Some("aaaa1111"), 5),
step("002", Some("bbbb2222"), 7),
step("003", None, 11),
]),
&chat(3),
&[],
)
}
fn delivered(name: &str) -> Entry {
Entry {
name: name.to_owned(),
raw: b"hello".to_vec(),
kind: EntryKind::Delivered {
sender: "user".to_owned(),
sender_name: None,
epitaph: None,
body: "hello".to_owned(),
},
}
}
fn spoken(name: &str) -> Entry {
Entry {
name: name.to_owned(),
raw: b"[]".to_vec(),
kind: EntryKind::Model {
model_id: "m".to_owned(),
blocks: vec![],
usage: crate::transcript::Usage::new(),
},
}
}
#[test]
fn a_pinned_notch_names_its_commit_and_states_the_budget_as_of_it() {
let rail = rail();
let budgets: Vec<u64> = rail.notches.iter().map(|n| n.budget).collect();
assert_eq!(
budgets,
[5, 12, 23],
"every notch carries the spend up to and including itself"
);
let pinned = pin(&rail, Some(1)).expect("notch 1 pins");
assert_eq!(pinned.commit, "bbbb2222");
assert_eq!(pinned.short, "bbbb222");
assert_eq!(pinned.tokens, 12);
assert_eq!(pinned.cut, 3);
}
#[test]
fn a_pin_with_no_tree_behind_it_declines() {
let rail = rail();
assert!(pin(&rail, None).is_none());
assert!(pin(&rail, Some(99)).is_none());
assert!(pin(&rail, Some(2)).is_none());
}
#[test]
fn the_transcript_cuts_at_what_that_call_read() {
let tx = Transcript {
entries: vec![
delivered("001-user.md"),
spoken("002-model.json"),
delivered("003-user.md"),
delivered("004-peer.md"),
spoken("005-model.json"),
],
};
assert_eq!(transcript_as_of(&tx, 1).entries.len(), 1);
let second = transcript_as_of(&tx, 4);
assert_eq!(second.entries.len(), 4);
assert_eq!(
second.entries.get(3).map(|e| e.name.clone()),
Some("004-peer.md".to_owned())
);
}
#[test]
fn a_cut_the_transcript_cannot_honour_reads_whole() {
let tx = Transcript {
entries: vec![delivered("001-user.md"), spoken("002-model.json")],
};
assert_eq!(transcript_as_of(&tx, 9).entries.len(), 2);
assert_eq!(transcript_as_of(&Transcript::default(), 3).entries.len(), 0);
}
#[test]
fn the_cut_keeps_the_entries_bytes_unaltered() {
let tx = Transcript {
entries: vec![delivered("001-user.md"), spoken("002-model.json")],
};
let cut = transcript_as_of(&tx, 1);
assert_eq!(
cut.entries.first().map(|e| e.raw.clone()),
Some(b"hello".to_vec())
);
}