Ë
    Fêñip7  ã                   óŽ  — d dl Z d dlmZ d dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZmZmZmZ d dlmZ d dlmZ dZg d	¢Zd
dgZddgZdUdedefd„Zej6                  j9                  ed¬«      ej6                  j;                  dde
j<                  ddeeedœfde
j<                  ddeeedœfde
j<                  ddeeedœfde
j<                  ddededœfde
j>                  ddej@                  eeddœfde
j>                  ddej@                  eeedœfde
jB                  ddeeedœfd e
jD                  ddeeedœfd!e
jF                  d"dd#eed$d%œfd&e
jF                  d"dd'eed$d%œfd(e
jF                  d"dd)eed$d%œfd*e
jF                  d"dd+eed$d%œfd,e
jH                  ddeeedœfd-e
jJ                  dd.d/eed0œfd1e
jL                  ddd2eed3œfd4e
jN                  ddd5ed6œfd7e
jP                  ddeed6œfd8e
jR                  ddeeedœfd9e
jT                  dd:g d;¢ed<œfd=e
jV                  dd>d?ed@dAœfdBe
jX                  ddi fg«      dC„ «       «       Z-dD„ Z.dE„ Z/dF„ Z0dG„ Z1dH„ Z2dI„ Z3dJ„ Z4dK„ Z5ej6                  j9                  e dLe› dM�¬«      ej6                  j9                  edN¬«      dO„ «       «       Z6ej6                  j9                  e dLe› dM�¬«      ej6                  j9                  edN¬«      dP„ «       «       Z7ej6                  j9                  e dLe› dM�¬«      ej6                  j9                  edN¬«      dQ„ «       «       Z8dR„ Z9dS„ Z:dT„ Z;y)Vé    N)Úpatch)ÚMODEL)Ú	solutions)Ú
ASSETS_URLÚIS_RASPBERRYPIÚTORCH_VERSIONÚchecks)Úsafe_download)Ú	TORCH_2_4F)©é
   éÈ   ©é  r   )r   é´   )r   r   r   r   )é@  r   )r   é�  Ú
video_pathÚneeds_frame_countc                 ó:  — t        j                  |«      }|j                  «       s
J d|› �«       ‚d}|j                  «       rJ|j                  «       \  }}|sn4|dz  }|j	                  «       }|r||gn|g} | |Ž }	|j                  «       rŒJ|j                  «        y)z^Process video with solution, feeding frames and optional frame count to the solution instance.zError reading video file r   é   N)Úcv2ÚVideoCaptureÚisOpenedÚreadÚcopyÚrelease)
Úsolutionr   r   ÚcapÚframe_countÚsuccessÚim0Úim_copyÚargsÚ_s
             úV/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/tests/test_solutions.pyÚprocess_videor'      s”   € ä
×
Ñ
˜:Ó
&€CØ�<‰<Œ>ÐCÐ6°z°lÐCÓCˆ>à€KØ
�,‰,Œ.Ø—x‘x“z‰ˆ�ÙØØ�qÑˆØ—(‘(“*ˆÙ):�˜Ñ%ÀÀ	ˆÙ�dˆOˆð �,‰,�.ð ‡K�K…Mó    z>Disabled for testing due to --slow test errors after YOLOE PR.)ÚreasonzAname, solution_class, needs_frame_count, video_key, kwargs_updateÚObjectCounterÚ
demo_video)ÚregionÚmodelÚshowÚObjectCounterVerticalÚvertical_videoÚObjectCounterwithOBBzyolo26n-obb.ptÚHeatmap)Úcolormapr-   r.   r,   ÚHeatmapWithRegion)r3   r,   r-   r.   ÚSpeedEstimatorÚQueueManagerÚLineAnalyticsTÚline)gš™™™™™@gš™™™™™	@)Úanalytics_typer-   r.   ÚfigsizeÚPieAnalyticsÚpieÚBarAnalyticsÚbarÚAreaAnalyticsÚareaÚ	TrackZoneÚObjectCropperÚ
crop_videozcropped-detections)Útemp_crop_dirr-   r.   ÚObjectBlurrerg{®Gáz”?)Ú
blur_ratior-   r.   ÚInstanceSegmentationúyolo26n-seg.pt)r-   r.   Ú	VisionEyeÚRegionCounterÚAIGymÚ
pose_video)é   é   r   )Úkptsr.   ÚParkingManagerÚparking_videoÚparking_modelÚparking_areas)r-   r.   Ú	json_fileÚStreamlitInferencec                 óÂ  — |rt         ||«      «      nd}i }|j                  «       D ]q  \  }	}
|	j                  d«      r"t        ||
z  «      ||	j                  dd«      <   Œ9|
dk(  rt         |d«      «      ||	<   ŒS|
dk(  rt         |d«      «      ||	<   Œm|
||	<   Œs | dk(  r+t	        j
                  «       r |di |¤Žj                  «        yt         |di |¤Ž||¬«       y)	zTTest individual Ultralytics solution with video processing and parameter validation.NÚtemp_Ú rR   rS   rU   )r   r   r   © )ÚstrÚitemsÚ
