§
    Ûi½j$  ã                  óÖ   — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZmZmZ ddlmZmZmZ ddlmZmZmZ ddlmZ d„ Zd	„ Zd
„ Zd„ Zd„ Ze	j        j
        d„ ¦   «         Zd„ Z dS )a	  
Unit Tests for the 4 Autonomous Agent Power Tools in FreeExile:
1. ARPG Crafting & Economy Monte Carlo Simulator
2. Meridian Graph Topology & Passive Tree Inspector
3. Asset Pipeline & Apple Metal Shader QA Linter
4. Headless Protobuf & 2PC Security Stress Fuzzer
é    )ÚannotationsN)ÚArpgCraftingSimulatorÚCraftingTargetÚCraftingMethod)ÚMeridianGraphInspectorÚMeridianNodeÚNodeType)Úis_power_of_twoÚAssetQaReportÚaudit_metal_shader_code)ÚHeadlessPacketFuzzerc                 ó  — t          d¬¦  «        } t          ddd¬¦  «        }|                      t          j        |d¬¦  «        }|j        }d}||k    }|sªt          j        d|fd	||f¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}d}|j        }||v }	|	sªt          j        d|	fd||f¦  «        t          j        |¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}d}|j        }||v }	|	sªt          j        d|	fd||f¦  «        t          j        |¦  «        d
t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}dS )zQVerifies that the Monte Carlo Crafting engine computes valid probabilistic stats.éU   )Úilvl_filteré   é   )Útarget_tierÚmin_matching_modsÚ
item_levelé   ©Ú
iterations©ú==©z4%(py2)s
{%(py2)s = %(py0)s.total_trials
} == %(py5)sÚres©Úpy0Úpy2Úpy5úassert %(py7)sÚpy7N)z9%(py2)s
{%(py2)s = %(py0)s.successful_crafts
} == %(py5)sr   ©ú>)z?%(py2)s
{%(py2)s = %(py0)s.avg_attempts_per_success
} > %(py5)sÚHUYET_HON_THACH©Úin)z<%(py1)s in %(py5)s
{%(py5)s = %(py3)s.total_currency_spent
})Úpy1Úpy3r    ÚGOLD_FEE)r   r   Úrun_monte_carlor   Ú
CHAOS_SPAMÚtotal_trialsÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚsuccessful_craftsÚavg_attempts_per_successÚtotal_currency_spent)
ÚsimÚtargetr   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8Ú@py_assert0Ú@py_assert2s
             ú:C:\Projects\FreeExile\tests\unit\test_agent_power_tools.pyÚtest_arpg_crafting_monte_carlorC      s±  € å
