#![allow(clippy::expect_used, clippy::unwrap_used)]
#![allow(unsafe_code)]
use ferridriver_script::bytecode_cache::{collect_inputs, entry_key, load, store};
#[test]
fn disk_cache_roundtrip_invalidation_and_disable() {
let cache = tempfile::tempdir().expect("cache dir");
unsafe { std::env::set_var("FERRIDRIVER_CACHE_DIR", cache.path()) };
unsafe { std::env::remove_var("FERRIDRIVER_NO_BYTECODE_CACHE") };
let src = tempfile::tempdir().expect("src dir");
let entry = src.path().join("a.js");
let helper = src.path().join("helper.js");
std::fs::write(&entry, "import './helper.js'; const v = 1;").expect("write entry");
std::fs::write(&helper, "export const h = 1;").expect("write helper");
let key = entry_key(std::slice::from_ref(&entry));
let inputs = vec![entry.clone(), helper.clone()];
store(key, b"BYTECODE-V1", "m.js", None, Some("[{\"name\":\"x\"}]"), &inputs);
let hit = load(key).expect("entry must load");
assert_eq!(hit.bytecode, b"BYTECODE-V1");
assert_eq!(hit.aux.as_deref(), Some("[{\"name\":\"x\"}]"));
assert!(hit.source_map_json.is_none());
std::fs::write(&helper, "export const h = 2; // changed").expect("rewrite helper");
assert!(load(key).is_none(), "edited transitive input must miss");
store(key, b"BYTECODE-V2", "m.js", None, None, &inputs);
assert_eq!(load(key).expect("re-store hits").bytecode, b"BYTECODE-V2");
std::fs::remove_file(&helper).expect("rm helper");
assert!(load(key).is_none(), "missing input must miss");
unsafe { std::env::set_var("FERRIDRIVER_NO_BYTECODE_CACHE", "1") };
std::fs::write(&helper, "export const h = 1;").expect("restore helper");
store(key, b"SHOULD-NOT-PERSIST", "m.js", None, None, &inputs);
assert!(load(key).is_none(), "disabled cache must not load");
unsafe { std::env::remove_var("FERRIDRIVER_NO_BYTECODE_CACHE") };
let collected = collect_inputs(std::slice::from_ref(&entry), None, src.path());
assert!(collected.iter().any(|p| p.ends_with("a.js")), "entry must be an input");
}