
    X-PhpE                    T   d Z ddlmZ ddlZddlZddlZddlZddlm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 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!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ dZ, G d de"          Z-ddZ. G d dej/                  Z0dS )a  Test cases for fine-grained incremental checking.

Each test cases runs a batch build followed by one or more fine-grained
incremental steps. We verify that each step produces the expected output.

See the comment at the top of test-data/unit/fine-grained.test for more
information.

N.B.: Unlike most of the other test suites, testfinegrained does not
rely on an alt_lib_path for finding source files. This means that they
can test interactions with the lib_path that is built implicitly based
on specified sources.
    )annotationsN)Any)build)parse_config_file)Server)DEFAULT_STATUS_FILE)CompileError)create_source_list)BuildSource)Options)check_consistency#sort_messages_preserving_file_order)test_temp_dir)DataDrivenTestCase	DataSuite
DeleteFile
UpdateFile)assert_module_equivalenceassert_string_arrays_equalassert_target_equivalencefind_test_filesparse_optionsperform_file_operationsFc                      e Zd Z eddg          ZdZd1d	Zd2dZd3dZd4dZ	d5dZ
d6dZd7dZd8d&Zd9d(Zd:d+Zd;d,Zd<d.Zd<d/Zd0S )=FineGrainedSuitezfine-grained*.testz#fine-grained-cache-incremental.test)patternexcludeFtestcaser   returnboolc                ~    | j         r(|j        dk    rdS |j        r|j        d         dk    rdS n|j        dk    rdS dS )Nz-only_when_nocacheTr   ==z-only_when_cacheF)	use_cache	only_whenoutput)selfr   s     Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mypy/test/testfinegrained.pyshould_skipzFineGrainedSuite.should_skip;   s^     > 		!%999t  8?1#5#=#=t!%777tu    Nonec                .   |                      |          rt          j                     d                    |j                  }t
          j                            t          d          }t          |dd          5 }|	                    |           d d d            n# 1 swxY w Y   | 
                    ||d          }|j        t          j        k    rt          j        d           | 
                    ||d	          }t          |t                    }|                     |          }d
}	|                     ||	|          }
|	|k    r|                     ||
          }n|                     ||
          }g }|r"|                    t+          |                     |j        J |                    |                     |	|||j                             |                    |                     |	||                     |j        rt4          rt7          |j                   |                                }g }|D ]e}|	d
z  }	|                     |||||||	|          \  }}|                    d           |                    |           |                    |           fd |D             }t?          |j         |d|j!         d|j"         d           |j#        r<t?          |j#        | $                    |          d|j!         d|j"         d           d S d S )N
mainwutf8)encodingF)build_cachez)Test case requires a newer Python versionT   r#   c                :    g | ]}|                     d d          S )\/)replace).0lines     r(   
<listcomp>z-FineGrainedSuite.run_case.<locals>.<listcomp>   s&    333T\\$$$333r*   zInvalid output (z, line )zInvalid active triggers ()%r)   pytestskipjoininputospathr   openwriteget_optionspython_versionsysversion_infor   r   get_build_stepsparse_sourcesr   	run_checkextendnormalize_messagestmpdirmaybe_suggestmaybe_inspectfine_grained_managerCHECK_CONSISTENCYr   
find_stepsperform_stepappendr   r&   filer9   	triggeredformat_triggered)r'   r   main_src	main_pathfoptionsbuild_optionsservernum_regular_incremental_stepsstepsourcesmessagesastepsall_triggered
operationsr&   rV   s                     r(   run_casezFineGrainedSuite.run_caseK   s|   H%% 	KMMM99X^,,GLL77	)S6222 	aGGH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ""8X5"II!C$444KCDDD((8(NN!455(,(<(<X(F(F%$$XtW==000zz-99HH~~fg66H 	3HH'11222***	##D&(HOLLMMM	##D&(;;<<<& 	?  ?!&"=>>>##%% 	, 	,JAID $ 1 1-	! 	!FI HHTNNNHHV  ++++ 43333"OQ Y8= Y Y Y Y Y	
 	
 	
  	&"%%m44RHMRR(-RRR    	 	s   :BB #B sourcestrr2   r   c                   t          ||d          }d|_        d|_        d|_        d|_        | |_        | j        o| |_        | j        |_        d|_	        d|j
        v |_        |j                            d           |_        t          j        d|          d|_        |j        D ]!\  }}d	|v sd
