Ë
    —~ªbòN  ã                   ój   — 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	e«      Zy
)z,
Tests for the public interface of Automat.
é    )Úreduce)ÚTestCase)ÚArgSpecÚ_getArgNamesÚ_getArgSpecÚ_filterArgsé   )ÚMethodicalMachineÚNoTransition)Ú_methodicalc                   ó‚   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚMethodicalTestsz)
    Tests for L{MethodicalMachine}.
    c                 ó´   —  G d„ dt         «      } |«       }| j                  |j                  «       dg«       | j                  |j                  «       dg«       y)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                   óN  — e Zd Z e«       Zej                  «       d„ «       Zej                  «       d„ «       Zej                  «       d„ «       Z	ej                  d¬«      d„ «       Zej                  «       d„ «       Zej                  eeeg¬«       ej                  eee	g¬«       y	)
ú7MethodicalTests.test_oneTransition.<locals>.Machinationc                  ó   — y©zan inputN© ©Úselfs    ú?/usr/lib/python3/dist-packages/automat/_test/test_methodical.pyÚanInputz?MethodicalTests.test_oneTransition.<locals>.Machination.anInput   ó   � ó    c                  ó   — y)z	an outputúan-output-valuer   r   s    r   ÚanOutputz@MethodicalTests.test_oneTransition.<locals>.Machination.anOutput!   s   € ð )r   c                  ó   — y)zanother outputúanother-output-valuer   r   s    r   ÚanotherOutputzEMethodicalTests.test_oneTransition.<locals>.Machination.anotherOutput&   s   € ð .r   T©Úinitialc                  ó   — y©za stateNr   r   s    r   ÚanStatez?MethodicalTests.test_oneTransition.<locals>.Machination.anState+   r   r   c                  ó   — y)zanother stateNr   r   s    r   ÚanotherStatezDMethodicalTests.test_oneTransition.<locals>.Machination.anotherState/   r   r   ©ÚenterÚoutputsN)Ú__name__Ú
__module__Ú__qualname__r
   ÚmachineÚinputr   Úoutputr   r    Ústater%   r'   Úuponr   r   r   ÚMachinationr      sÃ   „ Ù'Ó)ˆGØ�]‰]‹_ñó ðð �^‰^Óñ)ó ð)ð �^‰^Óñ.ó ð.ð �]‰] 4ˆ]Ó(ñó )ðð �]‰]‹_ñ ó ð ð �L‰L˜¨¸x¸jˆLÔIØ×Ñ˜g¨\Ø'4 oð õ 7r   r3   r   r   N)ÚobjectÚassertEqualr   )r   r3   Úms      r   Útest_oneTransitionz"MethodicalTests.test_oneTransition   sK   € ô	7œ&ô 	7ñ8 ‹MˆØ×Ñ˜Ÿ™›Ð'8Ð&9Ô:Ø×Ñ˜Ÿ™›Ð'=Ð&>Õ?r   c                 ó8  ‡— t        «       Š G ˆfd„dt        «      } |«       }| j                  t        «      5 }|j                   ddd«       | j                  dt        j                  «      «       | j                  |j                  ‰«       y# 1 sw Y   ŒKxY w)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                   ó   •— e Zd ZW ° Zy)ú@MethodicalTests.test_machineItselfIsPrivate.<locals>.MachinationN)r+   r,   r-   r.   )ÚexpectedMachines   €r   r3   r:   D   s   ø„ Ù%‰Gr   r3   Nz-MethodicalMachine is an implementation detail)	r
   r4   ÚassertRaisesÚAttributeErrorr.   ÚassertInÚstrÚ	exceptionÚassertIs)r   r3   ÚmachinationÚcmr;   s       @r   Útest_machineItselfIsPrivatez+MethodicalTests.test_machineItselfIsPrivate<   s}   ø€ ô ,Ó-ˆö	&œ&ô 	&á!“mˆØ×Ñœ~Ó.ð 	 °"Ø×Ò÷	 à�‰ÐEÜ˜"Ÿ,™,Ó'ô	)à�‰�k×)Ñ)¨?Õ;÷		 ð 	 ús   ¹BÂBc                 ó„  —  G d„ dt         «      } |«       }|j                  «        | j                  |j                  d«        |«       }| j	                  t
        «      5 }|j                   ddd«       | j                  |j                  d«       | j                  dt        j                  «      «       y# 1 sw Y   ŒKxY w)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                   óÐ   — e Zd Z e«       ZdZej                  «       d„ «       Zej                  «       d„ «       Z	ej                  d¬«      d„ «       Z
e
j                  ee
e	g¬«       y)	ú;MethodicalTests.test_outputsArePrivate.<locals>.Machinationr   c                  ó   — yr   r   r   s    r   r   zCMethodicalTests.test_outputsArePrivate.<locals>.Machination.anInputY   r   r   c                 ó.   — | xj                   dz  c_         y ©Né   )Úcounterr   s    r   r   zDMethodicalTests.test_outputsArePrivate.<locals>.Machination.anOutput\   s   € à—’ Ñ!–r   Tr!   c                  ó   — y)za machine stateNr   r   s    r   r1   zAMethodicalTests.test_outputsArePrivate.<locals>.Machination.state_   r   r   r(   N)r+   r,   r-   r
   r.   rL   r/   r   r0   r   r1   r2   r   r   r   r3   rG   V   sq   „ Ù'Ó)ˆGØˆGØ�]‰]‹_ñó ðà�^‰^Óñ"ó ð"à�]‰] 4ˆ]Ó(ñ"ó )ð"à�J‰J�w e°h°ZˆJÕ@r   r3   rK   Nr   zlMachination.anOutput is a state-machine output method; to produce this output, call an input method instead.)
