
    i9              	          d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
mZmZ ej                  j                  d e e	e      j#                         j$                  j$                               ddlmZmZmZmZmZmZ d!dededed	efd
Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z  G d d      Z! G d d      Z" G d d      Z# G d d      Z$ G d d      Z% G d d       Z&y)"a  Unit tests for impact_scanner.py.

Covers:
  - Scenario 1: Python symbol reverse tracing
  - Scenario 2: TypeScript symbol reverse tracing
  - Scenario 3: COMMON_FILTER behavior
  - Scenario 4: Timeout behavior
  - Scenario 5: Zero references (PASS)
  - Additional edge-case tests
    N)Path)	MagicMockpatch)COMMON_FILTER_parse_diff_linesextract_symbols_pythonextract_symbols_typescriptgrep_referencesscanstdout
returncodestderrreturnc                 D    t               }||_        | |_        ||_        |S N)r   r   r   r   )r   r   r   mocks       8/home/jay/workspace/scripts/tests/test_impact_scanner.py
_make_procr   !   s#    ;D DODKDKK    c                       e Zd Zd Zd Zd Zy)TestPythonSymbolReverseTracingc                    |dz  }|j                  d       t        t        |      g       }d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}y )
N
premium.pyFdef calculate_premium(age, risk_factor):
    return age * risk_factor
calculate_premiuminz%(py1)s in %(py3)ssymbolspy1py3assert %(py5)spy5
write_textr   str
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanationselftmp_pathsrcr   @py_assert0@py_assert2@py_format4@py_format6s           r   .test_extract_symbols_returns_calculate_premiumzMTestPythonSymbolReverseTracing.test_extract_symbols_returns_calculate_premium0   s    %ab(S26"-"g----"g---"------g---g-------r   c                 (   |dz  }|j                  d       |dz  }|j                  d       t        dt        |      t        |      g      }|D cg c]  }|d   	 }}d |D        }t        |      }|sdd	t	        j
                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
z  }	t        t        j                  |	            d x}}y c c}w )Nr   r   
billing.pyzhfrom premium import calculate_premium

def process_billing(age):
    return calculate_premium(age, 1.5)
r   filec              3   $   K   | ]  }d |v  
 yw)r:   N .0fs     r   	<genexpr>z]TestPythonSymbolReverseTracing.test_grep_references_finds_referencing_file.<locals>.<genexpr>=   s     8<1$8   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anypy0py2py4r&   r
   r'   rD   r+   r,   r(   r-   r*   r.   r/   )
r1   r2   define_fileref_filerefsr	ref_files@py_assert1@py_assert3@py_format5s
             r   +test_grep_references_finds_referencing_filezJTestPythonSymbolReverseTracing.test_grep_references_finds_referencing_file6   s    -ijl*  K  	L2CMCDTCUV(,-1QvY-	-8i88s888888888s888s88888888888888 .   Dc                 2   |dz  }|j                  d       |dz  }|j                  d       t        dt        |      t        |      g      }|D cg c]  }|d   	 }}d |D        }t        |      }| }	|	sdd	t	        j
                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
z  }
t        t        j                  |
            d x}x}}	y c c}w )Nr   zdef calculate_premium(): pass
r:   z&from premium import calculate_premium
r   r;   c              3   $   K   | ]  }d |v  
 yw)r   Nr=   r>   s     r   rA   z[TestPythonSymbolReverseTracing.test_grep_references_excludes_source_file.<locals>.<genexpr>F   s     <Q|q(<rB   0assert not %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}rD   rE   rI   )r1   r2   rJ   rK   rL   rM   rN   rO   rP   @py_assert5r7   s              r   )test_grep_references_excludes_source_filezHTestPythonSymbolReverseTracing.test_grep_references_excludes_source_file?   s    -@Al*EF2CMCDTCUV(,-1QvY-	-<)<<3<<<<<<<<<<<<3<<<3<<<<<<<<<<<<<< .s   DN)__name__
__module____qualname__r8   rR   rX   r=   r   r   r   r   .   s    .9=r   r   c                       e Zd Zd Zd Zy)"TestTypescriptSymbolReverseTracingc                    |dz  }|j                  d       t        t        |      g       }d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}y )
NFeatureGate.tsxzimport React from 'react';

