
    XfN                     r    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d
S )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dS )MethodicalTestsz)
    Tests for L{MethodicalMachine}.
    c                      G 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                      e Zd Z e            Ze                                d             Ze                                d             Ze                                d             Z	e
                    d          d             Ze
                                d             Ze                    eeeg           e                    eee	g           d	S )
7MethodicalTests.test_oneTransition.<locals>.Machinationc                     dS zan inputN selfs    O/var/www/html/env/lib/python3.11/site-packages/automat/_test/test_methodical.pyanInputz?MethodicalTests.test_oneTransition.<locals>.Machination.anInput             c                     dS )z	an outputan-output-valuer   r   s    r   anOutputz@MethodicalTests.test_oneTransition.<locals>.Machination.anOutput!   s
     )(r   c                     dS )zanother outputanother-output-valuer   r   s    r   anotherOutputzEMethodicalTests.test_oneTransition.<locals>.Machination.anotherOutput&   s
     .-r   Tinitialc                     dS za stateNr   r   s    r   anStatez?MethodicalTests.test_oneTransition.<locals>.Machination.anState+   r   r   c                     dS )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]((  )( ]]__    _  LLxjLIIIg\'4o  7 7 7 7 7r   r3   r   r   N)objectassertEqualr   )r   r3   ms      r   test_oneTransitionz"MethodicalTests.test_oneTransition   s    	7 	7 	7 	7 	7& 	7 	7 	78 KMM'8&9:::'=&>?????r   c                 Z   t                       G fddt                    } |            }|                     t                    5 }|j         ddd           n# 1 swxY 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                       e Zd Z ZdS )@MethodicalTests.test_machineItselfIsPrivate.<locals>.MachinationN)r+   r,   r-   r.   )expectedMachines   r   r3   r:   D   s        %GGGr   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    ,--	& 	& 	& 	& 	& 	& 	&& 	& 	& 	&!kmm~.. 	 "	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 E",''	) 	) 	)k)?;;;;;s   	AA!$A!c                     G d dt                     } |            }|                                 |                     |j        d            |            }|                     t
                    5 }|j         ddd           n# 1 swxY 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                   
   e Zd Z e            ZdZe                                d             Ze                                d             Z	e
                    d          d             Z
e
                    ee
e	g           dS )	;MethodicalTests.test_outputsArePrivate.<locals>.Machinationr   c                     dS r   r   r   s    r   r   zCMethodicalTests.test_outputsArePrivate.<locals>.Machination.anInputY   r   r   c                 &    | xj         dz  c_         d S N   )counterr   s    r   r   zDMethodicalTests.test_outputsArePrivate.<locals>.Machination.anOutput\   s    !r   Tr!   c                     dS )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   s        ''))GG]]__  _^^" " "]]4]((" " )("JJwehZJ@@@@@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 	A 	A 	A& 	A 	A 	A ***~.. 	"NN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	***A	
 	
 	
 	
 	
s   1BB	B	c                      G 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                      e Zd Z e            Z e            Ze                                d             Ze                                d             Ze	                    d          d             Z
e	                    d          d             Ze                                d             Ze                                d             Ze
                    ee
eg           e                    eeeg           d	S )
8MethodicalTests.test_multipleMachines.<locals>.MultiMachc                     dS )zinput ANr   r   s    r   inputAz?MethodicalTests.test_multipleMachines.<locals>.MultiMach.inputA{   r   r   c                     dS )zinput BNr   r   s    r   inputBz?MethodicalTests.test_multipleMachines.<locals>.MultiMach.inputB~   r   r   Tr!   c                     dS )z	initial ANr   r   s    r   initialAzAMethodicalTests.test_multipleMachines.<locals>.MultiMach.initialA   r   r   c                     dS )z	initial BNr   r   s    r   initialBzAMethodicalTests.test_multipleMachines.<locals>.MultiMach.initialB   r   r   c                     dS NAr   r   s    r   outputAz@MethodicalTests.test_multipleMachines.<locals>.MultiMach.outputA       sr   c                     dS 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   s0       !!##A!!##AWWYY  YWWYY  YWWTW""  #"WWTW""  #"XXZZ  ZXXZZ  ZMM&(WI666MM&(WI66666r   rg   r^   rc   N)r4   r5   rU   rW   )r   rg   mms      r   test_multipleMachinesz%MethodicalTests.test_multipleMachinesr   s    
	7 	7 	7 	7 	7 	7 	7 	72 Y[[se,,,se,,,,,r   c                     ddl  G fddt                    } |            }|                     |                                d           dS )zR
        Outputs can be combined with the "collector" argument to "upon".
        r   Nc                   L   e Zd Z e            Ze                                d             Ze                                d             Ze                                d             Ze	                    d          d             Z	e	
                    ee	eeg fd           d	S )
