§
    "Áj  ã            
       óN  — d Z ddlZddlZddlZej                             dej                             ej                             ej                             e	¦  «        d¦  «        ¦  «        ¦  «         ddl
mZmZ  G d„ dej        ¦  «        Zedk    r ej        ¦   «          dS dS )a  
Unit tests for Two-Phase Commit (2PC) Instant Buyout Trade Engine in FreeExile.
Verifies zero-duplication atomic swaps, rollback on insufficient funds, and concurrent trade lock rejection
using FreeExile original currencies (ThienMenh / Destiny Stone, HonNguyen / Primal Chaos Stone).
é    Nz../../server)ÚInstantBuyoutEngineÚ	StashItemc                   ó2   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestInstantBuyout2PCc                 ó  — t          d¬¦  «        | _        | j                             d¦  «        | _        | j                             d¦  «        | _        d| _        t          | j        dddd¬	¦  «        }|| j        j        | j        <   d S )
Nú:memory:)Údb_pathÚseller_account_01Úbuyer_account_02Úitem_sword_godtier_999u    LÃ´i Ä�Ã¬nh Tuyá»‡t áº¢nh Kiáº¿mÚ	ThienMenhé   ©Ú	item_uuidÚowner_account_idÚ	item_nameÚasking_price_currencyÚasking_price_amount)r   ÚengineÚregister_accountÚsellerÚbuyerr   r   Úitems)ÚselfÚswords     ú2C:\Projects\FreeExile\tests\unit\test_trade_2pc.pyÚsetUpzTestInstantBuyout2PC.setUp   s‹   € Ý)°*Ð=Ñ=Ô=ˆŒØ”k×2Ò2Ð3FÑGÔGˆŒØ”[×1Ò1Ð2DÑEÔEˆŒ
ð 2ˆŒÝØ”nØ0Ø8Ø"-Ø !ð
ñ 
ô 
ˆð -2ˆŒÔ˜$œ.Ñ)Ð)Ð)ó    c                 ó$  — d| j         j        d<   d| j        j        d<   | j                             dd| j        dd¬¦  «        \  }}}|                      |¦  «         |                      |¦  «         |                      | j         j        d         d¦  «         |                      | j        j        d         d¦  «         |  	                    | j        | j        j
        ¦  «         |                      | j        | j         j
        ¦  «         |                      | j         j
        | j                 j        d¦  «         |                      t          | j        j        ¦  «        d¦  «         |                      | j        j        d         d	         |¦  «         d
S )zSBuyer has 10 ThienMenh Stones, purchases 5 ThienMenh sword -> atomic swap succeeds.é
   r   r   r   r
   r   ©Úbuyer_account_idÚseller_account_idr   Úoffered_currencyÚoffered_amounté   Útx_idN)r   Ú
currenciesr   r   Úexecute_instant_buyoutr   Ú
assertTrueÚassertIsNotNoneÚassertEqualÚassertNotInr   ÚassertInr   ÚlenÚtransaction_log©r   ÚsuccessÚmsgr'   s       r   Útest_successful_atomic_swapz0TestInstantBuyout2PC.test_successful_atomic_swap"   si  € à-/ˆŒ
Ô˜kÑ*Ø./ˆŒÔ˜{Ñ+à"œk×@Ò@Ø/Ø1Ø”nØ(Øð Añ 
ô 
Ñˆ��eð 	�Š˜Ñ Ô Ð Ø×Ò˜UÑ#Ô#Ð#à×Ò˜œÔ.¨{Ô;¸QÑ?Ô?Ð?Ø×Ò˜œÔ/°Ô<¸aÑ@Ô@Ð@à×Ò˜œ¨¬Ô):Ñ;Ô;Ð;Ø�Š�d”n d¤jÔ&6Ñ7Ô7Ð7Ø×Ò˜œÔ)¨$¬.Ô9ÔJÐL^Ñ_Ô_Ð_à×Ò�˜Tœ[Ô8Ñ9Ô9¸1Ñ=Ô=Ð=Ø×Ò˜œÔ4°QÔ7¸Ô@À%ÑHÔHÐHÐHÐHr   c                 ó–  — d| j         j        d<   d| j        j        d<   | j                             dd| j        dd¬¦  «        \  }}}|                      |¦  «         |                      d|                     ¦   «         ¦  «         |  	                    | j         j        d         d¦  «         |  	                    | j        j        d         d¦  «         |                      | j        | j        j
        ¦  «         |                      | j        | j         j
        ¦  «         |                      | j        j
        | j                 j        ¦  «         d	S )
zVBuyer has only 3 ThienMenh Stones (needs 5) -> transaction rejected, zero items moved.é   r   r   r   r
   r   r!   zinsufficient fundsN)r   r(   r   r   r)   r   ÚassertFalser.   Úlowerr,   r   r-   Ú	is_lockedr1   s       r   Ú test_insufficient_funds_rollbackz5TestInstantBuyout2PC.test_insufficient_funds_rollback<   s)  € à-.ˆŒ