|v rt'          |d |            n"|S )Nr3   )incremental_stepTFinspect	_no_emptyzflags:.*--follow-importserrorzmypy.inizpyproject.tomlc                     d S )N ro   r*   r(   <lambda>z.FineGrainedSuite.get_options.<locals>.<lambda>   s    4 r*   )r   incrementaluse_builtins_fixturesshow_tracebackerror_summaryfine_grained_incrementalr$   use_fine_grained_cachecache_fine_grainedlocal_partial_typesrU   export_typesnameendswithallow_empty_bodiesresearchfollow_importsfilesr   )r'   rg   r   r2   r[   rz   _s          r(   rD   zFineGrainedSuite.get_options   s    1EEE"(,%!% %/:?()-)KO&%)^"&*#(HM9)1)?)?)L)L%L"9/88@%,G"~ 	 	GD!T!!%5%=%=!'<<>>> &> r*   r]   r   r`   list[BuildSource]	list[str]c                    |                     |ddd          }|d         p|d         }t          |t                    sJ |                                S )NF)ry   is_ttyterminal_widthouterr)check
isinstancerh   
splitlines)r'   r]   r`   responser   s        r(   rJ   zFineGrainedSuite.run_check   sT    <<eEZ\<]]uo0%#s#####~~r*   r[   c                |    	 t          j         ||          }n# t          $ r}|j        cY d }~S d }~ww xY w|j        S )N)r`   r[   )r   r	   ra   errors)r'   r[   r`   resultes        r(   r   zFineGrainedSuite.build   s[    	['BBBFF 	 	 	:	}s    
4/44rV   list[list[str]]c                    g }t          |          D ]b\  }}d |D             }t          |          }|                    d|dz   d                    |          fz                                             c|S )Nc                <    g | ]}|                     d           |S )z__>)r{   )r8   triggers     r(   r:   z5FineGrainedSuite.format_triggered.<locals>.<listcomp>   s,    WWWGw?O?OPU?V?VWWWWr*   z%d: %s   z, )	enumeratesortedrT   r>   strip)r'   rV   r   ntriggersfiltereds         r(   rW   z!FineGrainedSuite.format_triggered   s    $Y// 	M 	MKAxWWxWWWHh''HMM8q1udii.A.A&BBIIKKLLLLr*   program_textintc                    | j         sdS t          j        d|t          j                  }|"t	          |                    d                    S dS )zHGet the number of regular incremental steps to run, from the test sourcer   z# num_build_steps: ([0-9]+)$flagsNr3   )r$   r}   r~   	MULTILINEr   group)r'   r   ms      r(   rH   z FineGrainedSuite.get_build_steps   sJ    ~ 	1I4l",WWW=qwwqzz??"qr*   re   list[UpdateFile | DeleteFile]r\   rX   r_   r^   !tuple[list[str], list[list[str]]]c	                   t          |           |                     |||          }	||k    r|                     ||	          }
n|                     ||	          }
g }g }g }g }|j        rht
          rt          |j                   |                    |j        j                   |j        j	        }d |j        j
        D             }|j        j        }|j                            |dz
            }|$t          dt          |dz
            z   ||           |j                            |dz
            }|$t          dt          |dz
            z   ||           |j                            |          }|r!t%          dt          |          z   ||           t'          |
          }
|
}|j        J |                    |                     ||||j                             |                    |                     |||                     ||fS )zPerform one fine-grained incremental build step (after some file updates/deletions).

        Return (mypy output, triggered targets).
        c                    g | ]\  }}|S ro   ro   )r8   modrU   s      r(   r:   z1FineGrainedSuite.perform_step.<locals>.<listcomp>   s    XXXysDsXXXr*   r3   Nstale	recheckedtargets)r   rI   r   rJ   rP   rQ   r   rT   rV   updated_moduleschanged_modulesprocessed_targetsexpected_stale_modulesgetr   rh   expected_rechecked_modulesexpected_fine_grained_targetsr   rL   rM   rK   rN   rO   )r'   re   r]   r[   r\   r   rX   r_   r^   r`   new_messagesupdatedchangedr   rV   expected_staleexpected_recheckedexpectedrb   s                      r(   rS   zFineGrainedSuite.perform_step   s    	 
+++$$XtW==000::mW==LL>>&'::L	& 	D  ?!&"=>>>V8BCCC1AGXXF,G,WXXXG1CG!8<<TAXFF%%gD1H&=~wWWW%@DDTAXNN)%kCqMM&ACUW^___9==dCC 	P%i#d))&;XwOOO),77***	##D&(HOLLMMM	##D&(;;<<<)|r*   rj   c                   t          j        d|t           j                  }d| d}t          j        ||t           j                  }||}|rSd |                    d                                                                          D             }t          ||          S t          t          j	        
                    t          d          d	d          }|gt          t          g|d
          z   S )a!  Return target BuildSources for a test case.

        Normally, the unit tests will check all files included in the test
        case. This differs from how testcheck works by default, as dmypy
        doesn't currently support following imports.

        You can override this behavior and instruct the tests to check
        multiple modules by using a comment like this in the test case
        input:

          # cmd: main a.py

        You can also use `# cmdN:` to have a different cmd for incremental
        step N (2, 3, ...).

        z# cmd: mypy ([a-zA-Z0-9_./ ]+)$r   z# cmdz: mypy ([a-zA-Z0-9_./ ]+)$Nc                X    g | ]'}t           j                            t          |          (S ro   )r@   rA   r>   r   )r8   rA   s     r(   r:   z2FineGrainedSuite.parse_sources.<locals>.<listcomp>  s(    ^^^4RW\\-66^^^r*   r3   r.   __main__T)allow_empty_dir)r}   r~   r   r   r   splitr
   r   r@   rA   r>   r   )	r'   r   rj   r[   r   regexalt_mpathsbases	            r(   rI   zFineGrainedSuite.parse_sources   s    & I7R\ZZZD(DDD	%R\BBB A 	_^^1771::CSCSCUCUC[C[C]C]^^^E%eW555rw||M6BBJPTUUD 6.Y]^^^^^r*   srctmp_dirc                   g }|                      ||          }|D ]\  }}d|v }	d|v }