r4   r   r5   rL   r<   r=   r   r>   r?   r@   )r   r3   Úmach1Úmach2rC   s        r   Útest_outputsArePrivatez&MethodicalTests.test_outputsArePrivateN   s›   € ô	Aœ&ô 	Añ “ˆØ�‰ŒØ×Ñ˜Ÿ™¨Ô*Ù“ˆØ×Ñœ~Ó.ð 	°"Ø�NŠN÷	à×Ñ˜Ÿ™¨Ô*à�‰ðAä�—‘Óõ	
÷		ð 	ús   ÁB6Â6B?c                 ó´   —  G d„ dt         «      } |«       }| j                  |j                  «       dg«       | j                  |j                  «       dg«       y)zw
        Two machines may co-exist happily on the same instance; they don't
        interfere with each other.
        c                   óˆ  — e Zd Z e«       Z e«       Zej                  «       d„ «       Zej                  «       d„ «       Zej                  d¬«      d„ «       Z
ej                  d¬«      d„ «       Zej                  «       d„ «       Zej                  «       d„ «       Ze
j                  ee
eg«       ej                  eeeg«       y	)
ú8MethodicalTests.test_multipleMachines.<locals>.MultiMachc                  ó   — y)zinput ANr   r   s    r   ÚinputAz?MethodicalTests.test_multipleMachines.<locals>.MultiMach.inputA{   r   r   c                  ó   — y)zinput BNr   r   s    r   ÚinputBz?MethodicalTests.test_multipleMachines.<locals>.MultiMach.inputB~   r   r   Tr!   c                  ó   — y)z	initial ANr   r   s    r   ÚinitialAzAMethodicalTests.test_multipleMachines.<locals>.MultiMach.initialA�   r   r   c                  ó   — y)z	initial BNr   r   s    r   ÚinitialBzAMethodicalTests.test_multipleMachines.<locals>.MultiMach.initialB„   r   r   c                  ó   — y©NÚAr   r   s    r   ÚoutputAz@MethodicalTests.test_multipleMachines.<locals>.MultiMach.outputA‡   ó   € àr   c                  ó   — y©NÚBr   r   s    r   ÚoutputBz@MethodicalTests.test_multipleMachines.<locals>.MultiMach.outputBŠ   r`   r   N)r+   r,   r-   r
   ÚaÚbr/   rU   rW   r1   rY   r[   r0   r_   rd   r2   r   r   r   Ú	MultiMachrS   w   sÐ   „ Ù!Ó#ˆAÙ!Ó#ˆAà�W‰W‹Yñó ðà�W‰W‹Yñó ðà�W‰W˜TˆWÓ"ñó #ðà�W‰W˜TˆWÓ"ñó #ðà�X‰X‹Zñó ðà�X‰X‹Zñó ðà�M‰M˜& (¨W¨IÔ6Ø�M‰M˜& (¨W¨IÕ6r   rg   r^   rc   N)r4   r5   rU   rW   )r   rg   Úmms      r   Útest_multipleMachinesz%MethodicalTests.test_multipleMachinesr   sG   € ô
	7œô 	7ñ2 ‹[ˆØ×Ñ˜Ÿ™› s eÔ,Ø×Ñ˜Ÿ™› s eÕ,r   c                 ó~   ‡— ddl Š G ˆfd„dt        «      } |«       }| j                  |j                  «       d«       y)zR
        Outputs can be combined with the "collector" argument to "upon".
        r   Nc                   ó  •— e Zd Z e«       Zej                  «       d„ «       Zej                  «       d„ «       Zej                  «       d„ «       Zej                  d¬«      d„ «       Z	e	j                  ee	eegˆ fd„¬«       y	)
ú4MethodicalTests.test_collectOutputs.<locals>.Machinec                  ó   — yr   r   r   s    r   r/   z:MethodicalTests.test_collectOutputs.<locals>.Machine.inputœ   r   r   c                  ó   — yr]   r   r   s    r   r_   z<MethodicalTests.test_collectOutputs.<locals>.Machine.outputAŸ   r`   r   c                  ó   — yrb   r   r   s    r   rd   z<MethodicalTests.test_collectOutputs.<locals>.Machine.outputB¢   r`   r   Tr!   c                  ó   — yr$   r   r   s    r   r1   z:MethodicalTests.test_collectOutputs.<locals>.Machine.state¥   r   r   c                 ó0   •— t        ‰j                  | «      S ©N)r   Úadd)ÚxÚoperators    €r   ú<lambda>z=MethodicalTests.test_collectOutputs.<locals>.Machine.<lambda>©   s   ø€ ¬6°(·,±,ÀÓ+B€ r   ©Ú	collectorN)r+   r,   r-   r
   r6   r/   r0   r_   rd   r1   r2   )ru   s   €r   ÚMachinerl   š   s�   ø„ Ù!Ó#ˆAØ�W‰W‹Yñó ðà�X‰X‹Zñó ðà�X‰X‹Zñó ðà�W‰W˜TˆWÓ"ñó #ðà�J‰J�u˜e g¨wÐ%7Û!Bð õ Dr   ry   ÚAB)ru   r4   r5   r/   )r   ry   r6   ru   s      @r   Útest_collectOutputsz#MethodicalTests.test_collectOutputs•   s5   ø€ ó 	ö	D”fô 	Dñ  ‹IˆØ×Ñ˜Ÿ™› DÕ)r   c                 óô   —  G d„ dt         «      } |«       }| j                  t        «      5 }|j                  ddd«       ddd«       | j	                  dt        j                  «      «       y# 1 sw Y   Œ/xY w)z>
        Input methods preserve their declared names.
        c                   óv   — e Zd Z e«       Zej                  «       d„ «       Zej                  d¬«      d„ «       Zy)ú-MethodicalTests.test_methodName.<locals>.Mechc                  ó   — yr   r   r   s    r   ÚdeclaredInputNamez?MethodicalTests.test_methodName.<locals>.Mech.declaredInputName´   r   r   Tr!   c                  ó   — y)r1   Nr   r   s    r   ÚaStatez4MethodicalTests.test_methodName.<locals>.Mech.aState·   r   r   N)	r+   r,   r-   r
   r6   r/   r€   r1   r‚   r   r   r   ÚMechr~   ²   s?   „ Ù!Ó#ˆAØ�W‰W‹Yñó ðà�W‰W˜TˆWÓ"ñó #ñr   rƒ   ÚtooÚmanyÚ	argumentsNr€   )r4   r<   Ú	TypeErrorr€   r>   r?   r@   )r   rƒ   r6   rC   s       r   Útest_methodNamezMethodicalTests.test_methodName®   sf   € ô	”6ô 	ñ ‹FˆØ×ÑœyÓ)ð 	<¨RØ×Ñ  v¨{Ô;÷	<à�‰Ð)¬3¨r¯|©|Ó+<Õ=÷	<ð 	<ús   ¬A.Á.A7c                 ó¬   —  G d„ dt         «      } |«       }| j                  |j                  d«      dg«       | j                  |j                  d«       y)zW
        If an input takes an argument, it will pass that along to its output.
        c                   óÎ   — e Zd Z e«       Zej                  «       dd„«       Zej                  d¬«      d„ «       Zej                  «       dd„«       Zej                  eeeg«       y)ú:MethodicalTests.test_inputWithArguments.<locals>.Mechanismc                  ó   — yr   r   ©r   rt   Úys      r   r/   z@MethodicalTests.test_inputWithArguments.<locals>.Mechanism.inputÆ   r   r   Tr!   c                  ó   — yr$   r   r   s    r   r1   z@MethodicalTests.test_inputWithArguments.<locals>.Mechanism.stateÉ   r   r   c                 ó   — || _         ||z   S rr   ©Ú_xr�   s      r   r0   zAMethodicalTests.test_inputWithArguments.<locals>.Mechanism.outputÌ   s   € à�”Ø˜1‘u�r   N©rK   )	r+   r,   r-   r
   r6   r/   r1   r0   r2   r   r   r   Ú	Mechanismr‹   Ä   sk   „ Ù!Ó#ˆAØ�W‰W‹Yòó ðà�W‰W˜TˆWÓ"ñó #ðà�X‰X‹Zòó ðð �J‰J�u˜e f XÕ.r   r”   é   é   N)r4   r5   r/   r’   ©r   r”   r6   s      r   Útest_inputWithArgumentsz'MethodicalTests.test_inputWithArgumentsÀ   sE   € ô	/œô 	/ñ ‹KˆØ×Ñ˜Ÿ™ › a SÔ)Ø×Ñ˜Ÿ™˜qÕ!r   c                 ó  —  G d„ dt         «      } |«       }| j                  |j                  d«      g d¢«       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  d¬«      g d¢«       | j                  |j                  d«       | j                  |j                  d«       | j                  |j                  d	d«      g d
¢«       | j                  |j                  d	«       | j                  |j                  d«       | j                  |j                  dd¬«      g d¢«       | j                  |j                  d«       | j                  |j                  d«       y)z@
        Inputs pass arguments that output will accept.
        c                   ó(  — e Zd Z e«       Zej                  «       d	d„«       Zej                  d¬«      d„ «       Zej                  «       d„ «       Zej                  «       d„ «       Z	ej                  «       d„ «       Z
ej                  eeee	e
g«       y)
úCMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanismc                  ó   — yr   r   r�   s      r   r/   zIMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.inputÝ   r   r   Tr!   c                  ó   — yr$   r   r   s    r   r1   zIMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.stateà   r   r   c                 ó   — || _         |S rr   r‘   )r   rt   s     r   ÚoutputXzKMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputXã   ó   € à�”Ø�r   c                 ó   — || _         |S rr   )Ú_y)r   rŽ   s     r   ÚoutputYzKMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputYç   r    r   c                  ó   — y rr   r   r   s    r   ÚoutputNoArgszPMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputNoArgsë   ó   € àr   Nr“   )r+   r,   r-   r
   r6   r/   r1   r0   rŸ   r£   r¥   r2   r   r   r   r”   r›   Û   s¢   „ Ù!Ó#ˆAØ�W‰W‹Yòó ðà�W‰W˜TˆWÓ"ñó #ðà�X‰X‹Zñó ðð �X‰X‹Zñó ðð �X‰X‹Zñó ðà�J‰J�u˜e g¨w¸Ð%EÕFr   r”   r•   )r•   rK   NrK   r–   ©rt   )r–   rK   Né   )r¨   r•   Né   r	   )rŽ   )r©   r	   NN)r4   r5   r/   r’   r¢   r—   s      r   Ú test_outputWithSubsetOfArgumentsz0MethodicalTests.test_outputWithSubsetOfArguments×   s)  € ô	Gœô 	Gñ* ‹Kˆð 	×Ñ˜Ÿ™ ›¢\Ô2Ø×Ñ˜Ÿ™˜qÔ!Ø×Ñ˜Ÿ™˜qÔ!ð 	×Ñ˜Ÿ™ 1˜›¢|Ô4Ø×Ñ˜Ÿ™˜qÔ!Ø×Ñ˜Ÿ™˜qÔ!ð 	×Ñ˜Ÿ™  A›ªÔ5Ø×Ñ˜Ÿ™˜qÔ!Ø×Ñ˜Ÿ™˜qÔ!ð 	×Ñ˜Ÿ™  a˜›ª,Ô7Ø×Ñ˜Ÿ™˜qÔ!Ø×Ñ˜Ÿ™˜qÕ!r   c                 óà  ‡ — t        j                  «        t        j                  «         G ˆ fd„dt        «      } G d„ dt        «      } |«       j	                  «         G d„ dt        «      } |«       j	                  «         G d„ dt        «      } |«       j	                  «         G d	„ d
t        «      } |«       j	                  «         G d„ dt        «      } |«       j	                  «        y)zE
        The wrapped input function must have an empty body.
        c                   óÜ   •— e Zd Z e«       ZW ° j                  e«      5 Zej                  «       d„ «       Zddd«       W ° j                   e
ej                  «      d«       y# 1 sw Y   Œ-xY w)úAMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.Mechanismc                 ó   — t        «        yr   ©Úlistr   s    r   r/   zGMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.Mechanism.input  s	   € ô •Fr   Nzfunction body must be empty)r+   r,   r-   r
   r6   r<   Ú
ValueErrorrC   r/   r5   r?   r@   r   s   €r   r”   r­     sd   ø„ Ù!Ó#ˆAÙ×"Ñ" :Ó.ð °"Ø—‘“ñó ð÷ñ
 ×Ñ™S §¡Ó.Ð0MÕN÷ð ús   ŸA"Á"A+r”   c                   óž   — e Zd Z e«       Zej                  «       d„ «       Zej                  d¬«      d„ «       Zej                  eeg ¬«       y)úNMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringc                  ó   — yr   r   r   s    r   r/   zTMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstring.input  r   r   Tr!   c                  ó   — y©zstarting stateNr   r   s    r   ÚstartzTMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstring.start"  r   r   r(   N©	r+   r,   r-   r
   r6   r/   r1   r·   r2   r   r   r   ÚMechanismWithDocstringr³     sQ   „ Ù!Ó#ˆAØ�W‰W‹Yñó ðà�W‰W˜TˆWÓ"ñ!ó #ð!à�J‰J�u E°2ˆJÕ6r   r¹   c                   óž   — e Zd Z e«       Zej                  «       d„ «       Zej                  d¬«      d„ «       Zej                  eeg ¬«       y)úIMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPassc                  ó   — y rr   r   r   s    r   r/   zOMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPass.input*  s   € àr   Tr!   c                  ó   — yr¶   r   r   s    r   r·   zOMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPass.start-  r   r   r(   Nr¸   r   r   r   ÚMechanismWithPassr»   (  sQ   „ Ù!Ó#ˆAØ�W‰W‹Yñó ðà�W‰W˜TˆWÓ"ñ!ó #ð!à�J‰J�u E°2ˆJÕ6r   r¾   c                   óž   — e Zd Z e«       Zej                  «       d„ «       Zej                  d¬«      d„ «       Zej                  eeg ¬«       y)úUMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPassc                  ó   — yr   r   r   s    r   r/   z[MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPass.input5  s   € ð r   Tr!   c                  ó   — yr¶   r   r   s    r   r·   z[MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPass.start9  r   r   r(   Nr¸   r   r   r   ÚMechanismWithDocstringAndPassrÀ   3  sS   „ Ù!Ó#ˆAØ�W‰W‹Yñó ðð �W‰W˜TˆWÓ"ñ!ó #ð!à�J‰J�u E°2ˆJÕ6r   rÃ   c                   óž   — e Zd Z e«       Zej                  «       d„ «       Zej                  d¬«      d„ «       Zej                  eeg ¬«       y)úLMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNonec                  ó   — y rr   r   r   s    r   r/   zRMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNone.inputA  r¦   r   Tr!   c                  ó   — yr¶   r   r   s    r   r·   zRMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNone.startD  r   r   r(   Nr¸   r   r   r   ÚMechanismReturnsNonerÅ   ?  sQ   „ Ù!Ó#ˆAØ�W‰W‹Yñó ðà�W‰W˜TˆWÓ"ñ!ó #ð!à�J‰J�u E°2ˆJÕ6r   rÈ   c                   óž   — e Zd Z e«       Zej                  «       d„ «       Zej                  d¬«      d„ «       Zej                  eeg ¬«       y)ú\MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNonec                  ó   — yr   r   r   s    r   r/   zbMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNone.inputL  s   € ð r   Tr!   c                  ó   — yr¶   r   r   s    r   r·   zbMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNone.startP  r   r   r(   Nr¸   r   r   r   Ú$MechanismWithDocstringAndReturnsNonerÊ   J  sS   „ Ù!Ó#ˆAØ�W‰W‹Yñó ðð �W‰W˜TˆWÓ"ñ!ó #ð!à�J‰J�u E°2ˆJÕ6r   rÍ   N)r   Ú_emptyÚ
_docstringr4   r/   )r   r”   r¹   r¾   rÃ   rÈ   rÍ   s   `      r   Útest_inputFunctionsMustBeEmptyz.MethodicalTests.test_inputFunctionsMustBeEmpty  s¼   ø€ ô 	×ÑÔÜ×ÑÔ ö	Oœô 	Oô	7¤Vô 	7ñ 	Ó ×&Ñ&Ô(ô	7¤ô 	7ñ 	Ó×!Ñ!Ô#ô		7¬Fô 		7ñ 	&Ó'×-Ñ-Ô/ô	7¤6ô 	7ñ 	Ó×$Ñ$Ô&ô		7´6ô 		7ñ 	-Ó.×4Ñ4Õ6r   c                 ó(   ‡ —  G ˆ fd„dt         «      }y)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                   óÐ  •— e Zd Z e«       Zej                  «       d„ «       Zej                  «       d„ «       Zej                  «       d„ «       Z	ej                  «       d„ «       Z
W ° j                  e«      5 Ze
j                  ee
ee	g«       ddd«       W ° j                  d eej"                  «      «       W ° j                  d eej"                  «      «       y# 1 sw Y   ŒPxY w)ú;MethodicalTests.test_inputOutputMismatch.<locals>.Mechanismc                  ó   — yr   r   ©r   re   s     r   ÚnameOfInputzGMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.nameOfInput^  r   r   c                  ó   — y)zan output that matchesNr   rÕ   s     r   ÚoutputThatMatcheszMMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.outputThatMatchesa  r   r   c                  ó   — y)zan output that doesn't matchNr   )r   rf   s     r   ÚoutputThatDoesntMatchzQMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.outputThatDoesntMatchd  r   r   c                  ó   — yr$   r   r   s    r   r1   zAMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.stateg  r   r   NrÖ   rÚ   )r+   r,   r-   r
   r6   r/   rÖ   r0   rØ   rÚ   r1   r<   r‡   rC   r2   r>   r?   r@   r   s   €r   r”   rÓ   \  sâ   ø„ Ù!Ó#ˆAØ�W‰W‹Yñó ðà�X‰X‹Zñ)ó ð)à�X‰X‹Zñ/ó ð/à�W‰W‹Yñó ðá×"Ñ" 9Ó-ð H°Ø—
‘
˜;¨Ð0AØ0Eð0Gô H÷Hñ �M‰M˜-©¨R¯\©\Ó):Ô;Ù�M‰MÐ1±3°r·|±|Ó3DÕE÷	Hð Hús   Á7CÃC%r”   N©r4   ©r   r”   s   ` r   Útest_inputOutputMismatchz(MethodicalTests.test_inputOutputMismatchW  s   ø€ ö
	Fœõ 	Fr   c                 óx   —  G d„ dt         «      } |«       }|j                  «       \  }| j                  |d«       y)zI
        It is possible to write a self-loop by omitting "enter"
        c                   ó"  — e Zd Z e«       Zej                  «       d„ «       Zej                  «       d„ «       Zej                  «       d„ «       Zej                  d¬«      d„ «       Z
d„ Ze
j                  eg ¬«       e
j                  eeg¬«       y	)
ú1MethodicalTests.test_stateLoop.<locals>.Mechanismc                  ó   — yr   r   r   s    r   r/   z7MethodicalTests.test_stateLoop.<locals>.Mechanism.inputv  r   r   c                  ó   — yr   r   r   s    r   Úsay_hiz8MethodicalTests.test_stateLoop.<locals>.Mechanism.say_hiy  r   r   c                  ó   — y)NÚhir   r   s    r   Ú_start_say_hiz?MethodicalTests.test_stateLoop.<locals>.Mechanism._start_say_hi|  r¦   r   Tr!   c                  ó   — yr$   r   r   s    r   r·   z7MethodicalTests.test_stateLoop.<locals>.Mechanism.start  r   r   c                  ó   — y)za state with no inputsNr   r   s    r   Úsaid_hiz9MethodicalTests.test_stateLoop.<locals>.Mechanism.said_hi‚  r   r   )r*   N)r+   r,   r-   r
   r6   r/   rä   r0   rç   r1   r·   rê   r2   r   r   r   r”   rá   t  s–   „ Ù!Ó#ˆAØ�W‰W‹Yñó ðà�W‰W‹Yñó ðà�X‰X‹Zñó ðà�W‰W˜TˆWÓ"ñó #ðò)à�J‰J�u bˆJÔ)Ø�J‰J�v¨ ˆJÕ7r   r”   ræ   N)r4   rä   r5   )r   r”   Úa_mechanismÚ
a_greetings       r   Útest_stateLoopzMethodicalTests.test_stateLoopp  s7   € ô	8œô 	8ñ$  “kˆØ"×)Ñ)Ó+‰ˆØ×Ñ˜ TÕ*r   c                 óL   —  G d„ dt         «      } |«       j                  «        y)zF
        It is possible to write a transition with no outputs
        c                   óÈ   — e Zd Z e«       Zej                  «       d„ «       Zej                  d¬«      d„ «       Zej                  «       d„ «       Z	ej                  ee	¬«       y)ú6MethodicalTests.test_defaultOutputs.<locals>.Mechanismc                  ó   — y)zfinal transitionNr   r   s    r   Úfinishz=MethodicalTests.test_defaultOutputs.<locals>.Mechanism.finish‘  r   r   Tr!   c                  ó   — y)za start stateNr   r   s    r   r·   z<MethodicalTests.test_defaultOutputs.<locals>.Mechanism.start”  r   r   c                  ó   — y)za final stateNr   r   s    r   Úfinishedz?MethodicalTests.test_defaultOutputs.<locals>.Mechanism.finished—  r   r   )r)   N)r+   r,   r-   r
   r6   r/   rò   r1   r·   rõ   r2   r   r   r   r”   rð   �  sg   „ Ù!Ó#ˆAØ�W‰W‹Yñ#ó ð#à�W‰W˜TˆWÓ"ñ ó #ð à�W‰W‹Yñ ó ð à�J‰J�v XˆJÕ.r   r”   N)r4   rò   rÝ   s     r   Útest_defaultOutputsz#MethodicalTests.test_defaultOutputs‹  s   € ô	/œô 	/ñ 	‹×ÑÕr   c                 óš   — t        dddddddt        fdt        ff¬«      }| j                  t	        |«      dddt        fdt        fh«       y)zC
        Type annotations should be included in the set of
        )re   rf   Nr   re   rf   )ÚargsÚvarargsÚvarkwÚdefaultsÚ
kwonlyargsÚkwonlydefaultsÚannotations)r   Úintr?   r5   r   )r   Úspecs     r   Útest_getArgNamesz MethodicalTests.test_getArgNames�  s\   € ô ØØØØØØØœs˜ c¬3 ZÐ0ô
ˆð 	×ÑÜ˜ÓØ�#˜œS�z C¬ :Ð.õ	
r   c                 ó~   — t        d„ «      }t        d„ «      }d}t        |i ||«      \  }}| j                  ||«       y)zl
        filterArgs() should not filter the `args` parameter
        if outputSpec accepts `*args`.
        c                   ó   — y rr   r   ©rø   Úkwargss     r   rv   z1MethodicalTests.test_filterArgs.<locals>.<lambda>µ  r   r   c                   ó   — y rr   r   r  s     r   rv   z1MethodicalTests.test_filterArgs.<locals>.<lambda>¶  r   r   r   N)r   r   rA   )r   Ú	inputSpecÚ
outputSpecÚargsInÚargsOutÚ_s         r   Útest_filterArgszMethodicalTests.test_filterArgs°  sA   € ô
  Ñ <Ó=ˆ	Ü Ñ!=Ó>ˆ
ØˆÜ  ¨¨Y¸
ÓC‰
ˆ�Ø�‰�f˜gÕ&r   c                 ó(   ‡ —  G ˆ fd„dt         «      }y)zI
        A L{MethodicalMachine} can only have one initial state.
        c                   óÊ   •— e Zd Z e«       Zej                  d¬«      d„ «       ZW ° j                  e«      5  ej                  d¬«      d„ «       Z	ddd«       y# 1 sw Y   yxY w)úCMethodicalTests.test_multipleInitialStatesFailure.<locals>.WillFailTr!   c                  ó   — y)z&The first initial state -- this is OK.Nr   r   s    r   ÚfirstInitialStatezUMethodicalTests.test_multipleInitialStatesFailure.<locals>.WillFail.firstInitialStateÄ  r   r   c                  ó   — y)z4The second initial state -- results in a ValueError.Nr   r   s    r   ÚsecondInitialStatezVMethodicalTests.test_multipleInitialStatesFailure.<locals>.WillFail.secondInitialStateÉ  r   r   N)
r+   r,   r-   r
   r6   r1   r  r<   r±   r  r   s   €r   ÚWillFailr  Á  sp   ø„ Ù!Ó#ˆAà�W‰W˜TˆWÓ"ñ9ó #ð9ñ ×"Ñ" :Ó.ñ KØ—‘ �Ó&ñKó 'ðK÷K÷ Kñ Kús   ·AÁA"r  NrÜ   ©r   r  s   ` r   Ú!test_multipleInitialStatesFailurez1MethodicalTests.test_multipleInitialStatesFailure¼  s   ø€ ö

	K”võ 
	Kr   c                 ó(   ‡ —  G ˆ fd„dt         «      }y)zc
        A L{MethodicalMachine} can only have one transition per start/event
        pair.
        c                   óB  •— e Zd Z e«       Zej                  d¬«      d„ «       Zej                  «       d„ «       Zej                  «       d„ «       Z	ej                  e	eg ¬«       W ° j                  e«      5  ej                  e	eg ¬«       ddd«       y# 1 sw Y   yxY w)úAMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFailTr!   c                  ó   — y)zWe start here.Nr   r   s    r   r·   zGMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFail.start×  r   r   c                  ó   — y)zRainbows end.Nr   r   s    r   ÚendzEMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFail.endÚ  r   r   c                  ó   — y)z	An event.Nr   r   s    r   ÚeventzGMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFail.eventÞ  r   r   r(   N)r+   r,   r-   r
   r6   r1   r·   r  r/   r  r2   r<   r±   r   s   €r   r  r  Ô  s¡   ø„ Ù!Ó#ˆAà�W‰W˜TˆWÓ"ñ!ó #ð!à�W‰W‹Yñ ó ð ð �W‰W‹Yñó ðà�J‰J�u C°ˆJÔ4Ù×"Ñ" :Ó.ñ 9Ø—
