
    tfR                        d Z ddlZddlmZ ddlmZmZ ddlmZm	Z	m
Z
 ddlmZmZmZmZ ddlmZ  G d d	e          Z G d
 de          Zd Z G d dej                  Z G d dej                  Z G d dej                  Z G d de
j                  Z G d de
j                  Z G d de          Zd Z G d de
j                  Z G d de
j                  Z  G d d e
j                  Z! G d! d"e          Z"d#Z#d$Z$dS )%z*
Test cases for twisted.python._shellcomp
    N)BytesIO)ListOptional)
_shellcompreflectusage)CompleteFilesCompleteList	CompleterCompletions)unittestc                       e Zd ZdZd ZdS )ZshScriptTestMetaz*
    Metaclass of ZshScriptTestMixin.
    c                     d }d|v r"|d         D ]\  }} |||          }||d|z   <   t                               | |||          S )Nc                       fd}|S )Nc                 &    t          |           S )N)test_genZshFunction)selfcmdNameoptionsFQPNs    a/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/python/test/test_shellcomp.pyrunTestz<ZshScriptTestMeta.__new__.<locals>.makeTest.<locals>.runTest   s    *4+FFF     )r   r   r   s   `` r   makeTestz+ZshScriptTestMeta.__new__.<locals>.makeTest   s/    G G G G G G Nr   generateFortest_genZshFunction_)type__new__)clsnamebasesattrsr   r   r   tests           r   r   zZshScriptTestMeta.__new__   ss    	 	 	 E!!(-m(< ? ?$x55:>,w677||Cue444r   N)__name__
__module____qualname____doc__r   r   r   r   r   r      s-         5 5 5 5 5r   r   c                       e Zd ZdZdS )ZshScriptTestMixina  
    Integration test helper to show that C{usage.Options} classes can have zsh
    completion functions generated for them without raising errors.

    In your subclasses set a class variable like so::

      #            | cmd name | Fully Qualified Python Name of Options class |
      #
      generateFor = [('conch',  'twisted.conch.scripts.conch.ClientOptions'),
                     ('twistd', 'twisted.scripts.twistd.ServerOptions'),
                     ]

    Each package that contains Twisted scripts should contain one TestCase
    subclass which also inherits from this mixin, and contains a C{generateFor}
    list appropriate for the scripts in that package.
    N)r%   r&   r'   r(   r   r   r   r*   r*   (   s           r   r*   )	metaclassc           	         t                      }|                     t          j        d|           	  t	          j        |                      }n)# t          $ r}t          j        d|          d}~ww xY w	 |	                    g d           | 
                    d           n3# t          $ r}t          j        d|f          d}~wt          $ r Y nw xY w|                    d           |                     dt          |                    d                               |                    d           |                                 t%          |d	          r|j        D ]\  }}}}		 |	                    |d
ddg           | 
                    d           n3# t          $ r}t          j        d|f          d}~wt          $ r Y nw xY w|                    d           |                     dt          |                    d                               |                    d           |                                 |                                  dS )aI  
    Generate completion functions for given twisted command - no errors
    should be raised

    @type cmdName: C{str}
    @param cmdName: The name of the command-line utility e.g. 'twistd'

    @type optionsFQPN: C{str}
    @param optionsFQPN: The Fully Qualified Python Name of the C{Options}
        class to be tested.
    _shellCompFilez.Couldn't import or instantiate Options class: N --_shell-completionzsh:2zSystemExit not raisedz&ImportError calling parseOptions(): %sr      subCommandsr/   r0   zzsh:3z4ImportError calling parseOptions() on subcommand: %s)r   patchr   Optionsr   namedAny	Exceptionr   SkipTestparseOptionsfailImportError
SystemExitseekassertEquallenreadtruncatehasattrr3   flushWarnings)
r   r   r   
outputFileoecmdshortparserdocs
             r   r   r   ;   s    JJJu}.
;;;
)G[))++ 
 
 
EFQH
 
 	



