o
    ?n0j	                     @   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rQe  dS 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   c/home/wildlama/miniconda3/envs/lam_a2e/lib/python3.10/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r| jt | t jj	fgS g }| j
D ]}| |7 }q!|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)Z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==r9   )]N)r/   r0   r   r   r2   r1   r3   DOTTED_NAMEr4   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<   rH   r>   xrange10)r   r   r1   r3   rA   r2   r4   r   r   r   testFuncCalls   sV   



zSplitPenaltyTest.testFuncCallsN)F)
__name__
__module____qualname__classmethodr   r   r   r5   rB   rK   r   r   r   r   r   #   s    

S3r   __main__)__doc__r   r/   ZunittestZyapf_third_party._ylib2to3r   Zyapf.pytreer   r   r   Zyapf.yapflibr   Z	yapftestsr   r1   r3   rA   r2   ZYAPFTestr   rL   mainr   r   r   r   <module>   s&    g