‘
˜5¨°R�
Ô8÷9÷ 9ñ 9ús   Á7BÂBr  NrÜ   r  s   ` r   Útest_multipleTransitionsFailurez/MethodicalTests.test_multipleTransitionsFailureÎ  s   ø€ ö	9”võ 	9r   c                 ó`  —  G d„ dt         «      } |«       }| j                  t        «      5 }|j                  «        ddd«       | j	                  dt        j                  «      «       | j	                  dt        |j                  «      «       |j                  «        | j                  t        «      5 }|j                  «        ddd«       | j	                  dt        |j                  «      «       | j	                  dt        |j                  «      «       y# 1 sw Y   ŒÜxY w# 1 sw Y   Œ`xY w)z‘
        Calling any input method that lacks a transition for the machine's
        current state raises an informative L{NoTransition}.
        c                   óô   — e Zd Z e«       Zej                  d¬«      d„ «       Zej                  «       d„ «       Zej                  «       d„ «       Z	ej                  «       d„ «       Z
ej                  e	eg «       y)úFMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePathTr!   c                  ó   — y)zStart state.Nr   r   s    r   r·   zLMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.startî  r   r   c                  ó   — y)z
End state.Nr   r   s    r   r  zJMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.endñ  r   r   c                  ó   — y)zMove from start to end.Nr   r   s    r   ÚadvancezNMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.advanceô  r   r   c                  ó   — y)z%A transition from nowhere to nowhere.Nr   r   s    r   ÚdeadEndzNMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.deadEnd÷  r   r   N)r+   r,   r-   r
   r6   r1   r·   r  r/   r&  r(  r2   r   r   r   ÚOnlyOnePathr"  ì  s   „ Ù!Ó#ˆAØ�W‰W˜TˆWÓ"ñó #ðà�W‰W‹Yñó ðà�W‰W‹Yñ*ó ð*à�W‰W‹Yñ8ó ð8à�J‰J�w  RÕ(r   r)  Nr(  r·   r  )r4   r<   r   r(  r>   r?   r@   r&  )r   r)  r.   rC   s       r   Ú!test_badTransitionForCurrentStatez1MethodicalTests.test_badTransitionForCurrentStateæ  sÛ   € ô	)œ&ô 	)ñ  “-ˆØ×Ñœ|Ó,ð 	°Ø�O‰OÔ÷	à�‰�i¤ R§\¡\Ó!2Ô3Ø�‰�gœs 2§<¡<Ó0Ô1Ø�‰ÔØ×Ñœ|Ó,ð 	°Ø�O‰OÔ÷	à�‰�i¤ R§\¡\Ó!2Ô3Ø�‰�eœS §¡Ó.Õ/÷	ð 	ú÷
	ð 	ús   ¬DÂ4D$ÄD!Ä$D-c                 ór   —  G d„ dt         «      }| j                   |«       j                  «       dddœ«       y)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                   ó®   — e Zd Z e«       Zd„ Zej                  dd¬«      d„ «       Zej                  d¬«      d„ «       Zej                  «       d	„ «       Z
