U
    Á“«j+O  ã                   @   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(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   s   dS ©zan inputN© ©Úselfr   r   úA/tmp/pip-unpacked-wheel-dy2aa_48/automat/_test/test_methodical.pyÚanInput   s    z?MethodicalTests.test_oneTransition.<locals>.Machination.anInputc                 S   s   dS )z	an outputúan-output-valuer   r   r   r   r   ÚanOutput!   s    z@MethodicalTests.test_oneTransition.<locals>.Machination.anOutputc                 S   s   dS )zanother outputúanother-output-valuer   r   r   r   r   ÚanotherOutput&   s    zEMethodicalTests.test_oneTransition.<locals>.Machination.anotherOutputT©Úinitialc                 S   s   dS ©za stateNr   r   r   r   r   ÚanState+   s    z?MethodicalTests.test_oneTransition.<locals>.Machination.anStatec                 S   s   dS )zanother stateNr   r   r   r   r   ÚanotherState/   s    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              	      s`   t ƒ ‰ G ‡ fdd„dtƒ}|ƒ }|  t¡�}|j W 5 Q R X |  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   ©ZexpectedMachiner   r   r'   C   s   r'   z-MethodicalMachine is an implementation detailN)	r	   r(   ÚassertRaisesÚAttributeErrorr"   ÚassertInÚstrÚ	exceptionÚassertIs)r   r'   ZmachinationÚcmr   r,   r   Útest_machineItselfIsPrivate:   s     ÿz+MethodicalTests.test_machineItselfIsPrivatec              	   C   sr   G dd„ dt ƒ}|ƒ }| ¡  |  |jd¡ |ƒ }|  t¡�}|j W 5 Q R X |  |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   s   dS r   r   r   r   r   r   r   [   s    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   s   dS )za machine stateNr   r   r   r   r   r%   c   s    zAMethodicalTests.test_outputsArePrivate.<locals>.Machination.stater   N)r   r    r!   r	   r"   r7   r#   r   r$   r   r%   r&   r   r   r   r   r'   W   s   



r'   r6   r   zlMachination.anOutput is a state-machine output method; to produce this output, call an input method instead.N)
r(   r   r)   r7   r-   r.   r   r/   r0   r1   )r   r'   Zmach1Zmach2r3   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   s   dS )zinput ANr   r   r   r   r   ÚinputA�   s    z?MethodicalTests.test_multipleMachines.<locals>.MultiMach.inputAc                 S   s   dS )zinput BNr   r   r   r   r   ÚinputB…   s    z?MethodicalTests.test_multipleMachines.<locals>.MultiMach.inputBTr   c                 S   s   dS )z	initial ANr   r   r   r   r   ÚinitialA‰   s    zAMethodicalTests.test_multipleMachines.<locals>.MultiMach.initialAc                 S   s   dS )z	initial BNr   r   r   r   r   ÚinitialB�   s    zAMethodicalTests.test_multipleMachines.<locals>.MultiMach.initialBc                 S   s   dS ©NÚAr   r   r   r   r   ÚoutputA‘   s    z@MethodicalTests.test_multipleMachines.<locals>.MultiMach.outputAc                 S   s   dS ©NÚBr   r   r   r   r   ÚoutputB•   s    z@MethodicalTests.test_multipleMachines.<locals>.MultiMach.outputBN)r   r    r!   r	   ÚaÚbr#   r9   r:   r%   r;   r<   r$   r?   rB   r&   r   r   r   r   Ú	MultiMach}   s    







rE   r>   rA   N)r(   r)   r9   r:   )r   rE   Ú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   s   dS r   r   r   r   r   r   r#   ©   s    z:MethodicalTests.test_collectOutputs.<locals>.Machine.inputc                 S   s   dS r=   r   r   r   r   r   r?   ­   s    z<MethodicalTests.test_collectOutputs.<locals>.Machine.outputAc                 S   s   dS r@   r   r   r   r   r   rB   ±   s    z<MethodicalTests.test_collectOutputs.<locals>.Machine.outputBTr   c                 S   s   dS r   r   r   r   r   r   r%   µ   s    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$   r?   rB   r%   r&   r   rL   r   r   ÚMachine¦   s   





ürR   ZAB)rM   r(   r)   r#   )r   rR   r*   r   rL   r   Útest_collectOutputs    s    z#MethodicalTests.test_collectOutputsc              	   C   sP   G dd„ dt ƒ}|ƒ }|  t¡�}| ddd¡ W 5 Q R X |  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   s   dS r   r   r   r   r   r   ÚdeclaredInputNameË   s    z?MethodicalTests.test_methodName.<locals>.Mech.declaredInputNameTr   c                 S   s   dS )r%   Nr   r   r   r   r   ÚaStateÏ   s    z4MethodicalTests.test_methodName.<locals>.Mech.aStateN)	r   r    r!   r	   r*   r#   rT   r%   rU   r   r   r   r   ÚMechÈ   s
   

rV   ZtooÚmanyÚ	argumentsrT   N)r(   r-   Ú	TypeErrorrT   r/   r0   r1   )r   rV   r*   r3   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>.Mechanismr6   c                 S   s   dS r   r   ©r   rK   Úyr   r   r   r#   à   s    z@MethodicalTests.test_inputWithArguments.<locals>.Mechanism.inputTr   c                 S   s   dS r   r   r   r   r   r   r%   ä   s    z@MethodicalTests.test_inputWithArguments.<locals>.Mechanism.statec                 S   s   || _ || S rH   ©Ú_xr[   r   r   r   r$   è   s    zAMethodicalTests.test_inputWithArguments.<locals>.Mechanism.outputN)r6   )r6   )	r   r    r!   r	   r*   r#   r%   r$   r&   r   r   r   r   Ú	MechanismÝ   s   

r_   é   é   N)r(   r)   r#   r^   ©r   r_   r*   r   r   r   Útest_inputWithArgumentsØ   s    z'MethodicalTests.test_inputWithArgumentsc                 C   sò   G dd„ dt ƒ}|ƒ }|  | d¡dddg¡ |  |jd¡ |  |jd¡ |  |jdd�dddg¡ |  |jd¡ |  |jd¡ |  | dd¡dddg¡ |  |jd¡ |  |jd¡ |  |jd	d
d�d	d
dg¡ |  |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>.Mechanismr6   c                 S   s   dS r   r   r[   r   r   r   r#   û   s    zIMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.inputTr   c                 S   s   dS r   r   r   r   r   r   r%   ÿ   s    zIMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.statec                 S   s
   || _ |S rH   r]   )r   rK   r   r   r   ÚoutputX  s    zKMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputXc                 S   s
   || _ |S rH   )Ú_y)r   r\   r   r   r   ÚoutputY  s    zKMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputYc                 S   s   d S rH   r   r   r   r   r   ÚoutputNoArgs  s    zPMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputNoArgsN)r6   )r   r    r!   r	   r*   r#   r%   r$   rd   rf   rg   r&   r   r   r   r   r_   ø   s   




r_   r`   r6   Nra   rJ   é   é   r   )r\   )r(   r)   r#   r^   re   rb   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                	       sJ   e Zd Zeƒ Z”  e¡�Ze ¡ dd„ ƒZW 5 Q R X ”  	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.inputzfunction body must be emptyN)r   r    r!   r	   r*   r-   Ú
ValueErrorr3   r#   r)   r0   r1   r   r   r   r   r_   3  s
   r_   c                   @   sF   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   s   dS r   r   r   r   r   r   r#   D  s    zTMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstring.inputTr   c                 S   s   dS ©zstarting stateNr   r   r   r   r   ÚstartH  s    zTMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstring.startr   N©	r   r    r!   r	   r*   r#   r%   ro   r&   r   r   r   r   ÚMechanismWithDocstringA  s   