+	;;;<<< 			)****  P P P  H1$OOO    OOAQJOOA..//000OOA q-   "'(} 	" 	"#C3R)>HIII 		12222     'MPQt      
 OOAQJOOA$6$6 7 7888OOA!!!! 	sS   A 
A4A//A48B% %
C/CCC+F
G
$F::G
	G
c                   `    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S )ZshTestsz'
    Tests for zsh completion code
    c                    t                      }t          j        |dt                                }t          j        j                                        }|                    t           j        j                   | 	                    |j        |           | 	                    |j
        t          t          j        j
                             | 	                    |j        t          j        j                   t          j        j                                        }|                    t           j        j                   | 	                    |j        |           | 	                    |j        t          j        j                   dS )zi
        Are `compData' attributes you can place on Options classes
        picked up correctly?
        aceN)FighterAceExtendedOptionsr   ZshArgumentsGeneratorr   FighterAceOptionscompDatadescriptionscopyupdater>   multiUsesetmutuallyExclusive
optActionsextraActions)r   optsagrS   rY   s        r   test_accumulateMetadataz ZshTests.test_accumulateMetadata   s0   
 )**-dE799EE(1>CCEE5>KLLL,777c*;*D*M&N&NOOO "3"<"N	
 	
 	
 '/:??AA
3<GHHH
333*;*D*QRRRRRr   c                      G d dt                     } |            }t          j        |dt                                }h dh dh dh dh dd	}|                     |j        |           d
S )z
        Exercise a corner-case of ZshArgumentsGenerator.makeExcludesDict()
        where the long option name already exists in the `excludes` dict being
        built.
        c                   6    e Zd Zg dgZ eg dg          ZdS )GZshTests.test_mutuallyExclusiveCornerCase.<locals>.OddFighterAceOptions)anatraNz0Select the Anatra DS as your dogfighter aircraft)ra   fokkeralbatrosspadbristolrX   N)r%   r&   r'   optFlagsr   rR   r   r   r   OddFighterAceOptionsr`      sE        
 UTTH #{#V#V#V"W  HHHr   rh   rN   >   bfsrd   ra   rb   re   >   ari   rj   rk   rd   rb   re   rc   >   rl   rj   rk   rd   ra   rb   rc   >   rl   ri   rk   rd   ra   re   rc   >   rl   ri   rj   ra   rb   re   rc   )rc   ra   re   rb   rd   N)rO   r   rP   r   r>   excludes)r   rh   r[   r\   expecteds        r    test_mutuallyExclusiveCornerCasez)ZshTests.test_mutuallyExclusiveCornerCase   s    		 		 		 		 		#< 		 		 		 $#%%-dE799EE ONNSSSNNNNNNNNN
 
 	h/////r   c                 >   t                      }t          j        |dt                                }|                     d|j                   |                     d|j                   |                     d|j                   |                     d|j                   dS )z
        We pick up options that are only defined by having an
        appropriately named method on your Options class,
        e.g. def opt_foo(self, foo)
        rN   nocrash
difficultyN)rO   r   rP   r   assertInflagNameToDefinitionallOptionsNameToDefinitionparamNameToDefinition)r   r[   r\   s      r    test_accumulateAdditionalOptionsz)ZshTests.test_accumulateAdditionalOptions   s     )**-dE799EEi!8999i!>???lB$<===lB$ABBBBBr   c                 B    G d dt                     }|                     t          t          j         |            dt                                  G d dt                     }|                     t          t          j         |            dt                                 dS )z\
        Using a parameter/flag name that doesn't exist
        will raise an error
        c                   *    e Zd Z eddi          ZdS )0ZshTests.test_verifyZshNames.<locals>.TmpOptionsdetaillN)rY   r%   r&   r'   r   rR   r   r   r   
