use std::{fs, path::Path};
use crate::{json, tariff, test, Version};
const EXPECTATION_FILE_NAME: &str = "explanation.en-US.md";
const VERSION: Version = Version::V221;
#[test_each::file(
glob = "ocpi-tariffs/test_data/popular/*/tariff.json",
name(segments = 2)
)]
fn explain_popular_tariff(tariff_json: &str, path: &Path) {
test::setup();
let mut tariff_json = tariff_json.to_owned();
json_strip_comments::strip(&mut tariff_json)
.unwrap_or_else(|err| panic!("`{}` comments should strip:\n{err}", path.display()));
let tariff = json::parse_object(&tariff_json).unwrap();
let tariff = tariff::build(tariff, VERSION).ignore_warnings();
let explanation = tariff::explain(&tariff)
.unwrap_or_else(|_err| panic!("`{}` should be explainable", path.display()))
.ignore_warnings();
let expectation_path = path
.parent()
.expect("the tariff file should live in a directory")
.join(EXPECTATION_FILE_NAME);
if std::env::var_os("BLESS_EXPLANATIONS").is_some() {
fs::write(&expectation_path, format!("{explanation}\n")).unwrap_or_else(|err| {
panic!(
"`{}` should be writable:\n{err}",
expectation_path.display()
)
});
return;
}
let expected = fs::read_to_string(&expectation_path).unwrap_or_else(|err| {
panic!(
"Unable to read `{}`:\n{err}\nRun with `BLESS_EXPLANATIONS=1` to generate it.",
expectation_path.display()
)
});
assert_eq!(
explanation.trim_end(),
expected.trim_end(),
"explanation for `{}` does not match `{EXPECTATION_FILE_NAME}`",
path.display()
);
}