startswithÚreplacer	   Úcheck_imshowÚ	inferencer'   )ÚnameÚsolution_classr   Ú	video_keyÚkwargs_updateÚtmp_pathÚsolution_assetsr   ÚkwargsÚkeyÚvalues              r&   Útest_solutionri   ,   sì   € ñT 5>”‘_ YÓ/Ô0À4€Jð €FØ#×)Ñ)Ó+ò  ‰
ˆˆUØ�>‰>˜'Ô"Ü/2°8¸eÑ3CÓ/DˆF�3—;‘;˜w¨Ó+Ò,Ø�oÒ%Ü™o¨oÓ>Ó?ˆF�3ŠKØ�oÒ%Ü™o¨oÓ>Ó?ˆF�3ŠKàˆF�3ŠKð ð Ð#Ò#Ü×ÑÔ ÙÑ$˜VÑ$×.Ñ.Ô0ØäÙÑ) &Ñ)ØØ+ör(   c                  óÜ   — t        j                  «       } g d¢gdgc| _        | _        | j	                  t
        j                  dddd«       d| j                  v sJ d| j                  › �«       ‚y)z=Test distance calculation left click selection functionality.©r   r   é2   rl   r   é   Nz+Expected track_id 1 in selected_boxes, got )r   ÚDistanceCalculationÚboxesÚ	track_idsÚmouse_event_for_distancer   ÚEVENT_LBUTTONDOWNÚselected_boxes©Údcs    r&   Útest_left_click_selectionrv   Ð   sj   € ä	×	&Ñ	&Ó	(€BÚ.Ð/°!°Ð€B„HˆbŒlØ×Ñ¤× 5Ñ 5°r¸2¸tÀTÔJØ�×!Ñ!Ñ!ÐdÐ%PÐQS×QbÑQbÐPcÐ#dÓdÑ!r(   c                  ó  — t        j                  «       } dg d¢idc| _        | _        | j	                  t
        j                  dddd«       | j                  rJ d| j                  › �«       ‚| j                  dk(  sJ d| j                  › �«       ‚y)z:Test distance calculation right click reset functionality.r   rk   r   Nz/Expected empty selected_boxes after reset, got z-Expected left_mouse_count=0 after reset, got )r   rn   rs   Úleft_mouse_countrq   r   ÚEVENT_RBUTTONDOWNrt   s    r&   Útest_right_click_resetrz   Ø   s‘   € ä	×	&Ñ	&Ó	(€BØ./Ò1AÐ-BÀAÐ*€BÔ�rÔ*Ø×Ñ¤× 5Ñ 5°q¸!¸TÀ4ÔHØ× Ò ÐgÐ$SÐTV×TeÑTeÐSfÐ"gÓgÐ Ø×Ñ !Ò#ÐjÐ'TÐUW×UhÑUhÐTiÐ%jÓjÑ#r(   c                  óÔ   — t        j                  dt         j                  ¬«      } 	 t        j                  d¬«      } || «       y# t
        $ r t        j                  d«       Y yw xY w)z<Test that ParkingManagement handles missing JSON gracefully.©é€  éà  é   ©ÚdtypeN)Ú	json_pathz"Skipping test due to missing JSON.)ÚnpÚzerosÚuint8r   ÚParkingManagementÚ
