§
    ¶.¬j±1  ã                  óè   — 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ZddlZddlmZ ddlmZmZmZmZmZ ddlmZmZmZmZmZ  G d„ dej        ¦  «        Zed	k    r ej        ¦   «          dS dS )
uŒ  AutoPOE2 - Test Suite Kiá»ƒm Chá»©ng Minimap Fog of War & Frontier Grid Exploration (Doc 69 Â§3.4).
================================================================================================
Kiá»ƒm thá»­ toÃ n diá»‡n:
1. PhÃ¢n loáº¡i sÆ°Æ¡ng mÃ¹ (Fog Cell State Classification) trÃªn cÃ¡c artifact capture thá»±c táº¿.
2. TrÃ­ch xuáº¥t mÃ©p biÃªn Frontier vÃ  thuáº­t toÃ¡n gom cá»¥m (Connected Components).
3. Cáº¯t tá»‰a ngÃµ cá»¥t Topological (Dead-End Pruning & Anti-backtracking) triá»‡t tiÃªu Ä‘i lÃ²ng vÃ²ng.
4. HÃ m tiá»‡n Ã­ch Ä‘á»‹nh tuyáº¿n Frontier vÃ  báº£o toÃ n quÃ¡n tÃ­nh di chuyá»ƒn (Frontier Momentum).
5. TiÃªu chÃ­ hoÃ n táº¥t dá»�n Map (Coverage >= 95% tiles/monsters).
6. TÆ°Æ¡ng thÃ­ch Dynamic Resolution Scaling (1080p, 1440p, Windowed 1189x891, 720p).

