
    `N`                         d Z ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 ddlmZ e	j        Ze	j        Ze	j        Ze	j        Z G d	 d
ej                  Zedk    r ej                     dS dS )zTests for yapf.split_penalty.    N)pytree)pytree_utils)pytree_visitor)split_penalty)style)yapf_test_helperc                   D    e Zd Zed             Zd	dZd Zd Zd Zd Z	dS )
SplitPenaltyTestc                 P    t          j        t          j                               d S N)r   SetGlobalStyleCreateYapfStyle)clss    <lib/python3.11/site-packages/yapftests/split_penalty_test.py
setUpClasszSplitPenaltyTest.setUpClass%   s"    	.0011111    Fc                     t          j        |          }t          j        |           |r t	          j        |t          j                   |S )a  Parses the code and computes split penalties.

    Arguments:
      code: code to parse as a string
      dumptree: if True, the parsed pytree (after penalty assignment) is dumped
        to stderr. Useful for debugging.

    Returns:
      Parse tree.
    )target_stream)r   ParseCodeToTreer   ComputeSplitPenaltiesr   
DumpPyTreesysstderr)selfcodedumptreetrees       r   _ParseAndComputePenaltiesz*SplitPenaltyTest._ParseAndComputePenalties)   sK     '--D'--- @CJ????Kr   c                 P    fd|                      | |                     dS )zCheck that the tokens in the tree have the correct penalties.

    Args:
      tree: the pytree.
      list_of_expected: list of (name, penalty) pairs. Non-semantic tokens are
        filtered out from the expected values.
    c                    t          j        |           t           j        v rg S t          | t          j                  r,| j        t          j        | t           j        j	                  fgS g }| j
        D ]}| |          z  }|S r   )r   NodeNameNONSEMANTIC_TOKENS
isinstancer   LeafvalueGetNodeAnnotation
AnnotationSPLIT_PENALTYchildren)r   nodesnode
FlattenRecs      r   r,   z4SplitPenaltyTest._CheckPenalties.<locals>.FlattenRecC   s    		t	$	$(G	G	G		D&+	&	& D/<2@B BC D 	D e- " "$D!!!lr   N)assertEqual)r   r   list_of_expectedr,   s      @r   _CheckPenaltiesz SplitPenaltyTest._CheckPenalties:   sE    
 
 
 
 
 	%zz$'7'788888r   c                    t          j        d          }|                     |          }|                     |ddt          fdt          fddt
          fdt          fdg           t          j        d	          }|                     |          }|                     |ddt          fdt          fddt
          fdt          fdg           t          j        d
          }|                     |          }|                     |ddt          fdt          fdddt          fdt          fdddt          fdg           t          j        d          }|                     |          }|                     |ddt          fdt          fdt          fdt          fdt          fg           t          j        d          }|                     |          }|                     |dddt          fdt          fdt          fdt          fg           d S )Nz&
      def foo(x):
        pass
      )defNfoo()xN):)passNz:
      def foo(x):  # trailing comment
        pass
      zB
      class A:
        pass
      class B(A):
        pass
      )classNAB)r9   N)r5   Nz
      lambda a, b: None
      )lambdaNa,bNonez
      import a.b.c
      )importNr<   N.c)textwrapdedentr   r/   UNBREAKABLESTRONGLY_CONNECTEDVERY_STRONGLY_CONNECTEDr   r   r   s      r   testUnbreakablez SplitPenaltyTest.testUnbreakableQ   sj   ? 
  D ))$//D		k	 !	k     ? 
  D ))$//D		k	 !	k     ? 
  D ))$//D	k	k	k	k	k     ? 
  D ))$//D	%&	%&	%&	%&	()     ? 
  D ))$//D	k	k	k	k      r   c                     t          j        d          }|                     |          }|                     |dddddt          fddd	d
t
          fdt          fdt          fdt          fdt          fdt          fdt          fdddg           t          j        d          }|                     |          }|                     |ddddt          fdt          fdt          fddt          fdt          fdt          fdt          fdt          fdg           d S )NzM
      a = {
          'x': 42,
          y(lambda a: 23): 37,
      }
      rA   )=N){N)z'x'Nr6   )42N)r=   N)yNr3   r;   r<   23r5   )37N)}Nz+
      [a for a in foo if a.x == 37]
      )[Nforr   inr2   )ifr   rB   r4   z==rQ   )]N)rD   rE   r   r/   rG   rF   rH   DOTTED_NAMErI   s      r   testStronglyConnectedz&SplitPenaltyTest.testStronglyConnected   s]   ? 
  D ))$//D	 !	k	%&	%&	%&	&'	%&	 !%    , ? 
  D ))$//D	 !	!"	"#	 !	%&	k	!"	!"      r   c                 j   d}|                      |          }|                     |ddt          fddt          fddt          fddt          fg           d	}|                      |          }|                     |dd
t          fdt          fd
t          fdt          fdt
          fddt          fddt          fddt          fg           d}|                      |          }|                     |ddt          fdddt
          fdt
          fdt
          fdt          fdt
          fdt          fdt          fg           d S )Nzfoo(1, 2, 3)
)r2   Nr3   )1Nr=   )2N)3Nr5   zfoo.bar.baz(1, 2, 3)
rB   barbazzmax(i for i in xrange(10))
)maxN)ir   rT   rb   rV   xrange10)r   r/   rF   rH   rY   rG   rI   s      r   testFuncCallszSplitPenaltyTest.testFuncCalls   s   D))$//D	k	k	k	%&	  	 	 	 $D))$//D	%&		%&		 !	k	k	%&      *D))$//D	k	 !	!"	%&	k	!"	%&	%&      r   N)F)
__name__
__module____qualname__classmethodr   r   r/   rJ   rZ   re    r   r   r
   r
   #   s        2 2 ;2   "9 9 9.Q Q Qf1 1 1f/ / / / /r   r
   __main__)__doc__r   rD   unittestlib2to3r   yapf.yapflibr   r   r   r   	yapftestsr   rF   rH   rY   rG   YAPFTestr
   rf   mainrj   r   r   <module>rs      s   $ # 



         % % % % % % ' ' ' ' ' ' & & & & & &       & & & & & &''? '"5 c c c c c'0 c c cL z(-///// r   