use crate::config::repair::repair_toml;
fn parses(s: &str) -> bool {
toml::from_str::<toml::Value>(s).is_ok()
}
#[test]
fn already_valid_config_is_left_alone() {
let ok = r#"
[agent]
approval_policy = "auto-always"
models = ["a", "b", "c"]
"#;
assert!(repair_toml(ok).is_none(), "valid config needs no repair");
}
#[test]
fn unterminated_array_before_header_is_closed() {
let broken = r#"
[providers.custom.a]
models = ["x", "y", "z"
[providers.custom.b]
default_model = "m"
"#;
assert!(
!parses(broken),
"precondition: broken config must not parse"
);
let (fixed, fixes) = repair_toml(broken).expect("should repair an unterminated array");
assert!(parses(&fixed), "repaired config must parse");
assert!(!fixes.is_empty());
let v: toml::Value = toml::from_str(&fixed).unwrap();
assert!(v["providers"]["custom"]["b"].get("default_model").is_some());
}
#[test]
fn unterminated_array_at_eof_is_closed() {
let broken = r#"
[agent]
approval_policy = "auto-always"
models = ["x", "y"
"#;
assert!(!parses(broken));
let (fixed, _) = repair_toml(broken).expect("should close array at EOF");
assert!(parses(&fixed));
let v: toml::Value = toml::from_str(&fixed).unwrap();
assert_eq!(v["agent"]["approval_policy"].as_str(), Some("auto-always"));
}
#[test]
fn unterminated_inline_table_is_not_repaired() {
let broken = r#"
[server]
opts = { retries = 3, timeout = 30
[other]
x = 1
"#;
assert!(!parses(broken));
assert!(
repair_toml(broken).is_none(),
"an unterminated inline table must not be auto-repaired"
);
}
#[test]
fn valid_multiline_and_nested_arrays_are_not_touched() {
let ok = r#"
[x]
list = [
"a",
"b",
]
matrix = [
[1, 2],
[3, 4],
]
servers = [
{ name = "a" },
{ name = "b" },
]
"#;
assert!(parses(ok));
assert!(repair_toml(ok).is_none());
}
#[test]
fn unfixable_syntax_error_returns_none() {
let broken = r#"
[agent]
approval_policy = "auto-always" / oops
"#;
assert!(!parses(broken));
assert!(
repair_toml(broken).is_none(),
"must not fabricate a fix for a non-delimiter error"
);
}
#[test]
fn brackets_inside_strings_are_not_miscounted() {
let ok = r#"
[a]
note = "this [is] fine"
url = "http://example.com/x"
"#;
assert!(parses(ok));
assert!(repair_toml(ok).is_none());
}