use clawgarden_agent::loop_guard::LoopGuard;
#[test]
fn test_loop_guard_allows_first_messages() {
let mut guard = LoopGuard::new("test_agent".to_string());
let correlation = "corr1";
let content = "Hello world";
assert!(!guard.should_block(correlation, content));
guard.record(correlation, content);
assert!(!guard.should_block(correlation, content));
}
#[test]
fn test_loop_guard_blocks_after_threshold() {
let mut guard = LoopGuard::new("test_agent".to_string());
let correlation = "corr1";
let content = "Same message";
guard.record(correlation, content);
guard.record(correlation, content);
assert!(!guard.should_block(correlation, content));
guard.record(correlation, content);
assert!(guard.should_block(correlation, content));
}
#[test]
fn test_loop_guard_different_correlations_independent() {
let mut guard = LoopGuard::new("test_agent".to_string());
let content = "Same content";
guard.record("corr1", content);
guard.record("corr1", content);
guard.record("corr1", content);
assert!(guard.should_block("corr1", content));
assert!(!guard.should_block("corr2", content));
}
#[test]
fn test_loop_guard_different_agents_independent() {
let mut guard1 = LoopGuard::new("agent1".to_string());
let guard2 = LoopGuard::new("agent2".to_string());
let correlation = "corr1";
let content = "Same content";
guard1.record(correlation, content);
guard1.record(correlation, content);
guard1.record(correlation, content);
assert!(guard1.should_block(correlation, content));
assert!(!guard2.should_block(correlation, content));
}
#[test]
fn test_loop_guard_different_content_not_blocked() {
let mut guard = LoopGuard::new("test_agent".to_string());
let correlation = "corr1";
guard.record(correlation, "Message 1");
guard.record(correlation, "Message 2");
guard.record(correlation, "Message 3");
assert!(!guard.should_block(correlation, "Message 1"));
assert!(!guard.should_block(correlation, "Message 2"));
assert!(!guard.should_block(correlation, "Message 3"));
}
#[test]
fn test_loop_guard_get_block_notice() {
let mut guard = LoopGuard::new("test_agent".to_string());
let correlation = "corr1";
let content = "Repeated content";
assert!(guard.get_block_notice(correlation, content).is_none());
guard.record(correlation, content);
guard.record(correlation, content);
guard.record(correlation, content);
let notice = guard.get_block_notice(correlation, content);
assert!(notice.is_some());
assert!(notice.unwrap().contains("corr1"));
}
#[test]
fn test_hash_content_deterministic() {
let h1 = LoopGuard::hash_content("hello world");
let h2 = LoopGuard::hash_content("hello world");
assert_eq!(h1, h2);
}
#[test]
fn test_hash_content_different_inputs() {
let h1 = LoopGuard::hash_content("hello");
let h2 = LoopGuard::hash_content("world");
assert_ne!(h1, h2);
}