
    VhR                     "   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
j4                        Z G d de
j4                        Z G d de      Zd Z G d de
j4                        Z G d de
j4                        Z  G d d e
j4                        Z! G d! d"e      Z"d#Z#d$Z$y)%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y)ZshScriptTestMetaz*
    Metaclass of ZshScriptTestMixin.
    c                 |    d }d|v r|d   D ]  \  }} |||      }||d|z   <    t         j                  | |||      S )Nc                       fd}|S )Nc                     t        |       S )N)test_genZshFunction)selfcmdNameoptionsFQPNs    R/home/dcms/DCMS/lib/python3.12/site-packages/twisted/python/test/test_shellcomp.pyrunTestz<ZshScriptTestMeta.__new__.<locals>.makeTest.<locals>.runTest   s    *4+FF     )r   r   r   s   `` r   makeTestz+ZshScriptTestMeta.__new__.<locals>.makeTest   s    G Nr   generateFortest_genZshFunction_)type__new__)clsnamebasesattrsr   r   r   tests           r   r   zZshScriptTestMeta.__new__   s]    	 E!(-m(< ?$5:>,w67? ||Cue44r   N)__name__
__module____qualname____doc__r   r   r   r   r   r      s    5r   r   c                       e Zd ZdZy)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               }| j                  t        j                  d|       	  t	        j
                  |             }	 |j                  g d       | j                  d       |j                  d       | j                  dt        |j!                  d                   |j                  d       |j#                          t%        |d	      r|j&                  D ]  \  }}}}		 |j                  |d
