a
    
d	                     @   s   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
 d
ejZedkre  dS )zTests for yapf.split_penalty.    N)pytree)pytree_utils)pytree_visitor)split_penalty)style)yapf_test_helperc                   @   sB   e Zd Zedd ZdddZdd Zdd	 Zd
d Zdd Z	dS )SplitPenaltyTestc                 C   s   t t   d S N)r   ZSetGlobalStyleZCreateYapfStyle)cls r   e/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/yapftests/split_penalty_test.py
setUpClass%   s    zSplitPenaltyTest.setUpClassFc                 C   s,   t |}t| |r(tj|tjd |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.
    )Ztarget_stream)r   ZParseCodeToTreer   ZComputeSplitPenaltiesr   Z
DumpPyTreesysstderr)selfcodeZdumptreetreer   r   r   _ParseAndComputePenalties)   s
    

z*SplitPenaltyTest._ParseAndComputePenaltiesc                    s     fd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                    sX   t | t jv rg S t| tjr8| jt | t jj	fgS g }| j
D ]}| |7 }qB|S r	   )r   ZNodeNameZNONSEMANTIC_TOKENS
isinstancer   ZLeafvalueZGetNodeAnnotationZ
AnnotationZSPLIT_PENALTYchildren)r   nodesnode
FlattenRecr   r   r   C   s    
z4SplitPenaltyTest._CheckPenalties.<locals>.FlattenRecN)assertEqual)r   r   Zlist_of_expectedr   r   r   _CheckPenalties:   s    	z SplitPenaltyTest._CheckPenaltiesc                 C   sF  t d}| |}| |ddtfdtfddtfdtfdg t d	}| |}| |ddtfdtfddtfdtfdg t d
}| |}| |ddtfdtfdddtfdtfdddtfdg t d}| |}| |ddtfdtfdtfdtfdtfg t 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)r%   N)r!   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   r   r   r   testUnbreakableQ   sr    










z SplitPenaltyTest.testUnbreakablec                 C   s   t 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 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,
      }
      r-   )=N){N)z'x'Nr"   )Z42N)r)   N)yNr   r'   r(   Z23r!   )37N)}Nz+
      [a for a in foo if a.x == 37]
      )[Nforr   inr   )ifr   r.   r    z==r:   )]N)r0   r1   r   r   r3   r2   r4   DOTTED_NAMEr5   r   r   r   testStronglyConnected   sN    



z&SplitPenaltyTest.testStronglyConnectedc                 C   s   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)
)r   Nr   )1Nr)   )2N)3Nr!   zfoo.bar.baz(1, 2, 3)
r.   barZbazzmax(i for i in xrange(10))
)maxN)ir   r=   rI   r?   xrange10)r   r   r2   r4   rB   r3   r5   r   r   r   testFuncCalls   sV    


zSplitPenaltyTest.testFuncCallsN)F)
__name__
__module____qualname__classmethodr   r   r   r6   rC   rL   r   r   r   r   r   #   s   

S3r   __main__)__doc__r   r0   ZunittestZyapf_third_party._ylib2to3r   Zyapf.pytreer   r   r   Zyapf.yapflibr   Z	yapftestsr   r2   r4   rB   r3   ZYAPFTestr   rM   mainr   r   r   r   <module>   s"    g