¨BÐ
/Ñ
/Ô
/€Cå¨¸QÈ2ÐNÑNÔN€FØ
×
Ò
�nÔ7¸ÈBÐ
Ñ
OÔ
O€CàÔÐ!˜rÐ!Ð˜rÒ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!Ð˜rÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ3Ñ!Ô!Ð!Õ!Ô!ˆ3Ñ!Ô!Ð!Ð!Õ!Ô!ÐÑ!Ô!Õ!Ô!˜rÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ØÔ Ð& BÐ&Ð  BÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð  BÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ3Ñ&Ô&Ð&Õ&Ô&ˆ3Ñ&Ô&Ð&Ð&Õ&Ô&Ð Ñ&Ô&Õ&Ô& BÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÔ'Ð+¨!Ð+Ð'¨!Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð'¨!Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆ3Ñ+Ô+Ð+Õ+Ô+ˆ3Ñ+Ô+Ð+Ð+Õ+Ô+Ð'Ñ+Ô+Õ+Ô+¨!Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÐ8 Ô 8Ð8ÐÐ 8Ð8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8ÐÐ 8Ð8Ñ8Ô8Õ8Ô8ÐÑ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8 Ñ8Ô8Ð8Õ8Ô8 Ñ8Ô8Ð8Ð8Õ8Ô8Ð 8Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØÐ1˜Ô1Ð1ˆ:Ð1Ð1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1ˆ:Ð1Ð1Ñ1Ô1Õ1Ô1ˆ:Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1˜Ñ1Ô1Ð1Õ1Ô1˜Ñ1Ô1Ð1Ð1Õ1Ô1Ð1Ñ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ó    c                 óN  — t          ¦   «         } t          ¦   «         }|                      t          j        |d¬¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}d
}|j        }	||	k    }
d}|	|k    }|
r|s¿t          j        d|
|fd||	|f¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}
x}x}	}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}d	S )zGVerifies that Corruption Gamble honors the ~25% brick destruction rate.éÈ   r   r   r   r   r   r!   r"   Nr   éP   )ú<=rH   )z5%(py1)s <= %(py6)s
{%(py6)s = %(py4)s.bricked_items
}z5%(py6)s
{%(py6)s = %(py4)s.bricked_items
} <= %(py8)s)r(   Úpy4Úpy6Úpy8úassert %(py10)sÚpy10r   r#   )z8%(py2)s
{%(py2)s = %(py0)s.successful_crafts
} > %(py5)s)r   r   r+   r   ÚCORRUPTION_GAMBLEr-   r.   r/   r0   r1   r2   r3   r4   r5   Úbricked_itemsr6   )r9   r:   r   r;   r<   r=   r>   r?   r@   Ú@py_assert5rA   Ú@py_assert7Ú@py_format9Ú@py_format11s                 rB   Útest_corruption_gamble_ratesrT       s  € å
Ñ
!Ô
!€CÝÑÔ€FØ
×
Ò
�nÔ>ÀÐSVÐ
Ñ
WÔ
W€CàÔÐ"˜sÐ"Ð˜sÒ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"Ð˜sÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ3Ñ"Ô"Ð"Õ"Ô"ˆ3Ñ"Ô"Ð"Ð"Õ"Ô"ÐÑ"Ô"Õ"Ô"˜sÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"àÐ(�Ô"Ð(ˆ2Ð"Ò(Ð( bÐ(Ð" bÒ(Ð(Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð(ˆ2Ð" bÐ(Ñ(Ô(Õ(Ô(ˆ2Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�Ñ(Ô(Ð(Õ(Ô(�Ñ(Ô(Ð(Ð(Õ(Ô(Ð"Ñ(Ô(Õ(Ô( bÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÔ Ð$ 1Ð$Ð  1Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$Ð  1Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆ3Ñ$Ô$Ð$Õ$Ô$ˆ3Ñ$Ô$Ð$Ð$Õ$Ô$Ð Ñ$Ô$Õ$Ô$ 1Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ð$rD   c                 óþ  — t          ¦   «         } |                      ¦   «          |                      dd¦  «        \  }}d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x}}ddg}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x}}|                      dd¦  «        \  }}d}||k    }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd	|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x}}t          |¦  «        }d}	||	k    }
|
sòt          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x}x}
}	|                      d¦  «        }t          |¦  «        }d}	||	k    }
|
sòt          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x}x}
}	d
S )zGVerifies shortest path and island node detection on the Meridian Graph.Únode_origin_dantianÚnode_passive_301r   r   ©z%(py0)s == %(py3)sÚcost©r   r)   úassert %(py5)sr    NÚpathÚnode_passive_304r   r#   )z%(py0)s > %(py3)sÚcost_304r   )ú>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sÚlenÚpath_304)r   r(   r)   rJ   zassert %(py8)srK   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚisolated)r   Úload_canonical_meridian_treeÚdijkstra_shortest_pathr.   r/   r0   r1   r2   r3   r4   r5   r`   Úfind_isolated_nodes)Ú	inspectorrY   r\   rA   r;   Ú@py_format4r>   r^   ra   rP   r<   Ú@py_format7rR   rb   s                 rB   Ú-test_meridian_graph_dijkstra_and_connectivityri   ,   sù  € å&Ñ(Ô(€IØ×*Ò*Ñ,Ô,Ð,ð ×1Ò1Ð2GÐI[Ñ\Ô\�J€Dˆ$ØÐˆ4�1Š9ÐÐÐÕÔÐÐÐÐˆ4�1ÐÑÔÐÕÔÑÔÐÐÕÔˆ4ÑÔÐÕÔˆ4ÑÔÐÐÕÔ�1ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ)Ð+=Ð>Ð>ˆ4Ð>Ò>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>ˆ4Ð>Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>ˆ4Ñ>Ô>Ð>Õ>Ô>ˆ4Ñ>Ô>Ð>Ð>Õ>Ô>Ð>Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>ð #×9Ò9Ð:LÐN`ÑaÔaÑ€HˆhØÐˆ8�aŠ<ÐÐÐÕÔÐÐÐÐˆ8�aÐÑÔÐÕÔÑÔÐÐÕÔˆ8ÑÔÐÕÔˆ8ÑÔÐÐÕÔ�aÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÝˆx‰=Œ=Ð˜AÐˆ=˜AÒÐÐÐÕÔÐÐÐÐˆ=˜AÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆxÑÔÐÕÔˆxÑÔÐÐÕÔˆ=ÑÔÕÔ˜AÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐð ×,Ò,Ð-BÑCÔC€HÝˆx‰=Œ=Ð˜AÐˆ=˜AÒÐÐÐÕÔÐÐÐÐˆ=˜AÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆxÑÔÐÕÔˆxÑÔÐÐÕÔˆ=ÑÔÕÔ˜AÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÐÐrD   c                 ó	  — d} t          | ¦  «        }d}||u }|sÇt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x} x}x}}d
} t          | ¦  «        }d}||u }|sÇt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x} x}x}}d} t          | ¦  «        }d}||u }|sÇt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x} x}x}}d} t          | ¦  «        }d}||u }|sÇt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x} x}x}}d} t          | ¦  «        }d}||u }|sÇt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        | ¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x} x}x}}d	S )z/Verifies texture power-of-two validation logic.é   T)Úis)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} is %(py7)sr
   )r   r   rI   r"   zassert %(py9)sÚpy9Ni   i   i,  Fi   )	r
   r.   r/   r0   r1   r2   r3   r4   r5   )r;   r=   Ú@py_assert6rP   r?   Ú@py_format10s         rB   Ú test_asset_pipeline_power_of_tworp   @   s  € àÐ'�?˜3ÑÔÐ' 4Ð'Ð 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�?Ñ'Ô'Ð'Õ'Ô'�?Ñ'Ô'Ð'Ð'Õ'Ô'˜3Ñ'Ô'Õ'Ô'ÐÑ'Ô'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÐ'�?˜3ÑÔÐ' 4Ð'Ð 4Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð 4Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'�?Ñ'Ô'Ð'Õ'Ô'�?Ñ'Ô'Ð'Ð'Õ'Ô'˜3Ñ'Ô'Õ'Ô'ÐÑ'Ô'Õ'Ô' 4Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÐ(�?˜4Ñ Ô Ð( DÐ(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�?Ñ(Ô(Ð(Õ(Ô(�?Ñ(Ô(Ð(Ð(Õ(Ô(˜4Ñ(Ô(Õ(Ô(Ð Ñ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÐ(�?˜3ÑÔÐ( 5Ð(Ð 5Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð 5Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�?Ñ(Ô(Ð(Õ(Ô(�?Ñ(Ô(Ð(Ð(Õ(Ô(˜3Ñ(Ô(Õ(Ô(ÐÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÐ)�?˜4Ñ Ô Ð) EÐ)Ð  EÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð  EÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�?Ñ)Ô)Ð)Õ)Ô)�?Ñ)Ô)Ð)Ð)Õ)Ô)˜4Ñ)Ô)Õ)Ô)Ð Ñ)Ô)Õ)Ô) EÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)rD   c                óþ  — | dz  }|                      dd¬¦  «         t          ¦   «         }t          t          |¦  «        |¦  «         |j        }t          |¦  «        }d}||k    }|�st          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        t
          ¦  «        rt          j        t
          ¦  «        ndd	t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}d}	|j        d         }