4MethodicalTests.test_collectOutputs.<locals>.Machinec                     dS r   r   r   s    r   r/   z:MethodicalTests.test_collectOutputs.<locals>.Machine.input   r   r   c                     dS r]   r   r   s    r   r_   z<MethodicalTests.test_collectOutputs.<locals>.Machine.outputA   r`   r   c                     dS rb   r   r   s    r   rd   z<MethodicalTests.test_collectOutputs.<locals>.Machine.outputB   r`   r   Tr!   c                     dS r$   r   r   s    r   r1   z:MethodicalTests.test_collectOutputs.<locals>.Machine.state   r   r   c                 .    t          j        |           S N)r   add)xoperators    r   <lambda>z=MethodicalTests.test_collectOutputs.<locals>.Machine.<lambda>   s    6(,+B+B r   	collectorN)r+   r,   r-   r
   r6   r/   r0   r_   rd   r1   r2   )ru   s   r   Machinerl      s        !!##AWWYY  YXXZZ  ZXXZZ  ZWWTW""  #"JJuegw%7!B!B!B!B  D D D D Dr   ry   AB)ru   r4   r5   r/   )r   ry   r6   ru   s      @r   test_collectOutputsz#MethodicalTests.test_collectOutputs   s}     		D 	D 	D 	D 	D 	D 	Df 	D 	D 	D  GIID)))))r   c                 "    G d dt                     } |            }|                     t                    5 }|                    ddd           ddd           n# 1 swxY w Y   |                     dt          |j                             dS )z>
        Input methods preserve their declared names.
        c                       e Zd Z e            Ze                                d             Ze                    d          d             ZdS )-MethodicalTests.test_methodName.<locals>.Mechc                     dS r   r   r   s    r   declaredInputNamez?MethodicalTests.test_methodName.<locals>.Mech.declaredInputName   r   r   Tr!   c                     dS )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~      sk        !!##AWWYY  YWWTW""  #"  r   r   toomany	argumentsNr   )r4   r<   	TypeErrorr   r>   r?   r@   )r   r   r6   rC   s       r   test_methodNamezMethodicalTests.test_methodName   s    	 	 	 	 	6 	 	 	 DFFy)) 	<Rv{;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<)3r|+<+<=====s   AA #A c                      G 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                      e Zd Z e            Ze                                dd            Ze                    d          d             Ze                                dd            Ze                    eeeg           dS )	:MethodicalTests.test_inputWithArguments.<locals>.MechanismrK   c                     dS r   r   r   rt   ys      r   r/   z@MethodicalTests.test_inputWithArguments.<locals>.Mechanism.input   r   r   Tr!   c                     dS 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    1ur   NrK   )	r+   r,   r-   r
   r6   r/   r1   r0   r2   r   r   r   	Mechanismr      s        !!##AWWYY   YWWTW""  #"XXZZ   Z JJuefX.....r   r         N)r4   r5   r/   r   r   r   r6   s      r   test_inputWithArgumentsz'MethodicalTests.test_inputWithArguments   sy    	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ IKKaS)))q!!!!!r   c                 P    G d dt                     } |            }|                     |                    d          g d           |                     |j        d           |                     |j        d           |                     |                    d          g d           |                     |j        d           |                     |j        d           |                     |                    d	d          g d
           |                     |j        d	           |                     |j        d           |                     |                    dd          g d           |                     |j        d           |                     |j        d           dS )z@
        Inputs pass arguments that output will accept.
        c                   ~   e Zd Z e            Ze                                d