TuÃ¢n thá»§ nghiÃªm ngáº·t:
- Rule 5: Sá»­ dá»¥ng artifact tháº­t tá»« captures/.
- Rule 14: Quality Gate, 100% test PASS.
é    )ÚannotationsN)ÚImage)ÚExplorationGridÚExplorationTargetÚFogCellStateÚFrontierClusterÚMinimapFogExplorer)Ú	RES_1080PÚ	RES_1440PÚRES_720PÚRES_WINDOWED_DEFAULTÚ
Resolutionc                  óZ   — e Zd ZdZ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d„ZdS )ÚTestMinimapFogExplorationuf   Test suite kiá»ƒm thá»­ bá»™ nháº­n diá»‡n sÆ°Æ¡ng mÃ¹ Minimap vÃ  Ä‘á»‹nh tuyáº¿n thÃ¡m hiá»ƒm biÃªn.ÚreturnÚNonec                ó–   — t           j                             t           j                             t          ¦  «        dd¦  «        | _        d S )Nz..Úcaptures)ÚosÚpathÚjoinÚdirnameÚ__file__Úcaptures_dir)Úselfs    ú:C:\Projects\AutoPOE2\tests\test_minimap_fog_exploration.pyÚsetUpzTestMinimapFogExploration.setUp+   s0   € ÝœGŸLšL­¬¯ª½Ñ)BÔ)BÀDÈ*ÑUÔUˆÔÐÐó    c                ó:  — t           j                             | j        d¦  «        }t           j                             |¦  «        s|                      d|› �¦  «         t          j        |¦  «        }t          dddd¬¦  «        }| 	                    |¦  «         t          j        |j        t          j        k    ¦  «        }t          j        |j        t          j        k    ¦  «        }t          j        |j        t          j        k    ¦  «        }|j        |j        z  }|                      |d¦  «         |                      |d	d
¦  «         |                      |d	d¦  «         |t+          |¦  «        z  }|                      d|cxk    odk    nc d|d›�¦  «         dS )ui   Kiá»ƒm chá»©ng phÃ¢n loáº¡i sÆ°Æ¡ng mÃ¹ (Dark < 15) vÃ  Ä‘á»‹a hÃ¬nh trÃªn artifact tháº­t minimap_1.png.zminimap_1.pngu!   KhÃ´ng tÃ¬m tháº¥y file capture: é(   é   ç      .@g     €f@)Ú
grid_widthÚgrid_heightÚdark_thresholdÚwall_thresholdi  r   uD   Pháº£i phÃ¡t hiá»‡n vÃ¹ng sÆ°Æ¡ng mÃ¹ chÆ°a má»Ÿ trong minimap_1.pnguJ   Pháº£i phÃ¡t hiá»‡n vÃ¹ng Ä‘á»‹a hÃ¬nh Ä‘Ã£ khÃ¡m phÃ¡ trong minimap_1.pngg333333Ã?g333333ã?u'   Tá»· lá»‡ sÆ°Æ¡ng mÃ¹ báº¥t thÆ°á»�ng: z.2fN)r   r   r   r   ÚexistsÚskipTestr   Úopenr   Úload_from_minimap_imageÚnpÚsumÚcellsr   Ú
UNEXPLOREDÚEXPLOREDÚWALL_OBSTACLEÚgwÚghÚassertEqualÚassertGreaterÚfloatÚ
assertTrue)	r   Úimg_pathÚimgÚgridÚunexplored_countÚexplored_countÚ
wall_countÚtotalÚ	fog_ratios	            r   Ú3test_fog_cell_state_classification_on_real_captureszMTestMinimapFogExploration.test_fog_cell_state_classification_on_real_captures.   s€  € å”7—<’< Ô 1°?ÑCÔCˆÝŒw�~Š~˜hÑ'Ô'ð 	JØ�MŠMÐH¸hÐHÐHÑIÔIÐIåŒj˜Ñ"Ô"ˆÝ¨"¸"ÈTÐbgÐhÑhÔhˆØ×$Ò$ SÑ)Ô)Ð)õ œ6 $¤*µÔ0GÒ"GÑHÔHÐÝœ ¤
­lÔ.CÒ CÑDÔDˆÝ”V˜DœJ­,Ô*DÒDÑEÔEˆ
Ø”˜$œ'Ñ!ˆà×Ò˜ Ñ(Ô(Ð(Ø×ÒÐ+¨QÐ0vÑwÔwÐwØ×Ò˜>¨1Ð.zÑ{Ô{Ð{ð %¥u¨U¡|¤|Ñ3ˆ	Ø�Š˜ 	Ð1Ð1Ò1Ð1¨TÒ1Ð1Ð1Ð1Ð3lÐ]fÐ3lÐ3lÐ3lÑmÔmÐmÐmÐmr   c           
     óÚ  — t          dd¬¦  «        }t          j        |j        dd…dd…f<   t          j        |j        dd…dd…f<   |                     ¦   «         }|                      t          |¦  «        d¦  «         |D ]#\  }}|                      |dd|› d|› d�¦  «         Œ$|                     |¦  «        }|                      t          |¦  «        d	¦  «         |                      |d
         j	        d¦  «         |  
                    |d
         j        d
         d¦  «         |  
                    |d
         j        d	         d¦  «         |                      |d
         j        d¦  «         dS )uw   Kiá»ƒm chá»©ng tÃ­nh báº¥t biáº¿n cá»§a Frontier: Ã” explored tiáº¿p giÃ¡p unexplored Ä‘Æ°á»£c nhÃ³m cá»¥m chÃ­nh xÃ¡c.é   ©r#   r$   Né
   é	   õ   Ã” (ú, u$   ) pháº£i náº±m táº¡i cá»™t biÃªn x=9é   r   g      "@g      #@ç        )r   r   r/   r-   r.   Úextract_frontier_cellsr3   ÚlenÚcluster_frontiersÚsizeÚassertAlmostEqualÚcenter_gridr4   Úinformation_gain)r   r9   Ú	frontiersÚxÚyÚclusterss         r   Ú2test_frontier_extraction_and_clustering_invariantszLTestMinimapFogExploration.test_frontier_extraction_and_clustering_invariantsF   sr  € õ ¨"¸"Ð=Ñ=Ô=ˆÝ)Ô2ˆŒ