TmpOptionsrz      s%        "{y$.?@@@HHHr   r}   rN   c                   (    e Zd Z edg          ZdS )1ZshTests.test_verifyZshNames.<locals>.TmpOptions2)foobarrf   Nr|   r   r   r   TmpOptions2r      s%         #{n5EFFFHHHr   r   N)rO   assertRaises
ValueErrorr   rP   r   )r   r}   r   s      r   test_verifyZshNameszZshTests.test_verifyZshNames   s    	A 	A 	A 	A 	A2 	A 	A 	A 	
8**,,wyy	
 	
 	
	G 	G 	G 	G 	G3 	G 	G 	G
 	,KMMII	
 	
 	
 	
 	
r   c                 V   t                      }|                     t          j        d|           |                     t          dg d           t                      }|                     t          |j                   | 	                    t          |                                           dS )zt
        Generate a completion function, and test the textual output
        against a known correct output
        r-   argv)sillyr/   r0   r1   N)r   r4   r   r5   sysSimpleProgOptionsr   r<   r9   r>   testOutput1getvaluer   rD   r[   s      r   test_zshCodezZshTests.test_zshCode   s    
 YY


5="2J???

3 M M MNNN ""*d&7888j&9&9&;&;<<<<<r   c                 V   t                      }|                     t          j        d|           |                     t          dg d           t                      }|                     t          |j                   | 	                    t          |                                           dS )z
        Generate a completion function with subcommands,
        and test the textual output against a known correct output
        r-   r   )silly2r/   r0   r1   N)r   r4   r   r5   r   SimpleProgWithSubcommandsr   r<   r9   r>   testOutput2r   r   s      r   test_zshCodeWithSubszZshTests.test_zshCodeWithSubs   s    
 YY


5="2J???

3 N N NOOO(***d&7888j&9&9&;&;<<<<<r   c                 \   t                      }|                     t          j        d|           t	                      }|                     t          |j        g d           |                    d           | 	                    dt          |                    d                               dS )zx
        Completion still happens even if a command-line is given
        that would normally throw UsageError.
        r-   )--fokkerserver--unknown-optionz--unknown-option2r0   zsh:5r   r2   Nr   r4   r   r5   rQ   r   r<   r9   r=   r>   r?   r@   r   s      r   test_incompleteCommandLinez#ZshTests.test_incompleteCommandLine   s    
 YY


5="2J??? ""  	
 	
 	
 	C
 2 23344444r   c                    t                      }|                     t          j        d|           t	                      }|                     t          |j        g d           |                    d           | 	                    dt          |                    d                               |                    d           |                                 dS )z
        Completion still happens even if a command-line is given
        that would normally throw UsageError.

        The existence of --unknown-option prior to the subcommand
        will break subcommand detection... but we complete anyway
        r-   )r   r   r   --list-serverr0   r   r   r2   N)r   r4   r   r5   rQ   r   r<   r9   r=   r>   r?   r@   rA   r   s      r    test_incompleteCommandLine_case2z)ZshTests.test_incompleteCommandLine_case2  s     YY


5="2J??? ""  	
 	
 	
 	C
 2 233444r   c                 \   t                      }|                     t          j        d|           t	                      }|                     t          |j        g d           |                    d           | 	                    dt          |                    d                               dS )z
        Completion still happens even if a command-line is given
        that would normally throw UsageError.

        Break subcommand detection in a different way by providing
        an invalid subcommand name.
        r-   )r   zunknown-subcommandr   r0   zzsh:4r   r2   Nr   r   s      r    test_incompleteCommandLine_case3z)ZshTests.test_incompleteCommandLine_case34  s     YY


5="2J??? ""  
	
 
	
 
	
 	C
 2 23344444r   c                 \   t                      }|                     t          j        d|           t	                      }|                     t          |j        g d           |                    d           | 	                    dt          |                    d                               dS )z
        Ensure the optimization which skips building the subcommand list
        under certain conditions isn't broken.
        r-   )z--albar0   r1   r   r2   Nr   r   s      r   test_skipSubcommandListz ZshTests.test_skipSubcommandListO  s    
 YY


