
    j+7                      
   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d	Zd
ZdZdZdZdZdZg dZddgZddgZdUdede fdZ!ej"        #                    ed          ej"        $                    dde
j%        deeeedfde
j%        deeeedfde
j%        deeeedfde
j%        deededfd e
j&        deej'        eedd!fd"e
j&        deej'        eeed#fd$e
j(        deeeedfd%e
j)        deeeedfd&e
j*        d'ed(eed)d*fd+e
j*        d'ed,eed)d*fd-e
j*        d'ed.eed)d*fd/e
j*        d'ed0eed)d*fd1e
j+        deeeedfd2e
j,        ded3eed4fd5e
j-        ded6eed7fd8e
j.        ded9ed:fd;e
j/        deeed:fd<e
j0        deeeedfd=e
j1        deg d>ed?fd@e
j2        de ee          e ee          dAfdBe
j3        ddi fg          dC                         Z4dD Z5dE Z6dF Z7dG Z8dH Z9dI Z:dJ Z;dK Z<ej"        #                    e dLe dM          ej"        #                    edN          dO                         Z=ej"        #                    e dLe dM          ej"        #                    edN          dP                         Z>ej"        #                    e dLe dM          ej"        #                    edN          dQ                         Z?dR Z@dS ZAdT ZBdS )V    N)patch)MODEL)	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     
video_pathneeds_frame_countc                 n   t          j        |          }|                                sJ d|             d}|                                rU|                                \  }}|sn;|dz  }|                                }|r||gn|g} | | }	|                                U|                                 dS )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
             Y/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/tests/test_solutions.pyprocess_videor'   !   s    

:
&
&C<<>>CCCzCCCC>K
,,.. xxzz 	q((**):I%%	HdO ,,..  KKMMMMM    z>Disabled for testing due to --slow test errors after YOLOE PR.)reasonz6name, solution_class, needs_frame_count, video, kwargsObjectCounter)regionmodelshowObjectCounterVerticalObjectCounterwithOBBzyolo26n-obb.ptHeatmap)colormapr,   r-   r+   HeatmapWithRegion)r1   r+   r,   r-   SpeedEstimatorQueueManagerLineAnalyticsTline)g@g	@)analytics_typer,   r-   figsizePieAnalyticspieBarAnalyticsbarAreaAnalyticsarea	TrackZoneObjectCropperzcropped-detections)temp_crop_dirr,   r-   ObjectBlurrerg{Gz?)
blur_ratior,   r-   InstanceSegmentationyolo26n-seg.pt)r,   r-   	VisionEyeRegionCounterAIGym)      r   )kptsr-   ParkingManager)
temp_modelr-   temp_json_fileStreamlitInferencec                    |rB| dk    rt          t           d| |           n t          t           dt           |           | dk    rAt          t           dt           |           t          t           dt           |           n5| dk    r/t          j                    r |d
i |                                 dS i }|D ]R}|                    d          r0t          |||         z            ||
                    dd          <   G||         ||<   S| dk    rt          n|}t           |d
i |t          ||z            |	           dS )zTTest individual Ultralytics solution with video processing and parameter validation.r.   /)urldirrL   rO   Ntemp_ )r   r   r    )r
   r   VERTICAL_VIDEOPARKING_AREAS_JSONPARKING_MODELr	   check_imshow	inference