�1�1�1�c�r�c�6ÑÝ)Ô4ˆŒ
�1�1�1�b�c�c�6Ñà×/Ò/Ñ1Ô1ˆ	à×Ò�˜Y™œ¨Ñ,Ô,Ð,Øð 	Xð 	X‰DˆAˆqØ×Ò˜Q Ð#V¨!Ð#VÐ#V¨qÐ#VÐ#VÐ#VÑWÔWÐWÐWð ×)Ò)¨)Ñ4Ô4ˆØ×Ò�˜X™œ¨Ñ*Ô*Ð*Ø×Ò˜ !œÔ)¨2Ñ.Ô.Ð.Ø×Ò˜x¨œ{Ô6°qÔ9¸3Ñ?Ô?Ð?Ø×Ò˜x¨œ{Ô6°qÔ9¸3Ñ?Ô?Ð?Ø×Ò˜8 Aœ;Ô7¸Ñ=Ô=Ð=Ð=Ð=r   c           
     ó  — t          dd¬¦  «        }|j                             t          j        ¦  «         t          dd¦  «        D ]*}t          d¦  «        D ]}t          j        |j        ||f<   ŒŒ+t          dd¦  «        D ]}t          j        |j        d|f<   Œ|                     ¦   «         }|                      |d¦  «         t          dd¦  «        D ])}|  	                    |j
        d|f         d|› d	�¦  «         Œ*t          dd¦  «        D ]>}t          d
¦  «        D ],}|                      |j
        ||f         d|› d|› d�¦  «         Œ-Œ?|                     ¦   «         }|D ](\  }}|                      |j
        ||f         d¦  «         Œ)dS )ux   Kiá»ƒm chá»©ng giáº£i thuáº­t cáº¯t tá»‰a ngÃµ cá»¥t: Cháº·n Ä‘á»©ng viá»‡c bot quay Ä‘áº§u vÃ o ngÃµ Ä‘Ã£ dá»�n sáº¡ch.rA   rB   é   é   rC   é   é   rE   u'   , 5) pháº£i bá»‹ cáº¯t tá»‰a ngÃµ cá»¥té   u   PhÃ²ng chÃ­nh (rF   u   ) khÃ´ng Ä‘Æ°á»£c bá»‹ tá»‰au8   Frontier khÃ´ng Ä‘Æ°á»£c chá»©a Ã´ ngÃµ cá»¥t Ä‘Ã£ tá»‰aN)r   r-   Úfillr   r0   Úranger/   Úprune_dead_endsr3   r6   Ú	dead_endsÚassertFalserI   )r   r9   rR   rQ   ÚprunedrP   ÚfxÚfys           r   Ú3test_dead_end_topological_pruning_anti_backtrackingzMTestMinimapFogExploration.test_dead_end_topological_pruning_anti_backtracking[   sà  € õ ¨"¸"Ð=Ñ=Ô=ˆØŒ