5="2J??? "")+U+U+U	
 	
 	
 	C
 2 23344444r   c                     t                      }t          j        |dd          }|                    d          }|                     |d           dS )zY
        Test corner case fetching an option description from a method docstring
        rN   Nr   )rQ   r   rP   getDescriptionr>   )r   r[   argGendescrs       r   test_poorlyDescribedOptMethodz&ZshTests.test_poorlyDescribedOptMethod_  sT     !""1$tDD%%g.. 	(((((r   c                      G d dt           j                  }t                      } |            }|                     |d|           |                     t
          |j        g d           dS )zu
        A C{Completer} with repeat=True may only be used as the
        last item in the extraActions list.
        c                   l    e Zd Z ej         ej        d           ej                    g          ZdS )2ZshTests.test_brokenActions.<locals>.BrokenActionsT)repeat)rZ   N)r%   r&   r'   r   r   r   rR   r   r   r   BrokenActionsr   r  sH        (u(-eoT:::OEO<M<MN  HHHr   r   r-   r.   N)r   r5   r   r4   r   r   r9   )r   r   rD   r[   s       r   test_brokenActionszZshTests.test_brokenActionsl  s    	 	 	 	 	EM 	 	 	
 YY
}

4):666)+O+O+O	
 	
 	
 	
 	
r   c                     G d dt           j                  } |            }t          j        |dd          }|                     |                    d          d           |                     |                    d          d           dS )	z~
        opt_* methods on Options classes should not override the
        data provided in optFlags or optParameters.
        c                   .    e Zd Zg dgZg dgZd Zd ZdS )5ZshTests.test_optMethodsDontOverride.<locals>.Options)flagrj   A flag)parampNA paramc                     dS zjunk descriptionNr   r   s    r   opt_flagz>ZshTests.test_optMethodsDontOverride.<locals>.Options.opt_flag        r   c                     dS r   r   )r   r   s     r   	opt_paramz?ZshTests.test_optMethodsDontOverride.<locals>.Options.opt_param  r   r   N)r%   r&   r'   rg   optParametersr   r   r   r   r   r5   r     sN        ///0H<<<=M' ' '' ' ' ' 'r   r5   rN   Nr   r   r   r   )r   r5   r   rP   r>   r   )r   r5   r[   r   s       r   test_optMethodsDontOverridez$ZshTests.test_optMethodsDontOverride~  s    	' 	' 	' 	' 	'em 	' 	' 	' wyy1$tDD..v66AAA..w77CCCCCr   N)r%   r&   r'   r(   r]   ro   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   rL   rL      s         S S S.0 0 0>C C C
 
 
6
= 
= 
=
= 
= 
=5 5 52  >5 5 565 5 5 ) ) )
 
 
$D D D D Dr   rL   c                       e Zd Zd ZdS )EscapeTestsc                     t           j        }d}|                      ||          d           d}|                      ||          d           dS )z5
        Verify _shellcomp.escape() function
        $z'$'zA--'$"\`--Bz"A--'\$\"\\\`--B"N)r   escaper>   )r   escr$   s      r   test_escapezEscapeTests.test_escape  sY     TE***T$=>>>>>r   N)r%   r&   r'   r   r   r   r   r   r     s#        
? 
? 
? 
? 
?r   r   c                       e Zd ZdZd ZdS )CompleterNotImplementedTestsz
    Test that using an unknown shell constant with SubcommandAction
    raises NotImplementedError

    The other Completer() subclasses are tested in test_usage.py
    c                 p    t          j                    }|                     t          |j        dd           dS )zM
        Using an unknown shellType should raise NotImplementedError
        Nbad_shell_type)r   SubcommandActionr   NotImplementedError
_shellCode)r   actions     r   test_unknownShellz.CompleterNotImplementedTests.test_unknownShell  sA     ,..!2D:J	
 	
 	
 	
 	
r   N)r%   r&   r'   r(   r   r   r   r   r   r     s-         
 
 
 
 
r   r   c                   &    e Zd ZdZg dgZg dgZdS )FighterAceServerOptionsz4
    Options for FighterAce 'server' subcommand
    )zlist-serverNz3List this server with the online FighterAce network)zpackets-per-secondNz+Number of update packets to send per second20N)r%   r&   r'   r(   rg   r   r   r   r   r   r     sA         
 	UTTH	
 	
 	
