§
    –v¿jX  ã                  ó‚  — d Z ddlmZ ddlZddlZddlZddlZddlZej         	                    ej         
                    ej                             e¦  «        dd¦  «        ¦  «        Zej         
                    eddd¦  «        Zej         
                    eddd¦  «        Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„ZdS )zIUnit tests for Semantic Blast Radius & Documentation Invariants Analyzer.é    )ÚannotationsNz..ÚtoolsÚanalysiszdoc_blast_radius.pyzblast_radius.pyÚtargetÚstrÚ
extra_argsÚreturnÚdictc                óÜ   — t           j        t          d| ddg|¢}t          j        |ddt
          d¬¦  «        }|j        dk    sJ d|j        › �¦   «         ‚t          j	        |j
        ¦  «        S )	z8Helper to run doc_blast_radius.py and parse JSON output.ú--targetú--formatÚjsonTúutf-8©Úcapture_outputÚtextÚcwdÚencodingr   úScript failed with stderr: )ÚsysÚ
executableÚDOC_SCRIPT_PATHÚ
subprocessÚrunÚPROJECT_ROOTÚ
returncodeÚstderrr   ÚloadsÚstdout©r   r   ÚcmdÚresults       ú9C:\Projects\FreeExile\tests\unit\test_doc_blast_radius.pyÚrun_doc_blast_radiusr$      sp   € åŒ>�?¨J¸À
ÈFÐ
`ÐU_Ð
`€CÝŒ^˜C°¸4Å\Ð\cÐdÑdÔd€FØÔ Ò!Ð!Ð!Ð#PÀÄÐ#PÐ#PÑ!Ô!Ð!ÝŒ:�f”mÑ$Ô$Ð$ó    c                óÜ   — t           j        t          d| ddg|¢}t          j        |ddt
          d¬¦  «        }|j        dk    sJ d|j        › �¦   «         ‚t          j	        |j
        ¦  «        S )	z<Helper to run unified blast_radius.py and parse JSON output.r   r   r   Tr   r   r   r   )r   r   ÚUNIFIED_SCRIPT_PATHr   r   r   r   r   r   r   r   r    s       r#   Úrun_unified_blast_radiusr(      sr   € åŒ>Õ.°
¸FÀJÐPVÐ
dÐYcÐ
d€CÝŒ^˜C°¸4Å\Ð\cÐdÑdÔd€FØÔ Ò!Ð!Ð!Ð#PÀÄÐ#PÐ#PÑ!Ô!Ð!ÝŒ:�f”mÑ$Ô$Ð$r%   ÚNonec                 óX   — t          d¦  «        } | d         dk    sJ ‚| d         du sJ ‚dS )zAScratch or design request files should be LOW risk and unblocked.z*docs/design_requests/templates/TEMPLATE.mdÚ
risk_levelÚLOWÚblockedFN©r$   )Úress    r#   Ú.test_doc_blast_radius_scratch_file_is_low_riskr0      sA   € å
ÐKÑ
LÔ
L€CØˆ|Ô Ò%Ð%Ð%Ð%ØˆyŒ>˜UÐ"Ð"Ð"Ð"Ð"Ð"r%   c                 óv  — d} t          | ¦  «        }|d         dk    sJ ‚t          |d         ¦  «        dk    sJ ‚t          d„ |d         D ¦   «         ¦  «        sJ ‚t          d„ |d         D ¦   «         ¦  «        sJ ‚t          d	„ |d
         D ¦   «         ¦  «        sJ ‚t          |d         ¦  «        dk    sJ ‚dS )z_Quest specs in wiki/vi should be CRITICAL, detect Wiki Mirrors, Code Catalogs, and SQLite ties.ú&wiki/vi/QUESTS_AND_MILESTONES_SPECS.mdr+   ÚCRITICALÚall_affected_docsé
   c              3  ó   K  — | ]}d |v V — Œ	dS )z&wiki/en/QUESTS_AND_MILESTONES_SPECS.mdN© ©Ú.0Úds     r#   ú	<genexpr>z@test_doc_blast_radius_quest_specs_is_critical.<locals>.<genexpr>.   ó(   è è € ÐgÐgÀÐ7¸1Ð<ÐgÐgÐgÐgÐgÐgr%   Úmultilingual_counterpartsc              3  ó   K  — | ]}d |v V — Œ	dS )z&wiki/zh/QUESTS_AND_MILESTONES_SPECS.mdNr7   r8   s     r#   r;   z@test_doc_blast_radius_quest_specs_is_critical.<locals>.<genexpr>/   r<   r%   c              3  ó&   K  — | ]}d |v pd|v V — ŒdS )zquest_catalog.pyzquest_engine.pyNr7   ©r9   Úcs     r#   r;   z@test_doc_blast_radius_quest_specs_is_critical.<locals>.<genexpr>2   s3   è è € ÐhÐhÀQÐ! QÐ&Ð@Ð*;¸qÐ*@ÐhÐhÐhÐhÐhÐhr%   Úaffected_code_catalogsÚdatabase_impactsr   N©r$   ÚlenÚany©r   r/   s     r#   Ú-test_doc_blast_radius_quest_specs_is_criticalrH   &   sï   € à5€FÝ
