
    .hh4                        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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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jB                  deejD                  eeddfdejB                  deejD                  eeedfdejF                  deeeedfdejH                  deeeedfd ejJ                  d!ed"eed#d$fd%ejJ                  d!ed&eed#d$fd'ejJ                  d!ed(eed#d$fd)ejJ                  d!ed*eed#d$fd+ejL                  deeeedfd,ejN                  de e(e	d-z        eed.fd/ejR                  ded0eed1fd2ejT                  ded3ed4fd5ejV                  deeed4fd6ejX                  deeeedfd7ejZ                  deg d8ed9fd:ej\                  de e(e	ez        e e(e	ez        d;fd<ej^                  ddi fgZ0dUd=e(d>e1fd?Z2ejf                  ji                  ed@A      ejf                  jk                  dBe0      dC               Z6dD Z7dE Z8dF Z9dG Z:dH Z;dI Z<dJ Z=dK Z>ejf                  ji                  e dLe dMA      ejf                  ji                  edNA      dO               Z?ejf                  ji                  e dLe dMA      ejf                  ji                  edNA      dP               Z@ejf                  ji                  e dLe dMA      ejf                  ji                  edNA      dQ               ZAdR ZBdS ZCdT ZDy)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                 :   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
             R/var/www/html/ai-service/venv/lib/python3.12/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                    |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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                      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   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                      t        j                         } dg didc| _        | _        | j	                  t
        j                  dddd       | j                  rJ | j                  dk(  sJ y)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                      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)rH   parkingmanagers     rL   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"   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 	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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                      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}   rZ   )objr   s     rL   /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.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                     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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>>+,,,		& 1!vvx00001II 	  	 1 1s    C*5C6*C36C?z1VisualAISearch requires torch>=2.4 (found torch==)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)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                  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    rL   test_similarity_search_app_initr   -  s4     

U
+C3
###3rN   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      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 4oobhhryy~~c3'BS'HIJ{1#T2234 ''S^<H/0GN7rN   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   )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-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+   rT   rN   rL   test_object_crop_with_show_Truer   Z  s    &rN   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   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%&&($$&'')* * * * * * * * *s=   C$%C1AC3C;C$CCC!	C$$C-)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   