rq   c                   @   sF   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 )	zIMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPassc                 S   s   d S rH   r   r   r   r   r   r#   S  s    zOMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPass.inputTr   c                 S   s   dS rn   r   r   r   r   r   ro   W  s    zOMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPass.startr   Nrp   r   r   r   r   ÚMechanismWithPassP  s   


rr   c                   @   sF   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 )	zUMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPassc                 S   s   dS r   r   r   r   r   r   r#   b  s    z[MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPass.inputTr   c                 S   s   dS rn   r   r   r   r   r   ro   g  s    z[MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPass.startr   Nrp   r   r   r   r   ÚMechanismWithDocstringAndPass_  s   


rs   c                   @   sF   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 )	zLMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNonec                 S   s   d S rH   r   r   r   r   r   r#   r  s    zRMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNone.inputTr   c                 S   s   dS rn   r   r   r   r   r   ro   v  s    zRMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNone.startr   Nrp   r   r   r   r   ÚMechanismReturnsNoneo  s   


rt   c                   @   sF   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 )	z\MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNonec                 S   s   dS r   r   r   r   r   r   r#   �  s    zbMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNone.inputTr   c                 S   s   dS rn   r   r   r   r   r   ro   †  s    zbMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNone.startr   Nrp   r   r   r   r   Ú$MechanismWithDocstringAndReturnsNone~  s   


