use allama::adapter::Degradations;
use allama::adapter::chat::MISSING_FINISH_REASON;
use allama::{RequestField, Subject, UnsupportedPolicy, Warning, WarningKind};
use serde_json::{Value, json};
const FIXTURE: &str = concat!(
env!("CARGO_MANIFEST_DIR"),
"/tests/fixtures/warning_codes.json"
);
fn fixture() -> Value {
let text = std::fs::read_to_string(FIXTURE).expect("the fixture exists");
serde_json::from_str(&text).expect("the fixture is JSON")
}
fn kinds(fixture: &Value) -> Vec<WarningKind> {
fixture["kinds"]
.as_array()
.expect("a list of kinds")
.iter()
.map(|name| {
let kind: WarningKind = serde_json::from_value(name.clone()).unwrap();
assert_eq!(kind.as_str(), name, "{name} reads back as itself");
assert_eq!(kind.to_string(), kind.as_str());
kind
})
.collect()
}
fn derived(kind: WarningKind, subject: Subject) -> String {
let mut degradations = Degradations::new("demo", UnsupportedPolicy::Warn);
degradations.warn(Warning::new(kind, subject, "x"));
let warning = °radations.warnings()[0];
warning.code.as_deref().expect("a derived code").to_owned()
}
fn current(kinds: &[WarningKind]) -> Value {
let fields: Vec<&str> = RequestField::ALL.iter().map(|f| f.as_str()).collect();
let mut codes = Vec::new();
for &kind in kinds {
for &field in RequestField::ALL {
let code = derived(kind, Subject::Field { field });
assert_eq!(code, format!("{kind}.{field}"));
codes.push(code);
}
assert_eq!(
derived(kind, Subject::System { index: 0 }),
format!("{kind}.system")
);
}
json!({
"kinds": kinds.iter().map(|kind| kind.as_str()).collect::<Vec<_>>(),
"fields": fields,
"derived": codes,
"constants": {
"allama::adapter::chat::MISSING_FINISH_REASON": MISSING_FINISH_REASON,
},
})
}
#[test]
fn warning_codes_are_stable() {
let fixture = fixture();
let current = current(&kinds(&fixture));
if current == fixture {
return;
}
if std::env::var("ALLAMA_UPDATE_FIXTURES").is_ok_and(|value| value.trim() == "1") {
let text = serde_json::to_string_pretty(¤t).unwrap();
std::fs::write(FIXTURE, text + "\n").expect("the fixture is writable");
return;
}
assert_eq!(
current, fixture,
"a warning code changed; if that is deliberate, rerun with \
ALLAMA_UPDATE_FIXTURES=1"
);
}
#[test]
fn content_warnings_are_not_coded_by_default() {
let mut degradations = Degradations::new("demo", UnsupportedPolicy::Warn);
degradations.warn(Warning::new(
WarningKind::Dropped,
Subject::Content {
message: 0,
block: Some(0),
},
"x",
));
assert_eq!(degradations.warnings()[0].code, None);
}