test(guard): mutación sobre el guard de causa, y un test que pasaba por el motivo equivocado - #246
Merged
Merged
Conversation
…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
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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_constanteescribíaexcept Exception as excy usabaexcdentro 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 elisinstance(..., ast.Constant), el test seguía verde — la mutación sólo moría por unAttributeErrorincidental en otro test.Ahora el caso no liga la excepción, más uno nuevo para la otra forma sintáctica (
JoinedStrvsName). 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:raisetest_calla_si_re_lanzaswallow-oktest_calla_ante_el_escape_declaradotest_calla_si_liga_y_usa_la_excepciontest_marca_aunque_ligue_si_nunca_usa_la_excepcionstatus,code)test_calla_ante_palabras_parecidas_pero_no_de_causaLas seis mueren. Queda como artefacto repetible en vez de una corrida perdida.
14/14, ruff limpio,
mutate_swallowed_cause.pysale 0.