Compare commits

...

1 Commits

Author SHA1 Message Date
sim
cc9392bde4 test: one disc resolver, no machine-specific defaults, all three corpora in the container
Finishes #16 in the three places its earlier remedies missed.

`tests/`: the last four local `disc_root()` copies now use `tests/common`, and
with them goes the one real hardcoded fallback — `ui_keyframe_record_disc.rs`
fell back to an absolute path on one machine, which made `unset SYLPHEED_DISC`
a no-op there. Control: with the corpus absent that suite now finishes in 0.00s
instead of 57.55s, so it skips rather than finding a disc of its own.

`examples/`: seventeen examples defaulted to `/disc`, the mount point inside the
CI container. Redundant there — `docker/ci/run` sets `SYLPHEED_DISC=/disc` — and
wrong everywhere else, where a missing corpus turned into a file-not-found
against a path that has never existed on the host. They now name the variable to
set, like the other hundred examples already did.

`docker/ci/run`: mount `$SYLPHEED_RES3D` and `$SYLPHEED_ISO` alongside the disc.
Only the disc was mounted, so an in-container run sat out the res3d and iso
suites while looking like a full one — the defect this issue is about, in the
runner itself.

Measured in the container on this desktop with all three corpora present:
45 suites / 377 passed / 0 failed / 14 ignored, and `sylpheed-corpus-report.txt`
now reports PRESENT for all three rather than for the disc alone.

Refs #16.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 22:18:59 +02:00
23 changed files with 56 additions and 52 deletions

View File