d            Ze                    d          d             Ze                                d             Ze                                d             Z	e                                d             Z
e                    eeee	e
g           d	S )CMethodicalTests.test_outputWithSubsetOfArguments.<locals>.MechanismrK   c                     dS r   r   r   s      r   r/   zIMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.input   r   r   Tr!   c                     dS 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                     d S rr   r   r   s    r   outputNoArgszPMethodicalTests.test_outputWithSubsetOfArguments.<locals>.Mechanism.outputNoArgs       tr   Nr   )r+   r,   r-   r
   r6   r/   r1   r0   r   r   r   r2   r   r   r   r   r      s        !!##AWWYY   YWWTW""  #"XXZZ  Z XXZZ  Z XXZZ  ZJJuegw%EFFFF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 	G 	G 	G 	G 	G 	G* IKK 	\\\222q!!!q!!! 	1|||444q!!!q!!! 	A555q!!!q!!! 	a,,,777q!!!q!!!!!r   c                 T    t          j                     t          j                      G  fddt                    } G d dt                    } |                                              G d dt                    } |                                              G d dt                    } |                                              G d	 d
t                    } |                                              G d dt                    } |                                             dS )zE
        The wrapped input function must have an empty body.
        c                       e Zd Z e            Z                     e          5 Ze                                d             Zddd           n# 1 swxY w Y    	                     e
ej                  d           dS )AMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.Mechanismc                 "    t                       dS r   listr   s    r   r/   zGMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.Mechanism.input  s     FFFFFr   Nzfunction body must be empty)r+   r,   r-   r
   r6   r<   
ValueErrorrC   r/   r5   r?   r@   r   s   r   r   r     s        !!##A"":.. "                
 SS..0MNNNNNs   AAAr   c                       e Zd Z e            Ze                                d             Ze                    d          d             Ze                    eeg            dS )NMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringc                     dS r   r   r   s    r   r/   zTMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstring.input  r   r   Tr!   c                     dS 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     s        !!##AWWYY  YWWTW""! ! #"!JJuE2J66666r   r   c                       e Zd Z e            Ze                                d             Ze                    d          d             Ze                    eeg            dS )IMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPassc                     d S rr   r   r   s    r   r/   zOMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPass.input*  s    r   Tr!   c                     dS r   r   r   s    r   r   zOMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithPass.start-  r   r   r(   Nr   r   r   r   MechanismWithPassr   (  s        !!##AWWYY  YWWTW""! ! #"!JJuE2J66666r   r   c                       e Zd Z e            Ze                                d             Ze                    d          d             Ze                    eeg            dS )UMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPassc                     dS r   r   r   s    r   r/   z[MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPass.input5  s	     r   Tr!   c                     dS r   r   r   s    r   r   z[MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndPass.start9  r   r   r(   Nr   r   r   r   MechanismWithDocstringAndPassr   3  s        !!##AWWYY  Y WWTW""! ! #"!JJuE2J66666r   r   c                       e Zd Z e            Ze                                d             Ze                    d          d             Ze                    eeg            dS )LMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNonec                     d S rr   r   r   s    r   r/   zRMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNone.inputA  r   r   Tr!   c                     dS r   r   r   s    r   r   zRMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismReturnsNone.startD  r   r   r(   Nr   r   r   r   MechanismReturnsNoner   ?  s        !!##AWWYY  YWWTW""! ! #"!JJuE2J66666r   r   c                       e Zd Z e            Ze                                d             Ze                    d          d             Ze                    eeg            dS )\MethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNonec                     dS r   r   r   s    r   r/   zbMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNone.inputL  s	     tr   Tr!   c                     dS r   r   r   s    r   r   zbMethodicalTests.test_inputFunctionsMustBeEmpty.<locals>.MechanismWithDocstringAndReturnsNone.startP  r   r   r(   Nr   r   r   r   $MechanismWithDocstringAndReturnsNoner   J  s        !!##AWWYY  Y WWTW""! ! #"!JJuE2J66666r   r   N)r   _empty
