
     j$%                       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
 e	e      j                         j                  d   Z ee      ej                   v r!ej                   j#                   ee             ej                   j%                  d ee             ddZ e
j(                  d      d	        Z e
j(                  d      d
        ZddZd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!y)u   tests/regression/test_git_evidence_hardening.py — task-2485 회귀.

git_evidence가 main repo dirty와 current worktree dirty를 분리 판단하는지 검증.
shared + dev1 두 모듈 모두 검증.
    )annotationsN)Path   c                v   |j                         st        j                  | d       t        j                  j                  | t        |            }||j                  J t        j                  j                  |      }|t        j                  |j                  <   |j                  j                  |       |S )Nu    없음)existspytestskip	importlibutilspec_from_file_locationstrloadermodule_from_specsysmodulesnameexec_module)modname	file_pathspecmods       C/home/jay/workspace/tests/regression/test_git_evidence_hardening.py_load_moduler      s    yk)*>>11'3y>JD 777
..
)
)$
/C CKK		KKC J    module)scopec                 :    t        dt        dz  dz  dz  dz        S )Nge_shared_t2485teamsshared	verifiersgit_evidence.pyr   	WORKSPACE r   r   shared_git_evidencer&   #   s*    Gh&47HH r   c                 @    t        dt        dz  dz  dz  dz  dz        S )Nge_dev1_t2485r   dev1qcr!   r"   r#   r%   r   r   dev1_git_evidencer+   +   s/    Gf$t+k9<MM r   c                2   t        j                  g d| d       t        j                  g d| d       t        j                  g d| d       | dz  j                  d       t        j                  g d| d       t        j                  g d	| d       | S )
u!   git repo 초기화 + 커밋 1건.)gitinit-qTcwdcheck)r-   configz
user.emailz	test@test)r-   r3   z	user.nametestz	README.mdr.   r-   add.)r-   commitr/   -mr.   )
subprocessrun
write_text)paths    r   
_init_repor>   3   sp    NN(d$?NN?TQUVNN9t4P	K##F+NN&D=NN8d$OKr   c                    t        |       | j                  dt        |            }t        |t              rt        |      dk(  sJ |\  }}t        |t              r|sJ |dv sJ y)uA   _resolve_project_dir_with_source는 (path, source) 튜플 반환.	task-testr   )env_vartask_timers	task_filefallbackNr>    _resolve_project_dir_with_sourcer   
isinstancetuplelen)r&   tmp_pathresultr=   sources        r   9test_resolve_project_dir_with_source_returns_tuple_sharedrM   >   sf    x AA+sS[}]Ffe$V)999LD&dC T))HHHHr   c                    t        |       | j                  dt        |            }t        |t              rt        |      dk(  sJ y )Nr@   r   rE   r+   rJ   rK   s      r   7test_resolve_project_dir_with_source_returns_tuple_dev1rP   H   s?    x??SQY][Ffe$V)999)9r   c                t    t        |       | j                  dt        |            }t        |t              sJ y)uF   기존 _resolve_project_dir(string 반환) API 유지 (하위 호환).r@   Nr>   _resolve_project_dirr   rG   )r&   rJ   rK   s      r   :test_resolve_project_dir_legacy_signature_preserved_sharedrT   N   s0    x 55k3x=QFfc"""r   c                t    t        |       | j                  dt        |            }t        |t              sJ y )Nr@   rR   rO   s      r   8test_resolve_project_dir_legacy_signature_preserved_dev1rV   U   s0    x33KXOFfc"""r   c                `    g d}| j                  |d      }d|v sJ d|v sJ d|vsJ d|vsJ y)u1   다른 task의 파일은 task scope에서 제외.)memory/tasks/task-2485.mdmemory/tasks/task-9999.mdutils/state_repair.pymemory/reports/task-2485-foo.mdz	task-2485rX   r[   rY   rZ   N_filter_dirty_to_task_scoper&   filesscopeds      r   &test_filter_dirty_to_task_scope_sharedra   [   sU    E !<<UKPF&&000,666&f444"&000r   c                T    g d}| j                  |d      }d|v sJ d|v sJ d|vsJ y)u,   task-N+M의 base(task-N)도 scope로 인정.)memory/tasks/task-2472.mdmemory/tasks/task-2472+1.mdrY   task-2472+1rc   rd   rY   Nr\   r+   r_   r`   s      r   1test_filter_dirty_to_task_scope_retry_suffix_dev1rg   j   sG    E
 ::5-PF&&000(F222&f444r   c                    g d}| 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       y)uk   task-2472+1 검사 시 task-2472+10 / task-24720 / foo-task-2472-bar 가 본 scope 로 오인되지 않음.)memory/tasks/task-2472+10.mdmemory/tasks/task-24720.md!memory/tasks/foo-task-2472-bar.mdrd   rc   re   rd   u   본 task 정확 일치 누락rc   u   본 task base 매치 누락ri   u@   task-2472+10 이 task-2472+1 로 오인 — 경계 검사 미흡rj   u<   task-24720 이 task-2472 로 오인 — 경계 검사 미흡rk   u>   단어 중간 task-2472 가 매치됨 — 앞쪽 경계 미흡Nr\   r^   s      r   Ftest_filter_dirty_to_task_scope_boundary_no_substring_collision_sharedrl   x   s    E !<<UMRF(F2S4SS2&&0O2OO0)7 J7 (v5 F5 /f< H<r   c                H    ddg}| j                  |d      }d|v sJ d|vsJ y)u   dev1 도 동일 경계 보장.ri   rd   re   Nr\   rf   s      r   -test_filter_dirty_to_task_scope_boundary_dev1rn      s;    +-JKE::5-PF(F222)777r   c                <   t        |      }|dz  dz  j                  d       |dz  dz  dz  j                  d       |dz  j                  d       t        j                  g d	|d
       t        j                  g d|d
       |dz  j                  d       |j                  dd       |j                  dd       | j                  dt        |            }t        d |d   D              }t        d |d   D              }|sJ d       |rJ d|d           y)u   fallback 모드에서 다른 task의 dirty 파일은 무시 (현재 task FAIL 안 됨).

    회귀 7-6: main repo dirty와 worktree dirty 분리.
    memorytasksTparentsztask-test+1.mdz# testzsrc.pyzx = 1r5   r0   )r-   r8   r/   r9   z[task-test+1] addzother_task_file.pyz
