
     j$%                       d Z ddlmZ ddlZddlmc 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,                  j1                  d ee             ddZ ej4                  d      d	        Z ej4                  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                   |j                         st        j                  | d       t        j                  j                  | t        |            }g }d }||u}|}|r|j                  }d }||u}	|	}|slt        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  }|j                  |       |rt        j                  d	fdf      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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}	}t        j                  j%                  |      }|t&        j(                  |j*                  <   |j                  j-                  |       |S )Nu    없음)is not)z%(py2)s is not %(py5)sspec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14%(py16)spy16r   assert %(py19)spy19)existspytestskip	importlibutilspec_from_file_locationstrloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolopAssertionError_format_explanationmodule_from_specsysmodulesnameexec_module)modname	file_pathr   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20mods                    C/home/jay/workspace/tests/regression/test_git_evidence_hardening.py_load_moduler;      sQ   yk)*>>11'3y>JD7t74t77474 777774t77777747774777t77777774777777777777777477777777777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_evidencerH   #   s*    Gh&47HH r<   c                 @    t        dt        dz  dz  dz  dz  dz        S )Nge_dev1_t2485rA   dev1qcrC   rD   rE   rG   r<   r:   dev1_git_evidencerM   +   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)rO   configz
user.emailz	test@test)rO   rU   z	user.nametestz	README.mdrP   rO   add.)rO   commitrQ   -mrP   )
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        |            }g }t        |t              }|}|rt        |      }d}||k(  }|}|s'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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }	|j                  |	       |rt        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                  |      rt        j                  |      ndt        j                  |      t        j                  |      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}}|\  }}g }t        |t              }|}|r|}|sd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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }	|j                  |	       |rXdddt        j                         v st        j                  |      rt        j                  |      ndiz  }|j                  |       t        j                  |d      i 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)uA   _resolve_project_dir_with_source는 (path, source) 튜플 반환.	task-testr   .%(py6)s
{%(py6)s = %(py2)s(%(py3)s, %(py4)s)
}
isinstanceresulttupler	   py3py4py6==z3%(py11)s
{%(py11)s = %(py8)s(%(py9)s)
} == %(py14)slenpy8r   r   r   r   r   r   r   r   Nr_   r   z%(py8)srp   zassert %(py11)sr   )env_vartask_timers	task_filefallbackin)z%(py0)s in %(py3)ssource)py0rh   assert %(py5)sr
   r`    _resolve_project_dir_with_sourcer   rd   rf   rn   r   r   r   r   r    r!   r   r"   r#   r$   )rH   tmp_pathre   r,   @py_assert5r/   r0   r1   r2   @py_format7r5   r6   r7   r8   r_   rw   @py_format9@py_format10@py_format12@py_assert2@py_format4r3   s                         r:   9test_resolve_project_dir_with_source_returns_tuple_sharedr   >   s   x AA+sS[}]F9:fe$9$9$V99)9999999:999:999999f999f999999e999e999$9999$999999999999999999V999V99999999999999999999LD&):dC ) ) T)))))):))):))))))d)))d))))))C)))C))) )))) )))))T)))T))))))))))))HH6HHHHH6HHHHHHH6HHH6HHHHHHHHHHHr<   c                   t        |       | j                  dt        |            }g }t        |t              }|}|rt        |      }d}||k(  }|}|s'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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }	|j                  |	       |rt        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                  |      rt        j                  |      ndt        j                  |      t        j                  |      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 )Nrb   r   rc   rd   re   rf   rg   rk   rm   rn   ro   r   r   r   r   r   rz   )rM   r|   re   r,   r}   r/   r0   r1   r2   r~   r5   r6   r7   r8   s                 r:   7test_resolve_project_dir_with_source_returns_tuple_dev1r   H   sQ   x??SQY][F9:fe$9$9$V99)9999999:999:999999f999f999999e999e999$9999$999999999999999999V999V99999999999999999999r<   c                   t        |       | j                  dt        |            }t        |t              }|s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dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}y)uF   기존 _resolve_project_dir(string 반환) API 유지 (하위 호환).rb   5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}rd   re   r   rx   py1r	   ri   Nr`   _resolve_project_dirr   rd   r   r   r   r   r    r#   r$   )rH   r|   re   r.   @py_format5s        r:   :test_resolve_project_dir_legacy_signature_preserved_sharedr   N   s    x 55k3x=QFfc"""""""":""":""""""f"""f""""""c"""c""""""""""r<   c                   t        |       | j                  dt        |            }t        |t              }|s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dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d }y )Nrb   r   rd   re   r   r   r   )rM   r|   re   r.   r   s        r:   8test_resolve_project_dir_legacy_signature_preserved_dev1r   U   s    x33KXOFfc"""""""":""":""""""f"""f""""""c"""c""""""""""r<   c                X   g d}| j                  |d      }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}}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
)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-2485r   ru   z%(py1)s in %(py3)sscopedr   rh   ry   r
   Nr   r   not inz%(py1)s not in %(py3)sr   	_filter_dirty_to_task_scoper   r   r    r   r   r   r#   r$   rH   filesr   r/   r   r   r3   s          r:   &test_filter_dirty_to_task_scope_sharedr   [   s   E !<<UKPF&0&&0000&&000&000000&000&0000000,6,6666,666,6666666666666666&4&f4444&f444&444444f444f4444444"0"&0000"&000"000000&000&0000000r<   c                   g d}| j                  |d      }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}}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
)u,   task-N+M의 base(task-N)도 scope로 인정.)memory/tasks/task-2472.mdmemory/tasks/task-2472+1.mdr   task-2472+1r   ru   r   r   r   ry   r
   Nr   r   r   r   r   rM   r   r   r/   r   r   r3   s          r:   1test_filter_dirty_to_task_scope_retry_suffix_dev1r   j   s1   E
 ::5-PF&0&&0000&&000&000000&000&0000000(2(F2222(F222(222222F222F2222222&4&f4444&f444&444444f444f4444444r<   c                ~   g d}| j                  |d      }d}||v }|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      d	z   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  }t        j                  d      d	z   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  }t        j                  d      d	z   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  }t        j                  d      d	z   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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}}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.mdr   r   r   r   ru   r   r   r   u   본 task 정확 일치 누락z
