use super::{LoadRequest, PENDING, protected_request};
use crate::frx_load::LoadedRules;
use std::path::PathBuf;
fn request(name: &str) -> LoadRequest {
return LoadRequest { path: PathBuf::from(name), builtin: false, explicit: true };
}
fn inner() -> anyhow::Result<LoadedRules> {
let current: LoadRequest = PENDING.take().expect("inner request");
assert_eq!(current.path, PathBuf::from("inner"));
return Ok(crate::frx_load::test_rules("NESTED_FIXTURE_LONG\n"));
}
fn outer() -> anyhow::Result<LoadedRules> {
let current: LoadRequest = PENDING.take().expect("outer request");
assert_eq!(current.path, PathBuf::from("outer"));
return protected_request(request("inner"), inner);
}
fn panic_after_construction() -> anyhow::Result<LoadedRules> {
let _current: LoadRequest = PENDING.take().expect("partial request");
let _partial: LoadedRules = crate::frx_load::test_rules("PARTIAL_FIXTURE_LONG\n");
panic!("SYNTHETIC_PARTIAL_LOAD_PAYLOAD");
}
#[test]
fn nested_loads_consume_their_own_requests() {
assert!(protected_request(request("outer"), outer).is_ok());
assert!(PENDING.take().is_none());
}
#[test]
fn constructed_rules_are_discarded_after_a_panic() {
let error = match protected_request(request("partial"), panic_after_construction) {
Ok(_) => panic!("partial rules must not be accepted"),
Err(failure) => failure,
};
assert_eq!(error.to_string(), "Forbidden-strings rule loading panicked; no rule set was accepted.");
assert!(protected_request(request("outer"), outer).is_ok());
assert!(PENDING.take().is_none());
}
#[test]
fn occupied_slot_restores_original_arguments() {
PENDING.set(Some(LoadRequest { path: PathBuf::from("original"), builtin: true, explicit: false }));
assert!(protected_request(request("replacement"), inner).is_err());
let restored: LoadRequest = PENDING.take().expect("restored request");
assert_eq!(restored.path, PathBuf::from("original"));
assert!(restored.builtin);
assert!(!restored.explicit);
}