Ô˜kÑ*Ø./ˆŒÔ˜{Ñ+à"œk×@Ò@Ø/Ø1Ø”nØ(Øð Añ 
ô 
Ñˆ��eð 	×Ò˜Ñ!Ô!Ð!Ø�ŠÐ*¨C¯IªI©K¬KÑ8Ô8Ð8à×Ò˜œÔ.¨{Ô;¸QÑ?Ô?Ð?Ø×Ò˜œÔ/°Ô<¸aÑ@Ô@Ð@à�Š�d”n d¤kÔ&7Ñ8Ô8Ð8Ø×Ò˜œ¨¬Ô)9Ñ:Ô:Ð:Ø×Ò˜œÔ*¨4¬>Ô:ÔDÑEÔEÐEÐEÐEr   c                 ó*  — d| j         j        d<   | j        j        | j                 }d|_        | j                             dd| j        dd¬¦  «        \  }}}|                      |¦  «         |  	                    d| 
                    ¦   «         ¦  «         d	S )
zGIf item is currently locked, simultaneous buy attempt must be rejected.r    r   Tr   r
   r   r!   zlocked in another pending tradeN)r   r(   r   r   r   r9   r   r)   r7   r.   r8   ©r   Úitemr2   r3   r'   s        r   Ú*test_concurrent_lock_prevents_double_spendz?TestInstantBuyout2PC.test_concurrent_lock_prevents_double_spendS   s—   € à-/ˆŒ
Ô˜kÑ*ØŒ{Ô  ¤Ô0ˆØˆŒà"œk×@Ò@Ø/Ø1Ø”nØ(Øð Añ 
ô 
Ñˆ��eð 	×Ò˜Ñ!Ô!Ð!Ø�ŠÐ7¸¿º¹¼ÑEÔEÐEÐEÐEr   c                 óì  — t          dd¬¦  «        }|                     d¦  «        }|                     d¦  «        }t          ddddd	¬
¦  «        }||j        d<   d|j        d<   |                     ddddd	¬¦  «        \  }}}|                      |¦  «         |                      |j        d         d¦  «         |                      |j        d         d¦  «         |                      |j        d¦  «         dS )zWWhen market_tax_rate is set to 5%, 5% of currency is permanently destroyed upon buyout.gš™™™™™©?r   )Úmarket_tax_rater	   Ú
seller_taxÚ	buyer_taxÚ	axe_tax_1u   Cuá»“ng LÃ´i RÃ¬uÚ	HonNguyenéd   r   é–   r!   é2   é_   r   N)	r   r   r   r   r(   r)   r*   r,   Útotal_tax_burned)r   Ú
tax_engineÚs_accÚb_accr=   Úokr3   Útxs           r   Ú)test_anti_inflationary_market_burning_taxz>TestInstantBuyout2PC.test_anti_inflationary_market_burning_taxd   s  € å(¸ÀzÐRÑRÔRˆ
Ø×+Ò+¨LÑ9Ô9ˆØ×+Ò+¨KÑ8Ô8ˆåØ!Ø)Ø)Ø"-Ø #ð
ñ 
ô 
ˆð $(ˆŒ�KÑ Ø(+ˆÔ˜Ñ%à ×7Ò7Ø(Ø*Ø!Ø(Øð 8ñ 
ô 
‰ˆˆC�ð 	�Š˜ÑÔÐà×Ò˜Ô)¨+Ô6¸Ñ;Ô;Ð;à×Ò˜Ô)¨+Ô6¸Ñ;Ô;Ð;Ø×Ò˜Ô4°aÑ8Ô8Ð8Ð8Ð8r   c                 ó¾  — d| j         j        d<   | j        j        | j                 }d|_        | j                             dd| j        dd¬¦  «        \  }}}|                      |¦  «         |  	                    d| 
                    ¦   «         ¦  «         |  	                    | j        | j        j        ¦  «         |                      | j        | j         j        ¦  «         d	S )
zIIf an item is scourge soulbound, it cannot be traded on the black market.r    r   Tr   r
   r   r!   zscourge soulboundN)r   r(   r   r   r   Úis_scourge_soulboundr   r)   r7   r.   r8   r-   r<   s        r   Ú,test_scourge_soulbound_item_cannot_be_tradedzATestInstantBuyout2PC.test_scourge_soulbound_item_cannot_be_traded‚   sÐ   € à-/ˆŒ
Ô˜kÑ*ØŒ{Ô  ¤Ô0ˆØ$(ˆÔ!à"œk×@Ò@Ø/Ø1Ø”nØ(Øð Añ 
ô 
Ñˆ��eð 	×Ò˜Ñ!Ô!Ð!Ø�ŠÐ)¨3¯9ª9©;¬;Ñ7Ô7Ð7à�Š�d”n d¤kÔ&7Ñ8Ô8Ð8Ø×Ò˜œ¨¬Ô)9Ñ:Ô:Ð:Ð:Ð:r   N)	Ú__name__Ú
__module__Ú__qualname__r   r4   r:   r>   rO   rR   © r   r   r   r      sw   € € € € € ð2ð 2ð 2ð Ið Ið Ið4Fð Fð Fð.Fð Fð Fð"9ð 9ð 9ð<;ð ;ð ;ð ;ð ;r   r   Ú__main__)Ú__doc__ÚunittestÚsysÚosÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Útrade.two_phase_commitr   r   ÚTestCaser   rS   ÚmainrV   r   r   ú<module>re      sä   ððð ð €€€Ø 
€
€
€
Ø 	€	€	€	ð „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \à AÐ AÐ AÐ AÐ AÐ AÐ AÐ AðC;ð C;ð C;ð C;ð C;˜8Ô,ñ C;ô C;ð C;ðL ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   