startswithstrreplacer'   )namesolution_classr   videokwargstmp_pathkwargs_updatedkeys           r&   test_solutionrf   3   s   R  N***55e558DDDDD>>n>>HMMMMZ>>*<>>HMMMMZ99-99xHHHHH	%	%	%   	1N$$V$$..000 N . .>>'"" 	.7:8fSk;Q7R7RN3;;w3344"(+N3"&===NN5E11.11x%'((+     r(   c                      t          j                    } g dgdgc| _        | _        |                     t
          j        dddd           d| j        v sJ dS )z=Test distance calculation left click selection functionality.r   r   2   ri   r      N)r   DistanceCalculationboxes	track_idsmouse_event_for_distancer   EVENT_LBUTTONDOWNselected_boxesdcs    r&   test_left_click_selectionrs      sd    		&	(	(B.../!BHbl 5r2tTJJJ!!!!!!!r(   c                      t          j                    } dg didc| _        | _        |                     t
          j        dddd           | j        rJ | j        dk    sJ dS )z:Test distance calculation right click reset functionality.r   rh   r   N)r   rk   rp   left_mouse_countrn   r   EVENT_RBUTTONDOWNrq   s    r&   test_right_click_resetrw      sv    		&	(	(B./1A1A1A-BA*Br* 5q!T4HHH    !######r(   c                      t          j        dt           j                  } 	 t          j        d          } ||            dS # t
          $ r t          j        d           Y dS 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      s{    
(=
1
1
1C:"4tDDDs : : :8999999:s    A A&%A&c                     	 t          j        d          } |                     t          j        dt          j                  d           J d            # t          $ r}d	t          |          v sJ Y d
}~d
S d
}~ww xY w)z7Test that unsupported analytics type raises ValueError.testr7   ry   r}   r   )r"   frame_numberFz.Expected ValueError for unsupported chart typezUnsupported analytics_typeN)r   	Analyticsprocessr   r   r   r   r]   )	analyticses     r&   "test_analytics_graph_not_supportedr      s    6'v>>>	bh}BHEEETUVVVFFFFu 6 6 6+s1vv55555555556s   AA 
A> A99A>c                      t          j        d          } |                     dddid           |                     ddddd          }|J d	S )
z>Test area chart graph update with dynamic class padding logic.r>   r   r   car   )r   
count_dictplotr|   )r   personN)r   r   update_graph)r   plot_ims     r&   test_area_chart_paddingr      sj    #6:::IuajvNNN$$!UV@W@W^d$eeGr(   c                      t           j                                        } 	 |                     d           J d            # t          $ r}dt          |          v sJ Y d}~dS d}~ww xY w)z=Test that update() raises ValueError for invalid config keys.{   )invalid_keyFz/Expected ValueError for invalid update argumentz is not a valid solution argumentN)r   configSolutionConfigupdater   r]   )objr   s     r&   /test_config_update_method_with_invalid_argumentr     s    


)
)
+
+C<

s
###GGGGu < < <1SVV;;;;;;;;;;<s    A   
A(
A##A(c                      t          j        dt           j                  } t          j        d          } ||           }|j        J dS )z<Test that instance segmentation handles cases with no masks.ry   r}   rE   )r,   N)r   r   r   r   rD   r   )r"   isegmentresultss      r&   test_plot_with_no_masksr     sM    
(=
1
1
1C-4DEEEHhsmmG?&&&&&r(   c                  J   ddl } |                     d          }|j        |_        |y|                     |                                          }t	          dd          5 }|                    |                                           ddd           n# 1 swxY w Y   d}nd}|dk    sJ t          j                            d          sJ t	          dd          5 }|                                dk    sJ 	 ddd           n# 1 swxY w Y   t          j	        d           dS )z7Test Streamlit video upload logic saves file correctly.r   Ns   fake video contentzultralytics.mp4wbrb)
ioBytesIOgetvaluer   openwriteospathexistsremove)r   	fake_filegoutoutput_pathfs         r&   /test_streamlit_handle_video_upload_creates_filer     s   III

011I'INJJy~~''((#T** 	 cIIaffhh	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 '+++++7>>+,,,,,		&	& 1!vvxx0000001 1 1 1 1 1 1 1 1 1 1 1 1 1 1I     s$   (BBB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          }dS )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   VisualAISearchr]   )rc   searcherr%   s      r&   test_similarity_searchr   -  sU     Z===8LLLL'S<U1U-V-VWWWH+,,AAAr(   c                  x    t          j        d          } t          | d          sJ t          | d          sJ dS )z4Test SearchApp initializes with required attributes.cpu)devicer   runN)r   	SearchApphasattr)apps    r&   test_similarity_search_app_initr   6  sI     
U
+
+
+C3
#####3r(   c           
         ddl m} | dz  }t          j        |d           t	          d          D ]g}|                    t          j        t          j        	                    ddd          d	z                      }|
                    |d