�Š�Ô2Ñ3Ô3Ð3õ �q˜!‘”ð 	9ð 	9ˆAÝ˜1‘X”Xð 9ð 9�Ý#/Ô#8�”
˜1˜a˜4Ñ Ð ð9õ �q˜"‘”ð 	5ð 	5ˆAÝ+Ô4ˆDŒJ�q˜!�tÑÐð ×%Ò%Ñ'Ô'ˆØ×Ò˜ Ñ#Ô#Ð#õ �q˜"‘”ð 	eð 	eˆAØ�OŠO˜DœN¨1¨a¨4Ô0Ð2c¸Ð2cÐ2cÐ2cÑdÔdÐdÐdõ �q˜!‘”ð 	oð 	oˆAÝ˜1‘X”Xð oð o�Ø× Ò  ¤°°1°Ô!5Ð7mÈÐ7mÐ7mÈaÐ7mÐ7mÐ7mÑnÔnÐnÐnðoð ×/Ò/Ñ1Ô1ˆ	Øð 	qð 	q‰FˆB�Ø×Ò˜Tœ^¨B°¨FÔ3Ð5oÑpÔpÐpÐpð	qð 	qr   c                óú   — t          dd¬¦  «        }d}d}t          ddgddd	d
¬¦  «        }t          ddgddd	d
¬¦  «        }|                     ||g||¬¦  «        \  }}|                      |j        dd¦  «         dS )ur   Kiá»ƒm chá»©ng hÃ m tiá»‡n Ã­ch: Æ¯u tiÃªn giá»¯ hÆ°á»›ng di chuyá»ƒn (Momentum) vÃ  pháº¡t quay Ä‘áº§u 180 Ä‘á»™.é   rB   ©r"   r"   )ç      ð?rH   r   )é   é   )g      9@r"   rX   g      4@rH   ©Ú
cluster_idr-   rN   rL   rO   Úavg_visit_countrG   )rX   ri   )ç      @r"   ©Úplayer_grid_xyÚ
player_velu=   Frontier Momentum pháº£i Æ°u tiÃªn hÆ°á»›ng Ä‘ang di chuyá»ƒnN©r	   r   Úselect_best_frontierr3   rk   )r   ÚexplorerÚ
player_posÚplayer_vel_eastÚcluster_eastÚcluster_westÚbest_clÚutilitys           r   Ú'test_frontier_momentum_utility_functionzATestMinimapFogExploration.test_frontier_momentum_utility_function}   sÅ   € å%°ÀÐDÑDÔDˆà!ˆ
Ø$ˆõ 'ØØ�*Ø$ØØ!Øð
ñ 
ô 
ˆõ 'ØØ�)Ø#ØØ!Øð
ñ 
ô 
ˆð $×8Ò8Ø˜<Ð(Ø%Ø&ð 9ñ 
ô 
Ñˆ�ð 	×Ò˜Ô+¨QÐ0oÑpÔpÐpÐpÐpr   c                óö   — t          dd¬¦  «        }d}t          ddgdddd	¬
¦  «        }t          ddgdddd¬
¦  «        }|                     ||g|d¬¦  «        \  }}|                      |j        dd¦  «         dS )uv   Kiá»ƒm chá»©ng báº£n Ä‘á»“ nhiá»‡t: Pháº¡t náº·ng cá»¥m Ä‘Ã£ dáº«m chÃ¢n nhiá»�u láº§n, triá»‡t tiÃªu Ä‘i lÃ²ng vÃ²ng.re   rB   rf   r   )é   ri   )g      2@r"   rX   g      $@rm   rj   rG   )é   ri   )g      6@r"   r"   rH   )rH   rH   rn   uM   Báº£n Ä‘á»“ nhiá»‡t pháº£i chuyá»ƒn hÆ°á»›ng bot sang cá»¥m chÆ°a dáº«m chÃ¢nNrq   )r   rs   rt   Úcluster_visitedÚcluster_freshrx   Ú_s          r   Ú+test_visit_heatmap_penalty_prevents_loopingzETestMinimapFogExploration.test_visit_heatmap_penalty_prevents_looping¡   sÎ   € å%°ÀÐDÑDÔDˆØ!ˆ
õ *ØØ�*Ø$ØØ!Øð
ñ 
ô 
ˆõ (ØØ�*Ø$ØØ!Øð
ñ 
ô 
ˆð ×2Ò2Ø˜mÐ,Ø%Ø!ð 3ñ 
ô 
‰
ˆ�ð 	×Ò˜Ô+¨QÐ0ñ  	Aô  	Að  	Að  	Að  	Ar   c                ó  — t          dd¬¦  «        }|j                             t          j        ¦  «         t          j        |j        ddd…f<   |                     ¦   «         }|                      |dd¬¦  «         |                      |d	¦  «         t          ddd	¬
¦  «        }t          j        ddt          j        ¬¦  «        }d|dd…dd…f<   |                     |¦  «        }|                      |j        p
|j        d	k    ¦  «         dS )uK   Kiá»ƒm chá»©ng tiÃªu chÃ­ hoÃ n thÃ nh dá»�n báº£n Ä‘á»“ (Coverage >= 95%).rC   rB   r   NrV   g¸…ëQ¸î?é   )Úplacesgffffffî?)r#   r$   Útarget_coverage)éd   r†   é2   ©Údtyper    )r   r-   r[   r   r/   r.   Úget_coverage_ratiorM   ÚassertGreaterEqualr	   r+   ÚfullÚuint8Úanalyze_minimap_and_router6   Úis_fully_exploredÚcoverage_ratio)r   r9   Úcovrs   Úfake_imgÚtargets         r   Ú0test_map_completion_criteria_95_percent_coveragezJTestMinimapFogExploration.test_map_completion_criteria_95_percent_coverageÂ   s  € å¨"¸"Ð=Ñ=Ô=ˆàŒ
�Š�Ô-Ñ.Ô.Ð.Ý(Ô3ˆŒ
�1�b�q�b�5Ñà×%Ò%Ñ'Ô'ˆØ×Ò˜s D°ÐÑ3Ô3Ð3Ø×Ò  TÑ*Ô*Ð*õ &°ÀÐUYÐZÑZÔZˆå”7˜: rµ´Ð:Ñ:Ô:ˆØˆ��!��S�b�S�Ñà×3Ò3°HÑ=Ô=ˆØ�Š˜Ô0ÐQ°FÔ4IÈTÒ4QÑRÔRÐRÐRÐRr   c                óê  — t           t          t          t          g}t	          j        ddt          j        ¬¦  «        }d|dd…dd…f<   |D �](}t          dd|¬¦  «        }|                     |¦  «        }|j	        \  }}|  
                    |d	d