˜vÑ
&Ô
&€CØˆ|Ô 
Ò*Ð*Ð*Ð*ÝˆsÐ&Ô'Ñ(Ô(¨2Ò-Ð-Ð-Ð-õ ÐgÐgÀcÐJeÔFfÐgÑgÔgÑgÔgÐgÐgÐgÝÐgÐgÀcÐJeÔFfÐgÑgÔgÑgÔgÐgÐgÐgõ ÐhÐhÈ#ÐNfÔJgÐhÑhÔhÑhÔhÐhÐhÐhõ ˆsÐ%Ô&Ñ'Ô'¨!Ò+Ð+Ð+Ð+Ð+Ð+r%   c                 óþ   — d} t          | ¦  «        }|d         dk    sJ ‚t          |d         ¦  «        dk    sJ ‚t          d„ |d         D ¦   «         ¦  «        sJ ‚t          d„ |d         D ¦   «         ¦  «        sJ ‚d	S )
zSCore economy architecture doc must detect reverse references and currency catalogs.z6docs/game_design/ANTI_INFLATION_SAVAGE_ECONOMY_2026.mdr+   r3   Úreverse_dependent_docsr   c              3  ó&   K  — | ]}d |v pd|v V — ŒdS )ÚITEM_CRAFTINGÚORIGINAL_SYSTEMSNr7   r8   s     r#   r;   zBtest_doc_blast_radius_economy_specs_is_critical.<locals>.<genexpr>>   s2   è è € ÐfÐfÀ1ˆ !Ð#Ð>Ð'9¸QÐ'>ÐfÐfÐfÐfÐfÐfr%   c              3  ó&   K  — | ]}d |v pd|v V — ŒdS )Úconsignment_vaultÚeconomyNr7   r@   s     r#   r;   zBtest_doc_blast_radius_economy_specs_is_critical.<locals>.<genexpr>?   s1   è è € ÐaÐa¸aÐ" aÐ'Ð9¨9¸¨>ÐaÐaÐaÐaÐaÐar%   rB   NrD   rG   s     r#   Ú/test_doc_blast_radius_economy_specs_is_criticalrQ   8   s¡   € àE€FÝ
˜vÑ
&Ô
&€CØˆ|Ô 
Ò*Ð*Ð*Ð*ÝˆsÐ+Ô,Ñ-Ô-°Ò1Ð1Ð1Ð1ÝÐfÐfÈÐLdÔHeÐfÑfÔfÑfÔfÐfÐfÐfÝÐaÐaÀ3ÐG_ÔC`ÐaÑaÔaÑaÔaÐaÐaÐaÐaÐar%   c                 ó¨   — d} t          | d¦  «        }|d         du sJ ‚|d         du sJ ‚t          | ¦  «        }|d         du sJ ‚|d         du sJ ‚dS )z$Acknowledging a document unlocks it.z,docs/standards/ENGINEERING_STANDARDS_2026.mdz--ackÚacknowledgedTr-   FNr.   )r   Úres_ackÚ	res_checks      r#   Ú)test_doc_blast_radius_acknowledgment_flowrV   B   sƒ   € à;€FÝ" 6¨7Ñ3Ô3€GØ�>Ô" dÐ*Ð*Ð*Ð*Ø�9Ô Ð&Ð&Ð&Ð&õ % VÑ,Ô,€IØ�^Ô$¨Ð,Ð,Ð,Ð,Ø�YÔ 5Ð(Ð(Ð(Ð(Ð(Ð(r%   c                 ó¼   — d} t          | ¦  «        }|d         dk    sJ ‚d|v sJ ‚t          |d         ¦  «        dk    sJ ‚t          |d         ¦  «        dk    sJ ‚d	S )
zPblast_radius.py should automatically delegate to doc_blast_radius for .md files.r2   r+   r3   Údoc_detailsÚaffected_filesr5   Údomain_impactsr   N)r(   rE   rG   s     r#   Ú$test_unified_blast_radius_delegationr[   O   s   € à5€FÝ
" 6Ñ
*Ô
*€CØˆ|Ô 
Ò*Ð*Ð*Ð*Ø˜CÐÐÐÐÝˆsÐ#Ô$Ñ%Ô%¨Ò*Ð*Ð*Ð*ÝˆsÐ#Ô$Ñ%Ô%¨Ò)Ð)Ð)Ð)Ð)Ð)r%   )r   r   r   r   r	   r
   )r	   r)   )Ú__doc__Ú
__future__r   r   Úosr   r   ÚpytestÚpathÚabspathÚjoinÚdirnameÚ__file__r   r   r'   r$   r(   r0   rH   rQ   rV   r[   r7   r%   r#   ú<module>re      sO  ðØ OÐ OØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø Ð Ð Ð Ø 
€
€
€
Ø €€€àŒw�Š˜rœwŸ|š|¨B¬G¯OªO¸HÑ,EÔ,EÀtÈTÑRÔRÑSÔS€Ø”'—,’,˜|¨W°jÐBWÑXÔX€Ø”g—l’l <°¸*ÐFWÑXÔXÐ ð%ð %ð %ð %ð%ð %ð %ð %ð#ð #ð #ð #ð,ð ,ð ,ð ,ð$bð bð bð bð
)ð 
)ð 
)ð 
)ð*ð *ð *ð *ð *ð *r%   