>assert %(py5)sr
   Nr   u   본 task base 매치 누락r   r   r   u@   task-2472+10 이 task-2472+1 로 오인 — 경계 검사 미흡r   u<   task-24720 이 task-2472 로 오인 — 경계 검사 미흡r   u>   단어 중간 task-2472 가 매치됨 — 앞쪽 경계 미흡)
r   r   r   r    r   r   r   _format_assertmsgr#   r$   r   s          r:   Ftest_filter_dirty_to_task_scope_boundary_no_substring_collision_sharedr   x   s   E !<<UMRF(S(F2SSS(FSSS(SSSSSSFSSSFSSSS4SSSSSSS&O&&0OOO&&OOO&OOOOOO&OOO&OOOO2OOOOOOO) )7  )    *      28    28    	K     ( 'v5  'v    (      06    06    	G     / .f<  .f    /      7=    7=    	I    r<   c                   ddg}| j                  |d      }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
)u   dev1 도 동일 경계 보장.r   r   r   ru   r   r   r   ry   r
   Nr   r   r   r   s          r:   -test_filter_dirty_to_task_scope_boundary_dev1r      s    +-JKE::5-PF(2(F2222(F222(222222F222F2222222)7)7777)777)7777777777777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{t        j                  d      dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                   |            | }|st        j                  d|d          dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }	t        t        j                   |	            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 = 1rW   rR   )rO   rZ   rQ   r[   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_UNCOMMITTEDNrG   .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=NrG   r   s     r:   r   zQtest_verify_main_repo_fallback_ignores_other_task_dirty_shared.<locals>.<genexpr>   s     O!3Or   u)   resolved_via= 라벨이 details에 없음
>assert %(py0)srx   resolved_via_presentuS   main repo의 다른 task dirty로 NO_UNCOMMITTED FAIL — 분리 판단 미동작: z
>assert not %(py0)sno_uncommitted_failedN)r`   mkdirr^   r\   r]   delenvverifyr   anyr   r   r   r   r   r    r#   r$   )
rH   r|   monkeypatchrepore   r   r   @py_format1r,   @py_format2s
             r:   >test_verify_main_repo_fallback_ignores_other_task_dirty_sharedr      s    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LLLLLLLLLLLLLL$$ $   ^^den^o]pq     %    %     r<   c                4   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              }|st        j                  d|d          dz   ddt        j                         v st        j                  |      rt        j                   |      ndiz  }t#        t        j$                  |            |d   }d}||k(  }|st        j&                  d|fd||f      t        j                   |      t        j                   |      dz  }	t        j                  d|d          dz   d|	iz  }
t#        t        j$                  |
            dx}x}}d |d   D        }t        |      }|st        j                  d|d          d z   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# t        j                  j                  dd       w xY w)#u   worktree 자체 dirty는 여전히 FAIL (회귀 7-6 다른 면).

    PROJECT_PATH=worktree로 설정하면 worktree dirty 검출 시 FAIL해야 한다.
    r   r   Tr   ztask-wt+1.mdz# wtztask-wt+1-impl.pyzy = 1rW   rR   )rO   rZ   rQ   r[   z[task-wt+1] addz!y = 2  # task-wt+1 worktree dirtyr   z	task-wt+1Nc              3  $   K   | ]  }d |v  
 yw)zresolved_via=env_varNrG   r   s     r:   r   z@test_verify_worktree_dirty_still_fails_shared.<locals>.<genexpr>   s     Vq5:Vr   r   u$   resolved_via=env_var 라벨 누락: r   rx   r   statusFAILrk   )z%(py1)s == %(py4)s)r   ri   uI   worktree 자체 dirty인데 FAIL이 아님 (dirty_check_removal 위반): z
>assert %(py6)srj   c              3  $   K   | ]  }d |v  
 ywr   rG   r   s     r:   r   z@test_verify_worktree_dirty_still_fails_shared.<locals>.<genexpr>   s      '("r   u#   NO_UNCOMMITTED FAIL 사유 누락: z.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}r   )rx   r	   ri   )r`   r   r^   r\   r]   r   osenvironr   popr   r   r   r   r   r   r    r#   r$   r   )rH   r|   r   re   r   r   r/   r.   r   r   r~   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 v%  v         &    TTZ[dTeSfg    ,29,= A3   A  A/@/@	,VI->,?@A A:@&A A(@(@  A A7@y  A A7@y A A7@y A A A-@-@A A 	

~t,s   7K5 5"L)r*   r   r+   r   )r_   r   returnr   )(__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   importlib.utilr   r   r\   r&   pathlibr   r   __file__resolver   rF   r   r_   removeinsertr;   fixturerH   rM   r`   r   r   r   r   r   r   r   r   r   r   rG   r<   r:   <module>r      s   
 #     	  
  N""$,,Q/	 y>SXXHHOOC	N# 3y> " h   h  I:##1
5.8#LAr<   