//! One place that decides where the disc corpora are — issue #16, remedy (3). //! //! # What this replaces //! //! Seventeen files under `tests/` each defined their own `disc_root()`, and they //! had **already drifted into five variants**. Four were the same thing written //! four ways (differing only in return type and style). The fifth — //! `movie_manifest_disc`, `movie_subtitle_disc`, `slb_disc` — did something //! materially different: it honoured `SYLPHEED_DISC` **and nothing else**. //! //! So one function name meant two different things in one directory, which is //! the same "one name, several meanings" defect #16 identifies in //! `SYLPHEED_DISC` itself and in `#[ignore]`. //! //! # Why the env var, and no fallback //! //! The fourteen copies with a fallback hardcoded one machine's absolute layout: //! //! ```text //! /home/fabi/RE - Project Sylpheed/Project Sylpheed - Arc of Deception (USA, Europe) (En,Ja) //! ``` //! //! That made `unset SYLPHEED_DISC` a no-op there: whether the disc suites ran //! was a property of *the machine's directory layout*, invisible in the command //! and in the output. The env var looked like a control and was not one. //! //! This module adopts the behaviour three of those files already had, rather //! than inventing a new one: **the environment decides, always.** Point //! `SYLPHEED_DISC` at the extracted disc and the suites run; leave it unset and //! they skip. Same command, same answer, on every machine. //! //! `just test-disc` reads `.env` (already gitignored as a local dev override) //! so no absolute path has to live in the source tree again. //! //! # This does not fix the tally //! //! A skipped suite still counts as `passed` — `#[ignore]` is static and cannot //! move at runtime. That is why `tests/corpus_report.rs` exists: it prints which //! corpora resolved, and it is the thing to read. This module only makes the //! *control* honest, so that report can now say `PRESENT via $SYLPHEED_DISC` //! and mean it. // `tests/common/mod.rs` is compiled into EVERY integration-test binary, and each // one uses only the resolver (and maybe the macro) it needs. Without these, every // binary warns about the parts it did not use. #![allow(dead_code, unused_macros, unused_imports)] use std::path::PathBuf; /// The extracted disc root — the directory containing `dat/`. pub fn disc_root() -> Option { let p = PathBuf::from(std::env::var("SYLPHEED_DISC").ok()?); p.join("dat").is_dir().then_some(p) } /// The extracted `resource3d` directory (`Stage_SNN.xpr` models). pub fn res3d_dir() -> Option { let p = PathBuf::from(std::env::var("SYLPHEED_RES3D").ok()?); p.is_dir().then_some(p) } /// The retail ISO image itself, not a directory. pub fn iso_path() -> Option { let p = PathBuf::from(std::env::var("SYLPHEED_ISO").ok()?); p.is_file().then_some(p) } /// Bind the disc root or return from the test. /// /// The early return keeps the test *passing*, which is why the tally cannot /// distinguish a skip from a real run — see `corpus_report.rs`. macro_rules! skip_without_disc { ($root:ident) => { let Some($root) = crate::common::disc_root() else { eprintln!("SKIP: set SYLPHEED_DISC to the extracted disc root"); return; }; }; } pub(crate) use skip_without_disc;