use monty::MontyRun;
use monty_types::{CompileOptions, MontyObject};
fn run_str(code: &str) -> String {
let ex = MontyRun::new(code.to_owned(), "test.py", vec![], CompileOptions::default()).unwrap();
let obj: MontyObject = ex.run_no_limits(vec![]).unwrap();
(&obj).try_into().unwrap()
}
fn run_err(code: &str) -> String {
let ex = MontyRun::new(code.to_owned(), "test.py", vec![], CompileOptions::default()).unwrap();
ex.run_no_limits(vec![]).unwrap_err().to_string()
}
#[test]
fn unknown_directive_passes_through_verbatim() {
assert_eq!(
run_str("from datetime import date\ndate(2024, 6, 15).strftime('%Q')"),
"%Q"
);
assert_eq!(
run_str("from datetime import date\ndate(2024, 6, 15).strftime('%Y-%Q-%d')"),
"2024-%Q-15"
);
assert_eq!(
run_str("from datetime import date\ndate(2024, 6, 15).strftime('%')"),
"%"
);
}
#[test]
fn fstring_unknown_directive_passes_through_verbatim() {
assert_eq!(
run_str("from datetime import datetime\nf'{datetime(2024, 6, 15):{\"%Q\"}}'"),
"%Q"
);
}
#[test]
fn unrenderable_directive_raises_not_panics() {
let msg = run_err("from datetime import date\ndate(2024, 6, 15).strftime('%z')");
assert!(
msg.contains("ValueError") && msg.contains("Invalid format string"),
"expected ValueError: Invalid format string, got: {msg}"
);
}