
    i:                    P   d dl mZ d dlZd dlmc mZ d dlZd dl	m
Z
  e
e      j                         j                  d   Z ee      ej                   vr"ej                   j#                  d  ee             d dlZd dlmZmZmZmZmZ  G d d      Z G d d	      Z G d
 d      Zy)    )annotationsN)Path   )OrchestratorStateOrchestratorStateMachineInvalidTransitionDEFAULT_TRANSITIONSGLOBAL_TRANSITIONSc                      e Zd ZdZd Zd Zy)TestNewStatesExistzNTest that new states AWAITING_CONFIRM and EXECUTING_ACTIONS exist in the Enum.c                   d}t        t        |      }|sddt        j                         v st	        j
                  t               rt	        j                  t               nddt        j                         v st	        j
                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            dx}}t        j                  }|j                  }d}||k(  }|st	        j                  d|fd||f      dt        j                         v st	        j
                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      t	        j                  |      d	z  }d
d|iz  }	t        t	        j                  |	            dx}x}x}}y)zFTest that AWAITING_CONFIRM state is defined in OrchestratorState enum.AWAITING_CONFIRM5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}hasattrr   py0py1py3py5N==)zS%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.AWAITING_CONFIRM
}.value
} == %(py7)sr   py2py4py7assert %(py9)spy9)r   r   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanationr   value_call_reprcompare
self@py_assert2@py_assert4@py_format6@py_assert1@py_assert3@py_assert6@py_assert5@py_format8@py_format10s
             L/home/nelsen/Projects/kognitive/orchestrator/src/tests/test_state_machine.py"test_awaiting_confirm_state_existsz5TestNewStatesExist.test_awaiting_confirm_state_exists   s   *<=w(*<========w===w======(===(===*<========== 11M177M;MM7;MMMMM7;MMMMMMM MMM MMM1MMM7MMM;MMMMMMMM    c                   d}t        t        |      }|sddt        j                         v st	        j
                  t               rt	        j                  t               nddt        j                         v st	        j
                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            dx}}t        j                  }|j                  }d}||k(  }|st	        j                  d|fd||f      dt        j                         v st	        j
                  t              rt	        j                  t              ndt	        j                  |      t	        j                  |      t	        j                  |      d	z  }d
d|iz  }	t        t	        j                  |	            dx}x}x}}y)zGTest that EXECUTING_ACTIONS state is defined in OrchestratorState enum.EXECUTING_ACTIONSr   r   r   r   Nr   )zT%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.EXECUTING_ACTIONS
}.value
} == %(py7)sr   r   r   )r   r   r   r   r    r!   r"   r#   r$   r6   r%   r&   r'   s
             r2   #test_executing_actions_state_existsz6TestNewStatesExist.test_executing_actions_state_exists   s   *=>w(*=>>>>>>>>w>>>w>>>>>>(>>>(>>>*=>>>>>>>>>> 22O288O<OO8<OOOOO8<OOOOOOO OOO OOO2OOO8OOO<OOOOOOOOr4   N)__name__
__module____qualname____doc__r3   r7    r4   r2   r   r      s    XN
Pr4   r   c                  4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestNewStateTransitionsz8Test that new states have proper transitions configured.c                   t         j                  }|t        v }|st        j                  d|fd|t        f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            dx}}t        t         j                     }t        |t              }|sd	d
t        j                         v st        j                  t              rt        j                  t              nd
dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}t        |      }d}||kD  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}y)zJTest that AWAITING_CONFIRM has transitions defined in DEFAULT_TRANSITIONS.in)z8%(py2)s
{%(py2)s = %(py0)s.AWAITING_CONFIRM
} in %(py4)sr   r	   r   r   r   assert %(py6)spy6N5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancetransitionsdictr   r   r   r   r   >z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slenr   r   r   rD   assert %(py8)spy8)r   r   r	   r    r&   r   r   r!   r"   r#   r$   rF   rH   rM   
r(   r,   r-   @py_format5@py_format7rG   r)   r/   r*   @py_format9s
             r2   ,test_awaiting_confirm_in_default_transitionszDTestNewStateTransitions.test_awaiting_confirm_in_default_transitions%   s    11H15HHHHH15HHHHHHH HHH HHH1HHHHHH5HHHH5HHHHHHHH)*;*L*LM+t,,,,,,,,z,,,z,,,,,,+,,,+,,,,,,t,,,t,,,,,,,,,,;#!#!####!######s###s######;###;######!#######r4   c                   t         j                  }|t        v }|st        j                  d|fd|t        f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            dx}}t        t         j                     }t        |t              }|sd	d