export function FeatureGate({ flag, children }: Props) {
    if (!flag) return null;
    return <>{children}</>;
}
FeatureGater   r   r   r    r#   r$   )r&   r	   r'   r(   r)   r*   r+   r,   r-   r.   r/   )r1   r2   tsx_filer   r4   r5   r6   r7   s           r   4test_extract_symbols_typescript_returns_feature_gatezWTestTypescriptSymbolReverseTracing.test_extract_symbols_typescript_returns_feature_gateP   s    //  t  	u,S]B?'}''''}'''}''''''''''''''''r   c                 (   |dz  }|j                  d       |dz  }|j                  d       t        dt        |      t        |      g      }|D cg c]  }|d   	 }}d |D        }t        |      }|sdd	t	        j
                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
z  }	t        t        j                  |	            d x}}y c c}w )Nr_   zLexport function FeatureGate({ flag, children }: Props) {
    return null;
}
use-feature-access.tszmimport { FeatureGate } from './FeatureGate';

export function useFeatureAccess() {
    return FeatureGate;
}
r`   r;   c              3   $   K   | ]  }d |v  
 yw)rd   Nr=   r>   s     r   rA   zcTestTypescriptSymbolReverseTracing.test_grep_references_finds_use_feature_access.<locals>.<genexpr>]   s     CA*a/CrB   rC   rD   rE   rI   )
r1   r2   ra   rK   rL   rM   rN   rO   rP   rQ   s
             r   -test_grep_references_finds_use_feature_accesszPTestTypescriptSymbolReverseTracing.test_grep_references_finds_use_feature_accessV   s    //mn55  Q  	R}c(mc(m_M(,-1QvY-	-CCCsCCCCCCCCCsCCCsCCCCCCCCCCCCCC .rS   N)rY   rZ   r[   rb   rf   r=   r   r   r]   r]   N   s    (Dr   r]   c                       e Zd Zd Zd Zy)TestCommonFilterc                 >   d}|t         v }|st        j                  d|fd|t         f      t        j                  |      dt	        j
                         v st        j                  t               rt        j                  t               nddz  }dd|iz  }t        t        j                  |            d x}}|dz  }|j                  d	       t        d
      5 }t        dd      |_        t        t        |      t        |      gd      }d d d        d}d   }	||	v}|slt        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
dd|
iz  }t        t        j                  |            d x}x}}	y # 1 sw Y   xY w)Ndatar   r   r   r    r#   r$   zutils.pyzdef data():
    return {}
subprocess.run r   r   r   ztest-filterproject_rootmodified_filestask_idsymbols_checkednot in)z%(py1)s not in %(py4)sr!   rH   assert %(py6)spy6)r   r(   r)   r*   r+   r,   r-   r.   r/   r&   r   r   return_valuer   r'   )r1   r2   r4   r5   r6   r7   r3   mock_runresultrP   rQ   @py_format7s               r    test_data_not_in_symbols_checkedz1TestCommonFilter.test_data_not_in_symbols_checkedg   s   &v&&&&v&&&v&&&&&&&&&&&&&&&&#56#$ 	h$.bQ$GH!s8}c#hZYfgF	h 6V$566v66666v6666v66666666666	h 	hs   4FFc                 x   dj                  d t        D              }|dz  }|j                  |dz          t        d      5 }t	        dd      |_        t        t        |      t        |      g      }d d d        t        D ]  }d	   }||v}|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}} y # 1 sw Y   xY w)N
c              3   (   K   | ]
  }d | d  yw)def z(): passNr=   )r?   ns     r   rA   zITestCommonFilter.test_all_common_filter_names_excluded.<locals>.<genexpr>q   s     C4s(+Cs   zall_common.pyrk   rl   r   rm   ro   rp   rr   rs   )z%(py0)s not in %(py3)sr   rF   r"   r#   r$   )joinr   r&   r   r   rx   r   r'   r(   r)   r+   r,   r-   r*   r.   r/   )r1   r2   bodyr3   ry   rz   r   r5   rO   r6   r7   s              r   %test_all_common_filter_names_excludedz6TestCommonFilter.test_all_common_filter_names_excludedp   s    yyC]CC(td{##$ 	Q$.bQ$GH!s8}c#hZPF	Q  	6A"#455155555155555551555155555555555	6	Q 	Qs   3D00D9N)rY   rZ   r[   r|   r   r=   r   r   rh   rh   e   s    76r   rh   c                   $    e Zd Zd Zd Zd Zd Zy)TestTimeoutBehaviorc                 j   t        d      }g d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}}y )	Nz&@@ -1,3 +10,5 @@
 context
+added line
)
               ==)z%(py0)s == %(py3)slinesr   r#   r$   	r   r(   r)   r+   r,   r-   r*   r.   r/   )r1   r   r5   rO   r6   r7   s         r    test_parse_diff_lines_basic_hunkz4TestTimeoutBehavior.test_parse_diff_lines_basic_hunk   si    !"MN,,u,,,,,u,,,,,,,u,,,u,,,,,,,,,,,r   c                 @   t        d      }g }d}||v }|}|rd}||v }|}|rd}||v }	|	}|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }
d	d
|
iz  }|j                  |       |rt        j                  dfd|f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       |rt        j                  d	fd|f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}x}x}}	g }d}||v }|}|rd}||v }|}|sXt        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }
d	d
|
iz  }|j                  |       |rt        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}y )Nz(@@ -1,2 +1,3 @@
 a
@@ -10,1 +20,2 @@
 b
         r   z%(py3)s in %(py5)sr   r"   r$   %(py7)spy7z%(py10)s in %(py12)spy10py12%(py14)spy14z%(py17)s in %(py19)spy17py19%(py21)spy21r   assert %(py24)spy24      assert %(py17)sr   )r   r(   r)   r*   r+   r,   r-   append_format_boolopr.   r/   )r1   r   rO   r5   @py_assert4r4   @py_assert9@py_assert11@py_assert16@py_assert18r7   @py_format8@py_format13@py_format15@py_format20@py_format22@py_format23@py_format25@py_format16@py_format18s                       r   $test_parse_diff_lines_multiple_hunksz8TestTimeoutBehavior.test_parse_diff_lines_multiple_hunks   s   !"PQ7q7qEz7a7a5j7Q7Q%Z7777qE777q777777E777E77777777a5777a777777577757777777Q%777Q777777%777%777777777777777*r*rU{*r*rU{****rU***r******U***U*******rU***r******U***U**************r   c                    d}t        |      }dg}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )	Nz@@ -5 +7 @@
   r   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   rF   rG   rH   r   assert %(py9)spy9r   r1   rO   rP   @py_assert6rW   r   @py_format10s          r   test_parse_diff_lines_no_countz2TestTimeoutBehavior.test_parse_diff_lines_no_count   s    !08 18aS81S88881S888888 888 8888881888S8888888r   c                    g }t        d      D ]:  }|d| dz  }|j                  d| d       |j                  t        |             < dgfd}t	        d|	      5  t	        d
      5 }t        dd      |_        t        t        |      |d      }d d d        d d d        d   }d}	||	k(  }
|
slt        j                  d|
fd||	f      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}
}	y # 1 sw Y   xY w# 1 sw Y   xY w)Nr   module_z.pyzdef unique_function_z	(): pass
r   c                  2     dxx   dz  cc<    d   dk(  ryy)Nr   r   g    .Ag    H.Ar=   )
call_counts   r   fake_monotoniczMTestTimeoutBehavior.test_scan_returns_warn_on_timeout.<locals>.fake_monotonic   s#    qMQM!}!"r   zimpact_scanner.time.monotonicside_effectrk   rl   rm   r   )ro   rp   timeoutgate_resultWARNr   z%(py1)s == %(py4)sru   rv   rw   )ranger&   r   r'   r   r   rx   r   r(   r)   r*   r.   r/   )r1   r2   filesir3   r   ry   rz   r4   rP   r5   rQ   r{   r   s                @r   !test_scan_returns_warn_on_timeoutz5TestTimeoutBehavior.test_scan_returns_warn_on_timeout   s"   r 	#Awqc--CNN1!J?@LLS"	# S
	 2O 	['( [H(2"(K%3x=XYZ[	[ m$..$....$...$..........[ [	[ 	[s$   !D4-*D(D4(D1	-D44D=N)rY   rZ   r[   r   r   r   r   r=   r   r   r   r      s    -+
9/r   r   c                       e Zd Zd Zy)TestZeroReferencesPassc                 4   d}|dz  }|j                  d| d       t        d      5 }t        dd      |_        t	        t        |      t        |      gd	
      }d d d        d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }||v }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}}y # 1 sw Y   3xY w)N xyzzy_totally_unique_func_a1b2c3zunique_module.pyr   z():
    return 42
rk   rl   r   rm   z	zero-refsrn   r   PASSr   r   ru   rv   rw   rr   r   )z%(py0)s in %(py3)sunique_namer   r#   r$   )r&   r   r   rx   r   r'   r(   r)   r*   r.   r/   r+   r,   r-   )r1   r2   r   r3   ry   rz   r4   rP   r5   rQ   r{   rO   r6   r7   s                 r   /test_unique_function_no_references_returns_passzFTestZeroReferencesPass.test_unique_function_no_references_returns_pass   s*   8++k]*>?@#$ 	f$.bQ$GH!s8}c#hZYdeF	f m$..$....$...$..........$%677{77777{7777777{777{77777777777		f 	fs   4FFN)rY   rZ   r[   r   r=   r   r   r   r      s    8r   r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)!TestExtractSymbolsPythonEdgeCasesc                    |dz  }|j                  d       t        t        |      g       }g }d}||v }|}|rd}||v }	|	}|	rd}
|
|v }|}|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      ndd	z  }d
d|iz  }|j                  |       |rt        j                  d	fd|f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       |	rt        j                  dfd
|f      t        j
                  |
      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}x}	x}
}y )N	module.pyz5def alpha(): pass
class Beta: pass
def gamma(): pass
alphaBetagammar   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r   r'   r(   r)   r*   r+   r,   r-   r   r   r.   r/   )r1   r2   r3   r   rO   r5   r   r4   r   r   r   r   r7   r   r   r   r   r   r   r   s                       r   )test_empty_diff_lines_returns_all_symbolszKTestExtractSymbolsPythonEdgeCases.test_empty_diff_lines_returns_all_symbols   sF   $QR(S26NwNw'!NfNf&7NGNGw<NNNNNw'NNNwNNNNNN'NNN'NNNNNNNNfNNNfNNNNNNNNNNNNNNNNGwNNNGNNNNNNwNNNwNNNNNNNNNNNNNNNr   c                    |dz  }|j                  d       t        t        |      dg      }d}||v }|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}d}||v}|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }d	d
|iz  }t        t        j                  |            d x}}y )Nr   z#def alpha(): pass
def beta(): pass
r   r   r   r   r   r    r#   r$   betars   )z%(py1)s not in %(py3)sr%   r0   s           r   1test_specific_diff_lines_returns_only_overlappingzSTestExtractSymbolsPythonEdgeCases.test_specific_diff_lines_returns_only_overlapping   s    $>?(SA37!w'!!!!w'!!!w!!!!!!'!!!'!!!!!!!$vW$$$$vW$$$v$$$$$$W$$$W$$$$$$$r   c           
      X   |dz  }|j                  d       t        |      }g }t        ||      }g }||k(  }|sgt        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }d	d
|iz  }	t        t        j                  |	            d x}x}x}x}}y )Nz	broken.pyzdef (:
    pass
r   )zX%(py8)s
{%(py8)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
}, %(py6)s)
} == %(py11)sr   r'   r3   )rF   r!   rG   rH   rw   py8py11assert %(py13)spy13)r&   r'   r   r(   r)   r+   r,   r-   r*   r.   r/   )
r1   r2   r3   rP   rW   @py_assert7@py_assert10r   @py_format12@py_format14s
             r   )test_syntax_error_file_returns_empty_listzKTestExtractSymbolsPythonEdgeCases.test_syntax_error_file_returns_empty_list   s    $+,&)#h99%h39r93r99993r999999%999%999999c999c999999#999#999h9999993999r99999999r   c                 j   d}||z  }t        |      }g }t        ||      }g }||k(  }|s{t        j                  d|fd||f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  t               rt        j                  t               nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	dd	|	iz  }
t        t        j                  |
            d x}x}x}x}x}x}}y )
Nzghost.pyr   zf%(py11)s
{%(py11)s = %(py0)s(%(py7)s
{%(py7)s = %(py1)s((%(py2)s / %(py4)s))
}, %(py9)s)
} == %(py14)sr   r'   r2   rF   r!   rG   rH   r   r   r   r   assert %(py16)spy16)
r'   r   r(   r)   r+   r,   r-   r*   r.   r/   r1   r2   rP   rW   r   @py_assert8r   @py_assert13@py_assert12r   @py_format17s              r   (test_nonexistent_file_returns_empty_listzJTestExtractSymbolsPythonEdgeCases.test_nonexistent_file_returns_empty_list   s    5?K(Z*?Kc*?&@K"K%&@"EKKEKKKKEKKKKKK%KKK%KKKKKKcKKKcKKKKKK(KKK(KKKZKKK&@KKK"KKKEKKKKKKKKKKKr   c                 P   |dz  }|j                  d       t        t        |      g       }g }d}||v }|}|rd}||v }	|	}|sXt        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }
d	d
|
iz  }|j                  |       |rt        j                  d	fd|f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}	y )Nz	nested.pyz#def outer():
    def inner(): pass
outerinnerr   r   r   r   r   r   r   r   r   r   r   r   r   r   )r1   r2   r3   r   rO   r5   r   r4   r   r   r7   r   r   r   r   r   s                   r   "test_nested_functions_are_includedzDTestExtractSymbolsPythonEdgeCases.test_nested_functions_are_included   s    $>?(S268w8w'!8g8g&88888w'888w888888'888'8888888g888g88888888888888888888888r   c           
      V   |dz  }|j                  d       d}t        |      }g }t        ||      }||v }|sgt        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  t              rt        j
                  t              nddt        j                         v st        j                  t              rt        j
                  t              nddt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |      t        j
                  |      d	z  }d
d|iz  }	t        t        j                  |	            d x}x}x}x}}y )Nzasync_mod.pyzasync def fetch_data(): pass

fetch_datar   )zY%(py1)s in %(py11)s
{%(py11)s = %(py3)s(%(py7)s
{%(py7)s = %(py4)s(%(py5)s)
}, %(py9)s)
}r   r'   r3   )r!   r"   rH   r$   r   r   r   r   r   )r&   r'   r   r(   r)   r*   r+   r,   r-   r.   r/   )
r1   r2   r3   r4   r   r   r   r5   r   r   s
             r    test_async_function_is_extractedzBTestExtractSymbolsPythonEdgeCases.test_async_function_is_extracted   s    '78Cc#hCC5hCC|CCCCC|CCCC|CCCCCC5CCC5CCCCCCcCCCcCCCCCC#CCC#CCChCCCCCCCCCCCCCCCr   N)	rY   rZ   r[   r   r   r   r   r  r  r=   r   r   r   r      s#    O%:
L9Dr   r   c                   $    e Zd Zd Zd Zd Zd Zy)%TestExtractSymbolsTypescriptEdgeCasesc                 j   d}||z  }t        |      }g }t        ||      }g }||k(  }|s{t        j                  d|fd||f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  t               rt        j                  t               nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	dd	|	iz  }
t        t        j                  |
            d x}x}x}x}x}x}}y )
Nzghost.tsr   r   r	   r'   r2   r   r   r   )
r'   r	   r(   r)   r+   r,   r-   r*   r.   r/   r   s              r   r   zNTestExtractSymbolsTypescriptEdgeCases.test_nonexistent_file_returns_empty_list   s    9COh.CO#.C*DObO)*DbIOROIROOOOIROOOOOO)OOO)OOOOOO#OOO#OOOOOOhOOOhOOOOOO*DOOObOOOIOOOROOOOOOOOr   c                    |dz  }|j                  d       t        t        |      g       }dD ]  }||v }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }d	d
|iz  }t        t        j                  |            d } y )Nz
exports.tszexport function MyFunction() {}
export class MyClass {}
export const MY_CONST = 42;
export enum MyEnum { A, B }
export interface MyInterface {}
export type MyType = string;
)
MyFunctionMyClassMY_CONSTMyEnumMyInterfaceMyTyper   z%(py0)s in %(py2)ssr   rF   rG   assert %(py4)srH   )r&   r	   r'   r(   r)   r+   r,   r-   r*   r.   r/   )r1   r2   ts_filer   r  rO   @py_format3rQ   s           r   test_multiple_export_typesz@TestExtractSymbolsTypescriptEdgeCases.test_multiple_export_types   s    \)  Q  	R,S\2>Y 	 A<111	 r   c                 R   |dz  }|j                  d       t        t        |      dg      }g }d}||v }|}|rd}||v}	|	}|sXt        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      ndd	z  }
d
d|
iz  }|j                  |       |rt        j                  d	fd|f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}	y )Nz	module.tsz5export function Alpha() {}
export function Beta() {}
r   r   Alphar   r   r   r   r   r   rs   z%(py10)s not in %(py12)sr   r   r   r   r   r   r&   r	   r'   r(   r)   r*   r+   r,   r-   r   r   r.   r/   r1   r2   r  r   rO   r5   r   r4   r   r   r7   r   r   r   r   r   s                   r   *test_specific_diff_lines_filters_correctlyzPTestExtractSymbolsTypescriptEdgeCases.test_specific_diff_lines_filters_correctly   s    [(TU,S\A3?;v;v ;W;WG%;;;;;v;;;v;;;;;;;;;;;;;;;;WG;;;W;;;;;;G;;;G;;;;;;;;;;;;;;r   c                 P   |dz  }|j                  d       t        t        |      g       }g }d}||v }|}|rd}||v}	|	}|sXt        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }
d	d
|
iz  }|j                  |       |rt        j                  d	fd|f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}	y )Nzinternal.tsz;function privateHelper() {}
export function PublicApi() {}
	PublicApiprivateHelperr   r   r   r   r   r   rs   r  r   r   r   r   r   r   r  r  s                   r   &test_non_exported_symbols_not_includedzLTestExtractSymbolsTypescriptEdgeCases.test_non_exported_symbols_not_included   s    ]*Z[,S\2>H{H{g%H/H/*HHHHH{gHHH{HHHHHHgHHHgHHHHHHH/HHH/HHHHHHHHHHHHHHHHHHHHHHHr   N)rY   rZ   r[   r   r  r  r   r=   r   r   r  r     s    P <Ir   r  c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestParseDiffLinesc                    d}t        |      }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )Nrl   r   r   r   r   r   r   r   r   s          r   test_empty_stringz$TestParseDiffLines.test_empty_string   s    !#* $**$****$****** *** ******$**********r   c                    d}t        |      }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )Nz@@ -1,0 +5,0 @@
r   r   r   r   r   r   r   r   s          r   test_count_zeroz"TestParseDiffLines.test_count_zero   s    !4; !45;;5;;;;5;;;;;; ;;; ;;;!4;;;5;;;;;;;;;;r   c                    d}t        |      }dg}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )	Nz@@ -3,1 +7,1 @@
r   r   r   r   r   r   r   r   r   s          r   test_single_linez#TestParseDiffLines.test_single_line   s    !4< !45<!<5<<<<5<<<<<< <<< <<<!4<<<5<<<<<<<<<<r   c                    t        d      }t        |      }||k(  }|s#t        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}}y )	Nz"@@ -1,3 +20,3 @@
@@ -10,2 +1,2 @@
r   )z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}rz   sorted)rF   rG   r"   r$   zassert %(py7)sr   )
r   r*  r(   r)   r+   r,   r-   r*   r.   r/   )r1   rz   r   rO   r7   r   s         r   test_sorted_outputz%TestParseDiffLines.test_sorted_output  s    "#IJ'v''''v''''''v'''v''''''''''''''''''''''''''''r   c                    d}t        |      }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )Nz/diff --git a/f.py b/f.py
index abc..def 100644
r   r   r   r   r   r   r   r   s          r   test_no_hunk_headersz'TestParseDiffLines.test_no_hunk_headers  s    !T[ !TU[Y[[UY[[[[[UY[[[[[[[ [[[ [[[!T[[[U[[[Y[[[[[[[[r   N)rY   rZ   r[   r$  r&  r(  r+  r-  r=   r   r   r"  r"     s    +<=(\r   r"  c                   :    e Zd ZdedefdZd Zd Zd Zd Z	d Z
y	)
TestGateThresholdsn_refsr   c                 
   dz  }|j                  d       dj                  fdt        |      D              fd}t        d|      5  t	        t              t        |      gd	      cd d d        S # 1 sw Y   y xY w)
Nz	source.pyzdef threshold_func(): pass
r~   c              3   .   K   | ]  } d | d  yw)z/other_z.py:1:threshold_func()Nr=   )r?   r   r2   s     r   rA   z;TestGateThresholds._run_scan_with_n_refs.<locals>.<genexpr>  s      dQR(71#5KLds   c                 X    | d   dk(  rt        r      S d      S t        dd      S )Nr   greprl   )r   rm   )r   )cmd_kw
grep_liness     r   fake_runz:TestGateThresholds._run_scan_with_n_refs.<locals>.fake_run  s1    1v!zJJrJJRA66r   rk   r   zthreshold-testrn   )r&   r   r   r   r   r'   )r1   r2   r0  r3   r8  r7  s    `   @r   _run_scan_with_n_refsz(TestGateThresholds._run_scan_with_n_refs  sw    $56YYdV[\bVcdd
	7
 #: 	iS]CH:Wgh	i 	i 	is   !A99Bc                 $   | j                  |d      d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d x}x}}y )	Nr   r   r   r   r   ru   rv   rw   r9  r(   r)   r*   r.   r/   r1   r2   r4   rP   r5   rQ   r{   s          r   test_zero_refs_is_passz)TestGateThresholds.test_zero_refs_is_pass  a    ))(A6}EOOEOOOOEOOOEOOOOOOOOOOr   c                 $   | j                  |d      d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d x}x}}y )	Nr   r   r   r   r   ru   rv   rw   r;  r<  s          r   test_one_ref_is_warnz'TestGateThresholds.test_one_ref_is_warn  r>  r   c                 $   | j                  |d      d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d x}x}}y )	N   r   r   r   r   ru   rv   rw   r;  r<  s          r   test_five_refs_is_warnz)TestGateThresholds.test_five_refs_is_warn  r>  r   c                 $   | j                  |d      d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d x}x}}y )	N   r   BLOCKr   r   ru   rv   rw   r;  r<  s          r   test_six_refs_is_blockz)TestGateThresholds.test_six_refs_is_block!  sa    ))(A6}EPPEPPPPEPPPEPPPPPPPPPPr   c                 $   | j                  |d      d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            d x}x}}y )	Nr   r   rF  r   r   ru   rv   rw   r;  r<  s          r   test_many_refs_is_blockz*TestGateThresholds.test_many_refs_is_block$  sa    ))(B7FQ'QF'QQQQF'QQQFQQQ'QQQQQQQr   N)rY   rZ   r[   intdictr9  r=  r@  rC  rG  rI  r=   r   r   r/  r/  	  s6    ic id iPPPQRr   r/  c                       e Zd Zd Zd Zy)TestGrepReferencesExcludeFilesc                    |dz  }|j                  d       |dz  }|j                  d       t        dt        |      t        |      t        |      g      }|D cg c]  }|d   	 }}t        |      t        |      fD ]  fd|D        }t        |      }| }	|	sdd	t	        j
                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
z  }
t        t        j                  |
            d x}x}}	 y c c}w )N	define.pyzdef my_func(): pass