ru   N)r   Ú_emptyZ
_docstringr(   r#   )r   r_   rq   rr   rs   rt   ru   r   r   r   Útest_inputFunctionsMustBeEmpty)  s    



z.MethodicalTests.test_inputFunctionsMustBeEmptyc                    s   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 5 Q R X ”  d	eejƒ¡ ”  d
eejƒ¡ dS )z;MethodicalTests.test_inputOutputMismatch.<locals>.Mechanismc                 S   s   dS r   r   ©r   rC   r   r   r   ÚnameOfInput—  s    zGMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.nameOfInputc                 S   s   dS )zan output that matchesNr   rx   r   r   r   ÚoutputThatMatches›  s    zMMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.outputThatMatchesc                 S   s   dS )zan output that doesn't matchNr   )r   rD   r   r   r   ÚoutputThatDoesntMatchŸ  s    zQMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.outputThatDoesntMatchc                 S   s   dS r   r   r   r   r   r   r%   £  s    zAMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.statery   r{   N)r   r    r!   r	   r*   r#   ry   r$   rz   r{   r%   r-   rY   r3   r&   r/   r0   r1   r   r   r   r   r_   ”  s"   



  ÿr_   N©r(   ©r   r_   r   r   r   Útest_inputOutputMismatchŽ  s    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   s   dS r   r   r   r   r   r   r#   ¶  s    z7MethodicalTests.test_stateLoop.<locals>.Mechanism.inputc                 S   s   dS r   r   r   r   r   r   Úsay_hiº  s    z8MethodicalTests.test_stateLoop.<locals>.Mechanism.say_hic                 S   s   dS )NÚhir   r   r   r   r   Ú_start_say_hi¾  s    z?MethodicalTests.test_stateLoop.<locals>.Mechanism._start_say_hiTr   c                 S   s   dS r   r   r   r   r   r   ro   Â  s    z7MethodicalTests.test_stateLoop.<locals>.Mechanism.startc                 S   s   dS )za state with no inputsNr   r   r   r   r   Úsaid_hiÆ  s    z9MethodicalTests.test_stateLoop.<locals>.Mechanism.said_hi)r   N)r   r    r!   r	   r*   r#   r   r$   r�   r%   ro   r‚   r&   r   r   r   r   r_   ³  s   




r_   r€   N)r(   r   r)   )r   r_   Za_mechanismZ
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   s   dS )zfinal transitionNr   r   r   r   r   ÚfinishØ  s    z=MethodicalTests.test_defaultOutputs.<locals>.Mechanism.finishTr   c                 S   s   dS )za start stateNr   r   r   r   r   ro   Ü  s    z<MethodicalTests.test_defaultOutputs.<locals>.Mechanism.startc                 S   s   dS )za final stateNr   r   r   r   r   Úfinishedà  s    z?MethodicalTests.test_defaultOutputs.<locals>.Mechanism.finished)r   N)r   r    r!   r	   r*   r#   r„   r%   ro   r…   r&   r   r   r   r   r_   Õ  s   



r_   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
        )rC   rD   Nr   rC   rD   )ÚargsÚvarargsÚvarkwÚdefaultsÚ
kwonlyargsÚkwonlydefaultsÚannotations)r   Úintr0   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                  _   s   d S rH   r   ©r‡   Úkwargsr   r   r   rN   ÿ  rO   z1MethodicalTests.test_filterArgs.<locals>.<lambda>c                  _   s   d S rH   r   r‘   r   r   r   rN      rO   r   N)r   r   r2   )r   Z	inputSpecZ
outputSpecZargsInZargsOutÚ_r   r   r   Útest_filterArgsú  s
    zMethodicalTests.test_filterArgsc                    s   G ‡ fdd„dt ƒ}dS )zI
        A L{MethodicalMachine} can only have one initial state.
        c                	       sP   e Zd Zeƒ Zejdd�dd„ ƒZ”  e¡� ejdd�dd„ ƒZ	W 5 Q R X dS )zCMethodicalTests.test_multipleInitialStatesFailure.<locals>.WillFailTr   c                 S   s   dS )z&The first initial state -- this is OK.Nr   r   r   r   r   ÚfirstInitialState  s    zUMethodicalTests.test_multipleInitialStatesFailure.<locals>.WillFail.firstInitialStatec                 S   s   dS )z4The second initial state -- results in a ValueError.Nr   r   r   r   r   ÚsecondInitialState  s    zVMethodicalTests.test_multipleInitialStatesFailure.<locals>.WillFail.secondInitialStateN)
r   r    r!   r	   r*   r%   r•   r-   rm   r–   r   r   r   r   ÚWillFail
  s   


