The host gate accepted a WATCOM environment override and skipped when nothing was found. Both are wrong for what it is: a system-wide Open Watcom is a different version reporting different diagnostics, and a gate that skips is a gate that is not running, which is the exact shape of the problem this file was added to close. It now uses .dosboxx/watcom only and fails with the setup command when that is absent, matching how dosboxx.py already behaves. Nothing else in the project reaches for a system install: the DOS session sets WATCOM=W: before calling BUILD.BAT, so the C:\DEVEL\WATCOMC fallback inside it is unreachable. fec/test-dos.bat was tracked but dead -- the runner generates RUN.BAT and only copies build-dos.bat -- so it goes, along with the comment claiming it drives the build and the three fixture READMEs that still pointed at it. The registry decides what runs now. (.qemu/ is untracked local debris from the same era and is left alone.)
2.0 KiB
M8 fixtures
M8 is the first multi-unit milestone, so cases live in subdirectories. Each case is compiled separately with that directory on the import path.
Pass cases:
basic: public function across units.pubfld: public type and public field across units.dottedandalias: canonical dotted unit paths, last-segment binding, and explicit import aliases.dotpriv: a dotted unit prefix does not grant access to another unit's private declarations.errsame: two units use the same anonymouserror.Name; the driver must assign one deterministiccore.Errorcode.errdet: the same anonymous error-name set appears in a different source/import order; generatedfe_errors.hmust be byte-identical toerrsamemodulo the intentionally different unit graph.
Fail cases:
privfn: private declaration access.privfld: private field access.missing: unresolved import.cycle: cyclic imports.unitbad: filename/unit-name mismatch.badupperandbadlong: DOS-safe lowercase, eight-character unit-segment limit.bindconf: two imports with the same last-segment binding require an alias.pubpriv: a public signature cannot expose a private nominal type.errnom: nominal error cannot flow intocore.Errorviatry.
They are not registered in src/ferrolang_vm/registry.py yet. M8 should add procedural checks for .fei creation/hash invalidation and deterministic fe_errors.h using these fixtures.
The M8 DOS gate must additionally construct two separate -I roots containing the same canonical unit and require an ambiguity error; repeat the case with two paths to the same canonical file and require deduplication. It must also verify that std.* resolves only from the built-in std root, ordinary user units never do, and that changing a private non-generic implementation preserves the dependent interface-cache hit. Those checks need temporary roots/cache inspection and deliberately remain procedural rather than encoding host paths in fixtures.