
    i                         S SK JrJr  S SKJr  S SKJr  S SKJrJ	r	  S SK
JrJrJr  \ " S S5      5       r " S S	5      rg
)    )AnyOptional)Counter)	dataclass)WorkflowContext)
StartEventEvent	EventTypec                   R    \ rS rSr% Sr\\   \S'   \\	\
4   \S'   \\S'   \\S'   Srg)	WorkflowTestResult	   a"  
Container for workflow test results

Attributes:
    collected (list[Event]): List of collected events
    event_type (dict[EventType, int]): Dictionary that maps each event type with its number of occurencies within the collected events
    result (Any): Final output of the workflow run
	collectedevent_typesresultctx N)__name__
__module____qualname____firstlineno____doc__listr
   __annotations__dictr   intr   r   __static_attributes__r       R/home/james-whalen/.local/lib/python3.13/site-packages/workflows/testing/runner.pyr   r   	   s,     E{in%%K	Lr   r   c                   l    \ rS rSrSr  SS jr\" 5       SSS4S\S\S   S	\S
\\	\
      S\4
S jjrSrg)WorkflowTestRunner   z
Utility class that can be used to test workflows end-to-end.

Attributes:
    _workflow (Workflow): The workflow to be tested
c                     Xl         g )N	_workflow)selfworkflows     r   __init__WorkflowTestRunner.__init__"   s	     "r   NTstart_eventr   r   expose_internalexclude_eventsreturnc           
        #    U R                   R                  XS9n/ nUR                  US9  Sh  vN nU(       a  [        U5      U;   a  M!  UR	                  U5        M4   N/
 UI Sh  vN  n[        [        U V	s/ s H  n	[        U	5      PM     Os  sn	f sn	5      5      n
UR                  c   e[        UUU
UR                  S9$ 7f)a  
Run a workflow end-to-end and collect the events that are streamed during its execution.

Args:
    start_event (StartEvent): The input event for the workflow
    expose_internal (bool): Whether or not to expose internal events. Defaults to True if not set.
    exclude_events. (list[EventType]): A list of event types to exclude from the collected events. Defaults to None if not set.

Returns:
    WorkflowTestResult

Example:
    ```
    wf = GreetingWorkflow()
    runner = WorkflowTestRunner(wf)
    test_result = runner.run(start_even=StartEvent(message="hello"), expose_internal = True, exclude_events = [StepStateChanged])
    assert test_result.collected == 22
    assert test_result.event_types.get(StepStateChanged, 0) == 8
    assert str(test_result.result) == "hello Adam!"
    ```
)r*   r   )r+   N)r   r   r   r   )	r%   runstream_eventstypeappendr   r   r   r   )r&   r*   r   r+   r,   handlercollected_eventseventr   evevent_freqss              r   r/   WorkflowTestRunner.run(   s     8 ..$$$F(*"000Q 	+%$u+"?##E*	+Q ,0(89(8"T"X(89:-
 {{&&&!&#	
 	
s=   +CA#A!A#,C!A##C)A,*C=B6Cr$   )r'   r   )r   r   r   r   r   r(   r	   r   boolr   r   r   r/   r   r   r   r   r!   r!      sl    "" #-,#' $48,
,
 i ,
 	,

 !i1,
 
,
 ,
r   r!   N)typingr   r   collectionsr   dataclassesr   	workflowsr   r   workflows.eventsr	   r
   r   r   r!   r   r   r   <module>r?      s:       ! ' 9 9    :
 :
r   