r—   Nr|   ©r   r—   r   r   r   Ú!test_multipleInitialStatesFailure  s    z1MethodicalTests.test_multipleInitialStatesFailurec                    s   G ‡ fdd„dt ƒ}dS )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 5 Q R X d
S )zAMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFailTr   c                 S   s   dS )zWe start here.Nr   r   r   r   r   ro      s    zGMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFail.startc                 S   s   dS )zRainbows end.Nr   r   r   r   r   Úend$  s    zEMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFail.endc                 S   s   dS )z	An event.Nr   r   r   r   r   Úevent(  s    zGMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFail.eventr   N)r   r    r!   r	   r*   r%   ro   rš   r#   r›   r&   r-   rm   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 5 Q R X |  dt|jƒ¡ |  dt|jƒ¡ | ¡  |  t¡�}| ¡  W 5 Q R X |  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   s   dS )zStart state.Nr   r   r   r   r   ro   9  s    zLMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.startc                 S   s   dS )z
End state.Nr   r   r   r   r   rš   =  s    zJMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.endc                 S   s   dS )zMove from start to end.Nr   r   r   r   r   ÚadvanceA  s    zNMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.advancec                 S   s   dS )z%A transition from nowhere to nowhere.Nr   r   r   r   r   ÚdeadEndE  s    zNMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.deadEndN)r   r    r!   r	   r*   r%   ro   rš   r#   r�   rž   r&   r   r   r   r   ÚOnlyOnePath6  s   




rŸ   rž   ro   rš   N)r(   r-   r
   rž   r/   r0   r1   r�   )r   rŸ   r"   r3   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 r5   ©Úvaluer   r   r   r   Ú__init__a  s    z:MethodicalTests.test_saveState.<locals>.Mechanism.__init__úfirst-stateT©Ú
serializedr   c                 S   s   dS ©zFirst state.Nr   r   r   r   r   Úfirstd  s    z7MethodicalTests.test_saveState.<locals>.Mechanism.firstúsecond-state©r¦   c                 S   s   dS ©zSecond state.Nr   r   r   r   r   Úsecondh  s    z8MethodicalTests.test_saveState.<locals>.Mechanism.secondc                 S   s   || j dœS ©N©úmachine-stateú
some-valuer¡   ©r   r%   r   r   r   Úsavel  s    þz6MethodicalTests.test_saveState.<locals>.Mechanism.saveN)r   r    r!   r	   r*   r£   r%   r¨   r¬   Ú
serializerr²   r   r   r   r   r_   ^  s   


r_   r¤   r6   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 )Nr6   F©r¢   Ú	ranOutputr   r   r   r   r£   †  s    z=MethodicalTests.test_restoreState.<locals>.Mechanism.__init__r¤   Tr¥   c                 S   s   dS r§   r   r   r   r   r   r¨   Š  s    z:MethodicalTests.test_restoreState.<locals>.Mechanism.firstr©   rª   c                 S   s   dS r«   r   r   r   r   r   r¬   Ž  s    z;MethodicalTests.test_restoreState.<locals>.Mechanism.secondc                 S   s   dS r   r   r   r   r   r   r#   ’  s    z:MethodicalTests.test_restoreState.<locals>.Mechanism.inputc                 S   s   d| _ d| _dS )Nr   Tr6   rµ   r   r   r   r   r$   –  s    z;MethodicalTests.test_restoreState.<locals>.Mechanism.outputc                 S   s   dS )Nr   r   r   r   r   r   Úoutput2œ  s    z<MethodicalTests.test_restoreState.<locals>.Mechanism.output2c                 S   s   t | ƒd S ©Nr   rk   rJ   r   r   r   rN      rO   z=MethodicalTests.test_restoreState.<locals>.Mechanism.<lambda>rP   c                 S   s   t | ƒd S r¸   rk   rJ   r   r   r   rN   ¡  rO   c                 S   s   || j dœS r­   r¡   r±   r   r   r   r²   £  s    þ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 rH   )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²   Zunserializerrº   Úclassmethodr¼   r   r   r   r   r_   ƒ  s(   







r_   Fr   r©   r®   N)r(   r#   r²   r¼   r)   r¶   )r   r_   Úm1r¹   Úm2r   r   r   Útest_restoreState{  s    2
þþz!MethodicalTests.test_restoreStateN)r   r    r!   Ú__doc__r+   r4   r8   rG   rS   rZ   rc   rj   rw   r~   rƒ   r†   r�   r”   r™   rœ   r    r´   rÀ   r   r   r   r   r      s(   ())#6e "&%r   N)rÁ   Ú	functoolsr   Zunittestr   Zautomat._methodicalr   r   r   r   Ú r	   r
   r   r   r   r   r   r   Ú<module>   s   