
    vDi"                        d Z ddlZddlmZ ddlZ ed      Zej                  j                  d eedz               ddl	Z
ej                  d        Zej                  d        Zdded	efd
Zd Zd Zd Zd Zd Zd Zy)u=   ast_dependency_map.py 단위 테스트 (task-2337 Phase 1.4).    N)Pathz/home/jay/workspacescriptsc                 ^    |dz  }|j                          | j                  t        d|       |S )Ncache	CACHE_DIR)mkdirsetattradm)monkeypatchtmp_pathr   s      N/home/jay/workspace/.worktrees/task-2466-dev1/tests/test_ast_dependency_map.pyisolated_cacher      s,    wE	KKM[%0L    c                 0    | dz  }|j                          |S )Nproj)r   )r   roots     r   tiny_projectr      s    fDJJLKr   pcontentc                 `    | j                   j                  dd       | j                  |       y )NT)parentsexist_ok)parentr   
write_text)r   r   s     r   _writer   "   s"    HHNN4$N/LLr   c                    | dz  }t        |dz  d       t        |dz  d       t        |dz  dz  dz  d	       t        |d
z  dz  d       t        |dz  dz  dz  d       t        |dz  dz  dz  d       t        |dz  dz  dz  d       t        |dz  dz  dz  d       t        j                  |      }|D ch c]  }|j                   }}d|v sJ d       d|v sJ d       d|vsJ d       d|vsJ d       d|vsJ d        d|vsJ d!       d|vsJ d"       d|vsJ d#       t	        |      d$k(  sJ d%t	        |       d&|        y'c c}w )(u\   EXCLUDE_DIRS 목록의 디렉토리는 _iter_py_files() 결과에서 제외되어야 한다.r   main.pyz# mainzfoo.pyz# foo
.worktreessubzexcluded.pyz
# excluded__pycache__z	cached.pyz# cachedz.venvlibzsite.pyz# sitez.githookszpre-commit.pyz# pre-commitnode_modulespkgzindex.pyz# indexz.codegraph-venvzx.pyz# xu   main.py 가 결과에 없음u   foo.py 가 결과에 없음u/   .worktrees 하위 파일이 결과에 포함됨u0   __pycache__ 하위 파일이 결과에 포함됨u*   .venv 하위 파일이 결과에 포함됨u)   .git 하위 파일이 결과에 포함됨u1   node_modules 하위 파일이 결과에 포함됨u4   .codegraph-venv 하위 파일이 결과에 포함됨   u   예상 2개, 실제 u   개: N)r   r
   _iter_py_filesnamelen)r   r   resultr   result_namess        r    test_iter_py_files_excludes_dirsr+   ,   s   fD 4)X&
4(?G$ 4,&6E
4-+-z:
4'>E!I-x8
4&=7"_4nE
4. 5(:5yA
4##e+f4e<%F$*+qAFF+L+ $D&DD$|#B%BB# ,_.__,l*^,^^*L(V*VV(,.[0[[.\)^+^^)%]']]% v;!N3CK=fXNN ,s   8E
c                 b   |}t        |dz  d       t        |dz  d       t        j                  |      }t        | j	                  d            }t        |      dk(  sJ dt        |       d       t        j                  |      }t        |j                  j                               t        |j                  j                               k(  sJ d	       |j                  D ],  }|j                  |   |j                  |   k(  r#J d
| d        t        d |j                  j                         D              t        d |j                  j                         D              k(  sJ d       |j                  D ],  }|j                  |   |j                  |   k(  r#J d| d        t        |j                  j                               t        |j                  j                               k(  sJ d       |j                  D ],  }|j                  |   |j                  |   k(  r#J d| d        y)uK   캐시 miss → 저장 → hit 후 동일 그래프 반환을 검증한다.zalpha.pyzimport beta
zbeta.pyz# beta module
*.pkl   u&   캐시 파일이 1개여야 하는데 u   개u   module_to_file 키 불일치zmodule_to_file[u   ] 값 불일치c              3   2   K   | ]  }t        |        y wNstr.0ks     r   	<genexpr>z'test_cache_roundtrip.<locals>.<genexpr>n        6!s1v6   c              3   2   K   | ]  }t        |        y wr0   r1   r3   s     r   r6   z'test_cache_roundtrip.<locals>.<genexpr>o   r7   r8   u   file_imports 키 불일치zfile_imports[u   module_importers 키 불일치zmodule_importers[N)r   r
   DependencyGraphlistglobr(   setmodule_to_filekeysfile_importsmodule_importers)r   r   r   g1cache_filesg2r5   s          r   test_cache_roundtriprE   T   s?   D 4*o.
4)./ 
		T	"B ~**734K{q `$J3{K[J\\_"``  
		T	"B r  %%'(C0A0A0F0F0H,II '&'I 1  #r'8'8';; 	1aS0	1;1
 6r335666r335667 U8TU 7__ /q!R__Q%77 	/A3o.	/7/
 r""'')*c"2E2E2J2J2L.MM )()M   3""1%)<)<Q)?? 	3s/2	3?3r   c                    |}t        |dz  d       t        j                  |      }d|j                  v sJ d       d|j                  vsJ d       t	        | j                  d            }t        |      dk(  sJ t        |d	z  d
       t        j                  |      }d|j                  v sJ d       d|j                  v sJ d       t	        | j                  d            }t        |      dk\  sJ y)ui   새 파일 추가 후 mtime 변경 시 캐시가 무효화되고 새 그래프에 파일이 포함된다.za.pyz# module a