MMMr   r   c            	          e Zd ZU dZg dg dg dg dg dg dg dgZeeee                           ed	<   g d
g dgZ	eeee                           ed<   dde
dggZ eddddgg dgd edg          i ed          g          Zd ZdS )rQ   zB
    Command-line options for an imaginary `Fighter Ace` game
    )rb   rj   z2Select the Fokker Dr.I as your dogfighter aircraft)rc   rl   z5Select the Albatros D-III as your dogfighter aircraft)rd   rk   z1Select the SPAD S.VII as your dogfighter aircraft)re   ri   z4Select the Bristol Scout as your dogfighter aircraft)physicsr   z$Enable secret Twisted physics engine)jamjz6Enable a small chance that your machine guns will jam!verbosevz1Verbose logging (may be specified more than once)rg   )z
pilot-nameNzWhat's your name, Ace?zManfred von Richthofen)detaildz*Select the level of rendering detail (1-5)3r   r   NzStart FighterAce game-server.zTwisted-PhysicszRendering detail level)r   r   r   )rb   rc   rd   re   r   12345zsaved game file to loadr   rS   rV   rX   rY   rZ   c                     dS ) Nr   r   s    r   	opt_sillyzFighterAceOptions.opt_silly  r   r   )r%   r&   r'   r(   rg   r   r   str__annotations__r   r   r3   r   r
   r	   rR   r   r   r   r   rQ   rQ     sH         
 	NMMRRRJJJPPP@@@NNNMMM+Hd4&'    	QPPJJJ0M4Xc]+,    
402QRK {!2>VWWDDDEll,?+@AAB#m*CDDDE  H    r   rQ   c                   h    e Zd ZdZg dgZg dgZ eddid ed          i	          Zd
 Z	d Z
dS )rO   z
    Extend the options and zsh metadata provided by FighterAceOptions.
    _shellcomp must accumulate options and metadata from all classes in the
    hiearchy so this is important to test.
    )	no-stallsNz+Turn off the ability to stall your aircraft)reality-levelNz)Select the level of physics reality (1-5)5r   zCan't stall your planer   zPhysics reality levelr   )rS   rY   c                     dS )z8
        Select that you can't crash your plane
        Nr   r   s    r   opt_nocrashz%FighterAceExtendedOptions.opt_nocrash  r   r   c                     dS )z+
        How tough are you? (1-10)
        Nr   )r   rr   s     r   opt_difficultyz(FighterAceExtendedOptions.opt_difficulty  r   r   N)r%   r&   r'   r(   rg   r   r   r   rR   r   r   r   r   r   rO   rO     s          SRRSHQQQM {!#;<#YY5L%M%M%MN  H
  
    r   rO   c                  (    t          g dd          S )N)12r   zAccuracy'`?r   )r
   r   r   r   _accuracyActionr   	  s    }====r   c            	           e Zd ZdZg dg dg dgZg dg dgZ eddd	d
gddgg eg dd          ed e	d          g          Z
d ZdS )r   z>
    Command-line options for a `Silly` imaginary program
    )colorczTurn on color output)graygzTurn on gray-scale outputr   )optimizationNr   z&Select the level of optimization (1-5))accuracyrl   r   z"Select the level of accuracy (1-3)zColor onzOptimization level)r   r   r   r   r   )r   r   r   4r   zOptimization?r   )r   r   zoutput filer   c                     dS )zM
        usage.Options does not recognize single-letter opt_ methods
        Nr   r   s    r   opt_XzSimpleProgOptions.opt_X+  r   r   N)r%   r&   r'   r(   rg   r   r   r
   r   r	   rR   r   r   r   r   r   r     s         
 	/..222MMMH 	NMMDDDM
 {);OPP#V,-(L)))   (	
 
 $m-8889  H    r   r   c                       e Zd Zg dgZdS )SimpleProgSub1)sub-optrk   zSub Opt OneNr%   r&   r'   rg   r   r   r   r   r   1          ///0HHHr   r   c                       e Zd Zg dgZdS )SimpleProgSub2)r   rk   zSub Opt TwoNr   r   r   r   r   r   5  r   r   r   c                   H    e Zd ZdgddggZdgddgg dgZdd	ed
