
    |h3                        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m	Z	 d dl
mZ d dlmZmZ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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jB                  deeeedfdejD                  d ed!eed"d#fd$ejD                  d ed%eed"d#fd&ejD                  d ed'eed"d#fd(ejD                  d ed)eed"d#fd*ejF                  deeeedfd+ejH                  de e%e	d,z        eed-fd.ejL                  ded/eed0fd1ejN                  ded2ed3fd4ejP                  deeed3fd5ejR                  deeeedfd6ejT                  deg d7ed8fd9ejV                  de e%e	ez        e e%e	ez        d:fd;ejX                  ddi fgZ-dSd<e%d=e.fd>Z/ej`                  jc                  ed?@      ej`                  je                  dAe-      dB               Z3ej`                  jc                  ejh                  dC@      ej`                  jc                  edD@      dE               Z5dF Z6dG Z7dH Z8dI Z9dJ Z:dK Z;dL Z<dM Z=ej`                  jc                  ejh                  dC@      ej`                  jc                  edD@      dN               Z>ej`                  jc                  edD@      dO        Z?dP Z@dQ ZAdR ZBy)T    N)patch)MODELTMP)	solutions)
ASSETS_URLIS_RASPBERRYPIchecks)safe_downloadFz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                 :   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)
solutionr8   r9   capframe_countsuccessim0im_copyargs_s
             S/var/www/html/test/engine/venv/lib/python3.12/site-packages/tests/test_solutions.pyprocess_videorK      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                    |r>| dk7  rt        t         d| t               nt        t         dt         t               | dk(  r=t        t         dt         t               t        t         dt
         t               n0| dk(  r+t        j                         r |di |j                          y| dk(  rt        n|}t         |di |t        t        |z        |       y)	zTTest individual Ultralytics solution with video processing and parameter validation.r   /)urldirr5   r7   N)rB   r8   r9    )r
   r   r   VERTICAL_VIDEOPARKING_AREAS_JSONPARKING_MODELr	   check_imshow	inferencerK   str)namesolution_classr9   videokwargss        rJ   test_solutionr]      s     **AeW53?An-=>CHZL*<)=>CHZL-9sC	%	% $V$..0"&==N5E)&)sU{#+rL   z.Disabled due to unsupported CLIP dependencies.z1Disabled due to slow performance on Raspberry Pi.c                      t        t         dt               t        j                  t        t        dz              }  | d      }y)zBTest similarity search solution with sample images and text query.z/4-imgs-similaritysearch.zip)rQ   z4-imgs-similaritysearchdataza dog sitting on a benchN)r
   r   r   r   VisualAISearchrX   )searcherrI   s     rJ   test_similarity_searchrc      s<     ZL <=3G''S7P1P-QRH+,ArL   c                      t        j                         } g dgdgc| _        | _        | j	                  t
        j                  dddd       d| j                  v sJ y)z=Test distance calculation left click selection functionality.r   r   2   rf   r;      N)r   DistanceCalculationboxes	track_idsmouse_event_for_distancer<   EVENT_LBUTTONDOWNselected_boxesdcs    rJ   test_left_click_selectionrp      sU    		&	&	(B./!BHbl 5 5r2tTJ!!!!!rL   c                      t        j                         } dg didc| _        | _        | j	                  t
        j                  dddd       | j                  i k(  sJ | j                  dk(  sJ y)z:Test distance calculation right click reset functionality.r;   re   r   N)r   rh   rm   left_mouse_countrk   r<   EVENT_RBUTTONDOWNrn   s    rJ   test_right_click_resetrt      sl    		&	&	(B./1A-BA*Br* 5 5q!T4H"""!###rL   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)rF   parkingmanagers     rJ   test_parking_json_noner      sO    
((=
1C:"44t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 Y d	}~y	d	}~ww xY w)
z@Test that unsupported analytics type raises ModuleNotFoundError.testr    rv   rz   r   )rF   frame_numberz7Expected ModuleNotFoundError for unsupported chart typeztest chart is not supportedN)r   	Analyticsprocessr}   r~   r   ModuleNotFoundErrorrX   )	analyticses     rJ   "test_analytics_graph_not_supportedr      sg    7''v>	bhh}BHHETUVOOOu 7,A6667s   AA 	A7A22A7c                      t        j                  d      } | j                  dddid       | j                  ddddd      }|J y	)
z>Test area chart graph update with dynamic class padding logic.r'   r   r;   car   )r   
count_dictplotry   )r   personN)r   r   update_graph)r   plot_ims     rJ   test_area_chart_paddingr      sU    ##6:IuajvN$$!UV@W^d$eGrL   c                      t         j                  j                         } 	 | j                  d       J d       # t        $ r}dt        |      v sJ 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 argumentN)r   configSolutionConfigupdater   rX   )objr   s     rJ   /test_config_update_method_with_invalid_argumentr     sV    



)
)
+C<

s
#GGGu <1SV;;;<s   9 	AAAc                      t        j                  dt         j                        } t        j                  d      } ||       }|j
                  J y)z<Test that instance segmentation handles cases with no masks.rv   rz   r.   )r   N)r}   r~   r   r   r-   r   )rF   isegmentresultss      rJ   test_plot_with_no_masksr     s@    
((=
1C--4DEHsmG??&&&rL   c                     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 t        j                  j                  d      sJ t	        dd      5 }|j                         dk(  sJ 	 ddd       t        j                  d       y# 1 sw Y   wxY w# 1 sw Y   +xY w)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         rJ   /test_streamlit_handle_video_upload_creates_filer     s    

01I''INJJy~~'(#T* 	 cIIaffh	 '++++77>>+,,,		& 1!vvx00001II 	  	 1 1s    C*5C6*C36C?c                  h    t        j                  d      } t        | d      sJ t        | d      sJ y)z4Test SearchApp initializes with required attributes.cpu)devicerb   runN)r   	SearchApphasattr)apps    rJ   test_similarity_search_app_initr   ,  s4     

U
+C3
###3rL   c           
      z   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 y)z;Test VisualAISearch end-to-end with sample image and query.r   )ImageimagesT)exist_okr      ry      test_image_z.jpgr_   za red and white objectN)PILr   r   makedirsrange	fromarrayr}   r   randomrandsaver   ra   rX   )tmp_pathr   	image_diriimgrb   r   s          rJ   test_similarity_search_completer   5  s     8#IKK	D)1X 4oobhhryy~~c3'BS'HIJ{1#T2234 ''S^<H/0GN7rL   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 |j                   dk(  sJ |j"                  dkD  sJ y# 1 sw Y   JxY w# 1 sw Y   NxY w# 1 sw Y   Rx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   )rx   rw   ry   rz   extract_tracksdisplay_outputzcv2.setMouseCallbackN)ultralytics.solutions.solutionsr   r   rh   ri   rj   clssconfsrm   r}   r~   r   r   objectr   
isinstancetotal_trackspixels_distance)r   ro   frameresults       rJ   (test_distance_calculation_process_methodr   D  s'   ?		&	&	(B	34	
A	
A	d	1-BHblBGRX HHQKBHHQK8BHH]"((3E	b*	+ #U\\">N-O #QVWmQn #E"# # #fo...!###!!A%%%	# # # # # #s<   %D;<D/D#D/"D;#D,(D//D8	4D;;Ec                  0    t        j                  d       y)z@Test ObjectCropper init with show=True to cover display warning.Tr   N)r   r)   rR   rL   rJ   test_object_crop_with_show_Truer   X  s    &rL   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   ry   rz   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        rJ   test_display_output_methodr   ]  s    %%40GGHH]"((3E	|	 *U=sSVx-X *\eglh *	u%&&($$&'')* * * * * * * * *s=   C$%C1AC3C;C$CCC!	C$$C-)F)Cr   unittest.mockr   r<   numpyr}   r   testsr   r   ultralyticsr   ultralytics.utilsr   r   r	   ultralytics.utils.downloadsr
   SHOW
DEMO_VIDEO
CROP_VIDEO
POSE_VIDEOPARKING_VIDEOrT   rU   rS   REGIONHORIZONTAL_LINEVERTICAL_LINEr   r   COLORMAP_PARULAr   r   r   r(   r)   rX   r+   r-   r/   r0   r1   r   	Inference	SOLUTIONSboolrK   markskipifparametrizer]   IS_PYTHON_3_8rc   rp   rt   r   r   r   r   r   r   r   r   r   r   r   rR   rL   rJ   <module>r     s   
  
    ! @ @ 5 $
)
(
.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. F((1abN+^_- ` c-"$:7<'!( F((1abN+^_ ` c N+^_ `&('
*rL   