_docstringr4   r/   )r   r   r   r   r   r   r   s   `      r   test_inputFunctionsMustBeEmptyz.MethodicalTests.test_inputFunctionsMustBeEmpty  s    	   	O 	O 	O 	O 	O 	O 	O 	O 	O 	O	7 	7 	7 	7 	7V 	7 	7 	7 	  &&(((	7 	7 	7 	7 	7 	7 	7 	7 	!!###		7 		7 		7 		7 		7F 		7 		7 		7 	&%''--///	7 	7 	7 	7 	76 	7 	7 	7 	$$&&&		7 		7 		7 		7 		76 		7 		7 		7 	-,..4466666r   c                 2      G  f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                   (   e Zd Z e            Ze                                d             Ze                                d             Ze                                d             Z	e
                                d             Z
                     e          5 Ze
                    ee
ee	g           ddd           n# 1 swxY w Y                        d eej                                                  d eej                             dS );MethodicalTests.test_inputOutputMismatch.<locals>.Mechanismc                     dS r   r   r   re   s     r   nameOfInputzGMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.nameOfInput^  r   r   c                     dS )zan output that matchesNr   r   s     r   outputThatMatcheszMMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.outputThatMatchesa  r   r   c                     dS )zan output that doesn't matchNr   )r   rf   s     r   outputThatDoesntMatchzQMethodicalTests.test_inputOutputMismatch.<locals>.Mechanism.outputThatDoesntMatchd  r   r   c                     dS 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WWYY  YXXZZ) ) Z)XXZZ/ / Z/WWYY  Y""9-- H

;0A0E0G H H HH H H H H H H H H H H H H H H MM-R\):):;;;MM133r|3D3DEEEEEs   B??CCr   Nr4   r   r   s   ` r   test_inputOutputMismatchz(MethodicalTests.test_inputOutputMismatchW  sM    
	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	Fr   c                      G d dt                     } |            }|                                \  }|                     |d           dS )zI
        It is possible to write a self-loop by omitting "enter"
        c                   r   e Zd Z e            Ze                                d             Ze                                d             Ze                                d             Ze	                    d          d             Z
d Ze
                    eg            e
                    eeg           d	S )
1MethodicalTests.test_stateLoop.<locals>.Mechanismc                     dS r   r   r   s    r   r/   z7MethodicalTests.test_stateLoop.<locals>.Mechanism.inputv  r   r   c                     dS r   r   r   s    r   say_hiz8MethodicalTests.test_stateLoop.<locals>.Mechanism.say_hiy  r   r   c                     dS )Nhir   r   s    r   _start_say_hiz?MethodicalTests.test_stateLoop.<locals>.Mechanism._start_say_hi|  r   r   Tr!   c                     dS r$   r   r   s    r   r   z7MethodicalTests.test_stateLoop.<locals>.Mechanism.start  r   r   c                     dS )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WWYY  YWWYY  YXXZZ  ZWWTW""  #") ) )JJubJ)))JJvJ77777r   r   r   N)r4   r   r5   )r   r   a_mechanism
a_greetings       r   test_stateLoopzMethodicalTests.test_stateLoopp  sh    	8 	8 	8 	8 	8 	8 	8 	8$  ikk"))++T*****r   c                 d     G d dt                     } |                                             dS )zF
        It is possible to write a transition with no outputs
        c                      e Zd Z e            Ze                                d             Ze                    d          d             Ze                                d             Z	e
                    ee	           dS )6MethodicalTests.test_defaultOutputs.<locals>.Mechanismc                     dS )zfinal transitionNr   r   s    r   finishz=MethodicalTests.test_defaultOutputs.<locals>.Mechanism.finish  r   r   Tr!   c                     dS )za start stateNr   r   s    r   r   z<MethodicalTests.test_defaultOutputs.<locals>.Mechanism.start  r   r   c                     dS )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     s        !!##AWWYY# # Y#WWTW""    #" WWYY    Y JJvXJ.....r   r   N)r4   r   r   s     r   test_defaultOutputsz#MethodicalTests.test_defaultOutputs  sL    	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 		r   c                     t          dddddddt          fdt          ff          }|                     t	          |          dddt          fdt          fh           dS )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c3Z0
 
 
 	#SzC:.	
 	
 	
 	
 	
