[package]
name = "epiphany-testkit"
version = "0.0.0"
edition.workspace = true
rust-version.workspace = true
authors.workspace = true
repository.workspace = true
description = "The Epiphany conformance testkit (spec QUICKSTART, Agent F): deterministic generators for the public types, the canonical round-trip harness, the CRDT convergence and equivocation harnesses, the crash-recovery and manifest-selection gates, and the layout round-trip. Cross-cutting; drives the real epiphany-determinism/core/ops/bundle/layout-ir crates."

[dependencies]
epiphany-determinism.workspace = true
epiphany-core.workspace = true
epiphany-bundle.workspace = true
epiphany-ops.workspace = true
epiphany-textproj.workspace = true
# Agent E's layout IR has landed; the layout round-trip harness (criterion 6)
# now drives the real crate instead of an in-tree stub.
epiphany-layout-ir.workspace = true

# T2 W3 — the `[9/9]` golden conformance gate (`golden-gate` feature,
# `examples/conformance_suite.rs`): re-renders the T1a golden states headlessly
# and rasterizes them exactly as `epiphany-editor-gui`'s demo binary does, to
# compare against the baselines committed there
# (`epiphany-editor-gui/goldens/*.png`). Both crates are example-only — used
# solely by the `#[cfg(feature = "golden-gate")]` code — and `optional = true`
# so the default (no-feature) build pulls in neither; dev-dependencies cannot
# be optional, so both live here in [dependencies], gated by the
# `golden-gate` feature (below) rather than always compiled. This is precisely
# what keeps `resvg`'s raster stack out of the MSRV job's dependency closure:
# that job runs `cargo test --workspace --all-targets` at the pinned MSRV
# (`.github/workflows/ci.yml`, the `check` job), which builds every example in
# this crate with default features only. See `DECISIONS.md` (T2 W3) and
# `spec/CONTRACT_EDITOR_T2_SELECTION.md` §W3.
epiphany-render-svg = { workspace = true, optional = true }
resvg = { version = "0.45", optional = true }

# The Chapter 10 performance benches (worklist F1) run under criterion; the
# budget-gate logic itself lives in `src/budget.rs` on plain `std`, so the
# library builds without it. The editor-core + engrave pair drives the
# multi-system click-to-insert regression test (`tests/multisystem_click.rs`)
# over the real casting-off engraver — dev-only, so the library dependency
# graph is unchanged (engrave's own dev-dependency on this crate makes the
# cycle dev-only, which cargo permits).
[dev-dependencies]
criterion.workspace = true
epiphany-editor-core.workspace = true
epiphany-engrave.workspace = true

# T2 W3: gate 9's session/session-editing surface (`EditorSession`,
# `Engraver::default()`) is exactly the pair the multi-system click test and
# the reference-suite harness above already pull in as unconditional
# dev-dependencies — reused as-is, not duplicated or made optional, since a
# dev-dependency cannot be optional and these two carry no `resvg`-class
# MSRV risk of their own (see the `[dependencies]` comment above for the two
# that do).
[features]
golden-gate = ["dep:epiphany-render-svg", "dep:resvg"]

# Drives the whole suite at scale outside the unit-test timeout — the analogue
# of epiphany-determinism's `fuzz_roundtrip` and epiphany-bundle's `fuzz_crash`.
[[example]]
name = "conformance_suite"

# The Chapter 10 performance-budget benches (worklist F1; DECISIONS.md F0/F1).
# `harness = false`: each bench owns `main()`, running criterion's measurements
# first and then the budget gate — the assertion layer criterion cannot express
# — exiting nonzero on an unexpected budget miss.
[[bench]]
name = "reduction"
harness = false

# Ruling A criterion 2 (`spec/PLAN_EDITOR_APP.md`): the staged interactive-edit
# latency bench — reduce / engrave / scene-build / paint measured separately,
# gating the core's portion against `req:perf:single-system-edit-latency`. The
# last two stages need `epiphany-render-svg` + `resvg`, so they are behind
# `golden-gate` for the MSRV reason documented above; without the feature the
# bench prints an explicit skip for those columns.
[[bench]]
name = "editor_pipeline"
harness = false

[[bench]]
name = "bundle"
harness = false
