Cross-cutting tests

Cross-cutting reproducibility tests

Verify the build-time determinism quality goal (Build-time determinism (sam... (QG_0010)).

Test Case: Repeated codegen runs produce byte-identical output TEST_0470
status: open
verifies: QG_0010, REQ_0543

Run Builder::build() twice on the same input set in freshly-prepared OUT_DIR directories. Compare the two devices.rs files with sha256. Assert identical.

Test Case: Input-file ordering does not affect output TEST_0471
status: open

Same input set, glob returns files in two different orders (force the order via explicit Builder::file(path) calls). The two devices.rs outputs are byte-identical (catches HashMap-iteration-order nondeterminism in dedup or collision-handling).

Test Case: Layering integrity check (Cargo.toml audit) TEST_0472
status: open

CI shell check that walks each toolchain crate’s Cargo.toml and asserts the allowed-dependency matrix:

  • ethercat-esi: no ethercrab, no proc-macro2, no quote, no codegen crate.

  • ethercat-esi-codegen: no ethercrab.

  • ethercat-esi-build: no ethercrab (transitively via ethercat-esi-codegen-only path).

  • ethercat-esi-verify: no ethercrab.

Implemented with cargo metadata + jq; runs in the workspace CI job.

Cross-cutting traceability

Used filter: types(test)

ID

Title

Status

Verifies

TEST_0400

parse() accepts a representative Beckhoff EL3001 ESI

open

REQ_0500; REQ_0504

TEST_0401

Parser compiles under no_std + alloc

rejected

REQ_0501

TEST_0402

Parser is independent of ethercrab

open

REQ_0503

TEST_0403

Vendor-specific elements survive as RawXml

open

REQ_0505

TEST_0404

Parse errors carry line and column

open

REQ_0506

TEST_0410

Name sanitisation handles ESI naming edge cases

open

REQ_0511

TEST_0411

Revision collision produces distinct idents

open

REQ_0512

TEST_0412

PDO entry dedup collapses structurally identical layouts

open

REQ_0513

TEST_0413

TokenStream emission, not string formatting

open

REQ_0514

TEST_0420

EL3001 backend output snapshot

open

REQ_0521; REQ_0522

TEST_0421

Generated registry covers every emitted device

open

REQ_0525

TEST_0422

Generated module compiles under no_std + alloc

open

REQ_0526

TEST_0423

Backend is the sole ethercrab consumer in the toolchain

open

REQ_0520

TEST_0424

Object-dictionary emission gated by feature flag

open

REQ_0533

TEST_0430

EsiDevice trait shape compiles for a hand-written device

open

REQ_0530

TEST_0431

EsiConfigurable async trait shape compiles

open

REQ_0531

TEST_0432

ethercat-esi-rt is the trait home, not taktora-internal

open

REQ_0532

TEST_0440

Builder writes a parseable Rust file to OUT_DIR

open

REQ_0540; REQ_0541

TEST_0441

cargo rerun-if-changed emitted per ESI input

open

REQ_0542

TEST_0442

Output passes prettyplease formatting

open

REQ_0543

TEST_0450

cargo esi expand emits a single device's code

open

REQ_0550

TEST_0451

cargo esi list enumerates devices

open

REQ_0551

TEST_0452

CLI output matches build helper output byte-for-byte

open

REQ_0552

TEST_0460

Verifier passes on matching ESI + SII pair

open

REQ_0560

TEST_0461

Verifier reports the differing field

open

REQ_0561

TEST_0462

Verifier reuses ethercat-esi parser

open

REQ_0562

TEST_0463

Verifier exit codes follow the documented matrix

open

REQ_0563

TEST_0470

Repeated codegen runs produce byte-identical output

open

QG_0010; REQ_0543

TEST_0471

Input-file ordering does not affect output

open

QG_0010; REQ_0512; REQ_0513

TEST_0472

Layering integrity check (Cargo.toml audit)

open

QG_0011; REQ_0503; REQ_0520