
    ?d                         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*                          yy)zTests for yapf.split_penalty.    N)pytree)pytree_utils)pytree_visitor)split_penalty)style)yapf_test_helperc                   <    e Zd Zed        ZddZd Zd Zd Zd Z	y)	SplitPenaltyTestc                 R    t        j                  t        j                                y N)r   SetGlobalStyleCreateYapfStyle)clss    >/usr/lib/python3/dist-packages/yapftests/split_penalty_test.py
setUpClasszSplitPenaltyTest.setUpClass%   s    	..01    c                     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)   s>     ''-D''-CJJ?Kr   c                 @    fd| j                  | |             y)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&++	&//<22@@BC D 	D e-- "$D!!"lr   N)assertEqual)r   r   list_of_expectedr,   s      @r   _CheckPenaltiesz SplitPenaltyTest._CheckPenalties:   s     
 	%z$'78r   c                    t        j                  d      }| j                  |      }| j                  |ddt        fdt        fddt
        fdt        fdg       t        j                  d	      }| j                  |      }| j                  |ddt        fdt        fddt
        fdt        fdg       t        j                  d
      }| j                  |      }| j                  |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      }| j                  |      }| j                  |ddt        fdt        fdt        fdt        fdt        fg       t        j                  d      }| j                  |      }| j                  |dddt        fdt        fdt        fdt        fg       y )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   s   ?? 
 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      }| j                  |      }| j                  |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      }| j                  |      }| j                  |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       y )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   s3   ?? 
 D ))$/D	 !	k	%&	%&	%&	&'	%&	 !%  , ?? 
 D ))$/D	 !	!"	"#	 !	%&	k	!"	!"  r   c                    d}| j                  |      }| j                  |ddt        fddt        fddt        fddt        fg       d	}| j                  |      }| j                  |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}| j                  |      }| j                  |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       y )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   sP   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
   #   s0    2 2"9.Qf1f/r   r
   __main__)__doc__r   rD   unittestlib2to3r   yapf.pytreer   r   r   yapf.yapflibr   	yapftestsr   rF   rH   rY   rG   YAPFTestr
   rf   mainrj   r   r   <module>rt      s    $ 
    $ & %  &'''?? ''"55 c'00 cL z(--/ r   