ValueErrorÚpytestÚskip)r"   Úparkingmanagers     r&   Útest_parking_json_noner‹   á   sO   € ä
�(‰(�=¬¯©Ô
1€Cð:Ü"×4Ñ4¸tÔDˆÙ�sÕøÜò :Ü�‰Ð8Ö9ð:ús   §A ÁA'Á&A'c                  ó  — 	 t        j                  d¬«      } | j                  t        j                  dt        j
                  ¬«      d¬«       J d«       ‚# t        $ r!}dt        |«      v s
J d	|› �«       ‚Y d
}~y
d
}~ww xY w)z7Test that unsupported analytics type raises ValueError.Útest©r9   r|   r€   r   )r"   Úframe_numberz.Expected ValueError for unsupported chart typezUnsupported analytics_typez5Expected 'Unsupported analytics_type' in error, got: N)r   Ú	AnalyticsÚprocessrƒ   r„   r…   r‡   rZ   )Ú	analyticsÚes     r&   Ú"test_analytics_graph_not_supportedr”   ë   sy   € ðsÜ×'Ñ'°vÔ>ˆ	Ø×ÑœbŸh™h }¼B¿H¹HÔEÐTUÐÔVØFÐFÓFˆuøÜò sØ+¬s°1«vÑ5ÐrÐ9nÐopÐnqÐ7rÓrÕ5ûðsús   ‚AA Á	A?ÁA:Á:A?c                  óœ   — t        j                  d¬«      } | j                  dddid¬«       | j                  ddddœd¬«      }|€J d
«       ‚y	)z>Test area chart graph update with dynamic class padding logic.r@   rŽ   r   Úcaré   )r�   Ú
count_dictÚplotr   )r–   ÚpersonNzArea chart plot returned None)r   r�   Úupdate_graph)r’   Úplot_ims     r&   Útest_area_chart_paddingr�   õ   s[   € ä×#Ñ#°6Ô:€IØ×Ñ¨°u¸a°jÀvÐÔNØ×$Ñ$°!ÈÐUVÑ@WÐ^dÐ$Óe€GØÐÐ?Ð ?Ó?Ñr(   c                  óÌ   — t         j                  j                  «       } 	 | j                  d¬«       J d«       ‚# t        $ r!}dt        |«      v s
J d|› �«       ‚Y d}~yd}~ww xY w)z=Test that update() raises ValueError for invalid config keys.é{   )Úinvalid_keyz/Expected ValueError for invalid update argumentz is not a valid solution argumentz(Expected validation error message, got: N)r   ÚconfigÚSolutionConfigÚupdater‡   rZ   )Úobjr“   s     r&   Ú/test_config_update_method_with_invalid_argumentr¥   ý   sh   € ä
×
Ñ
×
)Ñ
)Ó
+€CðlØ�
‰
˜sˆ
Ô#ØGÐGÓGˆuøÜò lØ1´S¸³VÑ;ÐkÐ?gÐhiÐgjÐ=kÓkÕ;ûðlús    9 ¹	A#ÁAÁA#c                  ó°   — t        j                  dt         j                  ¬«      } t        j                  d¬«      } || «      }|j
                  €J d«       ‚y)z<Test that instance segmentation handles cases with no masks.r|   r€   rH   )r-   Nz(Instance segmentation plot returned None)rƒ   r„   r…   r   rG   rœ   )r"   ÚisegmentÚresultss      r&   Útest_plot_with_no_masksr©     sF   € ä
