o
    >hQ                     @   sd   d 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mZ ddl
mZ G dd	 d	eZd
S )z,
Tests for the public interface of Automat.
    )reduce)TestCase)ArgSpec_getArgNames_getArgSpec_filterArgs   )MethodicalMachineNoTransition)_methodicalc                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*S )+MethodicalTestsz)
    Tests for L{MethodicalMachine}.
    c                 C   s>   G dd dt }| }| | dg | | dg dS )a!  
        L{MethodicalMachine} provides a way for you to declare a state machine
        with inputs, outputs, and states as methods.  When you have declared an
        input, an output, and a state, calling the input method in that state
        will produce the specified output.
        c                   @   s   e Zd Ze Ze dd Ze dd Ze dd Z	ej
ddd	d
 Ze
 dd Zejeeegd ejeee	gd dS )z7MethodicalTests.test_oneTransition.<locals>.Machinationc                 S      dS zan inputN selfr   r   }/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/automat/_test/test_methodical.pyanInput       z?MethodicalTests.test_oneTransition.<locals>.Machination.anInputc                 S   r   )z	an outputan-output-valuer   r   r   r   r   anOutput!      z@MethodicalTests.test_oneTransition.<locals>.Machination.anOutputc                 S   r   )zanother outputanother-output-valuer   r   r   r   r   anotherOutput&   r   zEMethodicalTests.test_oneTransition.<locals>.Machination.anotherOutputTinitialc                 S   r   za stateNr   r   r   r   r   anState+   r   z?MethodicalTests.test_oneTransition.<locals>.Machination.anStatec                 S   r   )zanother stateNr   r   r   r   r   anotherState/   r   zDMethodicalTests.test_oneTransition.<locals>.Machination.anotherStateenteroutputsN)__name__
__module____qualname__r	   machineinputr   outputr   r   stater   r   uponr   r   r   r   Machination   s    





r*   r   r   N)objectassertEqualr   )r   r*   mr   r   r   test_oneTransition   s   z"MethodicalTests.test_oneTransitionc                    st   t   G  fdddt}| }| t}|j W d   n1 s#w   Y  | dt|j | |j  dS )a4  
        L{MethodicalMachine} is an implementation detail.  If you attempt to
        access it on an instance of your class, you will get an exception.
        However, since tools may need to access it for the purposes of, for
        example, visualization, you may access it on the class itself.
        c                       s   e Zd Z ZdS )z@MethodicalTests.test_machineItselfIsPrivate.<locals>.MachinationN)r"   r#   r$   r%   r   expectedMachiner   r   r*   C   s    r*   Nz-MethodicalMachine is an implementation detail)	r	   r+   assertRaisesAttributeErrorr%   assertInstr	exceptionassertIs)r   r*   machinationcmr   r/   r   test_machineItselfIsPrivate:   s   
z+MethodicalTests.test_machineItselfIsPrivatec                 C   s   G dd dt }| }|  | |jd | }| t}|j W d   n1 s,w   Y  | |jd | dt|j	 dS )au  
        One of the benefits of using a state machine is that your output method
        implementations don't need to take invalid state transitions into
        account - the methods simply won't be called.  This property would be
        broken if client code called output methods directly, so output methods
        are not directly visible under their names.
        c                   @   s\   e Zd Ze ZdZe dd Ze dd Z	ej
dddd	 Z
e
jee
e	gd
 dS )z;MethodicalTests.test_outputsArePrivate.<locals>.Machinationr   c                 S   r   r   r   r   r   r   r   r   [   r   zCMethodicalTests.test_outputsArePrivate.<locals>.Machination.anInputc                 S   s   |  j d7  _ d S N   )counterr   r   r   r   r   _   s   zDMethodicalTests.test_outputsArePrivate.<locals>.Machination.anOutputTr   c                 S   r   )za machine stateNr   r   r   r   r   r(   c   r   zAMethodicalTests.test_outputsArePrivate.<locals>.Machination.stater   N)r"   r#   r$   r	   r%   r<   r&   r   r'   r   r(   r)   r   r   r   r   r*   W   s    



r*   r;   Nr   zlMachination.anOutput is a state-machine output method; to produce this output, call an input method instead.)
r+   r   r,   r<   r1   r2   r   r3   r4   r5   )r   r*   mach1mach2r8   r   r   r   test_outputsArePrivateN   s   	z&MethodicalTests.test_outputsArePrivatec                 C   s>   G dd dt }| }| | dg | | dg dS )zw
        Two machines may co-exist happily on the same instance; they don't
        interfere with each other.
        c                   @   s   e Zd Ze Ze Ze dd Ze dd Zej	dddd Z