r   c                     t          d           }t          d           }d}t          |i ||          \  }}|                     ||           dS )zl
        filterArgs() should not filter the `args` parameter
        if outputSpec accepts `*args`.
        c                      d S rr   r   r   kwargss     r   rv   z1MethodicalTests.test_filterArgs.<locals>.<lambda>  s     r   c                      d S rr   r   r  s     r   rv   z1MethodicalTests.test_filterArgs.<locals>.<lambda>  s     r   r   N)r   r   rA   )r   	inputSpec
outputSpecargsInargsOut_s         r   test_filterArgszMethodicalTests.test_filterArgs  s\    
   < <==	 !=!=>>
 Y
CC
fg&&&&&r   c                 2      G  fddt                     }dS )zI
        A L{MethodicalMachine} can only have one initial state.
        c                       e Zd Z e            Ze                    d          d             Z                     e          5  e                    d          d             Z	ddd           dS # 1 swxY w Y   dS )CMethodicalTests.test_multipleInitialStatesFailure.<locals>.WillFailTr!   c                     dS )z&The first initial state -- this is OK.Nr   r   s    r   firstInitialStatezUMethodicalTests.test_multipleInitialStatesFailure.<locals>.WillFail.firstInitialState  r   r   c                     dS )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    s        !!##AWWTW""9 9 #"9 "":.. K K&&K K '&KK K K K K K K K K K K K K K K K K Ks    A11A58A5r  Nr   r   r  s   ` r   !test_multipleInitialStatesFailurez1MethodicalTests.test_multipleInitialStatesFailure  sM    

	K 
	K 
	K 
	K 
	K 
	K 
	Kv 
	K 
	K 
	K 
	K 
	Kr   c                 2      G  fddt                     }dS )zc
        A L{MethodicalMachine} can only have one transition per start/event
        pair.
        c                      e Zd Z e            Ze                    d          d             Ze                                d             Ze                                d             Z	e
                    e	eg                                 e          5  e
                    e	eg            ddd           dS # 1 swxY w Y   dS )AMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFailTr!   c                     dS )zWe start here.Nr   r   s    r   r   zGMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFail.start  r   r   c                     dS )zRainbows end.Nr   r   s    r   endzEMethodicalTests.test_multipleTransitionsFailure.<locals>.WillFail.end  r   r   c                     dS )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WWTW""! ! #"!WWYY    Y  WWYY  YJJuCJ444"":.. 9 9

