use std::collections::HashMap;
use std::sync::Arc;
use adk_runner::MutableSession;
use adk_session::{Event, Events, Session, State};
use proptest::prelude::*;
struct MockEvents {
events: Vec<Event>,
}
impl Events for MockEvents {
fn all(&self) -> Vec<Event> {
self.events.clone()
}
fn len(&self) -> usize {
self.events.len()
}
fn at(&self, index: usize) -> Option<&Event> {
self.events.get(index)
}
}
struct MockState {
data: HashMap<String, serde_json::Value>,
}
impl adk_session::ReadonlyState for MockState {
fn get(&self, key: &str) -> Option<serde_json::Value> {
self.data.get(key).cloned()
}
fn all(&self) -> HashMap<String, serde_json::Value> {
self.data.clone()
}
}
impl State for MockState {
fn get(&self, key: &str) -> Option<serde_json::Value> {
self.data.get(key).cloned()
}
fn set(&mut self, key: String, value: serde_json::Value) {
self.data.insert(key, value);
}
fn all(&self) -> HashMap<String, serde_json::Value> {
self.data.clone()
}
}
struct MockSession {
events: MockEvents,
state: MockState,
}
impl Session for MockSession {
fn id(&self) -> &str {
"session-1"
}
fn app_name(&self) -> &str {
"test-app"
}
fn user_id(&self) -> &str {
"user-1"
}
fn state(&self) -> &dyn State {
&self.state
}
fn events(&self) -> &dyn Events {
&self.events
}
fn last_update_time(&self) -> chrono::DateTime<chrono::Utc> {
chrono::Utc::now()
}
}
fn make_event(author: &str) -> Event {
let mut e = Event::new("inv-test");
e.author = author.to_string();
e
}
fn make_session(event_count: usize, state_count: usize) -> Arc<dyn Session> {
let events: Vec<Event> = (0..event_count).map(|i| make_event(&format!("agent-{i}"))).collect();
let mut data = HashMap::new();
for i in 0..state_count {
data.insert(format!("key-{i}"), serde_json::json!(i));
}
Arc::new(MockSession { events: MockEvents { events }, state: MockState { data } })
}
proptest! {
#![proptest_config(ProptestConfig::with_cases(100))]
#[test]
fn prop_events_len_exists_and_returns_correct_count(
event_count in 1usize..50,
state_count in 0usize..20,
) {
let session = make_session(event_count, state_count);
let mutable = MutableSession::new(session);
let len = mutable.events_len();
prop_assert_eq!(len, event_count, "events_len() returned wrong count");
}
}
#[test]
fn events_len_zero_for_empty_session() {
let session = make_session(0, 0);
let mutable = MutableSession::new(session);
assert_eq!(mutable.events_len(), 0);
}
#[test]
fn events_len_tracks_appended_events() {
let session = make_session(3, 0);
let mutable = MutableSession::new(session);
assert_eq!(mutable.events_len(), 3);
mutable.append_event(make_event("new-agent"));
assert_eq!(mutable.events_len(), 4);
}