use super::*;
use chrono::TimeZone;
fn fixed_ts() -> DateTime<Utc> {
Utc.with_ymd_and_hms(2026, 1, 2, 3, 4, 5)
.single()
.expect("valid ts")
}
#[test]
fn tool_trace_serde_roundtrip() {
let t = ToolTrace::new("session_new", "spawned s-123 for goal g-7");
let json = serde_json::to_string(&t).expect("serialise trace");
let back: ToolTrace = serde_json::from_str(&json).expect("deserialise trace");
assert_eq!(back, t);
assert_eq!(
back.char_len(),
"session_new".len() + "spawned s-123 for goal g-7".len()
);
}
#[test]
fn round_new_sets_fields() {
let ts = fixed_ts();
let r = Round::new("hi", "hello", ts, vec![ToolTrace::new("t", "s")]);
assert_eq!(r.user, "hi");
assert_eq!(r.assistant, "hello");
assert_eq!(r.ts, ts);
assert_eq!(r.tool_calls.len(), 1);
}
#[test]
fn round_char_len_sums_all_parts() {
let r = Round::new(
"user-text",
"assistant-text",
fixed_ts(),
vec![ToolTrace::new("ab", "cd"), ToolTrace::new("ef", "gh")],
);
let expected = "user-text".len() + "assistant-text".len() + 2 + 2 + 2 + 2;
assert_eq!(r.char_len(), expected);
}
#[test]
fn round_serde_roundtrip() {
let r = Round::new("u", "a", fixed_ts(), vec![ToolTrace::new("n", "s")]);
let json = serde_json::to_string(&r).expect("serialise round");
let back: Round = serde_json::from_str(&json).expect("deserialise round");
assert_eq!(back, r);
}
#[test]
fn conversation_default_is_empty() {
let c = SmConversation::new();
assert!(c.compressed_context.is_empty());
assert_eq!(c.window_len(), 0);
assert_eq!(c.total_rounds, 0);
assert_eq!(c.token_estimate, 0);
}
#[test]
fn conversation_serde_roundtrip() {
let mut c = SmConversation::new();
c.compressed_context = "earlier summary".to_string();
c.recent_rounds
.push_back(Round::new("u", "a", fixed_ts(), Vec::new()));
c.total_rounds = 42;
c.token_estimate = 1234;
let json = serde_json::to_string(&c).expect("serialise conversation");
let back: SmConversation = serde_json::from_str(&json).expect("deserialise conversation");
assert_eq!(back, c);
}