# `mix corpus.generate`
[🔗](https://github.com/riddler/predicator-ex/blob/v9.4.1/lib/mix/tasks/corpus.generate.ex#L1)

Regenerates `conformance/corpus/tier-*.json` and `conformance/manifest.json`
from the authored cases in `conformance/cases/*.json` (`px-35i.4`).

Each authored case is run through the real compiler and evaluator by
`Predicator.Conformance.Generator.generate/1`, which fills in
`instructions`, `expected_result`/`expected_error`, `tier`, and `features`.
This task is the thin I/O shell around that pure function: it reads the
authored files, writes the completed corpus (one case per line, sorted by
id, via `Predicator.Conformance.JSON.encode_lines/1`) and the manifest, and
is otherwise deliberately free of logic - anything that needs a test belongs
in `Predicator.Conformance.*`, not here.

## Usage

    mix corpus.generate          # regenerate and write conformance/corpus/ and manifest.json
    mix corpus.generate --check  # regenerate in memory, diff against the checked-in files,
                                  # write nothing, exit non-zero on drift (for CI)

A case that fails to generate - a compile error, an authored `expected` or
`tier` mismatch, an unknown opcode, and so on - prints every failing case's
id and problem (not just the first) and exits non-zero without writing
anything.

# `file_map`

```elixir
@type file_map() :: %{required(String.t()) =&gt; binary()}
```

Relative path (from the project root) mapped to the exact bytes it should contain.

# `build_files`

```elixir
@spec build_files() ::
  {:ok, file_map()} | {:error, [Predicator.Conformance.Generator.case_error()]}
```

Reads `conformance/cases/*.json`, runs `Predicator.Conformance.Generator.generate/1`,
and returns the exact file map `mix corpus.generate` would write: relative
path (from the project root) mapped to the exact bytes that file should
contain.

Public so `test/predicator/conformance/corpus_freshness_test.exs` can
regenerate in memory and byte-compare against the checked-in files without
duplicating the assembly logic (tier file naming, canonical encoding, the
`corpus_hash` computation) - a second hand-maintained copy of that logic is
exactly the kind of drift this whole bead exists to prevent.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