d|v }d|v }t          j        d|          }|r"t          |                    d                    nd }t          j        d|          }|r|                    d          nd }t          j        d|          }|r"t          |                    d                    nd }|                    |                                |	|||||
|	          }d
|v r|d
         n|d         |d         z   }|	r|                    dd          }|                    t          j
                            |          t          j
        j        z   d          }|                    t          j
                            |          t          j
        j        z   d          }|                    |                                                    d                     t!          |          S )Nz--jsonz--callsitesz--no-anyz--no-errorsz--flex-any=([0-9.]+)r3   z--use-fixme=(\w+)z--max-guesses=([0-9]+))jsonno_any	no_errorsflex_any	use_fixme	callsitesmax_guessesrm   r   r   z\\r5    r-   )get_suggestr}   matchfloatr   r   cmd_suggestr   r7   r@   rA   realpathsepabspathrK   r   rL   )r'   r_   r]   r   r   r&   r   r   targetr   r   r   r   r   r   r   r   resvals                      r(   rN   zFineGrainedSuite.maybe_suggest&  s   ""3--$ 	3 	3ME6u$D%.I5(F%.I/77A,-7uQWWQZZ(((4H-u55A&'1


TI1599A-.8#aggajj///DK"("4"4#!##' #5 	# 	#C #*S..#g,,c%j3u:6MC Nkk&$//kk"'"2"27";";bgk"I2NNkk"'//'":":RW["H"MMMM#))++++D112222!&)))r*   c                J   g }|                      ||          }|D ]\  }}t          j        d|          }|r|                    d          nd}	d}
d|v rd}
d|v rd}
t          j        d|          }|r"t	          |                    d                    nd}d	|v }d
|v }d|v }d|v }d|v }|                    |	||
||||||	  	        }d|v r|d         n|d         |d         z   }|                    |                                                    d                     |S )Nz--show=(\w+)r3   typer   z-vz-vvr   z--limit=([0-9]+)z--include-spanz--include-kindz--include-object-attrsz--union-attrsz--force-reload)	verbositylimitinclude_spaninclude_kindinclude_object_attrsunion_attrsforce_reloadrm   r   r   r-   )	get_inspectr}   r   r   r   cmd_inspectrK   r   r   )r'   r_   r]   r   r&   r   r   locationr   showr   r   r   r   r   r   r   r   r   s                      r(   rO   zFineGrainedSuite.maybe_inspectG  se   ""3--& 	3 	3OE8%00A!".1771:::DIu}}	~~	,e44A'(/C

OOOaE+u4L+u4L#;u#D )U2K+u4L"("4"4#))%9') #5 
# 
#C #*S..#g,,c%j3u:6MCMM#))++++D112222r*   list[tuple[str, str]]c                    |dk    rdnt          |          }d| d}t          j        ||t          j                  }|S )Nr3   1?z	# suggestz3: (--[a-zA-Z0-9_\-./=?^ ]+ )*([a-zA-Z0-9_.:/?^ ]+)$r   rh   r}   findallr   r'   r   rj   step_bitr   r   s         r(   r   zFineGrainedSuite.get_suggesth  sK    +q0044c:J6K6KZHZZZJul",???r*   c                    |dk    rdnt          |          }d| d}t          j        ||t          j                  }|S )Nr3   r   z	# inspectz1: (--[a-zA-Z0-9_\-=?^ ]+ )*([a-zA-Z0-9_.:/?^ ]+)$r   r   r   s         r(   r   zFineGrainedSuite.get_inspectn  sK    +q0044c:J6K6KXHXXXJul",???r*   N)r   r   r    r!   )r   r   r    r+   )rg   rh   r   r   r2   r!   r    r   )r]   r   r`   r   r    r   )r[   r   r`   r   r    r   )rV   r   r    r   )r   rh   r    r   )re   r   r]   r   r[   r   r\   r   r   r   rX   rh   r_   r   r^   r   r    r   )r   rh   rj   r   r[   r   r    r   )
r_   r   r]   r   r   rh   r   rh   r    r   )r_   r   r]   r   r   rh   r    r   )r   rh   rj   r   r    r   )__name__
__module____qualname__r   r   r$   r)   rf   rD   rJ   r   rW   rH   rS   rI   rN   rO   r   r   ro   r*   r(   r   r   2   sK       O$/T.U  E I    C C C CJ   2                7 7 7 7r$_ $_ $_ $_L* * * *B   B        r*   r   ra   r   r    c                    d | D             S )Nc                x    g | ]7}t          j        d t          j        t          j                  z   d|          8S )z^tmpr   )r}   subescaper@   r   )r8   messages     r(   r:   z&normalize_messages.<locals>.<listcomp>v  s7    TTTBF6BIbf---r7;;TTTr*   ro   )ra   s    r(   rL   rL   u  s    TT8TTTTr*   c                  .    e Zd ZddZddZddZddZdS )	TestMessageSortingr    r+   c                
   ddg}ddg}t          ||          t          t          |                    k    sJ t          t          t          |                    |          t          t          |                    k    sJ d S )N!x.py:1: error: "int" not callable#foo/y.py:123: note: "X" not defined"foo/y.py:12: note: "Y" not defined!x.py:8: error: "str" not callable)r   listreversed)r'   msgsold_msgss      r(   test_simple_sortingz&TestMessageSorting.test_simple_sortingz  s    35Z[8:]^24BBd8TX>>FZFZZZZZ243G3GRRVZTNNW
 W
 
 
 
 
 
 
