o
    Ñó·iÁQ  ã                   @   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   úcC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\automat/_test/test_methodical.pyÚanInput   ó    z?MethodicalTests.test_oneTransition.<locals>.Machination.anInputc                 S   r   )z	an outputúan-output-valueNr   r   r   r   r   ÚanOutput!   ó   z@MethodicalTests.test_oneTransition.<locals>.Machination.anOutputc                 S   r   )zanother outputúanother-output-valueNr   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   ©ZexpectedMachiner   r   r*   C   s    r*   Nz-MethodicalMachine is an implementation detail)	r	   r+   ÚassertRaisesÚAttributeErrorr%   ÚassertInÚstrÚ	exceptionÚassertIs)r   r*   Z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*   r9   Nr   zlMachination.anOutput is a state-machine output method; to produce this output, call an input method instead.)
r+   r   r,   r:   r0   r1   r   r2   r3   r4   )r   r*   Zmach1Zmach2r6   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•   rC   z@MethodicalTests.test_multipleMachines.<locals>.MultiMach.outputBN)r"   r#   r$   r	   ÚaÚbr&   r<   r=   r(   r>   r?   r'   rB   rF   r)   r   r   r   r   Ú	MultiMach}   s"    







rI   rA   rE   N)r+   r,   r<   r=   )r   rI   Ú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   r@   r   r   r   r   r   rB   ­   rC   z<MethodicalTests.test_collectOutputs.<locals>.Machine.outputAc                 S   r   rD   r   r   r   r   r   rF   ±   rC   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'   rB   rF   r(   r)   r   rP   r   r   ÚMachine¦   s     






ürV   ZAB)rQ   r+   r,   r&   )r   rV   r-   r   rP   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&   rX   r(   rY   r   r   r   r   ÚMechÈ   s    

rZ   ZtooÚmanyÚ	argumentsNrX   )r+   r0   Ú	TypeErrorrX   r2   r3   r4   )r   rZ   r-   r6   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>.Mechanismr9   c                 S   r   r   r   ©r   rO   Ú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 rL   ©Ú_xr_   r   r   r   r'   è   s   zAMethodicalTests.test_inputWithArguments.<locals>.Mechanism.outputN©r9   )	r"   r#   r$   r	   r-   r&   r(   r'   r)   r   r   r   r   Ú	MechanismÝ   s    

rd   é   é   N)r+   r,   r&   rb   ©r   rd   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>.Mechanismr9   c                 S   r   r   r   r_   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 rL   ra   )r   rO   r   r   r   ÚoutputX  ó   zKMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputXc                 S   ri   rL   )Ú_y)r   r`   r   r   r   ÚoutputY  rk   zKMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputYc                 S   ó   d S rL   r   r   r   r   r   ÚoutputNoArgs  rC   zPMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputNoArgsNrc   )r"   r#   r$   r	   r-   r&   r(   r'   rj   rm   ro   r)   r   r   r   r   rd   ø   s    




rd   re   )re   r9   Nr9   rf   rN   )rf   r9   Né   )rp   re   Né   r   )r`   )rq   r   NN)r+   r,   r&   rb   rl   rg   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-   r0   Ú
ValueErrorr6   r&   r,   r3   r4   r   r   r   r   rd   3  s    ýrd   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(   rx   r)   r   r   r   r   ÚMechanismWithDocstringA  ó    


rz   c                   @   rv   )	zIMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPassc                 S   rn   rL   r   r   r   r   r   r&   S  rC   zOMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPass.inputTr   c                 S   r   rw   r   r   r   r   r   rx   W  r   zOMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPass.startr   Nry   r   r   r   r   ÚMechanismWithPassP  r{   r|   c                   @   rv   )	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   rw   r   r   r   r   r   rx   g  r   z[MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPass.startr   Nry   r   r   r   r   ÚMechanismWithDocstringAndPass_  ó    


r}   c                   @   rv   )	zLMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNonec                 S   rn   rL   r   r   r   r   r   r&   r  rC   zRMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNone.inputTr   c                 S   r   rw   r   r   r   r   r   rx   v  r   zRMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNone.startr   Nry   r   r   r   r   ÚMechanismReturnsNoneo  r{   r   c                   @   rv   )	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   rw   r   r   r   r   r   rx   †  r   zbMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNone.startr   Nry   r   r   r   r   Ú$MechanismWithDocstringAndReturnsNone~  r~   r€   N)r   Ú_emptyZ
_docstringr+   r&   )r   rd   rz   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   rG   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   rH   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(   r0   r]   r6   r)   r2   r3   r4   r   r   r   r   rd   ”  s"    




ÿÿrd   N©r+   ©r   rd   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¾  rC   z?MethodicalTests.test_stateLoop.<locals>.Mechanism._start_say_hiTr   c                 S   r   r   r   r   r   r   r   rx   Â  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(   rx   r�   r)   r   r   r   r   rd   ³  s    




rd   r�   N)r+   rŒ   r,   )r   rd   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   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   rx   Ü  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(   rx   r’   r)   r   r   r   r   rd   Õ  s    



rd   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
        )rG   rH   Nr   rG   rH   )ÚargsÚvarargsÚvarkwÚdefaultsÚ
kwonlyargsÚkwonlydefaultsÚannotations)r   Úintr3   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                  _   rn   rL   r   ©r”   Úkwargsr   r   r   rR   ÿ  r   z1MethodicalTests.test_filterArgs.<locals>.<lambda>c                  _   rn   rL   r   rž   r   r   r   rR      r   r   N)r   r   r5   )r   Z	inputSpecZ
outputSpecZargsInZ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¢   r0   ru   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   rx      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(   rx   r§   r&   r¨   r)   r0   ru   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   rx   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(   rx   r§   r&   rª   r«   r)   r   r   r   r   ÚOnlyOnePath6  s    




r¬   Nr«   rx   r§   )r+   r0   r
   r«   r2   r3   r4   rª   )r   r¬   r%   r6   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 r8   ©Ú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   rd   ^  s    


rd   r±   r9   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 )Nr9   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   Tr9   rÄ   r   r   r   r   r'   –  s   z;MethodicalTests.test_restoreState.<locals>.Mechanism.outputc                 S   r   )Nr   r   r   r   r   r   Úoutput2œ  rC   z<MethodicalTests.test_restoreState.<locals>.Mechanism.output2c                 S   ó   t | ƒd S ©Nr   rs   rN   r   r   r   rR      rS   z=MethodicalTests.test_restoreState.<locals>.Mechanism.<lambda>rT   c                 S   rÇ   rÈ   rs   rN   r   r   r   rR   ¡  rS   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 rL   )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   rd   ƒ  s*    







rd   Fr   r¶   r¼   N)r+   r&   rÀ   rÌ   r,   rÅ   )r   rd   Ú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 r8   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   rd   È  s    

rd   r   re   N)r+   rÓ   )r   rd   Z	mechanismr   r   r   Útest_allowBasicTypeAnnotationsÃ  s   z.MethodicalTests.test_allowBasicTypeAnnotationsN)r"   r#   r$   Ú__doc__r.   r7   r;   rK   rW   r^   rh   rr   r‚   rŠ   r�   r“   r�   r¡   r¦   r©   r­   rÃ   rÐ   rÖ   r   r   r   r   r      s,    ())#6e "&%Hr   N)r×   Ú	functoolsr   Zunittestr   Zautomat._methodicalr   r   r   r   Ú r	   r
   r   r   r   r   r   r   Ú<module>   s    