use crate::brain::provider::claude_cli::{
ClaudeCliProvider, clear_learned_models, learned_alias, record_alias, strip_claude_date_suffix,
};
use std::sync::Mutex;
static CACHE_TEST_LOCK: Mutex<()> = Mutex::new(());
#[test]
fn strip_claude_date_suffix_strips_eight_digit_date() {
assert_eq!(
strip_claude_date_suffix("claude-opus-4-7-20260115"),
"claude-opus-4-7"
);
assert_eq!(strip_claude_date_suffix("opus-4-7-20260115"), "opus-4-7");
}
#[test]
fn strip_claude_date_suffix_leaves_non_date_alone() {
assert_eq!(strip_claude_date_suffix("opus-4-7"), "opus-4-7");
assert_eq!(strip_claude_date_suffix("opus"), "opus");
assert_eq!(
strip_claude_date_suffix("sonnet-4-6-beta"),
"sonnet-4-6-beta"
);
}
#[test]
fn seed_for_alias_holds_the_build_time_fallbacks() {
assert_eq!(ClaudeCliProvider::seed_for_alias("opus"), Some("opus-4-7"));
assert_eq!(
ClaudeCliProvider::seed_for_alias("sonnet"),
Some("sonnet-4-6")
);
assert_eq!(
ClaudeCliProvider::seed_for_alias("haiku"),
Some("haiku-4-5")
);
assert_eq!(ClaudeCliProvider::seed_for_alias("opus-4-9"), None);
}
#[test]
fn learned_version_overrides_the_seed() {
let _guard = CACHE_TEST_LOCK.lock().unwrap_or_else(|p| p.into_inner());
clear_learned_models();
assert_eq!(
ClaudeCliProvider::default_for_alias("opus"),
"opus-4-7",
"with an empty cache, the seed is used"
);
ClaudeCliProvider::record_observed_model("claude-opus-4-8");
assert_eq!(learned_alias("opus").as_deref(), Some("opus-4-8"));
assert_eq!(
ClaudeCliProvider::default_for_alias("opus"),
"opus-4-8",
"the learned version must win over the build-time seed"
);
assert_eq!(ClaudeCliProvider::normalize_model("opus"), "opus-4-8");
clear_learned_models();
}
#[test]
fn record_alias_is_idempotent_and_updates() {
let _guard = CACHE_TEST_LOCK.lock().unwrap_or_else(|p| p.into_inner());
clear_learned_models();
record_alias("haiku", "haiku-4-5");
assert_eq!(learned_alias("haiku").as_deref(), Some("haiku-4-5"));
record_alias("haiku", "haiku-4-5");
record_alias("haiku", "haiku-4-6");
assert_eq!(learned_alias("haiku").as_deref(), Some("haiku-4-6"));
clear_learned_models();
}
#[test]
fn normalize_model_strips_claude_prefix_and_date() {
assert_eq!(
ClaudeCliProvider::normalize_model("claude-opus-4-7-20260115"),
"opus-4-7"
);
assert_eq!(
ClaudeCliProvider::normalize_model("claude-sonnet-4-6-20251112"),
"sonnet-4-6"
);
}
#[test]
fn normalize_model_passes_through_unknown() {
assert_eq!(
ClaudeCliProvider::normalize_model("opus-4-8"),
"opus-4-8",
"a future release shorthand should flow through unchanged"
);
assert_eq!(
ClaudeCliProvider::normalize_model("custom-model-id"),
"custom-model-id"
);
}