y
)ú1MethodicalTests.test_saveState.<locals>.Mechanismc                 ó   — d| _         y rJ   ©Úvaluer   s    r   Ú__init__z:MethodicalTests.test_saveState.<locals>.Mechanism.__init__  s	   € Ø�•
r   úfirst-stateT©Ú
serializedr"   c                  ó   — y©zFirst state.Nr   r   s    r   Úfirstz7MethodicalTests.test_saveState.<locals>.Mechanism.first  r   r   úsecond-state©r4  c                  ó   — y©zSecond state.Nr   r   s    r   Úsecondz8MethodicalTests.test_saveState.<locals>.Mechanism.second  r   r   c                 ó    — || j                   dœS ©N©úmachine-stateú
some-valuer/  ©r   r1   s     r   Úsavez6MethodicalTests.test_saveState.<locals>.Mechanism.save  ó   € ð &+Ø"&§*¡*ñð r   N)r+   r,   r-   r
   r6   r1  r1   r7  r<  Ú
serializerrC  r   r   r   r”   r-    sc   „ Ù!Ó#ˆAòà�W‰W °tˆWÓ<ñó =ðà�W‰W ˆWÓ/ñ ó 0ð à�\‰\‹^ñó ñr   r”   r2  rK   r?  N)r4   r5   rC  rÝ   s     r   Útest_saveStatezMethodicalTests.test_saveState  s7   € ô	œô 	ð" 	×ÑÙ‹K×ÑÓà!.Øñõ	
r   c                 óP  —  G d„ dt         «      } |«       }|j                  «        |j                  «       }|j                  |«      }| j	                  |j
                  d«       | j	                  |j                  «       d«       | j	                  |j                  «       dddœ«       y)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                   óÊ  — e Zd Z e«       Zd„ Zej                  dd¬«      d„ «       Zej                  d¬«      d„ «       Zej                  «       d	„ «       Z	ej                  «       d