ej	ddd	d
 Ze dd Ze dd Ze
ee
eg eeeeg dS )z8MethodicalTests.test_multipleMachines.<locals>.MultiMachc                 S   r   )zinput ANr   r   r   r   r   inputA   r   z?MethodicalTests.test_multipleMachines.<locals>.MultiMach.inputAc                 S   r   )zinput BNr   r   r   r   r   inputB   r   z?MethodicalTests.test_multipleMachines.<locals>.MultiMach.inputBTr   c                 S   r   )z	initial ANr   r   r   r   r   initialA   r   zAMethodicalTests.test_multipleMachines.<locals>.MultiMach.initialAc                 S   r   )z	initial BNr   r   r   r   r   initialB   r   zAMethodicalTests.test_multipleMachines.<locals>.MultiMach.initialBc                 S   r   NAr   r   r   r   r   outputA      z@MethodicalTests.test_multipleMachines.<locals>.MultiMach.outputAc                 S   r   NBr   r   r   r   r   outputB   rG   z@MethodicalTests.test_multipleMachines.<locals>.MultiMach.outputBN)r"   r#   r$   r	   abr&   r@   rA   r(   rB   rC   r'   rF   rJ   r)   r   r   r   r   	MultiMach}   s"    







rM   rE   rI   N)r+   r,   r@   rA   )r   rM   mmr   r   r   test_multipleMachinesw   s   z%MethodicalTests.test_multipleMachinesc                    s6   ddl  G  fdddt}| }| | d dS )zR
        Outputs can be combined with the "collector" argument to "upon".
        r   Nc                       st   e Zd Ze Ze dd Ze dd Ze dd Zej	ddd	d
 Z	e	j
ee	eeg fddd dS )z4MethodicalTests.test_collectOutputs.<locals>.Machinec                 S   r   r   r   r   r   r   r   r&      r   z:MethodicalTests.test_collectOutputs.<locals>.Machine.inputc                 S   r   rD   r   r   r   r   r   rF      rG   z<MethodicalTests.test_collectOutputs.<locals>.Machine.outputAc                 S   r   rH   r   r   r   r   r   rJ      rG   z<MethodicalTests.test_collectOutputs.<locals>.Machine.outputBTr   c                 S   r   r   r   r   r   r   r   r(      r   z:MethodicalTests.test_collectOutputs.<locals>.Machine.statec                    s   t  j| S N)r   addxoperatorr   r   <lambda>       z=MethodicalTests.test_collectOutputs.<locals>.Machine.<lambda>	collectorN)r"   r#   r$   r	   r-   r&   r'   rF   rJ   r(   r)   r   rT   r   r   Machine   s     






rZ   AB)rU   r+   r,   r&   )r   rZ   r-   r   rT   r   test_collectOutputs   s   z#MethodicalTests.test_collectOutputsc                 C   sd   G dd dt }| }| t}|ddd W d   n1 s"w   Y  | dt|j dS )z>
        Input methods preserve their declared names.
        c                   @   s6   e Zd Ze Ze dd Zejdddd ZdS )z-MethodicalTests.test_methodName.<locals>.Mechc                 S   r   r   r   r   r   r   r   declaredInputName   r   z?MethodicalTests.test_methodName.<locals>.Mech.declaredInputNameTr   c                 S   r   )r(   Nr   r   r   r   r   aState   r   z4MethodicalTests.test_methodName.<locals>.Mech.aStateN)	r"   r#   r$   r	   r-   r&   r]   r(   r^   r   r   r   r   Mech   s    

r_   toomany	argumentsNr]   )r+   r1   	TypeErrorr]   r3   r4   r5   )r   r_   r-   r8   r   r   r   test_methodName   s   zMethodicalTests.test_methodNamec                 C   s<   G dd dt }| }| |ddg | |jd dS )zW
        If an input takes an argument, it will pass that along to its output.
        c                   @   sZ   e Zd Ze Ze dddZejdddd Ze ddd	Zeeeeg d