r*   c                    g d}g d}ddg}t          ||z   |          ||z   k    sJ t          ||z   |          ||z   k    sJ d S )N)r   zand message continues (x: y)z    1()z    ^~~)zfoo/y.py: In function "f":r   zand again message continuesr   r   r   )r'   msg1msg2r   s       r(   test_long_form_sortingz)TestMessageSorting.test_long_form_sorting  s    
 
 

 
 

 9:]^24$;IITTX[XXXX24$;IITTX[XXXXXXr*   c                    d}d}d}g d}t          |||g|          |||gk    sJ t          |||g|          |||gk    sJ d S )Nr   z foo/y:123: note: "X" not definedz&mypy: Error not associated with a file)zmypy: Something wrongzfoo/y:12: note: "Y" not definedr   r   )r'   r  r  msg3r   s        r(   test_mypy_error_prefixz)TestMessageSorting.test_mypy_error_prefix  s     317
 
 

 3D$3ExPPU
 
 
 
 

 3D$3ExPPU
 
 
 
 
 
 
r*   c                    d}d}d}d}ddg}t          |||g|          |||gk    sJ t          ||||g|          ||||gk    sJ d S )Nr   r   zab.py:3: error: Problem: errorzaaa:3: error: Badr   r   r   )r'   r  r  new1new2r   s         r(   test_new_file_at_the_endz+TestMessageSorting.test_new_file_at_the_end  s    24/"8:]^2D$3ExPPU
 
 
 
 

 3D$d3KXVV	[
 
 
 
 
 
 
r*   N)r    r+   )r   r   r   r   r  r  r  ro   r*   r(   r   r   y  sh        
 
 
 
Y Y Y Y"
 
 
 
,
 
 
 
 
 
r*   r   )ra   r   r    r   )1__doc__
__future__r   r@   r}   rF   unittesttypingr   r<   mypyr   mypy.config_parserr   mypy.dmypy_serverr   mypy.dmypy_utilr   mypy.errorsr	   mypy.find_sourcesr
   mypy.modulefinderr   mypy.optionsr   mypy.server.mergecheckr   mypy.server.updater   mypy.test.configr   mypy.test.datar   r   r   r   mypy.test.helpersr   r   r   r   r   r   rQ   r   rL   TestCaser   ro   r*   r(   <module>r     s0    # " " " " " 				 				 



               0 0 0 0 0 0 $ $ $ $ $ $ / / / / / / $ $ $ $ $ $ 0 0 0 0 0 0 ) ) ) ) ) )             4 4 4 4 4 4 B B B B B B * * * * * * P P P P P P P P P P P P                 @ @ @ @ @y @ @ @F
U U U U@
 @
 @
 @
 @
* @
 @
 @
 @
 @
r*   