@@ -7,7 +7,8 @@ use std::process::Command;
use sylpheed_formats::media; use sylpheed_formats::media;
fn main() { fn main() {
let disc = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let disc =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let src = media::DirectorySource::new(&disc); let src = media::DirectorySource::new(&disc);
for bank in ["BGM_103.slb", "BGM_102.slb", "BGM_001.slb"] { for bank in ["BGM_103.slb", "BGM_102.slb", "BGM_001.slb"] {
match media::sound_bank_riffs(&src, bank) { match media::sound_bank_riffs(&src, bank) {

View File

@@ -18,7 +18,8 @@
use sylpheed_formats::media; use sylpheed_formats::media;
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let src = media::DirectorySource::new(&root); let src = media::DirectorySource::new(&root);
const WANT: [usize; 2] = [3_876_864, 3_930_112]; const WANT: [usize; 2] = [3_876_864, 3_930_112];
let (mut found, mut matches) = (0usize, Vec::new()); let (mut found, mut matches) = (0usize, Vec::new());

View File

@@ -20,7 +20,8 @@ use std::collections::BTreeSet;
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let ar = pak::PakArchive::open(format!("{root}/dat/GP_DIALOG.pak")).expect("GP_DIALOG.pak"); let ar = pak::PakArchive::open(format!("{root}/dat/GP_DIALOG.pak")).expect("GP_DIALOG.pak");
let sets: Vec<Option<BTreeSet<String>>> = ar let sets: Vec<Option<BTreeSet<String>>> = ar
.entries() .entries()

View File

@@ -17,7 +17,8 @@
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
// 🔴 WIDENED 2026-08-31 to every pak, to check the Decoder's rival search // 🔴 WIDENED 2026-08-31 to every pak, to check the Decoder's rival search
// independently. They report zero four-button builds within 6 px of // independently. They report zero four-button builds within 6 px of
// 259/329/399/469 anywhere on the disc, which turns "another dialog with // 259/329/399/469 anywhere on the disc, which turns "another dialog with

View File

@@ -8,7 +8,8 @@
use sylpheed_formats::{pak::PakArchive, ui_layout}; use sylpheed_formats::{pak::PakArchive, ui_layout};
fn main() { fn main() {
let disc = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let disc =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let ar = PakArchive::open(format!("{disc}/dat/GP_TITLE.pak")).expect("open"); let ar = PakArchive::open(format!("{disc}/dat/GP_TITLE.pak")).expect("open");
let e = &ar.entries()[4]; // entry 4 = the English title let e = &ar.entries()[4]; // entry 4 = the English title
let bundle = ar.read(e).expect("read"); let bundle = ar.read(e).expect("read");

View File

@@ -48,7 +48,8 @@ fn main() {
.unwrap_or(8); .unwrap_or(8);
unsafe { OFFSET = off }; unsafe { OFFSET = off };
println!(" reading the loop length at header +0x{off:02x}"); println!(" reading the loop length at header +0x{off:02x}");
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -11,7 +11,8 @@
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -11,7 +11,8 @@
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let ar = pak::PakArchive::open(format!("{root}/dat/GP_TITLE.pak")).expect("GP_TITLE.pak"); let ar = pak::PakArchive::open(format!("{root}/dat/GP_TITLE.pak")).expect("GP_TITLE.pak");
let (mut total, mut hits, mut multipose) = (0usize, 0usize, 0usize); let (mut total, mut hits, mut multipose) = (0usize, 0usize, 0usize);
for (i, e) in ar.entries().iter().enumerate() { for (i, e) in ar.entries().iter().enumerate() {

View File

@@ -7,7 +7,8 @@ use std::process::Command;
use sylpheed_formats::{media, slb::VoiceLang}; use sylpheed_formats::{media, slb::VoiceLang};
fn main() { fn main() {
let disc = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let disc =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let src = media::DirectorySource::new(&disc); let src = media::DirectorySource::new(&disc);
for movie in ["ADV", "S00A", "RT01A"] { for movie in ["ADV", "S00A", "RT01A"] {
let Some((s, e)) = media::resolve_movie_voice_region(&src, movie, VoiceLang::English) let Some((s, e)) = media::resolve_movie_voice_region(&src, movie, VoiceLang::English)

View File

@@ -1,6 +1,7 @@
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let ar = pak::PakArchive::open(format!("{root}/dat/GP_READY_ROOM.pak")).unwrap(); let ar = pak::PakArchive::open(format!("{root}/dat/GP_READY_ROOM.pak")).unwrap();
for (i, e) in ar.entries().iter().enumerate() { for (i, e) in ar.entries().iter().enumerate() {
let Ok(by) = ar.read(e) else { continue }; let Ok(by) = ar.read(e) else { continue };

View File

@@ -16,8 +16,7 @@
//! Usage: //! Usage:
//! SYLPHEED_ISO=... cargo run --release --example correlate_capture -- \ //! SYLPHEED_ISO=... cargo run --release --example correlate_capture -- \
//! <capture.log> <Stage_SNN> <ship_id> [ref_part_substr] [--emit] //! <capture.log> <Stage_SNN> <ship_id> [ref_part_substr] [--emit]
//! e.g. SYLPHEED_ISO="/home/fabi/RE - Project Sylpheed/Project Sylpheed - Arc of //! e.g. SYLPHEED_ISO="/path/to/Project Sylpheed - Arc of Deception (USA, Europe) (En,Ja).iso" \
//! Deception (USA, Europe) (En,Ja).iso" \
//! cargo run --release --example correlate_capture -- \ //! cargo run --release --example correlate_capture -- \
//! xenia_ship_capture.log Stage_S01 e106 bdy_04 --emit //! xenia_ship_capture.log Stage_S01 e106 bdy_04 --emit

View File

@@ -11,7 +11,8 @@
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -15,7 +15,8 @@ use std::collections::BTreeMap;
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -6,7 +6,8 @@
use std::collections::BTreeMap; use std::collections::BTreeMap;
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -14,7 +14,8 @@
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -33,7 +33,8 @@ fn opaque_span(el: &ui_layout::Element, thr: u32, tmax: u32) -> Vec<(f64, f64)>
} }
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -58,7 +58,8 @@ fn forced(b: &ui_layout::UiBuild, el: &ui_layout::Element, tmax: u32, hold: bool
} }
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -20,7 +20,8 @@ use std::collections::BTreeMap;
use sylpheed_formats::{pak, ratc, ui_layout}; use sylpheed_formats::{pak, ratc, ui_layout};
fn main() { fn main() {
let root = std::env::var("SYLPHEED_DISC").unwrap_or_else(|_| "/disc".into()); let root =
std::env::var("SYLPHEED_DISC").expect("set SYLPHEED_DISC to the extracted disc root");
let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat")) let mut paks: Vec<_> = std::fs::read_dir(format!("{root}/dat"))
.expect("dat/") .expect("dat/")
.flatten() .flatten()

View File

@@ -16,10 +16,8 @@ use std::path::PathBuf;
use sylpheed_formats::{pak::PakArchive, ratc, ui_layout}; use sylpheed_formats::{pak::PakArchive, ratc, ui_layout};
fn disc_root() -> Option<PathBuf> { mod common;
let p = PathBuf::from(std::env::var("SYLPHEED_DISC").ok()?); use common::disc_root;
p.join("dat").is_dir().then_some(p)
}
fn build(ar: &PakArchive, i: usize) -> (Vec<u8>, ui_layout::UiBuild) { fn build(ar: &PakArchive, i: usize) -> (Vec<u8>, ui_layout::UiBuild) {
let by = ar.read(&ar.entries()[i]).expect("entry"); let by = ar.read(&ar.entries()[i]).expect("entry");

View File

@@ -26,21 +26,8 @@ use std::path::{Path, PathBuf};
use sylpheed_formats::{pak::PakArchive, ratc, ui_layout}; use sylpheed_formats::{pak::PakArchive, ratc, ui_layout};
fn disc_root() -> Option<PathBuf> { mod common;
if let Ok(p) = std::env::var("SYLPHEED_DISC") { use common::disc_root;
let p = PathBuf::from(p);
if p.join("dat").is_dir() {
return Some(p);
}
}
let default = Path::new(
"/home/fabi/RE - Project Sylpheed/Project Sylpheed - Arc of Deception (USA, Europe) (En,Ja)",
);
if default.join("dat").is_dir() {
return Some(default.to_path_buf());
}
None
}
fn for_each_build(root: &Path, mut f: impl FnMut(&str, &[u8])) { fn for_each_build(root: &Path, mut f: impl FnMut(&str, &[u8])) {
let mut paks: Vec<PathBuf> = std::fs::read_dir(root.join("dat")) let mut paks: Vec<PathBuf> = std::fs::read_dir(root.join("dat"))

View File

@@ -22,10 +22,8 @@ use std::path::PathBuf;
use sylpheed_formats::{pak::PakArchive, ratc, ui_layout}; use sylpheed_formats::{pak::PakArchive, ratc, ui_layout};
fn disc_root() -> Option<PathBuf> { mod common;
let p = PathBuf::from(std::env::var("SYLPHEED_DISC").ok()?); use common::disc_root;
p.join("dat").is_dir().then_some(p)
}
/// Read a nested record's declared length and its largest keyframe time. /// Read a nested record's declared length and its largest keyframe time.
fn record_len_and_maxt(bundle: &[u8], off: usize, size: usize) -> Option<(i64, i64)> { fn record_len_and_maxt(bundle: &[u8], off: usize, size: usize) -> Option<(i64, i64)> {

View File

@@ -25,15 +25,8 @@ use std::path::PathBuf;
use sylpheed_formats::{pak::PakArchive, ratc, ui_layout}; use sylpheed_formats::{pak::PakArchive, ratc, ui_layout};
fn disc_root() -> Option<PathBuf> { mod common;
if let Ok(p) = std::env::var("SYLPHEED_DISC") { use common::disc_root;
let p = PathBuf::from(p);
if p.join("dat").is_dir() {
return Some(p);
}
}
None
}
/// The case that found the bug, asserted end to end. /// The case that found the bug, asserted end to end.
#[test] #[test]

View File

@@ -36,8 +36,20 @@ args=(
-w /work -w /work
) )
# The disc, read-only, when a disc-backed test or the exporter needs it. # The corpora, read-only, when a disc-backed test or the exporter needs them.
#
# All three, not just the disc: a suite whose corpus is absent self-skips and
# still counts as passed, so mounting one of three made an in-container run look
# like a full one while `res3d` and `iso` suites silently sat out (#16). Each is
# mounted only when it exists, and `target/sylpheed-corpus-report.txt` says which
# ones the run actually had.
DISC="${SYLPHEED_DISC:-$REPO/../sylph_extract}" DISC="${SYLPHEED_DISC:-$REPO/../sylph_extract}"
[ -d "$DISC" ] && args+=(-v "$DISC:/disc:ro" -e SYLPHEED_DISC=/disc) [ -d "$DISC" ] && args+=(-v "$DISC:/disc:ro" -e SYLPHEED_DISC=/disc)
RES3D="${SYLPHEED_RES3D:-}"
[ -n "$RES3D" ] && [ -d "$RES3D" ] && args+=(-v "$RES3D:/res3d:ro" -e SYLPHEED_RES3D=/res3d)
ISO="${SYLPHEED_ISO:-}"
[ -n "$ISO" ] && [ -f "$ISO" ] && args+=(-v "$ISO:/disc.iso:ro" -e SYLPHEED_ISO=/disc.iso)
exec docker run "${args[@]}" "$IMAGE" "$@" exec docker run "${args[@]}" "$IMAGE" "$@"