§
    (v¼jn  ã            
       óz  — 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mZ ddlmZ ddlmZmZ ddlmZ  G d„ d	ej        ¦  «        Zed
k    r ej        ¦   «          dS dS )z™
Unit tests for FreeExile 2D Spatial Grid Slot System for Inventory and Stash.
Follows Autonomous TDD Protocol: Formulating tests before implementation.
é    Nz../../server)ÚItemDimensionsÚGridPlacementÚget_default_item_dimensions)ÚSpatialInventoryGrid)ÚItemTypeÚInventoryItem)Ú
ItemRarityc                   ó>   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	S )
ÚTestSpatialInventoryGridc                 ó^   — t          dd¬¦  «        | _        t          dd¬¦  «        | _        d S )Né   é   ©ÚwidthÚheight)r   Úbag_gridÚ
stash_grid)Úselfs    ú?C:\Projects\FreeExile\tests\unit\test_spatial_inventory_grid.pyÚsetUpzTestSpatialInventoryGrid.setUp   s.   € å,°2¸aÐ@Ñ@Ô@ˆŒå.°RÀÐCÑCÔCˆŒˆˆó    c                 ó  — t          dt          j        ¦  «        }|                      |t	          dd¬¦  «        ¦  «         t          dt          j        ¦  «        }|                      |t	          dd¬¦  «        ¦  «         t          dt          j        d¬	¦  «        }|                      |t	          dd¬¦  «        ¦  «         t          d
t          j        ¦  «        }|                      |t	          dd¬¦  «        ¦  «         dS )zFEquipment archetypes must return correct W x H spatial bounding boxes.Úwpn_abyssal_chainguard_swordé   é   r   Úarmor_da_xoa_huyet_giapé   Úhelm_chchien_tuongÚHELMET)ÚsubtypeÚcurr_blood_soul_gemé   N)r   r   ÚWEAPONÚassertEqualr   ÚARMORÚCURRENCY)r   Údim_greatswordÚ	dim_armorÚdim_helmÚdim_gems        r   Ú!test_default_equipment_dimensionsz:TestSpatialInventoryGrid.test_default_equipment_dimensions   sí   € õ 5Ð5SÕU]ÔUdÑeÔeˆØ×Ò˜­¸aÈÐ)JÑ)JÔ)JÑKÔKÐKõ 0Ð0IÍ8Ì>ÑZÔZˆ	Ø×Ò˜¥N¸À1Ð$EÑ$EÔ$EÑFÔFÐFõ /Ð/CÅXÄ^Ð]eÐfÑfÔfˆØ×Ò˜¥>¸À!Ð#DÑ#DÔ#DÑEÔEÐEõ .Ð.CÅXÔEVÑWÔWˆØ×Ò˜¥.°qÀÐ"CÑ"CÔ"CÑDÔDÐDÐDÐDr   c                 ó~  — t          dddt          j        t          j        d¬¦  «        }| j                             |dddd¬	¦  «        }|                      |¦  «         t          dd¦  «        D ]r}t          dd¦  «        D ]_}|                      | j         	                    ||¦  «        ¦  «         |  
                    | j                             ||¦  «        |¦  «         Œ`Œs|                      | j         	                    dd¦  «        ¦  «         |                      | j         	                    dd¦  «        ¦  «         d
S )zIA 2x4 greatsword placed at (0, 0) occupies exactly 8 cells: (0..1, 0..3).Úsword_01r   u#   XÃ­ch Huyáº¿t Tráº£m Ma Cá»± Kiáº¿méU   )Ú	item_uuidÚitem_idÚnameÚ	item_typeÚrarityÚ
item_levelr   r   r   ©ÚxÚyr   r   N)r   r   r#   r	   ÚCUC_PHAMr   Ú
place_itemÚ
assertTrueÚrangeÚis_cell_occupiedr$   Úget_item_atÚassertFalse)r   ÚswordÚplacedÚcxÚcys        r   Ú'test_place_multicell_item_within_boundsz@TestSpatialInventoryGrid.test_place_multicell_item_within_bounds+   s>  € åØ Ø2Ø6Ý”oÝÔ&Øð
ñ 
ô 
ˆð ”×)Ò)¨%°1¸ÀÈ1Ð)ÑMÔMˆØ�Š˜ÑÔÐõ ˜˜1‘+”+ð 	Kð 	KˆBÝ˜A˜q‘k”kð Kð K�Ø—’ ¤× >Ò >¸rÀ2Ñ FÔ FÑGÔGÐGØ× Ò  ¤×!:Ò!:¸2¸rÑ!BÔ!BÀEÑJÔJÐJÐJðKð
 	×Ò˜œ×7Ò7¸¸1Ñ=Ô=Ñ>Ô>Ð>Ø×Ò˜œ×7Ò7¸¸1Ñ=Ô=Ñ>Ô>Ð>Ð>Ð>r   c           	      óÌ  — t          dddt          j        ¬¦  «        }|                      | j                             dddd¬	¦  «        ¦  «         |                      | j                             |dddd¬	¦  «        ¦  «         |                      | j                             dddd¬	¦  «        ¦  «         |                      | j                             |dddd¬	¦  «        ¦  «         d
S )zKPlacing a 2x4 item where x + width > 12 or y + height > 5 must be rejected.Ú	sword_oobr   õ   Cá»± Kiáº¿m©r/   r0   r1   r2   é   r   r   r   r5   N)r   r   r#   r>   r   Ú	can_placer9   )r   r?   s     r   Ú#test_reject_out_of_bounds_placementz<TestSpatialInventoryGrid.test_reject_out_of_bounds_placementC   sè   € åØ!Ø2ØÝ”oð	
ñ 
ô 
ˆð 	×Ò˜œ×0Ò0°2¸À!ÈAÐ0ÑNÔNÑOÔOÐOØ×Ò˜œ×1Ò1°%¸2ÀÈ!ÐTUÐ1ÑVÔVÑWÔWÐWð 	×Ò˜œ×0Ò0°1¸ÀÈ1Ð0ÑMÔMÑNÔNÐNØ×Ò˜œ×1Ò1°%¸1ÀÈÐSTÐ1ÑUÔUÑVÔVÐVÐVÐVr   c           	      ój  — t          dddt          j        ¬¦  «        }|                      | j                             |dddd¬¦  «        ¦  «         t          d	d	d
t          j        ¬¦  «        }|                      | j                             dddd¬¦  «        ¦  «         |                      | j                             |dddd¬¦  «        ¦  «         |                      | j                             dddd¬¦  «        ¦  «         |                      | j                             |dddd¬¦  «        ¦  «         dS )z)Two items cannot share overlapping cells.Úarmor_01r   u   Huyáº¿t GiÃ¡prG   r   r"   r   r5   Úhelm_01u   MÅ©r   N)r   r   r%   r:   r   r9   r>   rI   )r   ÚarmorÚhelms      r   Ú!test_reject_overlapping_collisionz:TestSpatialInventoryGrid.test_reject_overlapping_collisionS   s6  € åØ Ø-Ø Ý”nð	
ñ 
ô 
ˆð 	�Š˜œ×0Ò0°¸!¸qÈÐRSÐ0ÑTÔTÑUÔUÐUåØØØÝ”nð	
ñ 
ô 
ˆð 	×Ò˜œ×0Ò0°1¸ÀÈ1Ð0ÑMÔMÑNÔNÐNØ×Ò˜œ×1Ò1°$¸!¸qÈÐRSÐ1ÑTÔTÑUÔUÐUð 	�Š˜œ×/Ò/°!°qÀÈ!Ð/ÑLÔLÑMÔMÐMØ�Š˜œ×0Ò0°¸¸aÀqÐQRÐ0ÑSÔSÑTÔTÐTÐTÐTr   c                 óF  — | j                              dd¬¦  «        }|                      |d¦  «         t          dddt          j        ¬¦  «        }| j                              |d	d	dd¬
¦  «         | j                              dd¬¦  «        }|                      |d¦  «         dS )zJFirst-fit scan automatically finds the first available (x, y) coordinates.r   r   r   ©r   r   Úsw1Úswõ   Kiáº¿mrG   r   r5   )r   r   N)r   Úfind_first_fitr$   r   r   r#   r9   )r   Úposr?   Únext_poss       r   Útest_first_fit_auto_placementz6TestSpatialInventoryGrid.test_first_fit_auto_placementl   s©   € ð Œm×*Ò*°¸1Ð*Ñ=Ô=ˆØ×Ò˜˜fÑ%Ô%Ð%õ ¨°tÀ(ÕV^ÔVeÐfÑfÔfˆØŒ× Ò  ¨!¨q¸À!Ð ÑDÔDÐDð ”=×/Ò/°aÀÐ/ÑBÔBˆØ×Ò˜ 6Ñ*Ô*Ð*Ð*Ð*r   c                 óò  — t          dddt          j        ¬¦  «        }| j                             |dddd¬¦  «         |                      | j                             d	d¦  «        ¦  «         | j                             d¦  «        }|                      ||¦  «         |  	                    | j                             dd¦  «        ¦  «         |  	                    | j                             d	d¦  «        ¦  «         d
S )z<Removing an item frees all of its occupied grid coordinates.Úsw_remrT   rU   rG   r   r"   r   r5   r   N)
r   r   r#   r   r9   r:   r<   Úremove_itemr$   r>   )r   r?   Úremoveds      r   Ú)test_remove_item_frees_all_occupied_cellszBTestSpatialInventoryGrid.test_remove_item_frees_all_occupied_cellsz   sÞ   € å¨¸$ÀXÕYaÔYhÐiÑiÔiˆØŒ× Ò  ¨!¨q¸À!Ð ÑDÔDÐDØ�Š˜œ×6Ò6°q¸!Ñ<Ô<Ñ=Ô=Ð=à”-×+Ò+¨HÑ5Ô5ˆØ×Ò˜ %Ñ(Ô(Ð(Ø×Ò˜œ×7Ò7¸¸1Ñ=Ô=Ñ>Ô>Ð>Ø×Ò˜œ×7Ò7¸¸1Ñ=Ô=Ñ>Ô>Ð>Ð>Ð>r   c                 ól  — t          dddt          j        ¬¦  «        }t          dddt          j        ¬¦  «        }t          dddt          j        ¬¦  «        }| j                             |ddd	d	¬
¦  «         | j                             |dddd¬
¦  «         | j                             |dddd¬
¦  «         | j                             ¦   «         }|                      |¦  «         | j         	                    d¦  «        }|  
                    |¦  «         |                      |j        |j        fd¦  «         dS )zFAuto-compact defragments the inventory by packing largest items first.Úr1u   Nháº«nrG   Ús1rF   Úa1u   GiÃ¡pr   r"   r5   r   r   r   é   rR   N)r   r   ÚRELICr#   r%   r   r9   Úauto_compactr:   Úget_item_placementÚassertIsNotNoner$   r6   r7   )r   Úringr?   rN   ÚsuccessÚsword_placements         r   Ú test_auto_compact_and_defragmentz9TestSpatialInventoryGrid.test_auto_compact_and_defragment…   s0  € õ  t°TÀÕT\ÔTbÐcÑcÔcˆÝ¨°dÀÕZbÔZiÐjÑjÔjˆÝ¨°dÀÕT\ÔTbÐcÑcÔcˆð 	Œ× Ò  ¨¨a°qÀÐ ÑCÔCÐCàŒ× Ò  ¨!¨q¸À!Ð ÑDÔDÐDàŒ× Ò  ¨!¨q¸À!Ð ÑDÔDÐDð ”-×,Ò,Ñ.Ô.ˆØ�Š˜Ñ Ô Ð ð œ-×:Ò:¸4Ñ@Ô@ˆØ×Ò˜_Ñ-Ô-Ð-Ø×Ò˜/Ô+¨_Ô->Ð?ÀÑHÔHÐHÐHÐHr   N)Ú__name__Ú
__module__Ú__qualname__r   r+   rC   rJ   rP   rY   r^   rk   © r   r   r   r      s�   € € € € € ðDð Dð DðEð Eð Eð$?ð ?ð ?ð0Wð Wð Wð Uð Uð Uð2+ð +ð +ð	?ð 	?ð 	?ðIð Ið Ið Ið Ir   r   Ú__main__)Ú__doc__ÚunittestÚsysÚosÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úinventory.spatial_grid_typesr   r   r   Ú inventory.spatial_inventory_gridr   Úinventory.inventory_typesr   r   Úworld.primal_stones_craftingr	   ÚTestCaser   rl   Úmainro   r   r   ú<module>r�      s,  ððð ð
 €€€Ø 
€
€
€
Ø 	€	€	€	à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \à cÐ cÐ cÐ cÐ cÐ cÐ cÐ cÐ cÐ cØ AÐ AÐ AÐ AÐ AÐ AØ =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ðHIð HIð HIð HIð HI˜xÔ0ñ HIô HIð HIðV ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   