Skip to content

test(guard): mutación sobre el guard de causa, y un test que pasaba por el motivo equivocado - #246

Merged
wolverin0 merged 1 commit into
mainfrom
test/mutation-hardened-swallow-guard
Aug 31, 2026
Merged

test(guard): mutación sobre el guard de causa, y un test que pasaba por el motivo equivocado#246
wolverin0 merged 1 commit into
mainfrom
test/mutation-hardened-swallow-guard

Conversation

@wolverin0

Copy link
Copy Markdown
Owner

Cierra el contrato pedido sobre el guard de #245 (ya mergeado). PR aparte, como se pidió.

Lo que encontró la mutación

Exactamente para lo que sirve: un test verde que no probaba lo que decía su nombre.

test_calla_si_el_codigo_no_es_constante escribía except Exception as exc y usaba exc dentro del f-string, así que salía exento por la regla de "liga y usa" y nunca llegaba al chequeo de constante. Al mutar el guard sacándole el isinstance(..., ast.Constant), el test seguía verde — la mutación sólo moría por un AttributeError incidental en otro test.

Ahora el caso no liga la excepción, más uno nuevo para la otra forma sintáctica (JoinedStr vs Name). Esa mutación muere por dos tests dedicados en vez de por un crash accidental.

Los tres casos reales como fixtures

Literales, no ejemplos inventados: perfil compilado (AntigravityError), síntesis PPR-7 (synthesis_failed), discovery PPR-7 (discovery_failed). No dependen de que el archivo original siga escrito igual.

Y prueban las dos mitades: el guard ve las tres formas rotas, y no ve la forma arreglada. Un guard que sigue ladrando después del fix no distingue el problema de la solución, y lo único que enseña es a silenciarlo.

El arnés de mutación queda en el repo

scripts/mutate_swallowed_cause.py — seis mutaciones, cada una desactiva una decisión del guard:

Mutación Muere por
No exime el raise test_calla_si_re_lanza
Ignora el escape swallow-ok test_calla_ante_el_escape_declarado
No exime al que liga y usa test_calla_si_liga_y_usa_la_excepcion
Alcanza con ligar, sin usar test_marca_aunque_ligue_si_nunca_usa_la_excepcion
Vocabulario ancho (status, code) test_calla_ante_palabras_parecidas_pero_no_de_causa
Marca valores no constantes los dos tests corregidos arriba

Las seis mueren. Queda como artefacto repetible en vez de una corrida perdida.

14/14, ruff limpio, mutate_swallowed_cause.py sale 0.

…or el motivo equivocado

La prueba de mutacion encontro exactamente lo que se busca con ella: un test
verde que no probaba lo que decia su nombre.

`test_calla_si_el_codigo_no_es_constante` escribia `except Exception as exc` y
usaba `exc` dentro del f-string, asi que salia exento por la regla de "liga y
usa" y NUNCA llegaba al chequeo de constante. Al mutar el guard sacandole el
`isinstance(..., ast.Constant)`, el test seguia verde: la mutacion solo moria
por un AttributeError incidental en otro test. Ahora el caso no liga la
excepcion, mas uno nuevo para la otra forma sintactica (JoinedStr vs Name), y
esa mutacion muere por dos tests dedicados.

Agregado tambien lo que faltaba del contrato de cierre:

- Los TRES casos reales que originaron el guard quedan como fixtures literales
  (perfil compilado, sintesis PPR-7, discovery PPR-7). No dependen de que el
  archivo original siga escrito igual, y prueban las dos mitades: el guard ve
  las tres formas rotas, y NO ve la forma arreglada. Un guard que sigue ladrando
  despues del fix no distingue el problema de la solucion.

- `scripts/mutate_swallowed_cause.py`: seis mutaciones, cada una desactiva UNA
  decision del guard (exencion del re-raise, escape declarado, "liga y usa",
  "alcanza con ligar", vocabulario ancho, constante vs derivado). Las seis
  mueren. Queda como artefacto repetible en vez de una corrida perdida.

14/14, ruff limpio, mutacion sale 0.
@wolverin0
wolverin0 merged commit c431bba into main Aug 31, 2026
15 checks passed
@wolverin0
wolverin0 deleted the test/mutation-hardened-swallow-guard branch August 31, 2026 01:19
wolverin0 added a commit that referenced this pull request Aug 31, 2026
15421 -> 15412 simbolos, 39209 -> 39218 relaciones, indice al dia en c431bba.
Regenerado con --embeddings: sin ese flag el analyze BORRA los embeddings
existentes en vez de preservarlos, y son 12.079.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant