
    jp7                        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j                            ed          e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
j!        ddeeedfd e
j"        ddeeedfd!e
j#        d"dd#eed$d%fd&e
j#        d"dd'eed$d%fd(e
j#        d"dd)eed$d%fd*e
j#        d"dd+eed$d%fd,e
j$        ddeeedfd-e
j%        dd.d/eed0fd1e
j&        ddd2eed3fd4e
j'        ddd5ed6fd7e
j(        ddeed6fd8e
j)        ddeeedfd9e
j*        dd:g d;ed<fd=e
j+        dd>d?ed@dAfdBe
j,        ddi fg          dC                         Z-dD Z.dE Z/dF Z0dG Z1dH Z2dI Z3dJ Z4dK Z5ej                            e dLe dM          ej                            edN          dO                         Z6ej                            e dLe dM          ej                            edN          dP                         Z7ej                            e dLe dM          ej                            edN          dQ                         Z8dR Z9dS Z:dT Z;dS )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                 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
             W/var/www/html/Carbon-Document/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.)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{Gz?)
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 }|                                D ]\  }	}
|	                    d          r*t          ||
z            ||	                    dd          <   D|
dk    rt           |d                    ||	<   f|
dk    rt           |d                    ||	<   |
||	<   | dk    r/t	          j                    r |di |                                 dS t           |di |||           dS )	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   ,   sa   T 5>G__Y//0004J F#))++    
U>>'"" 	 /28e3C/D/DF3;;w++,,o%%ooo>>??F3KKo%%ooo>>??F3KKF3KK###   	1N$$V$$..000))&))+     r(   c                      t          j                    } g dgdgc| _        | _        |                     t
          j        dddd           d| j        v sJ d| j                     dS )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      sy    		&	(	(B.../!BHbl 5r2tTJJJ!!!!#dQSQb#d#d!!!!!r(   c                     t          j                    } dg didc| _        | _        |                     t
          j        dddd           | j        rJ d| j                     | j        dk    sJ d| j                     dS )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./1A1A1A-BA*Br* 5q!T4HHH gg"gTVTe"g"ggg !###%jUWUh%j%j#####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 d
|             Y d}~dS d}~ww xY w)z7Test that unsupported analytics type raises ValueError.testr9   r|   r   r   )r"   frame_numberFz.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      s    s'v>>>	bh}BHEEETUVVVFFFFu s s s+s1vv5557rop7r7r555555555ss   AA 
B	 BB	c                      t          j        d          } |                     dddid           |                     ddddd          }|
J d
            d	S )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      ss    #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 d|             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 argumentz(Expected validation error message, got: N)r   configSolutionConfigupdater   rZ   )objr   s     r&   /test_config_update_method_with_invalid_argumentr      s    


)
)
+
+Cl

s
###GGGGu l l l1SVV;;;=khi=k=k;;;;;;;;;ls    A   
A3
A..A3c                      t          j        dt           j                  } t          j        d          } ||           }|j        
J d            dS )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     sV    
(=
1
1
1C-4DEEEHhsmmG?&&(R&&&&&r(   c                     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 d|             t          j                            d          s
J d            t	          dd          5 }|                                }|dk    sJ d	|             	 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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   III

011I'INJJy~~''((#T** 	 cIIaffhh	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 '++++-i\g-i-i+++7>>+,,PP.PPP,		&	& U!&&((////1T71T1T////U U U U U U U U U U U U U U U 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)dirz4-imgs-similaritysearchdataza dog sitting on a benchN)r
   r   r   VisualAISearchrZ   )rd   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   -  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            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 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	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>>>>>7>>r(   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 dt!          |                       |j        dk    sJ d|j                     |j        dk    sJ d|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~   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  sc   ??????		&	(	(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..__0_QUV\Q]Q]0_0___.!###%Tv?R%T%T###!A%%%'b&J`'b'b%%%%%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   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 }|                     |           |	                                 |	                                 |	                                 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   _  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)<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 O O O O O O O O O O 5 5 5 5 5 5 3 3 3 3 3 3 	7	7	7j):&      $ N+kllG #t<<	
 #&EE	
 $#$udCC	
 ##(8$GG	
 ,udVZ[[	
  ,X\]]	
 $t<<	
 "t<<	
 %tPZ[[	
 $udzZZ	
 $udzZZ	
 %tPZ[[	
 
i)5,6\ako@p@pq#2UDQQ	
 #%>>	
 #*&55	
 
i)5,%Y]@^@^_#t<<	
 
)/5,UY8Z8Z['%t/RR	
 !	
wBE EL ME E mlN:e e ek k k: : :s s s@ @ @l l lS S S! ! !* 	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?c c c(' ' '
* * * * *r(   