5R
8889 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9s   B<<C C r  Nr   r  s   ` r   test_multipleTransitionsFailurez/MethodicalTests.test_multipleTransitionsFailure  sA    	9 	9 	9 	9 	9 	9 	9v 	9 	9 	9 	9 	9r   c                     G d dt                     } |            }|                     t                    5 }|                                 ddd           n# 1 swxY w Y   |                     dt          |j                             |                     dt          |j                             |                                 |                     t                    5 }|                                 ddd           n# 1 swxY w 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                   <   e Zd Z e            Ze                    d          d             Ze                                d             Ze                                d             Z	e                                d             Z
e                    e	eg            dS )FMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePathTr!   c                     dS )zStart state.Nr   r   s    r   r   zLMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.start  r   r   c                     dS )z
End state.Nr   r   s    r   r  zJMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.end  r   r   c                     dS )zMove from start to end.Nr   r   s    r   advancezNMethodicalTests.test_badTransitionForCurrentState.<locals>.OnlyOnePath.advance  r   r   c                     dS )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WWTW""  #"WWYY  YWWYY* * Y*WWYY8 8 Y8JJw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   	) 	) 	) 	) 	)& 	) 	) 	)  +--|,, 	OO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	iR\!2!2333gs2<00111|,, 	OO	 	 	 	 	 	 	 	 	 	 	 	 	 	 	iR\!2!2333eS../////s#   AA A"DD
Dc                      G 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                       e Zd Z e            Zd Ze                    dd          d             Ze                    d          d             Ze	                                d	             Z
d
S )1MethodicalTests.test_saveState.<locals>.Mechanismc                     d| _         d S rJ   valuer   s    r   __init__z:MethodicalTests.test_saveState.<locals>.Mechanism.__init__  s    


r   first-stateT
serializedr"   c                     dS zFirst state.Nr   r   s    r   firstz7MethodicalTests.test_saveState.<locals>.Mechanism.first  r   r   second-stater4  c                     dS 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-    s        !!##A  WWtW<<  =<WWW//    0/ \\^^  ^  r   r   r2  rK   r?  N)r4   r5   rC  r   s     r   test_saveStatezMethodicalTests.test_saveState  su    	 	 	 	 	 	 	 	" 	IKK!. 	
 	
 	
 	
 	
r   c                     G 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                   J   e Zd Z e            Zd Ze                    dd          d             Ze                    d          d             Ze	                                d	             Z	e
                                d
             Z
e
                                d             Ze                    e	ee
gd            e                    e	eegd            e                                d             Ze                                d             Zed             ZdS )4MethodicalTests.test_restoreState.<locals>.Mechanismc                 "    d| _         d| _        d S )NrK   Fr0  	ranOutputr   s    r   r1  z=MethodicalTests.test_restoreState.<locals>.Mechanism.__init__4  s    
!&r   r2  Tr3  c                     dS r6  r   r   s    r   r7  z:MethodicalTests.test_restoreState.<locals>.Mechanism.first7  r   r   r8  r9  c                     dS r;  r   r   s    r   r<  z;MethodicalTests.test_restoreState.<locals>.Mechanism.second:  r   r   c                     dS r   r   r   s    r   r/   z:MethodicalTests.test_restoreState.<locals>.Mechanism.input=  r   r   c                 "    d| _         d| _        dS )Nr	   TrK   rK  r   s    r   r0   z;MethodicalTests.test_restoreState.<locals>.Mechanism.output@  s    
!%qr   c                     dS )Nr	   r   r   s    r   output2z<MethodicalTests.test_restoreState.<locals>.Mechanism.output2E  s    qr   c                 ,    t          |           d         S Nr   r   r   s    r   rv   z=MethodicalTests.test_restoreState.<locals>.Mechanism.<lambda>I  s    4771: r   rw   c                 ,    t          |           d         S rT  r   r   s    r   rv   z=MethodicalTests.test_restoreState.<locals>.Mechanism.<lambda>K  s    DGGAJ 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                 D     |             }|                     |           |S rr   )rY  )clsrX  r   s      r   fromBlobz=MethodicalTests.test_restoreState.<locals>.Mechanism.fromBlobX  s$    suu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' ' ' WWtW<<  =<WWW//    0/ WWYY  YXXZZ  Z XXZZ  ZJJufvh!5!5  7 7 7KKvy"6"6  8 8 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 Y[[



wwyy%%u---Q'''GGII!/ 	
 	
 	
 	
 	
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      sS        &@ &@ &@R< < <$!
 !
 !
H -  -  -F* * *2> > >$" " ".-" -" -"`M7 M7 M7`F F F2+ + +6  $
 
 
&	' 	' 	'K K K$9 9 900 0 0D
 
 
D@
 @
 @
 @
 @
r   r   N)rb  	functoolsr   unittestr   automat._methodicalr   r   r   r    r
   r   r   r   r   r   r   <module>rg     s                 O O O O O O O O O O O O . . . . . . . .      \	
 \	
 \	
 \	
 \	
h \	
 \	
 \	
 \	
 \	
r   