use super::{LoadRequest, PENDING, protected_request};
use crate::frx_load::LoadedRules;
use crate::rules_list::RulesEntry;
use std::path::PathBuf;
fn request(name: &str) -> LoadRequest {
return LoadRequest {
entries: vec![RulesEntry { path: PathBuf::from(name), optional: false }],
builtin: false,
implicit: false,
};
}
fn inner() -> anyhow::Result<LoadedRules> {
let current: LoadRequest = PENDING.take().expect("inner request");
assert_eq!(current.entries[0].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.entries[0].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 {
entries: vec![RulesEntry { path: PathBuf::from("original"), optional: true }],
builtin: true,
implicit: true,
}));
assert!(protected_request(request("replacement"), inner).is_err());
let restored: LoadRequest = PENDING.take().expect("restored request");
assert_eq!(restored.entries[0].path, PathBuf::from("original"));
assert!(restored.entries[0].optional);
assert!(restored.builtin);
assert!(restored.implicit);
}