xdoc-rs 0.1.1

Declarative XML engine for Rust
Documentation
# Feature: Testing

Testing ofrece helpers para probar XML generado o parseado. La meta es que un
usuario pueda escribir pruebas legibles sin comparar strings enormes a mano.

## Que aprenderas aqui

[] Comparar XML esperado vs actual.
[] Usar fixtures y goldens.
[] Hacer roundtrip parser/writer.
[] Entender que cubren los compile tests de la macro.
[] Preparar pruebas para XML deterministico.

## Archivos

[] `src/testing/mod.rs`
[] `tests/support/mod.rs`
[] `tests/testing_infrastructure.rs`
[] `tests/fixtures/*`
[] `tests/golden/*`
[] `tests/compile.rs`
[] `fuzz/*`

## Comparar XML

```rust
use xdoc::testing::assert_xml_eq;

assert_xml_eq(
    "<Root><Item>A</Item></Root>",
    "<Root><Item>A</Item></Root>",
);
```

Si falla, el helper muestra una diferencia mas accionable que un assert simple
de strings.

## Roundtrip compacto

Roundtrip significa:

1. Parsear XML.
2. Serializar compacto.
3. Parsear de nuevo.
4. Serializar otra vez.
5. Confirmar que el resultado se estabiliza.

```rust
use xdoc::testing::assert_compact_roundtrip;

let roundtrip = assert_compact_roundtrip("<Root><A>1</A></Root>")?;

assert_eq!(roundtrip.compact_xml(), "<Root><A>1</A></Root>");
```

Esto ayuda a detectar problemas entre parser y writer.

## Goldens

Un golden es una salida XML esperada versionada en `tests/golden`.

```rust
use xdoc::testing::assert_document_matches_golden;
use xdoc::writer::WriterConfig;

assert_document_matches_golden(
    env!("CARGO_MANIFEST_DIR"),
    "writer_simple.xml",
    &document,
    &WriterConfig::pretty().with_xml_declaration(false),
)?;
```

Usa goldens cuando:

[] La salida es suficientemente grande para que el assert inline sea incomodo.
[] Quieres revisar cambios de salida en `git diff`.
[] La salida debe ser deterministica.

## Fixtures XML

Helpers de path:

```rust
use xdoc::testing::{parse_xml_fixture, read_xml_fixture};

let xml = read_xml_fixture(env!("CARGO_MANIFEST_DIR"), "simple.xml")?;
let document = parse_xml_fixture(env!("CARGO_MANIFEST_DIR"), "simple.xml")?;
```

Convenciones actuales:

[] XML fixtures: `tests/fixtures/xml`.
[] Golden outputs: `tests/golden`.

## Testing de `xml!`

La macro tiene compile tests con `trybuild`:

[] Casos validos en `tests/compile/pass`.
[] Casos invalidos en `tests/compile/fail`.
[] `.stderr` esperados para errores de compilacion.

Esto es importante porque muchos errores de `xml!` deben aparecer en compile
time, no en runtime.

## Property tests

El repositorio usa property tests para escaping de writer. Como usuario de la
libreria, puedes copiar el patron para probar:

[] Escaping de texto.
[] Escaping de atributos.
[] Roundtrips de fragments generados.
[] Estabilidad de orden en listas.

## Fuzzing

`fuzz/fuzz_targets/parser.rs` es un harness inicial para ejercitar el parser con
entradas arbitrarias. No forma parte del runtime ni crea una crate adicional del
motor.

## Buenas practicas

[] Prefiere comparar XML serializado por writer, no strings construidos a mano.
[] Usa compact output para asserts pequenos.
[] Usa pretty + golden para documentos grandes.
[] Prueba parser y writer juntos cuando aceptes XML externo.
[] Prueba componentes pequenos por separado.
[] Prueba el documento final completo antes de firmar.

## Errores comunes

[] Comparar pretty output en XML con mixed content sensible.
[] Versionar artefactos generados en `target/`.
[] Probar solo componentes y olvidar el documento completo.
[] Actualizar goldens sin revisar si el cambio era esperado.

## API principal

[] `RoundtripResult`
[] `XmlDiff`
[] `repo_path`
[] `xml_fixture_path`
[] `golden_path`
[] `read_utf8_file`
[] `read_xml_fixture`
[] `read_golden`
[] `compare_xml`
[] `assert_xml_eq`
[] `assert_matches_golden`
[] `assert_compact_roundtrip`
[] `assert_compact_roundtrip_with_config`
[] `assert_document_matches_golden`
[] `parse_xml_fixture`

## Siguiente lectura

[] [writer.md](writer.md) para entender la salida.
[] [parser.md](parser.md) para roundtrip.
[] [macros.md](macros.md) para compile tests.

[Volver al indice](features.md).