|	|
v }|slt          j        d|fd|	|
f¦  «        t          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}}
dS )z=Verifies detection of unpadded float3 in Metal shader struct.zBadShader.metalzg
        struct BadUniforms {
            float3 lightDir;
            float intensity;
        };
    zutf-8)Úencodingr   r   )z^%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.metal_alignment_warnings
})
} == %(py8)sr`   Úreport)r   r(   r)   r    rK   rL   rM   NÚBadUniformsr   r&   )z%(py1)s in %(py4)s)r(   rI   zassert %(py6)srJ   )Ú
write_textr   r   ÚstrÚmetal_alignment_warningsr`   r.   r/   r0   r1   r2   r3   r4   r5   )Útmp_pathÚ
bad_shaderrs   rA   r<   rQ   rn   rR   rS   r@   r=   Ú@py_format5rh   s                rB   Ú!test_metal_shader_alignment_auditr{   I   sE  € àÐ-Ñ-€JØ×Òð ð
 ð ñ ô ð õ ‰_Œ_€FÝ�C 
™OœO¨VÑ4Ô4Ð4ØÔ.Ð4�3Ð.Ñ/Ô/Ð4°1Ð4Ð/°1Ò4Ð4Ð4Ñ4Õ4Ô4Ð4Ð4Ð4Ð4Ð/°1Ð4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4�3Ñ4Ô4Ð4Õ4Ô4�3Ñ4Ô4Ð4Ð4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4ˆvÑ4Ô4Ð4Õ4Ô4ˆvÑ4Ô4Ð4Ð4Õ4Ô4Ð.Ñ4Ô4Õ4Ô4Ð/Ñ4Ô4Õ4Ô4°1Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ØÐ>˜FÔ;¸AÔ>Ð>ˆ=Ð>Ð>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>ˆ=Ð>Ð>Ñ>Ô>Õ>Ô>ˆ=Ñ>Ô>Õ>Ô>Ð>Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>rD   c               ƒ  óH  K  — t          d¬¦  «        } |                      d¬¦  «        ƒ d{V —†\  }}}d}||k    }|s—t          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}d}||k    }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}d}||k    }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
œz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}dS )zOVerifies that concurrent double-spend race condition attacks are 100% repelled.é   )Úconcurrencyr   )ÚrunsNé-   r   rX   Ú	total_attrZ   r[   r    Ú
total_succé*   Ú
total_prev)
r   Úfuzz_2pc_double_spend_racer.   r/   r0   r1   r2   r3   r4   r5   )Úfuzzerr�   r‚   r„   rA   r;   rg   r>   s           rB   Ú'test_headless_2pc_double_spend_repelledr‡   Y   s’  è è € õ "¨bÐ1Ñ1Ô1€FØ.4×.OÒ.OÐUVÐ.OÑ.WÔ.WÐ(WÐ(WÐ(WÐ(WÐ(WÐ(WÑ%€Iˆz˜:àÐˆ9˜Š?ÐÐÐÕÔÐÐÐÐˆ9˜ÐÑÔÐÕÔÑÔÐÐÕÔˆ9ÑÔÐÕÔˆ9ÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆ:˜Š?ÐÐÐÕÔÐÐÐÐˆ:˜ÐÑÔÐÕÔÑÔÐÐÕÔˆ:ÑÔÐÕÔˆ:ÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆ:˜ÒÐÐÐÕÔÐÐÐÐˆ:˜ÐÑÔÐÕÔÑÔÐÐÕÔˆ:ÑÔÐÕÔˆ:ÑÔÐÐÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐrD   c                 óè  — t          ¦   «         } |                      d¬¦  «        \  }}d}||k    }|s—t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}}d}||k    }|s—t          j        d|fd||f¦  «        d
t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚d	x}}d	S )z0Verifies that speedhacks are clamped and logged.é2   )Úattemptsr   rX   rŠ   rZ   r[   r    NÚblocked)
r   Úfuzz_movement_speedhacksr.   r/   r0   r1   r2   r3   r4   r5   )r†   rŠ   r‹   rA   r;   rg   r>   s          rB   Ú#test_headless_speedhack_interceptedr�   d   s°  € å!Ñ#Ô#€FØ×7Ò7ÀÐ7ÑDÔDÑ€HˆgØÐˆ8�rŠ>ÐÐÐÕÔÐÐÐÐˆ8�rÐÑÔÐÕÔÑÔÐÐÕÔˆ8ÑÔÐÕÔˆ8ÑÔÐÐÕÔ�rÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆ7�bŠ=ÐÐÐÕÔÐÐÐÐˆ7�bÐÑÔÐÕÔÑÔÐÐÕÔˆ7ÑÔÐÕÔˆ7ÑÔÐÐÕÔ�bÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐrD   )!Ú__doc__Ú
__future__r   Úbuiltinsr0   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter.   ÚpytestÚasyncioÚ"tools.math.arpg_crafting_simulatorr   r   r   Ú$tools.world.meridian_graph_inspectorr   r   r	   Ú tools.lint.verify_asset_pipeliner
   r   r   Ú%tools.security.headless_packet_fuzzerr   rC   rT   ri   rp   r{   Úmarkr‡   r�   © rD   rB   ú<module>rœ      s@  ððð ð #Ð "Ð "Ð "Ð "Ð "Ø  € € € € € € € € € € € € €€€€Ø €€€Ø dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dØ _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ð _Ø dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dÐ dØ FÐ FÐ FÐ FÐ FÐ Fð2ð 2ð 2ð	%ð 	%ð 	%ðð ð ð(*ð *ð *ð?ð ?ð ?ð  „Ôðð ñ Ôððð ð ð ð rD   