from otherPROJECT_PATHF)raisingWORKTREE_PATHztask-test+1c              3  $   K   | ]  }d |v  
 ywzFAIL NO_UNCOMMITTEDNr%   .0ds     r   	<genexpr>zQtest_verify_main_repo_fallback_ignores_other_task_dirty_shared.<locals>.<genexpr>   s       '("    detailsc              3  $   K   | ]  }d |v  
 yw)zresolved_via=Nr%   ry   s     r   r|   zQtest_verify_main_repo_fallback_ignores_other_task_dirty_shared.<locals>.<genexpr>   s     O!3Or}   u)   resolved_via= 라벨이 details에 없음uS   main repo의 다른 task dirty로 NO_UNCOMMITTED FAIL — 분리 판단 미동작: N)	r>   mkdirr<   r:   r;   delenvverifyr   any)r&   rJ   monkeypatchreporK   no_uncommitted_failedresolved_via_presents          r   >test_verify_main_repo_fallback_ignores_other_task_dirty_sharedr      s8    hD	H_w%%d%3	H_w!11==hG	H_  )NN&D=NN:D
 
  ,,\: ~u56 ''s4yAF  ,29,=   OVI=NOOL!LL$ 
]^den^o]pq$$r   c                   t        |      }|dz  dz  j                  d       |dz  dz  dz  j                  d       |dz  j                  d       t        j                  g d	|d
       t        j                  g d|d
       |dz  j                  d       t        |      t        j                  d<   	 | j                  dt        |            }t        j                  j                  dd       t        d |d   D              }|sJ d|d           |d   dk(  sJ d|d           t        d |d   D              sJ d|d           y# t        j                  j                  dd       w xY w)u   worktree 자체 dirty는 여전히 FAIL (회귀 7-6 다른 면).

    PROJECT_PATH=worktree로 설정하면 worktree dirty 검출 시 FAIL해야 한다.
    rp   rq   Trr   ztask-wt+1.mdz# wtztask-wt+1-impl.pyzy = 1r5   r0   )r-   r8   r/   r9   z[task-wt+1] addz!y = 2  # task-wt+1 worktree dirtyrt   z	task-wt+1Nc              3  $   K   | ]  }d |v  
 yw)zresolved_via=env_varNr%   ry   s     r   r|   z@test_verify_worktree_dirty_still_fails_shared.<locals>.<genexpr>   s     Vq5:Vr}   r~   u$   resolved_via=env_var 라벨 누락: statusFAILuI   worktree 자체 dirty인데 FAIL이 아님 (dirty_check_removal 위반): c              3  $   K   | ]  }d |v  
 ywrx   r%   ry   s     r   r|   z@test_verify_worktree_dirty_still_fails_shared.<locals>.<genexpr>   s      '("r}   u#   NO_UNCOMMITTED FAIL 사유 누락: )r>   r   r<   r:   r;   r   osenvironr   popr   )r&   rJ   r   rK   r   s        r   -test_verify_worktree_dirty_still_fails_sharedr      s   
 hD	H_w%%d%3	H_w/;;FC	++G4NN&D=NN8d$ 
++,OP!$TBJJ~-$++KTC


~t, VF9DUVV[#GyHYGZ![[(v% 
STZ[dTeSfg%  ,29,=  A	,VI->,?@A  	

~t,s   7E "E0)r   r   r   r   )r=   r   returnr   )"__doc__
__future__r   importlib.utilr
   r   r:   r   pathlibr   r   __file__resolvers   r$   r   r=   removeinsertr   fixturer&   r+   r>   rM   rP   rT   rV   ra   rg   rl   rn   r   r   r%   r   r   <module>r      s   
 #  	  
  N""$,,Q/	 y>SXXHHOOC	N# 3y> " h   h  I:##1
5.8#LAr   