S )z:MethodicalTests.test_inputWithArguments.<locals>.Mechanismr;   c                 S   r   r   r   r   rS   yr   r   r   r&      r   z@MethodicalTests.test_inputWithArguments.<locals>.Mechanism.inputTr   c                 S   r   r   r   r   r   r   r   r(      r   z@MethodicalTests.test_inputWithArguments.<locals>.Mechanism.statec                 S   s   || _ || S rP   _xre   r   r   r   r'      s   zAMethodicalTests.test_inputWithArguments.<locals>.Mechanism.outputNr;   )	r"   r#   r$   r	   r-   r&   r(   r'   r)   r   r   r   r   	Mechanism   s    

rj         N)r+   r,   r&   rh   r   rj   r-   r   r   r   test_inputWithArguments   s   z'MethodicalTests.test_inputWithArgumentsc                 C   s   G dd dt }| }| |dg d | |jd | |jd | |jddg d | |jd | |jd | |d	dg d
 | |jd	 | |jd | |jdddg d | |jd | |jd dS )z@
        Inputs pass arguments that output will accept.
        c                   @   s|   e Zd Ze Ze dddZejdddd Ze dd	 Ze d
d Z	e dd Z
eeeee	e
g dS )zCMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanismr;   c                 S   r   r   r   re   r   r   r   r&      r   zIMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.inputTr   c                 S   r   r   r   r   r   r   r   r(      r   zIMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.statec                 S   
   || _ |S rP   rg   )r   rS   r   r   r   outputX     zKMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputXc                 S   ro   rP   )_y)r   rf   r   r   r   outputY  rq   zKMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputYc                 S      d S rP   r   r   r   r   r   outputNoArgs  rG   zPMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputNoArgsNri   )r"   r#   r$   r	   r-   r&   r(   r'   rp   rs   ru   r)   r   r   r   r   rj      s    




rj   rk   )rk   r;   Nr;   rl   rR   )rl   r;   N   )rv   rk   N   r   )rf   )rw   r   NN)r+   r,   r&   rh   rr   rm   r   r   r    test_outputWithSubsetOfArguments   s   z0MethodicalTests.test_outputWithSubsetOfArgumentsc                    s   t   t   G  fdddt}G dd dt}|   G dd dt}|   G dd dt}|   G d	d
 d
t}|   G dd dt}|   dS )zE
        The wrapped input function must have an empty body.
        c                       s^   e Zd Ze Z eZe dd ZW d   n1 sw   Y   	e
ejd dS )zAMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.Mechanismc                 S   s
   t   dS r   listr   r   r   r   r&   7  s   
zGMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.Mechanism.inputNzfunction body must be empty)r"   r#   r$   r	   r-   r1   
ValueErrorr8   r&   r,   r4   r5   r   r   r   r   rj   3  s    rj   c                   @   F   e Zd Ze Ze dd Zejdddd Zejeeg d dS )	zNMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringc                 S   r   r   r   r   r   r   r   r&   D  r   zTMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstring.inputTr   c                 S   r   zstarting stateNr   r   r   r   r   startH  r   zTMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstring.startr   N	r"   r#   r$   r	   r-   r&   r(   r~   r)   r   r   r   r   MechanismWithDocstringA      


r   c                   @   r|   )	zIMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPassc                 S   rt   rP   r   r   r   r   r   r&   S  rG   zOMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPass.inputTr   c                 S   r   r}   r   r   r   r   r   r~   W  r   zOMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPass.startr   Nr   r   r   r   r   MechanismWithPassP  r   r   c                   @   r|   )	zUMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPassc                 S   r   r   r   r   r   r   r   r&   b  r   z[MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPass.inputTr   c                 S   r   r}   r   r   r   r   r   r~   g  r   z[MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPass.startr   Nr   r   r   r   r   MechanismWithDocstringAndPass_      


r   c                   @   r|   )	zLMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNonec                 S   rt   rP   r   r   r   r   r   r&   r  rG   zRMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNone.inputTr   c                 S   r   r}   r   r   r   r   r   r~   v  r   zRMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNone.startr   Nr   r   r   r   r   MechanismReturnsNoneo  r   r   c                   @   r|   )	z\MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNonec                 S   r   r   r   r   r   r   r   r&     r   zbMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNone.inputTr   c                 S   r   r}   r   r   r   r   r   r~     r   zbMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNone.startr   Nr   r   r   r   r   $MechanismWithDocstringAndReturnsNone~  r   r   N)r   _empty
_docstringr+   r&   )r   rj   r   r   r   r   r   r   r   r   test_inputFunctionsMustBeEmpty)  s   