zother.pyz
my_func()
my_funcr;   c              3      K   | ]7  }t        |      j                         t              j                         k(   9 y wr   )r   resolve)r?   r@   excludeds     r   rA   zPTestGrepReferencesExcludeFiles.test_exclude_files_are_omitted.<locals>.<genexpr>2  s.     \Q47??,X0F0F0HH\s   =A rV   rD   rE   rI   )r1   r2   rJ   
other_filerL   rM   rN   rO   rP   rW   r7   rS  s              @r   test_exclude_files_are_omittedz=TestGrepReferencesExcludeFiles.test_exclude_files_are_omitted*  s    ,67
*
m,y#h-#k:JCPZO9\](,-1QvY-	-[)3z?; 	]H\R[\\s\\\\\\\\\\\\s\\\s\\\\\\\\\\\\\\	] .s   D<c                    |dz  }|j                  d       |dz  }|j                  d       t        dt        |      t        |      g      }d |D        }t        |      }|sddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }t        t        j                  |            d x}}y )
NrO  zdef visible_func(): pass
ref.pyzvisible_func()
visible_funcc              3   *   K   | ]  }d |d   v   yw)rW  r;   Nr=   )r?   rM   s     r   rA   zTTestGrepReferencesExcludeFiles.test_non_excluded_file_is_included.<locals>.<genexpr>:  s     7Q8qy(7s   rC   rD   rE   rI   )r1   r2   rJ   rK   rL   rO   rP   rQ   s           r   "test_non_excluded_file_is_includedzATestGrepReferencesExcludeFiles.test_non_excluded_file_is_included4  s    ,;<h&./~s8}s;?O>PQ7$77s777777777s777s77777777777777r   N)rY   rZ   r[   rU  rZ  r=   r   r   rM  rM  (  s    ]8r   rM  c                       e Zd Zd Zd Zd Zy)TestScanOutputStructurec                    |dz  }|j                  d       t        d      5 }t        dd      |_        t	        t        |      t        |      gd      }d d d        d	D ]  }|v }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d } d   }	d}
|	|
k(  }|slt        j                  d|fd|	|
f      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}	x}}
y # 1 sw Y   `xY w)Nzcheck.pyzdef check_something(): pass
rk   rl   r   rm   zstructure-testrn   )rq   r   unmodified_referencesrr   r   r  krz   r  r  rH   rq   r   r   ru   rv   rw   )r&   r   r   rx   r   r'   r(   r)   r+   r,   r-   r*   r.   r/   )r1   r2   r3   ry   rz   r_  rO   r  rQ   r4   rP   r5   r{   s                r   test_result_has_required_keysz5TestScanOutputStructure.test_result_has_required_keys?  s4   #67#$ 	k$.bQ$GH!s8}c#hZYijF	k X 	A;111	i 4$44 $44444 $4444 444$44444444	k 	ks   4F44F>c                    |dz  }|j                  d       t        d      5 }t        dd      |_        t	        t        |      t        |      g      }d d d        d   }d	}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}}|d   }g }||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}}y # 1 sw Y   xY w)Nzdata.csvzcol1,col2
1,2
rk   rl   r   rm   r   r   r   r   r   ru   rv   rw   rr   r&   r   r   rx   r   r'   r(   r)   r*   r.   r/   
r1   r2   r3   ry   rz   r4   rP   r5   rQ   r{   s
             r   "test_unsupported_extension_skippedz:TestScanOutputStructure.test_unsupported_extension_skippedI  s	   #)*#$ 	Q$.bQ$GH!s8}c#hZPF	Q m$..$....$...$..........'(.B.(B....(B...(...B.......		Q 	Qs   3EE(c                    |dz  }|j                  d       t        d      5 }t        dd      |_        t	        t        |      t        |      gd      }d d d        d	   }d}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}}y # 1 sw Y   xY w)Nzmod.pyzdef func(): pass
rk   rl   r   rm   z
my-task-99rn   rq   r   r   ru   rv   rw   rb  rc  s
             r   test_task_id_propagatedz/TestScanOutputStructure.test_task_id_propagatedR  s    !+,#$ 	g$.bQ$GH!s8}c#hZYefF	g i 0L0 L0000 L000 000L0000000	g 	gs   4CC(N)rY   rZ   r[   r`  rd  rf  r=   r   r   r\  r\  =  s    5/1r   r\  )rl   r   rl   )'__doc__builtinsr+   _pytest.assertion.rewrite	assertionrewriter(   syspathlibr   unittest.mockr   r   pathinsertr'   __file__rR  parentimpact_scannerr   r   r   r	   r
   r   rJ  r   r   r]   rh   r   r   r   r  r"  r/  rM  r\  r=   r   r   <module>rt     s   	  
  * 3tH~--/66==> ? s S c 9 = =@D D.6 66 /  /P
8 
8$ D  DFI I2\ \&R R>8 8*1 1r   