t        j                         v st        j                  t              rt        j                  t              nd
dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}t        |      }d}||kD  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}y)zKTest that EXECUTING_ACTIONS has transitions defined in DEFAULT_TRANSITIONS.r@   )z9%(py2)s
{%(py2)s = %(py0)s.EXECUTING_ACTIONS
} in %(py4)sr   r	   rB   rC   rD   NrE   rF   rG   rH   rI   r   rJ   rL   rM   rN   rO   rP   )r   r6   r	   r    r&   r   r   r!   r"   r#   r$   rF   rH   rM   rQ   s
             r2   -test_executing_actions_in_default_transitionszETestNewStateTransitions.test_executing_actions_in_default_transitions,   s    22I26IIIII26IIIIIII III III2IIIIII6IIII6IIIIIIII)*;*M*MN+t,,,,,,,,z,,,z,,,,,,+,,,+,,,,,,t,,,t,,,,,,,,,,;#!#!####!######s###s######;###;######!#######r4   c                D   t        j                  t        j                  i       }d}||v }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            dx}}|d   }t        j                  }||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}y)zSTest that PROCESSING state transitions to AWAITING_CONFIRM on 'llm_response' event.llm_responser@   z%(py1)s in %(py3)srG   r   r   assert %(py5)sr   Nr   )z8%(py1)s == %(py5)s
{%(py5)s = %(py3)s.AWAITING_CONFIRM
}r   r   r   r   assert %(py7)sr   )r	   getr   
PROCESSINGr    r&   r"   r   r   r!   r#   r$   r   r(   rG   @py_assert0r)   @py_format4r+   r*   r0   s           r2   0test_processing_llm_response_to_awaiting_confirmzHTestNewStateTransitions.test_processing_llm_response_to_awaiting_confirm3   s    )--.?.J.JBO,~,,,,~,,,~,,,,,,,,,,,,,,,,>*P.?.P.PP*.PPPPP*.PPPP*PPPPPP.?PPP.?PPP.PPPPPPPPr4   c                D   t        j                  t        j                  i       }d}||v }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            dx}}|d   }t        j                  }||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}y)zVTest that AWAITING_CONFIRM transitions to EXECUTING_ACTIONS on 'user_confirmed' event.user_confirmedr@   rZ   rG   r[   r\   r   Nr   )z9%(py1)s == %(py5)s
{%(py5)s = %(py3)s.EXECUTING_ACTIONS
}r   r]   r^   r   )r	   r_   r   r   r    r&   r"   r   r   r!   r#   r$   r6   ra   s           r2   9test_awaiting_confirm_user_confirmed_to_executing_actionszQTestNewStateTransitions.test_awaiting_confirm_user_confirmed_to_executing_actions9   s    )--.?.P.PRTU.;....;.........;...;.......+,S0A0S0SS,0SSSSS,0SSSS,SSSSSS0ASSS0ASSS0SSSSSSSSr4   c                D   t        j                  t        j                  i       }d}||v }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            dx}}|d   }t        j                  }||k(  }|st	        j
                  d	|fd
||f      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}y)zHTest that AWAITING_CONFIRM transitions to IDLE on 'user_rejected' event.user_rejectedr@   rZ   rG   r[   r\   r   Nr   )z,%(py1)s == %(py5)s
{%(py5)s = %(py3)s.IDLE
}r   r]   r^   r   )r	   r_   r   r   r    r&   r"   r   r   r!   r#   r$   IDLEra   s           r2   +test_awaiting_confirm_user_rejected_to_idlezCTestNewStateTransitions.test_awaiting_confirm_user_rejected_to_idle?   s    )--.?.P.PRTU-+----+---------+---+-------?+E/@/E/EE+/EEEEE+/EEEE+EEEEEE/@EEE/@EEE/EEEEEEEEr4   c                <   t        j                  t        j                  i       }d}||v }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            dx}}d	}||v }|st	        j
                  d|fd||f      t	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      nddz  }dd|iz  }t        t	        j                  |            dx}}|d   }t        j                  }||k(  }|st	        j
                  d
|fd||f      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}|d	   }t        j                  }||k(  }|st	        j
                  d
