use crate::acp::turn::{round_text_is_duplicate, stop_reason};
use crate::brain::provider::StopReason;
#[test]
fn stop_reasons_map_to_acp() {
assert_eq!(stop_reason(Some(StopReason::EndTurn)), "end_turn");
assert_eq!(stop_reason(Some(StopReason::MaxTokens)), "max_tokens");
assert_eq!(stop_reason(Some(StopReason::StopSequence)), "end_turn");
assert_eq!(stop_reason(Some(StopReason::ToolUse)), "end_turn");
assert_eq!(stop_reason(None), "end_turn");
}
const V1_STOP_REASONS: &[&str] = &[
"end_turn",
"max_tokens",
"max_turn_requests",
"refusal",
"cancelled",
];
#[test]
fn every_mapped_stop_reason_is_a_v1_variant() {
for reason in [
Some(StopReason::EndTurn),
Some(StopReason::MaxTokens),
Some(StopReason::StopSequence),
Some(StopReason::ToolUse),
None,
] {
let mapped = stop_reason(reason);
assert!(
V1_STOP_REASONS.contains(&mapped),
"`{mapped}` is not in the v1 StopReason enum; a strict client may \
reject the whole PromptResponse over one required-field value"
);
}
}
#[test]
fn stop_sequence_is_no_longer_emitted() {
assert!(!V1_STOP_REASONS.contains(&"stop_sequence"));
for reason in [
Some(StopReason::EndTurn),
Some(StopReason::MaxTokens),
Some(StopReason::StopSequence),
Some(StopReason::ToolUse),
None,
] {
let label = format!("{reason:?}");
assert_ne!(
stop_reason(reason),
"stop_sequence",
"StopReason({label}) invented a variant again"
);
}
}
#[test]
fn round_aggregate_repeating_streamed_text_is_a_duplicate() {
assert!(round_text_is_duplicate("ACP-OK", "ACP-OK"));
}
#[test]
fn whitespace_disagreement_is_still_a_duplicate() {
assert!(round_text_is_duplicate("ACP-OK", "ACP-OK\n"));
assert!(round_text_is_duplicate(" ACP-OK ", "ACP-OK"));
}
#[test]
fn unstreamed_or_differing_text_is_not_a_duplicate() {
assert!(!round_text_is_duplicate("", "ACP-OK"));
assert!(!round_text_is_duplicate("round one", "round two"));
assert!(!round_text_is_duplicate("ACP-OK", ""));
assert!(!round_text_is_duplicate("", "\n"));
}