ddg       | j                  d       |j                  d       | j                  dt        |j!                  d                   |j                  d       |j#                           | j)                          y# t        $ r}t        j                  d|      d}~ww xY w# t        $ r}t        j                  d|f      d}~wt        $ r Y jw xY w# t        $ r}t        j                  d|f      d}~wt        $ r Y w xY w)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[)+
+	;< 			)*OOAQJOOA./0OOA q- '(}} 	"#C3R)>HI 		12OOAQJOOA$6 78OOA!%	", 	]  
EFH
 	

  P  H1$OO    ''MPQt   sS   E> F' )G>	F$FF$'	G0GGG	H	#G::H	H	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y)ZshTestsz'
    Tests for zsh completion code
    c                 T   t               }t        j                  |dt                     }t        j
                  j                  j                         }|j                  t         j
                  j                         | j                  |j                  |       | j                  |j                  t        t        j
                  j                               | j                  |j                  t        j
                  j                         t        j
                  j                  j                         }|j                  t         j
                  j                         | j                  |j                  |       | j                  |j                  t        j
                  j                         y)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   s#   
 )*--dE79E(11>>CCE5>>KKL,7c*;*D*D*M*M&NO  "3"<"<"N"N	
 '//::??A
3<<GGH
3*;*D*D*Q*QRr   c                      G d dt               } |       }t        j                  |dt                     }h dh dh dh dh dd	}| j	                  |j
                  |       y
)z
        Exercise a corner-case of ZshArgumentsGenerator.makeExcludesDict()
        where the long option name already exists in the `excludes` dict being
        built.
        c                   .    e Zd Zg dgZ eg dg      Zy)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`      s!    
 UH ##V"WHr   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^    		#< 		 $%--dE79E OSNNN
 	h/r   c                 6   t               }t        j                  |dt                     }| j	                  d|j
                         | j	                  d|j                         | j	                  d|j                         | j	                  d|j                         y)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   sr     )*--dE79Ei!8!89i!>!>?lB$<$<=lB$A$ABr   c                     G d dt               }| j                  t        t        j                   |       dt                       G d dt               }| j                  t        t        j                   |       dt                      y)z\
        Using a parameter/flag name that doesn't exist
        will raise an error
        c                   "    e Zd Z eddi      Zy)0ZshTests.test_verifyZshNames.<locals>.TmpOptionsdetaillN)rY   r%   r&   r'   r   rR   r   r   r   
TmpOptionsrz      s    "y$.?@Hr   r}   rN   c                        e Zd Z edg      Zy)1ZshTests.test_verifyZshNames.<locals>.TmpOptions2)foobarrf   Nr|   r   r   r   TmpOptions2r      s     #n5EFHr   r   N)rO   assertRaises
ValueErrorr   rP   r   )r   r}   r   s      r   test_verifyZshNameszZshTests.test_verifyZshNames   sn    	A2 	A 	
88*,wy	
	G3 	G
 	,,MI	
r   c                 (   t               }| j                  t        j                  d|       | j                  t        dg d       t               }| j                  t        |j                         | j                  t        |j                                y)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   sh    
 Y


5=="2J?

3 MN "*d&7&78j&9&9&;<r   c                 (   t               }| j                  t        j                  d|       | j                  t        dg d       t               }| j                  t        |j                         | j                  t        |j                                y)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   sh    
 Y


5=="2J?

3 NO(**d&7&78j&9&9&;<r   c                 *   t               }| j                  t        j                  d|       t	               }| j                  t        |j                  g d       |j                  d       | j                  dt        |j                  d                   y)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   ss    
 Y


5=="2J? "	
 	C
 234r   c                 l   t               }| j                  t        j                  d|       t	               }| j                  t        |j                  g d       |j                  d       | j                  dt        |j                  d                   |j                  d       |j                          y)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     Y


5=="2J? "	
 	C
 234r   c                 *   t               }| j                  t        j                  d|       t	               }| j                  t        |j                  g d       |j                  d       | j                  dt        |j                  d                   y)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  ss     Y


5=="2J? "
	
 	C
 234r   c                 *   t               }| j                  t        j                  d|       t	               }| j                  t        |j                  g d       |j                  d       | j                  dt        |j                  d                   y)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  sp    
 Y


5=="2J? "))+U	
 	C
 234r   c                     t               }t        j                  |dd      }|j                  d      }| j	                  |d       y)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_  sB     !"11$tD%%g. 	(r   c                      G d dt         j                        }t               } |       }| j                  |d|       | j	                  t
        |j                  g d       y)zu
        A C{Completer} with repeat=True may only be used as the
        last item in the extraActions list.
        c                   v    e Zd Z ej                   ej
                  d       ej
                         g      Zy)2ZshTests.test_brokenActions.<locals>.BrokenActionsT)repeat)rZ   N)r%   r&   r'   r   r   r   rR   r   r   r   BrokenActionsr   r  s0    (u((-eooT:OEOO<MNHr   r   r-   r.   N)r   r5   r   r4   r   r   r9   )r   r   rD   r[   s       r   test_brokenActionszZshTests.test_brokenActionsl  sO    	EMM 	
 Y


4):6))+O	
r   c                      G d dt         j                        } |       }t        j                  |dd      }| j	                  |j                  d      d       | j	                  |j                  d      d       y)	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y)5ZshTests.test_optMethodsDontOverride.<locals>.Options)flagrj   A flag)parampNA paramc                      yzjunk descriptionNr   r   s    r   opt_flagz>ZshTests.test_optMethodsDontOverride.<locals>.Options.opt_flag      r   c                      y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     s    /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~  se    	'emm 	' y11$tD..v6A..w7Cr   N)r%   r&   r'   r(   r]   ro   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   rL   rL      sK    S.0>C
6
=
=52>565 )
$Dr   rL   c                       e Zd Zd Zy)EscapeTestsc                     t         j                  }d}| j                   ||      d       d}| j                   ||      d       y)z5
        Verify _shellcomp.escape() function
        $z'$'zA--'$"\`--Bz"A--'\$\"\\\`--B"N)r   escaper>   )r   escr$   s      r   test_escapezEscapeTests.test_escape  sB     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y)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                         }| j                  t        |j                  dd       y)zM
        Using an unknown shellType should raise NotImplementedError
        Nbad_shell_type)r   SubcommandActionr   NotImplementedError
_shellCode)r   actions     r   test_unknownShellz.CompleterNotImplementedTests.test_unknownShell  s0     ,,.!2!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y)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     s     
 	UH	
Mr   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y)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                      y) 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     s    
 	NRJP@NM+Hd4&'  	QJ0M4Xc]+,  
402QRK !2>VWDEl,?+@AB#*CDEHr   rQ   c                   Z    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
y)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                      y)z8
        Select that you can't crash your plane
        Nr   r   s    r   opt_nocrashz%FighterAceExtendedOptions.opt_nocrash  r   r   c                      y)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     sI     SSHQM !#;<#Y5L%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y)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                      y)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     sw    
 	/2MH 	NDM
 );OP#V,-() (	
 $-89Hr   r   c                       e Zd Zg dgZy)SimpleProgSub1)sub-optrk   zSub Opt OneNr%   r&   r'   rg   r   r   r   r   r   1  
    /0Hr   r   c                       e Zd Zg dgZy)SimpleProgSub2)r   rk   zSub Opt TwoNr   r   r   r   r   r   5  r   r   r   c                   F    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y	)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  sM    .#!67H 
	3M 
~7	~7Kr   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 T T "5 5,#4 &AHSDx   SDl?(## ?
8#4#4 
&emm $" "J 1 8>
   F1U]] 11U]] 1 1 & r   