�(‰(�=¬¯©Ô
1€CÜ×-Ñ-Ð4DÔE€HÙ�s‹m€GØ�?‰?Ð&ÐRÐ(RÓRÑ&r(   c                  ó2  — ddl } | j                  d«      }|j                  |_        |�V| j                  |j                  «       «      }t	        dd«      5 }|j                  |j                  «       «       ddd«       d}nd}|dk(  s
J d|› �«       ‚t        j                  j                  d«      sJ d«       ‚t	        dd«      5 }|j                  «       }|dk(  s
J d	|› �«       ‚	 ddd«       t        j                  d«       y# 1 sw Y   ŒŽxY w# 1 sw Y   Œ+xY w)
z7Test Streamlit video upload logic saves file correctly.r   Ns   fake video contentzultralytics.mp4Úwbz,Expected output_path 'ultralytics.mp4', got z ultralytics.mp4 file not createdÚrbzFile content mismatch: )
ÚioÚBytesIOÚgetvaluer   ÚopenÚwriteÚosÚpathÚexistsÚremove)r­   Ú	fake_fileÚgÚoutÚoutput_pathÚfÚcontents          r&   Ú/test_streamlit_handle_video_upload_creates_filer¼     s  € ãà—
‘
Ð0Ó1€IØ×'Ñ'€I„NØÐØ�J‰J�y—~‘~Ó'Ó(ˆÜÐ# TÓ*ð 	 ¨cØ�I‰I�a—f‘f“hÔ÷	 à'‰àˆØÐ+Ò+ÐiÐ/[Ð\gÐ[hÐ-iÓiÐ+Ü�7‰7�>‰>Ð+Ô,ÐPÐ.PÓPÐ,Ü	Ð Ó	&ð U¨!Ø—&‘&“(ˆØÐ/Ò/ÐTÐ3JÈ7È)Ð1TÓTÑ/÷Uô ‡I�IÐÕ ÷	 ð 	 ú÷Uð Uús   Á DÃ DÄD
ÄDz1VisualAISearch requires torch>=2.4 (found torch==ú)z1Disabled due to slow performance on Raspberry Pi.c                 ó€   — t        t        › d�| ¬«       t        j                  t	        | dz  «      ¬«      } |d«      }y)zBTest similarity search solution with sample images and text query.z/4-imgs-similaritysearch.zip)Údirz4-imgs-similaritysearch©Údataza dog sitting on a benchN)r
   r   r   ÚVisualAISearchrZ   )rd   Úsearcherr%   s      r&   Útest_similarity_searchrÄ   $  s<   € ô ”Z�LÐ <Ð=À8ÕLÜ×'Ñ'¬S°Ð<UÑ1UÓ-VÔW€HÙÐ+Ó,�Ar(   c                  óh   — t        j                  d¬«      } t        | d«      sJ ‚t        | d«      sJ ‚y)z4Test SearchApp initializes with required attributes.Úcpu)ÚdevicerÃ   ÚrunN)r   Ú	SearchAppÚhasattr)Úapps    r&   Útest_similarity_search_app_initrÌ   -  s4   € ô ×
Ñ
 UÔ
