o
    [I                     @   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$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   ?/usr/lib/python3/dist-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*   D   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   Y   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(   _   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*   V   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   	MultiMachw   s"    







rM   rE   rI   N)r+   r,   r@   rA   )r   rM   mmr   r   r   test_multipleMachinesr   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&     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     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&     r   zTMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstring.inputTr   c                 S   r   zstarting stateNr   r   r   r   r   start"  r   zTMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstring.startr   N	r"   r#   r$   r	   r-   r&   r(   r~   r)   r   r   r   r   MechanismWithDocstring      


r   c                   @   r|   )	zIMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPassc                 S   rt   rP   r   r   r   r   r   r&   *  rG   zOMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPass.inputTr   c                 S   r   r}   r   r   r   r   r   r~   -  r   zOMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPass.startr   Nr   r   r   r   r   MechanismWithPass(  r   r   c                   @   r|   )	zUMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPassc                 S   r   r   r   r   r   r   r   r&   5  r   z[MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPass.inputTr   c                 S   r   r}   r   r   r   r   r   r~   9  r   z[MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPass.startr   Nr   r   r   r   r   MechanismWithDocstringAndPass3      


r   c                   @   r|   )	zLMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNonec                 S   rt   rP   r   r   r   r   r   r&   A  rG   zRMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNone.inputTr   c                 S   r   r}   r   r   r   r   r   r~   D  r   zRMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNone.startr   Nr   r   r   r   r   MechanismReturnsNone?  r   r   c                   @   r|   )	z\MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNonec                 S   r   r   r   r   r   r   r   r&   L  r   zbMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNone.inputTr   c                 S   r   r}   r   r   r   r   r   r~   P  r   zbMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNone.startr   Nr   r   r   r   r   $MechanismWithDocstringAndReturnsNoneJ  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   outputThatMatchesa  r   zMMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.outputThatMatchesc                 S   r   )zan output that doesn't matchNr   )r   rL   r   r   r   outputThatDoesntMatchd  r   zQMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.outputThatDoesntMatchc                 S   r   r   r   r   r   r   r   r(   g  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_inputOutputMismatchW     z(MethodicalTests.test_inputOutputMismatchc              
   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_getArgNamesq  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  r   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  s   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~     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   advance  r   zNMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.advancec                 S   r   )z%A transition from nowhere to nowhere.Nr   r   r   r   r   deadEnd  r   zNMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.deadEndN)r"   r#   r$   r	   r-   r(   r~   r   r&   r   r   r)   r   r   r   r   OnlyOnePath  s    




r   Nr   r~   r   )r+   r1   r
   r   r3   r4   r5   r   )r   r   r%   r8   r   r   r   !test_badTransitionForCurrentState  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__  s   
z:MethodicalTests.test_saveState.<locals>.Mechanism.__init__first-stateT
serializedr   c                 S   r   zFirst state.Nr   r   r   r   r   first  r   z7MethodicalTests.test_saveState.<locals>.Mechanism.firstsecond-stater   c                 S   r   zSecond state.Nr   r   r   r   r   second  r   z8MethodicalTests.test_saveState.<locals>.Mechanism.secondc                 S      || j dS Nmachine-state
some-valuer   r   r(   r   r   r   save     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_saveState  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     s2    







rj   Fr   r   r   N)r+   r&   r   r   r,   r   )r   rj   m1r   m2r   r   r   test_restoreState  s   ,
z!MethodicalTests.test_restoreStateN)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      s&    )$#0P""r   N)r   	functoolsr   unittestr   automat._methodicalr   r   r   r    r	   r
   r   r   r   r   r   r   <module>   s   