
    hh4                        S SK r S SKJr  S SKrS SKrS SKrS SKJrJ	r	  S SK
Jr  S SKJrJrJrJr  S SKJr  S SKJr  SrS	rS
rSrSrSrSrSr/ SQrSS/rSS/rS\R@                  S\\\\S.4S\R@                  S\\\\S.4S\R@                  S\\\\S.4S\R@                  S\\S\S.4S\RB                  S\\RD                  \\SS.4S\RB                  S\\RD                  \\\S.4S\RF                  S\\\\S.4S\RH                  S\\\\S.4S \RJ                  S!\S"\\S#S$.4S%\RJ                  S!\S&\\S#S$.4S'\RJ                  S!\S(\\S#S$.4S)\RJ                  S!\S*\\S#S$.4S+\RL                  S\\\\S.4S,\RN                  S\\(" \	S--  5      \\S..4S/\RR                  S\S0\\S1.4S2\RT                  S\S3\S4.4S5\RV                  S\\\S4.4S6\RX                  S\\\\S.4S7\RZ                  S\/ S8Q\S9.4S:\R\                  S\\(" \	\-  5      \\(" \	\-  5      S;.4S<\R^                  SS0 4/r0SUS=\(S>\14S? jjr2\Rf                  Ri                  \S@SA9\Rf                  Rk                  SB\05      SC 5       5       r6SD r7SE r8SF r9SG r:SH r;SI r<SJ r=SK r>\Rf                  Ri                  \(       + SL\ SM3SA9\Rf                  Ri                  \SNSA9SO 5       5       r?\Rf                  Ri                  \(       + SL\ SM3SA9\Rf                  Ri                  \SNSA9SP 5       5       r@\Rf                  Ri                  \(       + SL\ SM3SA9\Rf                  Ri                  \SNSA9SQ 5       5       rASR rBSS rCST rDg)V    N)patch)MODELTMP)	solutions)
ASSETS_URLIS_RASPBERRYPITORCH_VERSIONchecks)safe_download)	TORCH_2_4Fzsolutions_ci_demo.mp4zdecelera_landscape_min.movzsolution_ci_pose_demo.mp4zsolution_ci_parking_demo.mp4zsolution_ci_parking_areas.jsonzsolutions_ci_parking_model.ptzsolution_vertical_demo.mp4)
        r   )r      )r   r   r   r   )@  r   )r     ObjectCounter)regionmodelshowObjectCounterVerticalObjectCounterwithOBBzyolo11n-obb.ptHeatmap)colormapr   r   r   HeatmapWithRegion)r   r   r   r   SpeedEstimatorQueueManagerLineAnalyticsTline)g@g	@)analytics_typer   r   figsizePieAnalyticspieBarAnalyticsbarAreaAnalyticsarea	TrackZoneObjectCropperzcropped-detections)crop_dirr   r   ObjectBlurrerg{Gz?)