|› d|› �¦  «         |                      ||j        d
|› d|j        › �¦  «         |  
                    |d	d|› d|› �¦  «         |                      ||j        d|› d|j        › �¦  «         |j        \  }}	}
}|                      ||cxk    o|
k    nc d|› d|› d|
› d|› �¦  «         |                      |	|cxk    o|k    nc d|› d|	› d|› d|› �¦  «         �Œ*dS )up   Kiá»ƒm chá»©ng tÃ­nh tÆ°Æ¡ng thÃ­ch vá»›i Dynamic Resolution Scaler trÃªn 1080p, 1440p, Windowed 1189x891, 720p.)i  i�  r    rˆ   rX   Ni,  r!   ©r#   r$   Útarget_resolutionr   u   Tá»�a Ä‘á»™ X (u   ) pháº£i dÆ°Æ¡ng trÃªn res u    ) khÃ´ng Ä‘Æ°á»£c vÆ°á»£t width u   Tá»�a Ä‘á»™ Y (u!   ) khÃ´ng Ä‘Æ°á»£c vÆ°á»£t height zsx=u"    pháº£i náº±m trong bounding box [rF   u   ] trÃªn res=zsy=)r
   r   r   r   r+   rŒ   r�   r	   rŽ   Útarget_screen_xyr4   Ú