au   a 모듈이 g1에 없음bu*   b 모듈이 이미 g1에 있으면 안 됨r-   r.   zb.pyz# module b
u   a 모듈이 g2에 없음u@   b 모듈이 g2에 포함되어야 함 (cache miss 후 재빌드)N)r   r
   r:   r>   r;   r<   r(   )r   r   r   rB   cache_files_beforerD   cache_files_afters          r   &test_cache_invalidates_on_mtime_changerK      s	   D 4&=.) 
		T	"B"###?%??#b'''U)UU'n11':;!"a''' 4&=.) 
		T	"B"###?%??#"###g%gg# ^009: !Q&&&r   c                    |}t        |dz  dz  d       t        |dz  dz  d       t        |dz  dz  dz  dz  d       t        j                  |dg      }t        |      dk(  sJ |d	   d
   d   }|D ]  }d|vrJ d|         y)uX   .worktrees 하위 파일은 analyze() direct_importers에 포함되지 않아야 한다.r$   r   zimport data
zdata.pyz# data module
r   r   r.   r   blast_radiusdirect_importersu4   .worktrees 경로가 direct_importers에 포함됨: N)r   r
   analyzer(   )r   r   r   resultsrN   path_strs         r   test_analyze_excludes_worktreesrR      s    D 4%<)#_5
4%<)#%67 4%<,&.:OLkk$,Gw<1qz.12DE % N8+ 	NB8*M	N+Nr   c                    |}t        |dz  d       t        |dz  d       t        j                  |dgd      }t        |      dk(  sJ |d   d	   d
   }t        |      dkD  sJ d       |D cg c]  }|j	                  d      d    }}t        d |D              s
J d|        |D ]I  }|j                  dd      }t        |      dk(  s
J d|        |d   j                         rAJ d|         yc c}w )uW   캐시 hit 후 lazy AST를 사용해 함수 호출자를 올바르게 찾아야 한다.zlib.pyzdef hello():
    pass
	caller.pyzfrom lib import hello
hello()
hello)function_namer.   r   rM   callersu9   callers가 비어 있음 — hello() 호출 감지 실패:c              3   $   K   | ]  }d |v  
 yw)rT   N )r4   fs     r   r6   z5test_get_function_callers_lazy_ast.<locals>.<genexpr>   s     6A{a6s   u!   caller.py 가 callers에 없음: r%   u    줄번호 없는 caller 항목: u   줄번호가 숫자가 아님: N)r   r
   rO   r(   splitanyrsplitisdigit)r   r   r   rP   rW   ccaller_filespartss           r   "test_get_function_callers_lazy_astrc      s%   D
4(?67
4+ABkk$
'BGw<1aj(3Gw<!XXX .55AGGCLO5L5666 6
+G9566  Ia 5zQF"B1# FFQx!H%DQC#HH!I 6s   .C6c                 p    |}t        |dz  d       t        j                  |g       }|g k(  s
J d|        y)uY   빈 affected_files 리스트로 analyze() 호출 시 빈 리스트 반환, 예외 없음.zsomething.pyz# placeholder
u4   빈 입력 시 빈 리스트 반환 예상, 실제: N)r   r
   rO   )r   r   r   rP   s       r   test_analyze_empty_filesre      sB    D
4. "34kk$#Gb=ZPQXPYZZ=r   ) )__doc__syspathlibr   pytest	WORKSPACEpathinsertr2   ast_dependency_mapr
   fixturer   r   r   r+   rE   rK   rR   rc   re   rZ   r   r   <module>rp      s    C 
   &'	 3y9,- .      d S  OP%3Z'DN6I<[r   