|fd||f      t	        j                  |      dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}y)zOTest that EXECUTING_ACTIONS has 'actions_complete' and 'actions_failed' events.actions_completer@   rZ   rG   r[   r\   r   Nactions_failedr   )z0%(py1)s == %(py5)s
{%(py5)s = %(py3)s.SPEAKING
}r   r]   r^   r   )r	   r_   r   r6   r    r&   r"   r   r   r!   r#   r$   SPEAKINGra   s           r2   test_executing_actions_eventsz5TestNewStateTransitions.test_executing_actions_eventsE   s   )--.?.Q.QSUV!0![0000![000!000000[000[0000000.;....;.........;...;.......-.L2C2L2LL.2LLLLL.2LLLL.LLLLLL2CLLL2CLLL2LLLLLLLL+,J0A0J0JJ,0JJJJJ,0JJJJ,JJJJJJ0AJJJ0AJJJ0JJJJJJJJr4   N)
r8   r9   r:   r;   rU   rW   rd   rg   rk   rp   r<   r4   r2   r>   r>   "   s'    B$$QTFKr4   r>   c                  .    e Zd ZdZd Zd Zd Zd Zd Zy)TestStateMachineWithNewStatesz2Test state machine operations with the new states.c                   t               }t        j                  |_        |j	                  d      }t        j
                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}|j                  }t        j
                  }||k(  }|st        j                  d|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)zZTest that state machine can transition to AWAITING_CONFIRM state via 'llm_response' event.rY   r   )z8%(py0)s == %(py4)s
{%(py4)s = %(py2)s.AWAITING_CONFIRM
}	new_stater   rB   rC   rD   N)zS%(py2)s
{%(py2)s = %(py0)s.state
} == %(py6)s
{%(py6)s = %(py4)s.AWAITING_CONFIRM
}smr   r   r   rD   rO   rP   )r   r   r`   _statehandle_eventr   r    r&   r   r   r!   r"   r#   r$   state	r(   ru   rt   r-   r,   rR   rS   r/   rT   s	            r2   #test_transition_to_awaiting_confirmzATestStateMachineWithNewStates.test_transition_to_awaiting_confirmQ   s@   %'%00	OON3	->>>y>>>>>y>>>>>>>y>>>y>>>>>>->>>->>>>>>>>>>>xx=,===x=====x=======r===r===x======,===,===========r4   c                   t               }t        j                  |_        |j	                  d      }t        j
                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}|j                  }t        j
                  }||k(  }|st        j                  d|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)zVTest transition from AWAITING_CONFIRM to EXECUTING_ACTIONS via 'user_confirmed' event.rf   r   )z9%(py0)s == %(py4)s
{%(py4)s = %(py2)s.EXECUTING_ACTIONS
}rt   r   rB   rC   rD   N)zT%(py2)s
{%(py2)s = %(py0)s.state
} == %(py6)s
{%(py6)s = %(py4)s.EXECUTING_ACTIONS
}ru   rv   rO   rP   )r   r   r   rw   rx   r6   r    r&   r   r   r!   r"   r#   r$   ry   rz   s	            r2   :test_transition_from_awaiting_confirm_to_executing_actionszXTestStateMachineWithNewStates.test_transition_from_awaiting_confirm_to_executing_actionsY   sA   %'%66	OO$45	-???y?????y???????y???y??????-???-???????????xx>,>>>x>>>>>x>>>>>>>r>>>r>>>x>>>>>>,>>>,>>>>>>>>>>>r4   c                   t               }t        j                  |_        |j	                  d      }t        j
                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}|j                  }t        j
                  }||k(  }|st        j                  d|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)zHTest transition from AWAITING_CONFIRM to IDLE via 'user_rejected' event.ri   r   )z,%(py0)s == %(py4)s
{%(py4)s = %(py2)s.IDLE
}rt   r   rB   rC   rD   N)zG%(py2)s
{%(py2)s = %(py0)s.state
} == %(py6)s
{%(py6)s = %(py4)s.IDLE
}ru   rv   rO   rP   )r   r   r   rw   rx   rj   r    r&   r   r   r!   r"   r#   r$   ry   rz   s	            r2   7test_transition_from_awaiting_confirm_to_idle_on_rejectzUTestStateMachineWithNewStates.test_transition_from_awaiting_confirm_to_idle_on_rejecta   s@   %'%66	OOO4	-222y22222y2222222y222y222222-222-22222222222xx1,111x11111x1111111r111r111x111111,111,11111111111r4   c                   t               }t        j                  |_        |j	                  d      }t        j
                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}|j                  }t        j
                  }||k(  }|st        j                  d|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)zPTest that EXECUTING_ACTIONS transitions to SPEAKING on 'actions_complete' event.rm   r   z0%(py0)s == %(py4)s
{%(py4)s = %(py2)s.SPEAKING
}rt   r   rB   rC   rD   NzK%(py2)s
{%(py2)s = %(py0)s.state
} == %(py6)s
{%(py6)s = %(py4)s.SPEAKING
}ru   rv   rO   rP   r   r   r6   rw   rx   ro   r    r&   r   r   r!   r"   r#   r$   ry   rz   s	            r2   +test_executing_actions_complete_to_speakingzITestStateMachineWithNewStates.test_executing_actions_complete_to_speakingi   sA   %'%77	OO$67	-666y66666y6666666y666y666666-666-66666666666xx5,555x55555x5555555r555r555x555555,555,55555555555r4   c                   t               }t        j                  |_        |j	                  d      }t        j
                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}|j                  }t        j
                  }||k(  }|st        j                  d|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)zNTest that EXECUTING_ACTIONS transitions to SPEAKING on 'actions_failed' event.rn   r   r   rt   r   rB   rC   rD   Nr   ru   rv   rO   rP   r   rz   s	            r2   )test_executing_actions_failed_to_speakingzGTestStateMachineWithNewStates.test_executing_actions_failed_to_speakingq   sA   %'%77	OO$45	-666y66666y6666666y666y666666-666-66666666666xx5,555x55555x5555555r555r555x555555,555,55555555555r4   N)	r8   r9   r:   r;   r{   r}   r   r   r   r<   r4   r2   rr   rr   N   s    <>?266r4   rr   )
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter    syspathlibr   __file__resolveparentsROOTstrpathinsertpytestsrc.state_machiner   r   r   r	   r
   r   r>   rr   r<   r4   r2   <module>r      s    "   
 H~''*t9CHHHHOOAs4y!  P P)K )KX)6 )6r4   