z.MethodicalTests.test_inputFunctionsMustBeEmptyc                       G  fdddt }dS )z
        All the argument lists of the outputs for a given input must match; if
        one does not the call to C{upon} will raise a C{TypeError}.
        c                       s   e Zd Ze Ze dd Ze dd Ze dd Z	e
 dd Z
 eZe
ee
ee	g W d	   n1 s@w   Y   d
eej  deej d	S )z;MethodicalTests.test_inputOutputMismatch.<locals>.Mechanismc                 S   r   r   r   r   rK   r   r   r   nameOfInput  r   zGMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.nameOfInputc                 S   r   )zan output that matchesNr   r   r   r   r   outputThatMatches  r   zMMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.outputThatMatchesc                 S   r   )zan output that doesn't matchNr   )r   rL   r   r   r   outputThatDoesntMatch  r   zQMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.outputThatDoesntMatchc                 S   r   r   r   r   r   r   r   r(     r   zAMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.stateNr   r   )r"   r#   r$   r	   r-   r&   r   r'   r   r   r(   r1   rc   r8   r)   r3   r4   r5   r   r   r   r   rj     s"    




rj   Nr+   r   rj   r   r   r   test_inputOutputMismatch     z(MethodicalTests.test_inputOutputMismatchc                 C   s0   G dd dt }| }| \}| |d dS )zI
        It is possible to write a self-loop by omitting "enter"
        c                   @   s|   e Zd Ze Ze dd Ze dd Ze dd Zej	ddd	d
 Z
dd Ze
jeg d e
jeegd dS )z1MethodicalTests.test_stateLoop.<locals>.Mechanismc                 S   r   r   r   r   r   r   r   r&     r   z7MethodicalTests.test_stateLoop.<locals>.Mechanism.inputc                 S   r   r   r   r   r   r   r   say_hi  r   z8MethodicalTests.test_stateLoop.<locals>.Mechanism.say_hic                 S   r   )Nhir   r   r   r   r   _start_say_hi  rG   z?MethodicalTests.test_stateLoop.<locals>.Mechanism._start_say_hiTr   c                 S   r   r   r   r   r   r   r   r~     r   z7MethodicalTests.test_stateLoop.<locals>.Mechanism.startc                 S   r   )za state with no inputsNr   r   r   r   r   said_hi  r   z9MethodicalTests.test_stateLoop.<locals>.Mechanism.said_hi)r!   N)r"   r#   r$   r	   r-   r&   r   r'   r   r(   r~   r   r)   r   r   r   r   rj     s    




rj   r   N)r+   r   r,   )r   rj   a_mechanism
a_greetingr   r   r   test_stateLoop  s   
zMethodicalTests.test_stateLoopc                 C   s   G dd dt }|   dS )zF
        It is possible to write a transition with no outputs
        c                   @   sT   e Zd Ze Ze dd Zejdddd Ze dd Z	ej
ee	d	 d
S )z6MethodicalTests.test_defaultOutputs.<locals>.Mechanismc                 S   r   )zfinal transitionNr   r   r   r   r   finish  r   z=MethodicalTests.test_defaultOutputs.<locals>.Mechanism.finishTr   c                 S   r   )za start stateNr   r   r   r   r   r~     r   z<MethodicalTests.test_defaultOutputs.<locals>.Mechanism.startc                 S   r   )za final stateNr   r   r   r   r   finished  r   z?MethodicalTests.test_defaultOutputs.<locals>.Mechanism.finished)r    N)r"   r#   r$   r	   r-   r&   r   r(   r~   r   r)   r   r   r   r   rj     s    



rj   N)r+   r   r   r   r   r   test_defaultOutputs  s   z#MethodicalTests.test_defaultOutputsc              
   C   sF   t dddddddtfdtffd}| t|dddtfdtfh dS )zC
        Type annotations should be included in the set of
        )rK   rL   Nr   rK   rL   )argsvarargsvarkwdefaults
kwonlyargskwonlydefaultsannotations)r   intr4   r,   r   )r   specr   r   r   test_getArgNames  s   	z MethodicalTests.test_getArgNamesc                 C   s>   t dd }t dd }d}t|i ||\}}| || dS )zl
        filterArgs() should not filter the `args` parameter
        if outputSpec accepts `*args`.
        c                  _   rt   rP   r   r   kwargsr   r   r   rV     r   z1MethodicalTests.test_filterArgs.<locals>.<lambda>c                  _   rt   rP   r   r   r   r   r   rV      r   r   N)r   r   r6   )r   	inputSpec