+€CÜ�3˜
Ô#Ð#Ð#Ü�3˜ÔÐÑr(   c           
      ó„  — ddl m} | dz  }t        j                  |d¬«       t	        d«      D ]`  }|j                  t        j                  t        j                  j                  ddd«      d	z  «      «      }|j                  |d
|› d�z  «       Œb t        j                  t        |«      ¬«      } |d«      }|sJ d«       ‚y)z<Test VisualAISearch end-to-end with sample images and query.r   )ÚImageÚimagesT)Úexist_okr—   éà   r   éÿ   Útest_image_z.jpgrÀ   za red and white objectz(Similarity search returned empty resultsN)ÚPILrÎ   r²   ÚmakedirsÚrangeÚ	fromarrayrƒ   r…   ÚrandomÚrandÚsaver   rÂ   rZ   )rd   rÎ   Ú	image_dirÚiÚimgrÃ   r¨   s          r&   Útest_similarity_search_completerÞ   6  s¨   € õ à˜8Ñ#€IÜ‡K�K�	 DÕ)Ü�1‹Xò 4ˆØ�o‰oœbŸh™h¤r§y¡y§~¡~°c¸3ÀÓ'BÀSÑ'HÓIÓJˆØ�‰�˜{¨1¨#¨TÐ2Ñ2Õ3ð4ô ×'Ñ'¬S°«^Ô<€HÙÐ/Ó0€GÙÐ>Ð>Ó>‰7r(   c                  óø  — ddl m}  t        j                  «       }g d¢g d¢gddgddgddgf\  |_        |_        |_        |_        |j                  d   |j                  d   d	œ|_        t        j                  d
t        j                  ¬«      }t        j                  |d«      5  t        j                  |d«      5  t        d«      5  |j                  |«      }ddd«       ddd«       ddd«       t        | «      sJ dt!        |«      › �«       ‚|j"                  dk(  sJ d|j"                  › �«       ‚|j$                  dkD  sJ d|j$                  › �«       ‚y# 1 sw Y   ŒxY w# 1 sw Y   ŒƒxY w# 1 sw Y   Œ‡xY w)zLTest DistanceCalculation.process() computes distance between selected boxes.r   )ÚSolutionResults)éd   rá   r   r   )é,  râ   r   r   r   r—   gÍÌÌÌÌÌì?gffffffî?)r   r—   )r~   r}   r   r€   Úextract_tracksÚdisplay_outputzcv2.setMouseCallbackNzExpected SolutionResults, got zExpected 2 tracks, got z Expected positive distance, got )Úultralytics.solutions.solutionsrà   r   rn   ro   rp   ÚclssÚconfsrs   rƒ   r„   r…   r   Úobjectr‘   Ú
isinstanceÚtypeÚtotal_tracksÚpixels_distance)rà   ru   ÚframeÚresults       r&   Ú(test_distance_calculation_process_methodrï   F  sd  € å?ä	×	&Ñ	&Ó	(€Bâ	Ò3Ð4Ø	
ˆAˆØ	
ˆAˆØ	ˆdˆð	1Ñ-€B„HˆbŒl˜BœG R¤Xð ŸH™H Q™K¨B¯H©H°Q©KÑ8€BÔÜ�H‰H�]¬"¯(©(Ô3€EÜ	�‰�bÐ*Ó	+ñ #¬U¯\©\¸"Ð>NÓ-Oñ #ÔQVÐWmÓQnñ #Ø—‘˜EÓ"ˆ÷#÷ #÷ #ä�f˜oÔ.Ð_Ð2PÔQUÐV\ÓQ]ÐP^Ð0_Ó_Ð.Ø×Ñ !Ò#ÐTÐ'>¸v×?RÑ?RÐ>SÐ%TÓTÐ#Ø×!Ñ! AÒ%ÐbÐ)IÈ&×J`ÑJ`ÐIaÐ'bÓbÑ%÷	#ð #ú÷ #ð #ú÷ #ð #ús<   Â%E0Â<E$ÃEÃE$Ã"E0ÅE!ÅE$Å$E-	Å)E0Å0E9c                  ó0   — t        j                  d¬«       y)z@Test ObjectCropper init with show=True to cover display warning.T©r.   N)r   rB   rY   r(   r&   Útest_object_crop_with_show_Truerò   Z  s   € ä×Ñ Ö&r(   c                  óà  — t        j                  d¬«      } d| _        t        j                  dt        j
                  ¬«      }t        d«      5 }t        dt        d«      ¬«      5 }t        d	«      5 }| j                  |«       |j                  «        |j                  «        |j                  «        d
d
d
«       d
d
d
«       d
d
d
«       y
# 1 sw Y   ŒxY w# 1 sw Y   ŒxY w# 1 sw Y   y
xY w)zVTest that display_output triggers imshow, waitKey, and destroyAllWindows when enabled.Trñ   )rá   rá   r   r€   z
cv2.imshowzcv2.waitKeyÚq)Úreturn_valuezcv2.destroyAllWindowsN)
r   r*   Ú	env_checkrƒ   r„   r…   r   Úordrä   Úassert_called_once)Úcounterrí   Úmock_imshowÚ	mock_waitÚmock_destroys        r&   Útest_display_output_methodrý   _  sÉ   € ä×%Ñ%¨4Ô0€GØ€GÔÜ�H‰H�]¬"¯(©(Ô3€EÜ	ˆ|Ó	ð * ¬U°=ÌsÐSVËxÔ-Xð *Ð\eÔglØóhð *à	Ø×Ñ˜uÔ%Ø×&Ñ&Ô(Ø×$Ñ$Ô&Ø×'Ñ'Ô)÷*÷ *÷ *÷ *ñ *ú÷ *ð *ú÷ *ð *ús=   ÁC$Á%CÁ1ACÂ3CÂ;C$ÃCÃCÃC!	ÃC$Ã$C-)F)<r²   Úunittest.mockr   r   Únumpyrƒ   rˆ   Útestsr   Úultralyticsr   Úultralytics.utilsr   r   r   r	   Úultralytics.utils.downloadsr
   Úultralytics.utils.torch_utilsr   ÚSHOWÚREGIONÚHORIZONTAL_LINEÚVERTICAL_LINErZ   Úboolr'   ÚmarkÚskipifÚparametrizer*   r2   ÚCOLORMAP_PARULAr5   r6   r�   rA   rB   rE   rG   rI   rJ   rK   r†   Ú	Inferenceri   rv   rz   r‹   r”   r�   r¥   r©   r¼   rÄ   rÌ   rÞ   rï   rò   rý   rY   r(   r&   ú<module>r     sÄ  ðó 
Ý ã 
Û Û å Ý !ß OÓ OÝ 5Ý 3ð €Ú	7€Ø˜jÐ)€Ø˜:Ð&€ñ¨ð Àó ð$ ‡�×Ñ�NÐ+kÐÓlØ‡�×ÑØGð Ø×#Ñ#ØØØ¨°tÑ<ð	
ð Ø×#Ñ#ØØØ&°ÀÑEð	
ð $Ø×#Ñ#ØØØ$¨u¸dÑCð	
ð #Ø×#Ñ#ØØØÐ(8À$ÑGð	
ð Ø×ÑØØØ×,Ñ,°uÀdÐVZÑ[ð	
ð  Ø×ÑØØØ×,Ñ,¸ÈÐX\Ñ]ð	
ð Ø×$Ñ$ØØØ¨°tÑ<ð	
ð Ø×"Ñ"ØØØ¨°tÑ<ð	
ð Ø×ÑØØØ%°¸tÐPZÑ[ð	
ð Ø×ÑØØØ$¨u¸dÈzÑZð	
ð Ø×ÑØØØ$¨u¸dÈzÑZð	
ð Ø×ÑØØØ%°¸tÐPZÑ[ð	
ð 
�i×)Ñ)¨5°,È6Ð\aÐkoÑ@pÐqàØ×#Ñ#ØØØ2¸UÈDÑQð	
ð Ø×#Ñ#ØØØ¨%¸Ñ>ð	
ð #Ø×*Ñ*ØØØ&°Ñ5ð	
ð 
�i×)Ñ)¨5°,È%ÐY]Ñ@^Ð_àØ×#Ñ#ØØØ¨°tÑ<ð	
ð 
�)—/‘/ 5¨,ÂÐUYÑ8ZÐ[àØ×'Ñ'ØØØ%¨tÀ/ÑRð	
ð !Ø×ÑØØØð	
ðwBóEñLóMEó mðNò:eòkò:òsò@òlòSò!ð* ‡�×Ñ˜	�MÐ,]Ð^kÐ]lÐlmÐ*nÐÓoØ‡�×Ñ�NÐ+^ÐÓ_ñ-ó `ó pð-ð ‡�×Ñ˜	�MÐ,]Ð^kÐ]lÐlmÐ*nÐÓoØ‡�×Ñ�NÐ+^ÐÓ_ñó `ó pðð ‡�×Ñ˜	�MÐ,]Ð^kÐ]lÐlmÐ*nÐÓoØ‡�×Ñ�NÐ+^ÐÓ_ñ?ó `ó pð?òcò('ó
*r(   