gdd	edggZd	S )r   zsome-optionzother-optionrE   z
some-paramzother-paramr   )zanother-paramPzYet Another Paramsub1NzSub Command 1sub2zSub Command 2)r%   r&   r'   rg   r   r   r   r3   r   r   r   r   r   9  s_        .#!67H 
	333M 
~7	~7KKKr   r   s  #compdef silly

_arguments -s -A "-*" \
':output file (*):_files -g "*"' \
"(--accuracy)-a[Select the level of accuracy (1-3)]:Accuracy'\`?:(1 2 3)" \
"(-a)--accuracy=[Select the level of accuracy (1-3)]:Accuracy'\`?:(1 2 3)" \
'(--color --gray -g)-c[Color on]' \
'(--gray -c -g)--color[Color on]' \
'(--color --gray -c)-g[Turn on gray-scale output]' \
'(--color -c -g)--gray[Turn on gray-scale output]' \
'--help[Display this help and exit.]' \
'--optimization=[Optimization level]:Optimization?:(1 2 3 4 5)' \
'*-v[Verbose logging (may be specified more than once)]' \
'*--verbose[Verbose logging (may be specified more than once)]' \
'--version[Display Twisted version and exit.]' \
&& return 0
s  #compdef silly2

_arguments -s -A "-*" \
'*::subcmd:->subcmd' \
':output file (*):_files -g "*"' \
"(--accuracy)-a[Select the level of accuracy (1-3)]:Accuracy'\`?:(1 2 3)" \
"(-a)--accuracy=[Select the level of accuracy (1-3)]:Accuracy'\`?:(1 2 3)" \
'(--another-param)-P[another-param]:another-param:_files' \
'(-P)--another-param=[another-param]:another-param:_files' \
'(--color --gray -g)-c[Color on]' \
'(--gray -c -g)--color[Color on]' \
'(--color --gray -c)-g[Turn on gray-scale output]' \
'(--color -c -g)--gray[Turn on gray-scale output]' \
'--help[Display this help and exit.]' \
'--optimization=[Optimization level]:Optimization?:(1 2 3 4 5)' \
'(--other-option)-o[other-option]' \
'(-o)--other-option[other-option]' \
'(--other-param)-p[other-param]:other-param:_files' \
'(-p)--other-param=[other-param]:other-param:_files' \
'--some-option[some-option]' \
'--some-param=[some-param]:some-param:_files' \
'*-v[Verbose logging (may be specified more than once)]' \
'*--verbose[Verbose logging (may be specified more than once)]' \
'--version[Display Twisted version and exit.]' \
&& return 0
local _zsh_subcmds_array
_zsh_subcmds_array=(
"sub1:Sub Command 1"
"sub2:Sub Command 2"
)

_describe "sub-command" _zsh_subcmds_array
)%r(   r   ior   typingr   r   twisted.pythonr   r   r   twisted.python.usager	   r
   r   r   twisted.trialr   r   r   r*   r   TestCaserL   r   r   r5   r   rQ   rO   r   r   r   r   r   r   r   r   r   r   <module>r
     s   
 


       ! ! ! ! ! ! ! ! 5 5 5 5 5 5 5 5 5 5 T T T T T T T T T T T T " " " " " "5 5 5 5 5 5 5 5,    #4    &A A AHSD SD SD SD SDx  SD SD SDl? ? ? ? ?(# ? ? ?
 
 
 
 
8#4 
 
 
&    em   $" " " " " " " "J     1   8> > >
               F1 1 1 1 1U] 1 1 11 1 1 1 1U] 1 1 1     1   & r   