blur_ratior   r   InstanceSegmentationyolo11n-seg.pt)r   r   	VisionEyeRegionCounterAIGym)      r   )kptsr   ParkingManager)r   r   	json_fileStreamlitInference
video_pathneeds_frame_countc                 l   [         R                  " U5      nUR                  5       (       d
   SU 35       eSnUR                  5       (       aX  UR                  5       u  pVU(       d  O>US-  nUR	                  5       nU(       a  Xt/OU/nU " U6 n	UR                  5       (       a  MX  UR                  5         g)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
             N/home/james-whalen/.local/lib/python3.13/site-packages/tests/test_solutions.pyprocess_videorM      s    


:
&C<<>>C6zlCC>K
,,..xxzq((*):%	dO ,,.. KKM    z>Disabled for testing due to --slow test errors after YOLOE PR.)reasonz6name, solution_class, needs_frame_count, video, kwargsc                    U(       a9  U S:w  a  [        [         SU 3[        S9  O[        [         S[         3[        S9  U S:X  a7  [        [         S[         3[        S9  [        [         S[
         3[        S9  O7U S:X  a1  [        R                  " 5       (       a  U" S0 UD6R                  5         gU S:X  a  [        OUn[        U" S0 UD6[        [        U-  5      US9  g)	zTTest individual Ultralytics solution with video processing and parameter validation.r   /)urldirr7   r9   N)rD   r:   r;    )r   r   r   VERTICAL_VIDEOPARKING_AREAS_JSONPARKING_MODELr
   check_imshow	inferencerM   str)namesolution_classr;   videokwargss        rL   test_solutionr_      s     **AeW53?An-=>CHZL*<)=>CHZL-9sC	%	%  $V$..0"&==N5E)&)sU{#+rN   c                      [         R                  " 5       n / SQ/S/sU l        U l        U R	                  [
        R                  SSSS5        SU R                  ;   d   eg)z=Test distance calculation left click selection functionality.r   r   2   rb   r=      N)r   DistanceCalculationboxes	track_idsmouse_event_for_distancer>   EVENT_LBUTTONDOWNselected_boxesdcs    rL   test_left_click_selectionrl      sU    		&	&	(B./!BHbl 5 5r2tTJ!!!!!rN   c                      [         R                  " 5       n S/ SQ0SsU l        U l        U R	                  [
        R                  SSSS5        U R                  (       a   eU R                  S:X  d   eg)z:Test distance calculation right click reset functionality.r=   ra   r   N)r   rd   ri   left_mouse_countrg   r>   EVENT_RBUTTONDOWNrj   s    rL   test_right_click_resetrp      sg    		&	&	(B./1A-BA*Br* 5 5q!T4H    !###rN   c                      [         R                  " S[         R                  S9n  [        R                  " SS9nU" U 5        g! [
         a    [        R                  " S5         gf = f)z<Test that ParkingManagement handles missing JSON gracefully.       dtypeN)	json_pathz"Skipping test due to missing JSON.)npzerosuint8r   ParkingManagement
ValueErrorpytestskip)rH   parkingmanagers     rL   test_parking_json_noner      sO    
((=
1C:"44tDs :89:s   A  A%$A%c                       [         R                  " SS9n U R                  [        R                  " S[        R
                  S9SS9   S5       e! [         a  nS[        U5      ;   d   e S	nAg	S	nAff = f)
z@Test that unsupported analytics type raises ModuleNotFoundError.testr"   rr   rv   r   )rH   frame_numberz7Expected ModuleNotFoundError for unsupported chart typeztest chart is not supportedN)r   	Analyticsprocessry   rz   r{   ModuleNotFoundErrorrZ   )	analyticses     rL   "test_analytics_graph_not_supportedr      sg    7''v>	bhh}BHHETUVOOOu 7,A6667s   AA 
A3A..A3c                      [         R                  " SS9n U R                  SSS0SS9  U R                  SSSS.SS9nUc   eg	)
z>Test area chart graph update with dynamic class padding logic.r)   r   r=   car   )r   
count_dictplotru   )r   personN)r   r   update_graph)r   plot_ims     rL   test_area_chart_paddingr      sU    ##6:IuajvN$$!UV@W^d$eGrN   c                      [         R                  R                  5       n  U R                  SS9   S5       e! [         a  nS[        U5      ;   d   e SnAgSnAff = f)z=Test that update() raises ValueError for invalid config keys.{   )invalid_keyz/Expected ValueError for invalid update argumentz is not a valid solution argumentN)r   configSolutionConfigupdater}   rZ   )objr   s     rL   /test_config_update_method_with_invalid_argumentr      sV    



)
)
+C<

s
#GGGu <1SV;;;<s   6 
A AAc                      [         R                  " S[         R                  S9n [        R                  " SS9nU" U 5      nUR
                  c   eg)z<Test that instance segmentation handles cases with no masks.rr   rv   r0   )r   N)ry   rz   r{   r   r/   r   )rH   isegmentresultss      rL   test_plot_with_no_masksr     s@    
((=
1C--4DEHsmG??&&&rN   c                  *   SSK n U R                  S5      nUR                  Ul        UbV  U R                  UR                  5       5      n[	        SS5       nUR                  UR                  5       5        SSS5        SnOSnUS:X  d   e[        R                  R                  S5      (       d   e[	        SS5       nUR                  5       S:X  d   e SSS5        [        R                  " S5        g! , (       d  f       N= f! , (       d  f       N6= f)z7Test Streamlit video upload logic saves file correctly.r   Ns   fake video contentzultralytics.mp4wbrb)
ioBytesIOgetvaluerA   openwriteospathexistsremove)r   	fake_filegoutoutput_pathfs         rL   /test_streamlit_handle_video_upload_creates_filer     s    

01I''INJJy~~'(#T*cIIaffh +'++++77>>+,,,,		&!vvx0000 
'II  +* 
'	&s    C3<D3
D
Dz1VisualAISearch requires torch>=2.4 (found torch==)z1Disabled due to slow performance on Raspberry Pi.c                      [        [         S3[        S9  [        R                  " [        [        S-  5      S9n U " S5      ng)zBTest similarity search solution with sample images and text query.z/4-imgs-similaritysearch.zip)rS   z4-imgs-similaritysearchdataza dog sitting on a benchN)r   r   r   r   VisualAISearchrZ   )searcherrK   s     rL   test_similarity_searchr   $  s<     ZL <=3G''S7P1P-QRH+,ArN   c                  x    [         R                  " SS9n [        U S5      (       d   e[        U S5      (       d   eg)z4Test SearchApp initializes with required attributes.cpu)devicer   runN)r   	SearchApphasattr)apps    rL   test_similarity_search_app_initr   -  s:     

U
+C3
####3rN   c           
         SSK Jn  U S-  n[        R                  " USS9  [	        S5       Hb  nUR                  [        R                  " [        R                  R                  SSS5      S	-  5      5      nUR                  US
U S3-  5        Md     [        R                  " [        U5      S9nU" S5      nU(       d   eg)z;Test VisualAISearch end-to-end with sample image and query.r   )ImageimagesT)exist_okr      ru      test_image_z.jpgr   za red and white objectN)PILr   r   makedirsrange	fromarrayry   r{   randomrandsaver   r   rZ   )tmp_pathr   	image_diriimgr   r   s          rL   test_similarity_search_completer   6  s     8#IKK	D)1Xoobhhryy~~c3'BS'HIJ{1#T223  ''S^<H/0GN7rN   c                     SSK Jn   [        R                  " 5       n/ SQ/ SQ/SS/SS/SS/4u  Ul        Ul        Ul        Ul        UR                  S   UR                  S   S	.Ul        [        R                  " S
[        R                  S9n[        R                  " US5         [        R                  " US5         [        S5         UR                  U5      nSSS5        SSS5        SSS5        [        WU 5      (       d   eUR                   S:X  d   eUR"                  S:  d   eg! , (       d  f       NV= f! , (       d  f       N_= f! , (       d  f       Nh= f)zLTest DistanceCalculation.process() computes distance between selected boxes.r   )SolutionResults)d   r   r   r   ),  r   r   r   r=   r   g?gffffff?)r=   r   )rt   rs   ru   rv   extract_tracksdisplay_outputzcv2.setMouseCallbackN)ultralytics.solutions.solutionsr   r   rd   re   rf   clssconfsri   ry   rz   r{   r   objectr   
isinstancetotal_trackspixels_distance)r   rk   frameresults       rL   (test_distance_calculation_process_methodr   F  s   ?		&	&	(B	34	
A	
A	d	1-BHblBGRX HHQKBHHQK8BHH]"((3E	b*	+U\\">N-OQVWmQnE" Ro-O	+fo....!###!!A%%%	 RoQn-O-O	+	+s<   %E=D<	D+D<#E+
D95D<<
E
	E
Ec                  ,    [         R                  " SS9  g)z@Test ObjectCropper init with show=True to cover display warning.Tr   N)r   r+   rT   rN   rL   test_object_crop_with_show_Truer   Z  s    &rN   c                     [         R                  " SS9n SU l        [        R                  " S[        R
                  S9n[        S5       n[        S[        S5      S9 n[        S	5       nU R                  U5        UR                  5         UR                  5         UR                  5         S
S
S
5        S
S
S
5        S
S
S
5        g
! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g
= f)zVTest that display_output triggers imshow, waitKey, and destroyAllWindows when enabled.Tr   )r   r   ru   rv   z
cv2.imshowzcv2.waitKeyq)return_valuezcv2.destroyAllWindowsN)
r   r   	env_checkry   rz   r{   r   ordr   assert_called_once)counterr   mock_imshow	mock_waitmock_destroys        rL   test_display_output_methodr   _  s    %%40GGHH]"((3E	|	U=sSVx-X\eglh	u%&&($$&'')h-X		 h h-X-X		s=   
C'C*AC,C4C'
CC
C$	 C''
C5)F)Er   unittest.mockr   r>   numpyry   r~   testsr   r   ultralyticsr   ultralytics.utilsr   r   r	   r
   ultralytics.utils.downloadsr   ultralytics.utils.torch_utilsr   SHOW
DEMO_VIDEO
CROP_VIDEO
POSE_VIDEOPARKING_VIDEOrV   rW   rU   REGIONHORIZONTAL_LINEVERTICAL_LINEr   r   COLORMAP_PARULAr   r   r   r*   r+   rZ   r-   r/   r1   r2   r3   r|   	Inference	SOLUTIONSboolrM   markskipifparametrizer_   rl   rp   r   r   r   r   r   r   r   r   r   r   r   r   rT   rN   rL   <module>r	     s   
  
    ! O O 5 3 $
)
(
.5 /-	7j):&
 	E48 	"UDA 	  5$? 	$4dC 	((5$RVW 	((FUTXY 	  E48 	E48 	!E4JW 	 5$:V 	 5$:V 	!E4JW )%%ujVV[ei:jk334udS 	eT: 	&&"D1 )%%ujESW:XYE48 ioouj:t2TU##cM)*Ds3QcKcGde 	
wB	J  $ N+klQS\] ^ m."$:7<'!( 	M,]^k]llm*noN+^_- ` p- 	M,]^k]llm*noN+^_ ` p 	M,]^k]llm*noN+^_ ` p&('
*rN   