„ «       Z
ej                  «       d„ «       Zej                  e	ee
gd„ ¬«       ej                  e	eegd„ ¬«       ej                  «       d„ «       Zej                  «       d„ «       Zed„ «       Zy)ú4MethodicalTests.test_restoreState.<locals>.Mechanismc                 ó    — d| _         d| _        y )NrK   F©r0  Ú	ranOutputr   s    r   r1  z=MethodicalTests.test_restoreState.<locals>.Mechanism.__init__4  s   € Ø�”
Ø!&�•r   r2  Tr3  c                  ó   — yr6  r   r   s    r   r7  z:MethodicalTests.test_restoreState.<locals>.Mechanism.first7  r   r   r8  r9  c                  ó   — yr;  r   r   s    r   r<  z;MethodicalTests.test_restoreState.<locals>.Mechanism.second:  r   r   c                  ó   — yr   r   r   s    r   r/   z:MethodicalTests.test_restoreState.<locals>.Mechanism.input=  r   r   c                 ó    — d| _         d| _        y)Nr	   TrK   rK  r   s    r   r0   z;MethodicalTests.test_restoreState.<locals>.Mechanism.output@  s   € à�”
Ø!%�”Ør   c                  ó   — y)Nr	   r   r   s    r   Úoutput2z<MethodicalTests.test_restoreState.<locals>.Mechanism.output2E  s   € àr   c                 ó   — t        | «      d   S ©Nr   r¯   r§   s    r   rv   z=MethodicalTests.test_restoreState.<locals>.Mechanism.<lambda>I  s   € ¬4°«7°1©:€ r   rw   c                 ó   — t        | «      d   S rT  r¯   r§   s    r   rv   z=MethodicalTests.test_restoreState.<locals>.Mechanism.<lambda>K  s   € ¬D°«G°A©J€ r   c                 ó    — || j                   dœS r>  r/  rB  s     r   rC  z9MethodicalTests.test_restoreState.<locals>.Mechanism.saveL  rD  r   c                 ó    — |d   | _         |d   S )NrA  r@  r/  )r   Úblobs     r   Ú_restorez=MethodicalTests.test_restoreState.<locals>.Mechanism._restoreS  s   € à! ,Ñ/�”
Ø˜OÑ,Ð,r   c                 ó6   —  | «       }|j                  |«       |S rr   )rY  )ÚclsrX  r   s      r   ÚfromBlobz=MethodicalTests.test_restoreState.<locals>.Mechanism.fromBlobX  s   € á“u�Ø—‘˜dÔ#Ø�r   N)r+   r,   r-   r
   r6   r1  r1   r7  r<  r/   r0   rR  r2   rE  rC  ÚunserializerrY  Úclassmethodr\  r   r   r   r”   rI  2  s  „ Ù!Ó#ˆAò'ð �W‰W °tˆWÓ<ñó =ðà�W‰W ˆWÓ/ñ ó 0ð à�W‰W‹Yñó ðà�X‰X‹Zñó ðð �X‰X‹Zñó ðà�J‰J�u˜f v hÙ!5ð ô 7à�K‰K˜˜v¨ yÙ"6ð ô 8à�\‰\‹^ñó ðð �^‰^Óñ-ó ð-ð ñó ñr   r”   Fr	   r8  r?  N)r4   r/   rC  r\  r5   rL  )r   r”   Úm1rX  Úm2s        r   Útest_restoreStatez!MethodicalTests.test_restoreState*  sˆ   € ô*	œô *	ñX ‹[ˆØ
�‰Œ
Ø�w‰w‹yˆØ×Ñ Ó%ˆØ×Ñ˜Ÿ™ uÔ-Ø×Ñ˜Ÿ™› QÔ'Ø×ÑØ�G‰G‹Ià!/Øñõ	
r   N)r+   r,   r-   Ú__doc__r7   rD   rP   ri   r{   rˆ   r˜   rª   rÐ   rÞ   rí   rö   r  r  r  r  r*  rF  ra  r   r   r   r   r      sr   „ ñò&@òR<ò$!
òH -òF*ò2>ò$"ò.-"ò`M7ò`Fò2+ò6ò$
ò&	'òKò$9ò00òD
óD@
r   r   N)rb  Ú	functoolsr   Úunittestr   Úautomat._methodicalr   r   r   r   Ú r
   r   r   r   r   r   r   ú<module>rg     s,   ðñõ Ý ç OÓ Oß .Ý ô\	
�hõ \	
r   