use std::collections::HashSet;
use std::path::Path;
use crate::generate::archetypes::Archetype;
use crate::generate::archetypes::TestInput;
use crate::enforce::category::Category;
use crate::generate::emit::emit::{write_test, EmittedTest};
use crate::generate::emit::naming::{sanitize, test_name};
use crate::generate::emit::provenance::{header, SourceTuple};
use crate::generate::emit::seed::SeedStream;
use crate::generate::emit::{GenError, GeneratedFile, GenerationPlan, GenerationReport, TemplateKind};
use crate::adversarial::mutations::catalog::applied::applied_for_classes;
use crate::spec::{OracleKind, SpecRow};
use crate::generate::templates::{render, TemplateContext};
use crate::spec::types::OpSpec;
use super::codegen::{expected_bytes, law_name, route_key, rust_test, spec_row_index};
use super::util::{input_bytes_for_arity, last_segment, oracle_name, property_key, template_src};
fn emit_tuple(
out_dir: &Path,
seeds: &mut SeedStream,
op: &'static OpSpec,
archetype: &'static dyn Archetype,
input: &TestInput,
route: &Route,
) -> Result<GeneratedFile, GenError> {
let route_key = route_key(route);
let seed = seeds.derive(op.id, archetype.id(), &route_key);
let name = test_name(op.id, archetype.id(), &route_key, seed);
let rendered = render(
template_src(route.template),
&context(op, archetype, input, route),
)?;
let tuple = SourceTuple {
op: op.id,
archetype: archetype.id(),
oracle: &route.oracle_name,
};
let provenance = header(&tuple, seeds.master(), op.version);
let rust = rust_test(&name, op, archetype, input, route, seed);
let path = out_dir.join(sanitize(op.id)).join(format!("{name}.rs"));
let written = write_test(
&path,
&EmittedTest {
test_name: &name,
provenance: &provenance,
rendered_template: &rendered,
rust: &rust,
op_under_test: op.id,
},
)?;
Ok(GeneratedFile {
path: written,
test_name: name,
op: op.id,
archetype: archetype.id(),
oracle: route.oracle_name.clone(),
template: route.template,
seed,
})
}