
    ej                        d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ  G d d      Zy)    )annotationsN)	GeneratorIterator)Any)nodes)IS_PYPY	PY39_PLUS)linter)MessageTest)UnittestLinter)	ASTWalkerc                      e Zd ZU dZded<   i Zded<   ddZej                  dd       Z	ej                  dd		 	 	 	 	 dd
       Z
ddZy)CheckerTestCasezBA base testcase class for unit testing individual checker classes.r   CHECKER_CLASSzdict[str, Any]CONFIGc                0   t               | _        | j                  | j                        | _        | j                  j                         D ]0  \  }}t        | j                  j                  j                  ||       2 | j                  j                          y N)	r   r
   r   checkerr   itemssetattrconfigopen)selfkeyvalues      D/usr/lib/python3/dist-packages/pylint/testutils/checker_test_case.pysetup_methodzCheckerTestCase.setup_method   sn    $&))$++6++++- 	<JCDLL''..U;	<    c              #  ^   K   | j                         5  d ddd       y# 1 sw Y   yxY ww)z6Assert that no messages are added by the given method.N)assertAddsMessages)r   s    r   assertNoMessagesz CheckerTestCase.assertNoMessages#   s+      $$& 		 	 	s   -!	-*-F)ignore_positionc             '  V  K   d | j                   j                         }d}dj                  d |D              xs |}dj                  d |D              xs |}d| d| d}t        |      t        |      k(  sJ |       t	        ||      D ]  \  }}	|j
                  |	j
                  k(  sJ |       |j                  |	j                  k(  sJ |       |j                  |	j                  k(  sJ |       |j                  |	j                  k(  sJ |       |r|j                  |	j                  k(  sJ |       |j                  |	j                  k(  sJ |       t        rt        s|j                  |	j                  k(  sJ |       |j                  |	j                  k(  rJ |        yw)a  Assert that exactly the given method adds the given messages.

        The list of messages must exactly match *all* the messages added by the
        method. Additionally, we check to see whether the args in each message can
        actually be substituted into the message string.

        Using the keyword argument `ignore_position`, all checks for position
        arguments (line, col_offset, ...) will be skipped. This can be used to
        just test messages for the correct node.
        NzNo message.
c              3  2   K   | ]  }t        |        y wr   repr.0ms     r   	<genexpr>z5CheckerTestCase.assertAddsMessages.<locals>.<genexpr>:   s     7T!W7   c              3  2   K   | ]  }t        |        y wr   r&   r(   s     r   r+   z5CheckerTestCase.assertAddsMessages.<locals>.<genexpr>;   s     1DG1r,   z3Expected messages did not match actual.

Expected:
z

Got:
)r
   release_messagesjoinlenzipmsg_idnodeargs
confidenceline
col_offsetr   r	   end_lineend_col_offset)
r   r"   messagesgotno_msgexpectedgot_strmsgexpected_msg
gotten_msgs
             r   r    z"CheckerTestCase.assertAddsMessages)   s     	kk**,997h77A6))1S11;V$:Zy< 	
 8}C(-#-((+Hc(: 	U$L*&&**;*;;@S@;$$
7<<7$$
7<<7**j.C.CCHSHC$$
7<<7**j.C.CCHSHCi#,,
0C0CCHSHC#22j6O6OOTQTTO	Us   E"F)%9F) 	F)c                z    t        t              }|j                  | j                         |j	                  |       y)z!Recursive walk on the given node.N)r   r
   add_checkerr   walk)r   r3   walkers      r   rD   zCheckerTestCase.walkS   s*    6"4<<(Dr   N)returnNone)rF   zIterator[None])r:   r   r"   boolrF   zGenerator[None, None, None])r3   znodes.NodeNGrF   rG   )__name__
__module____qualname____doc____annotations__r   r   
contextlibcontextmanagerr!   r    rD    r   r   r   r      sv    L FN  
 >C'U$'U7;'U	$'U 'URr   r   )
__future__r   rN   collections.abcr   r   typingr   astroidr   pylint.constantsr   r	   #pylint.testutils.global_test_linterr
   pylint.testutils.output_liner    pylint.testutils.unittest_linterr   pylint.utilsr   r   rP   r   r   <module>rZ      s1   
 #  /   / 6 4 ; "C Cr   