| dz             ht          j        t          |                    } |d          }|sJ dS )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 objectN)PILr   r   makedirsrange	fromarrayr   r   randomrandsaver   r   r]   )rc   r   	image_diriimgr   r   s          r&   test_similarity_search_completer   ?  s     8#IK	D))))1XX 4 4oobhry~~c3'B'BS'HIIJJ2122223333'S^^<<<Hh/00GNN7NNr(   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  |                    |          }ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   t          ||           sJ |j        dk    sJ |j        dk    sJ dS )zLTest DistanceCalculation.process() computes distance between selected boxes.r   )SolutionResults)d   r   r   r   ),  r   r   r   r   r   g?gffffff?)r   r   )r{   rz   r|   r}   extract_tracksdisplay_outputzcv2.setMouseCallbackN)ultralytics.solutions.solutionsr   r   rk   rl   rm   clssconfsrp   r   r   r   r   objectr   
isinstancetotal_trackspixels_distance)r   rr   frameresults       r&   (test_distance_calculation_process_methodr   O  s    ??????		&	(	(B			3334	
A	
A	d	1-BHblBGRX HQKBHQK88BH]"(333E	b*	+	+ # #U\">N-O-O # #QVWmQnQn # #E""# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #fo.....!####!A%%%%%%sZ   D0C9 C"C9"C&&C9)C&*C9-D9C=	=D C=	DDDc                  0    t          j        d           dS )z@Test ObjectCropper init with show=True to cover display warning.Tr-   N)r   r@   rV   r(   r&   test_object_crop_with_show_Truer   c  s    &&&&&&r(   c                  *   t          j        d          } d| _        t          j        dt          j                  }t          d          5 }t          dt          d                    5 }t          d	          5 }|                     |           |	                                 |	                                 |	                                 d
d
d
           n# 1 swxY w Y   d
d
d
           n# 1 swxY w Y   d
d
d
           d
S # 1 swxY w Y   d
S )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   h  s   %4000GGH]"(333E	|		 *U=sSVxx-X-X-X *\eglh h *	u%%%&&((($$&&&'')))* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *s[   D+C0;ACC0CC0 C!C0$D0C4	4D7C4	8DDD)F)Cr   unittest.mockr   r   numpyr   r   testsr   ultralyticsr   ultralytics.utilsr   r   r   r	   ultralytics.utils.downloadsr
   ultralytics.utils.torch_utilsr   SHOW
DEMO_VIDEO
CROP_VIDEO
POSE_VIDEOPARKING_VIDEOrX   rY   rW   REGIONHORIZONTAL_LINEVERTICAL_LINEr]   boolr'   markskipifparametrizer*   r0   COLORMAP_PARULAr3   r4   r   r?   r@   rB   rD   rF   rG   rH   r   	Inferencerf   rs   rw   r   r   r   r   r   r   r   r   r   r   r   r   rV   r(   r&   <module>r     sC   
			       



            ! ! ! ! ! ! O O O O O O O O O O O O 5 5 5 5 5 5 3 3 3 3 3 3 $
)
(
.5 /-	7	7	7j):&      $ N+kll< #t<<	
 #&EE	
 $#$udCC	
 ##(8$GG	
 ,udVZ[[	
  ,X\]]	
 $t<<	
 "t<<	
 %tPZ[[	
 $udzZZ	
 $udzZZ	
 %tPZ[[	
 
i)5*Z_im>n>no#2UDQQ	
 #%>>	
 #*&55	
 
i)5*W[>\>\]#t<<	
 
)/5*zzzSW6X6XY'3}--tssSeOfOfgg	
 !	
wBE EL ME E mlN@" " "$ $ $: : :6 6 6  < < <' ' '! ! !( 	M*n^k*n*n*nooN+^__- - `_ po- 	M*n^k*n*n*nooN+^__  `_ po 	M*n^k*n*n*nooN+^__  `_ po& & &(' ' '
* * * * *r(   