outputSpecargsInargsOut_r   r   r   test_filterArgs  s
   zMethodicalTests.test_filterArgsc                    r   )zI
        A L{MethodicalMachine} can only have one initial state.
        c                       sf   e Zd Ze Zejdddd Z e ejdddd Z	W d   dS 1 s,w   Y  dS )zCMethodicalTests.test_multipleInitialStatesFailure.<locals>.WillFailTr   c                 S   r   )z&The first initial state -- this is OK.Nr   r   r   r   r   firstInitialState  r   zUMethodicalTests.test_multipleInitialStatesFailure.<locals>.WillFail.firstInitialStatec                 S   r   )z4The second initial state -- results in a ValueError.Nr   r   r   r   r   secondInitialState  r   zVMethodicalTests.test_multipleInitialStatesFailure.<locals>.WillFail.secondInitialStateN)
r"   r#   r$   r	   r-   r(   r   r1   r{   r   r   r   r   r   WillFail
  s    


"r   Nr   r   r   r   r   r   !test_multipleInitialStatesFailure  s   z1MethodicalTests.test_multipleInitialStatesFailurec                    r   )zc
        A L{MethodicalMachine} can only have one transition per start/event
        pair.
        c                       s   e Zd Ze Zejdddd Ze dd Ze dd Z	ej
e	eg d	  e ej
e	eg d	 W d
   d
S 1 sBw   Y  d
S )zAMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFailTr   c                 S   r   )zWe start here.Nr   r   r   r   r   r~      r   zGMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFail.startc                 S   r   )zRainbows end.Nr   r   r   r   r   end$  r   zEMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFail.endc                 S   r   )z	An event.Nr   r   r   r   r   event(  r   zGMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFail.eventr   N)r"   r#   r$   r	   r-   r(   r~   r   r&   r   r)   r1   r{   r   r   r   r   r     s    



"r   Nr   r   r   r   r   test_multipleTransitionsFailure  r   z/MethodicalTests.test_multipleTransitionsFailurec                 C   s   G dd dt }| }| t}|  W d   n1 sw   Y  | dt|j | dt|j |  | t}|  W d   n1 sNw   Y  | dt|j | dt|j dS )z
        Calling any input method that lacks a transition for the machine's
        current state raises an informative L{NoTransition}.
        c                   @   sd   e Zd Ze Zejdddd Ze dd Ze dd Z	e d	d
 Z
ee	eg  dS )zFMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePathTr   c                 S   r   )zStart state.Nr   r   r   r   r   r~   9  r   zLMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.startc                 S   r   )z
End state.Nr   r   r   r   r   r   =  r   zJMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.endc                 S   r   )zMove from start to end.Nr   r   r   r   r   advanceA  r   zNMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.advancec                 S   r   )z%A transition from nowhere to nowhere.Nr   r   r   r   r   deadEndE  r   zNMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.deadEndN)r"   r#   r$   r	   r-   r(   r~   r   r&   r   r   r)   r   r   r   r   OnlyOnePath6  s    




r   Nr   r~   r   )r+   r1   r
   r   r3   r4   r5   r   )r   r   r%   r8   r   r   r   !test_badTransitionForCurrentState0  s   

z1MethodicalTests.test_badTransitionForCurrentStatec                 C   s,   G dd dt }| |  ddd dS )a   
        L{MethodicalMachine.serializer} is a decorator that modifies its
        decoratee's signature to take a "state" object as its first argument,
        which is the "serialized" argument to the L{MethodicalMachine.state}
        decorator.
        c                   @   sT   e Zd Ze Zdd Zejddddd Zejdd	d
d Ze	 dd Z
dS )z1MethodicalTests.test_saveState.<locals>.Mechanismc                 S   s
   d| _ d S r:   valuer   r   r   r   __init__a  s   
z:MethodicalTests.test_saveState.<locals>.Mechanism.__init__first-stateT
serializedr   c                 S   r   zFirst state.Nr   r   r   r   r   firstd  r   z7MethodicalTests.test_saveState.<locals>.Mechanism.firstsecond-stater   c                 S   r   zSecond state.Nr   r   r   r   r   secondh  r   z8MethodicalTests.test_saveState.<locals>.Mechanism.secondc                 S      || j dS Nmachine-state
some-valuer   r   r(   r   r   r   savel     z6MethodicalTests.test_saveState.<locals>.Mechanism.saveN)r"   r#   r$   r	   r-   r   r(   r   r   
serializerr   r   r   r   r   rj   ^  s    