assertLessÚwidthÚheightÚminimap_screen_bboxr6   )r   ÚresolutionsÚfake_minimapÚresrs   r“   ÚsxÚsyÚbx1Úby1Úbx2Úby2s               r   Ú-test_dynamic_resolution_scaling_compatibilityzGTestMinimapFogExploration.test_dynamic_resolution_scaling_compatibilityÖ   s  € õ ÝÝ Ýð	
ˆõ ”w˜z¨2µR´XÐ>Ñ>Ô>ˆØ !ˆ�Q�Q�Q˜˜˜�WÑàð 	ñ 	ˆCÝ)°RÀRÐ[^Ð_Ñ_Ô_ˆHØ×7Ò7¸ÑEÔEˆFð Ô,‰FˆB�Ø×Ò˜r 1Ð&\¸Ð&\Ð&\ÐWZÐ&\Ð&\Ñ]Ô]Ð]Ø�OŠO˜B ¤	Ð+l¸RÐ+lÐ+lÐadÔajÐ+lÐ+lÑmÔmÐmØ×Ò˜r 1Ð&\¸Ð&\Ð&\ÐWZÐ&\Ð&\Ñ]Ô]Ð]Ø�OŠO˜B ¤
Ð,o¸bÐ,oÐ,oÐcfÔcmÐ,oÐ,oÑpÔpÐpð "*Ô!=ÑˆC��c˜3Ø�OŠOØ�rÐ Ð Ò Ð ˜SÒ Ð Ð Ð ØY�bÐYÐY¸CÐYÐYÀ3ÐYÐYÐTWÐYÐYñô ð ð �OŠOØ�rÐ Ð Ò Ð ˜SÒ Ð Ð Ð ØY�bÐYÐY¸CÐYÐYÀ3ÐYÐYÐTWÐYÐYñô ð ñ ð#	ð 	r   c                óÄ  — t           j                             | j        d¦  «        }t           j                             |¦  «        s|                      d|› �¦  «         t          j        |¦  «        }t          ddt          ¬¦  «        }| 
                    |dd¬¦  «        }|                      |t          ¦  «         |                      |j        d	¦  «         |                      |j        t           ¦  «         |                      t%          |j        ¦  «        d
¦  «         t'          j        |j        Ž }|                      |dk    pt-          |dz
  ¦  «        dk     ¦  «         dS )ua   Kiá»ƒm chá»©ng quy trÃ¬nh trá»�n gÃ³i End-to-End trÃªn artifact tháº­t captures/minimap_crop.png.zminimap_crop.pngu   KhÃ´ng tÃ¬m tháº¥y capture: é)   re   r–   )g     €4@r"   )rH   g      ð¿)Úplayer_grid_posÚplayer_velocityr   rƒ   rH   rg   gü©ñÒMbP?N)r   r   r   r   r'   r(   r   r)   r	   r   rŽ   ÚassertIsInstancer   r4   Úactive_clusters_countÚdirection_vectorÚtupler3   rJ   ÚmathÚhypotr6   Úabs)r   r7   r8   rs   r“   Úv_lens         r   Ú%test_end_to_end_real_minimap_pipelinez?TestMinimapFogExploration.test_end_to_end_real_minimap_pipelineù   sC  € å”7—<’< Ô 1Ð3EÑFÔFˆÝŒw�~Š~˜hÑ'Ô'ð 	EØ�MŠMÐC¸ÐCÐCÑDÔDÐDåŒj˜Ñ"Ô"ˆÝ%°ÀÕWkÐlÑlÔlˆð ×3Ò3ØØ(Ø'ð 4ñ 
ô 
ˆð 	×Ò˜fÕ&7Ñ8Ô8Ð8Ø×Ò˜6Ô7¸Ñ;Ô;Ð;Ø×Ò˜fÔ5µuÑ=Ô=Ð=Ø×Ò�˜VÔ4Ñ5Ô5°qÑ9Ô9Ð9å”
˜FÔ3Ð4ˆØ�Š˜ šÐ?­¨E°C©KÑ(8Ô(8¸4Ò(?Ñ@Ô@Ð@Ð@Ð@r   N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r?   rT   rc   rz   r�   r”   r¦   r³   © r   r   r   r   (   sð   € € € € € ØpÐpðVð Vð Vð Vðnð nð nð nð0>ð >ð >ð >ð* qð  qð  qð  qðD"qð "qð "qð "qðHAð Að Að AðBSð Sð Sð Sð(!ð !ð !ð !ðFAð Að Að Að Að Ar   r   Ú__main__) r·   Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr¯   r   ÚunittestÚnumpyr+   ÚPILr   Ú2src.assistant_tool.navigation.minimap_fog_explorerr   r   r   r   r	   Úsrc.common.coordinate_transformr
   r   r   r   r   ÚTestCaser   r´   Úmainr¸   r   r   ú<module>rÈ      sf  ððð ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ðgAð gAð gAð gAð gA Ô 1ñ gAô gAð gAðT ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   