rj   r   r;   r   N)r+   r,   r   r   r   r   r   test_saveStateV  s   zMethodicalTests.test_saveStatec                 C   sh   G dd dt }| }|  | }||}| |jd | | d | | ddd dS )a/  
        L{MethodicalMachine.unserializer} decorates a function that becomes a
        machine-state unserializer; its return value is mapped to the
        C{serialized} parameter to C{state}, and the L{MethodicalMachine}
        associated with that instance's state is updated to that state.
        c                   @   s   e Zd Ze Zdd Zejddddd Zejdd	d
d Ze	 dd Z	e
 dd Z
e
 dd Zeje	ee
gdd d eje	eegdd d e dd Ze dd Zedd ZdS )z4MethodicalTests.test_restoreState.<locals>.Mechanismc                 S   s   d| _ d| _d S )Nr;   Fr   	ranOutputr   r   r   r   r     s   
z=MethodicalTests.test_restoreState.<locals>.Mechanism.__init__r   Tr   c                 S   r   r   r   r   r   r   r   r     r   z:MethodicalTests.test_restoreState.<locals>.Mechanism.firstr   r   c                 S   r   r   r   r   r   r   r   r     r   z;MethodicalTests.test_restoreState.<locals>.Mechanism.secondc                 S   r   r   r   r   r   r   r   r&     r   z:MethodicalTests.test_restoreState.<locals>.Mechanism.inputc                 S   s   d| _ d| _dS )Nr   Tr;   r   r   r   r   r   r'     s   z;MethodicalTests.test_restoreState.<locals>.Mechanism.outputc                 S   r   )Nr   r   r   r   r   r   output2  rG   z<MethodicalTests.test_restoreState.<locals>.Mechanism.output2c                 S      t | d S Nr   ry   rR   r   r   r   rV     rW   z=MethodicalTests.test_restoreState.<locals>.Mechanism.<lambda>rX   c                 S   r   r   ry   rR   r   r   r   rV     rW   c                 S   r   r   r   r   r   r   r   r     r   z9MethodicalTests.test_restoreState.<locals>.Mechanism.savec                 S   s   |d | _ |d S )Nr   r   r   )r   blobr   r   r   _restore  s   
z=MethodicalTests.test_restoreState.<locals>.Mechanism._restorec                 S   s   |  }| | |S rP   )r   )clsr   r   r   r   r   fromBlob  s   
z=MethodicalTests.test_restoreState.<locals>.Mechanism.fromBlobN)r"   r#   r$   r	   r-   r   r(   r   r   r&   r'   r   r)   r   r   unserializerr   classmethodr   r   r   r   r   rj     s*    







rj   Fr   r   r   N)r+   r&   r   r   r,   r   )r   rj   m1r   m2r   r   r   test_restoreState{  s   2
z!MethodicalTests.test_restoreStatec                 C   s.   G dd dt }| }|ddgksJ dS )z_
        L{MethodicalMachine} can operate with type annotations on inputs and outputs.
        c                   @   sh   e Zd Ze Ze defddZe dedefddZ	ej
ddd	d
 Z
e
jee
e	gd dS )zAMethodicalTests.test_allowBasicTypeAnnotations.<locals>.Mechanismargc                 S   r   )zAn inputNr   r   r   r   r   r   an_input  r   zJMethodicalTests.test_allowBasicTypeAnnotations.<locals>.Mechanism.an_inputreturnc                 S   s   |d S r:   r   r   r   r   r   	an_output  s   zKMethodicalTests.test_allowBasicTypeAnnotations.<locals>.Mechanism.an_outputTr   c                 S   r   )zA stateNr   r   r   r   r   r(     r   zGMethodicalTests.test_allowBasicTypeAnnotations.<locals>.Mechanism.stater   N)r"   r#   r$   r	   r-   r&   r   r   r'   r   r(   r)   r   r   r   r   rj     s    

rj   r   rk   N)r+   r   )r   rj   	mechanismr   r   r   test_allowBasicTypeAnnotations  s   z.MethodicalTests.test_allowBasicTypeAnnotationsN)r"   r#   r$   __doc__r.   r9   r?   rO   r\   rd   rn   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s,    ())#6e "&%Hr   N)r   	functoolsr   unittestr   automat._methodicalr   r   r   r    r	   r
   r   r   r   r   r   r   <module>   s    