
    di}&                        d 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Zej                  j                  ed      Ze	j                  j                  dej                  j                  edd             e	j                  j                  dej                  j                  edd             ddlZddlZd	 Zd
 Zd Zd Zd Zd Ze
j0                  j3                  d edd            d        Zd Zd Zd Zy)u   
test_finish_loop_fix.py - task-2348 시뮬레이션 검증

MT-1: git_evidence.py 워크트리 자동 인식
MT-2: qc_verify.py 같은 사유 3회 즉시 escalate
MT-3: (동기화 완료 검증)
MT-4: 5회 시뮬레이션 포함
    Nz/home/jay/workspaceteamsshared	verifiersdev1qcc                    | dz  }|j                          |dz  j                          |j                  dt        |             |j                  dd       t	        j
                  dt        |             }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  }t        j                  d| d|       dz   d|iz  }t        t        j                  |            dx}}y)u<   PROJECT_PATH 환경변수가 있으면 그 경로를 사용.fake_project.gitPROJECT_PATHWORKTREE_PATHFraising	task-test==z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}resolvedstrpy0py2py3py5	Expected , got 
>assert %(py7)spy7N)mkdirsetenvr   delenvgit_evidence_resolve_project_dir
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationtmp_pathmonkeypatchr	   r   @py_assert4@py_assert1@py_format6@py_format8s           ?/home/jay/workspace/teams/dev7/qc/tests/test_finish_loop_fix.py(test_env_var_project_path_takes_priorityr4      s    n,LF!!#~s<'89600c(mLH<(T8((TTT8(TTTTTT8TTT8TTTTTTsTTTsTTTTTT<TTT<TTT(TTTIl^6(*TTTTTTT    c                    | dz  }|j                          |dz  j                          |j                  dd       |j                  dt	        |             t        j                  dt	        |             }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  }t        j                  d| d|       dz   d|iz  }t        t        j                  |            dx}}y)u=   WORKTREE_PATH 환경변수가 있으면 그 경로를 사용.fake_worktreer
   r   Fr   r   r   r   r   r   r   r   r   r   r   r   N)r   touchr    r   r   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   )r-   r.   r7   r   r/   r0   r1   r2   s           r3   )test_env_var_worktree_path_takes_priorityr9   +   s   .MV""$~u5M(:;00c(mLH=)V8))VVV8)VVVVVV8VVV8VVVVVVsVVVsVVVVVV=VVV=VVV)VVVY}oVH:+VVVVVVVr5   c                    |j                  dd       |j                  dd       | dz  }|j                          | dz  }|j                          ddt        |      ii}|d	z  }|j                  t	        j
                  |             t        j                  dt        |             }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  }	t        j                  d| d|       dz   d|	iz  }
t        t        j                   |
            dx}}y)u/   task-timers.json에서 worktree_path로 폴백.r   Fr   r   memory
my_projectztask-timer-testworktree_pathtask-timers.jsonr   r   r   r   r	   r   r   r   r   r   Nr    r   r   
write_textjsondumpsr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   )r-   r.   
memory_dirr	   timerstimers_pathr   r/   r0   r1   r2   s              r3   test_task_timers_json_fallbackrF   :   s`   ~u56 H$Jl*L 	S.
F
 11K4::f-.001BCMRH<(T8((TTT8(TTTTTT8TTT8TTTTTTsTTTsTTTTTT<TTT<TTT(TTTIl^6(*TTTTTTTr5   c                 8   |j                  dd       |j                  dd       | dz  }|dz  }|j                  d       | d	z  }|j                          d
t        |       d}|dz  }|j                  |       |dz  }|j                  t	        j
                  i              t        j                  dt        |             }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  }t        j                  d| d|       dz   d|iz  }t        t        j                   |            dx}
}	y)u0   task 파일에서 '워크트리 경로:' 파싱.r   Fr   r   r;   tasksTparentsparsed_projectu'   # task-file-test

워크트리 경로: u   

## 설명
본문ztask-file-test.mdr>   ztask-file-testr   r   r   r   r	   r   r   r   r   r   Nr?   )r-   r.   rC   	tasks_dirr	   task_content	task_filerE   r   r/   r0   r1   r2   s                r3   test_task_file_fallbackrO   S   s   ~u56H$JW$IOODO!..L ?s<?P>QQfgL//I& 11K4::b>*001A3x=QH<(T8((TTT8(TTTTTT8TTT8TTTTTTsTTTsTTTTTT<TTT<TTT(TTTIl^6(*TTTTTTTr5   c                    |j                  dd       |j                  dd       | dz  }|j                          |dz  j                  t        j                  i              t        j                  dt        |             }g }t        j                  }|j                  } ||      }|}|st        |       }	||	k(  }
|
}|s4dd	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      dz  }|j!                  |       |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  }|j!                  |       t        j$                  |d      i z  }dd|iz  }t'        t        j(                  |            dx}x}x}x}x}x}
}	y)u<   어느 것도 없으면 workspace_root 기반 폴백 사용.r   Fr   r   r;   r>   ztask-nonexistentzZ%(py9)s
{%(py9)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.path
}.isdir
}(%(py7)s)
}osr   )r   py4py6r   py9r   )z5%(py11)s == %(py16)s
{%(py16)s = %(py13)s(%(py14)s)
}r   r-   )py11py13py14py16z%(py18)spy18   zassert %(py21)spy21N)r    r   r@   rA   rB   r!   r"   r   rQ   pathisdirr%   r&   r#   r'   r(   appendr$   _format_boolopr*   r+   )r-   r.   rC   r   r0   @py_assert3@py_assert5@py_assert8@py_assert0@py_assert15@py_assert12@py_format10@py_format17@py_format19@py_format20@py_format22s                   r3   test_workspace_fallbackrk   n   s   ~u56 H$J$$00B@001CS]SH?277?7==?="?"?"#h-?h-&???????2???2???7???=????????????"????"???h-??????h???h??????#???#??????h???h???-??????????????r5   c                    | dz  dz  j                  d       | dz  }|j                          d}|j                  dfd       |j                  d	fd
       |j                  dt        |              dg}t	        ||       t	        ||       t        j                  |      }t        j                  ||       t        j                  t        |            }|j                  |      dz   }|| dz  }|dk\  rE|ddj                  t        |             |d}	|j                  t        j                  |	             |j                  }
 |
       }|st        j                   d      dz   dt#        j$                         v st        j&                  |      rt        j(                  |      ndt        j(                  |
      t        j(                  |      dz  }t+        t        j,                  |            dx}
}t        j.                  |j1                               }d}|d   }||v }|slt        j2                  d|fd||f      t        j(                  |      t        j(                  |      dz  }dd|iz  }t+        t        j,                  |            dx}x}}d}||k\  }
|
st        j2                  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)%u<   같은 verifier 3회 FAIL 시 escalate 파일 생성 확인.logsretry-countersTrI   eventsztask-sim-escalatez#qc_verify._get_failed_check_historyc                     t        |       S N)_build_fake_history)tidcounter_dirs    r3   <lambda>z5test_same_verifier_3_times_escalate.<locals>.<lambda>   s    'S9 r5   zqc_verify._record_failed_checksc                     t        | |      S rq   )_write_fake_history)rs   namesrt   s     r3   ru   z5test_same_verifier_3_times_escalate.<locals>.<lambda>   s    .{CG r5   WORKSPACE_ROOTr!   rZ   	.escalate   u"   동일 verifier 3회 연속 FAIL: z, )task_idreasonsame_fail_countu;   3회 연속 FAIL 시 escalate 파일이 생성되어야 함C
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}escalate_pathr   r   rR   Nu    동일 verifier 3회 연속 FAILr}   )in)z%(py1)s in %(py4)s)py1rR   zassert %(py6)srS   )>=)z%(py0)s >= %(py3)s
same_count)r   r   zassert %(py5)sr   )r   setattrr   r   rw   	qc_verify_get_failed_check_history_record_failed_checksrA   rB   sortedcountjoinr@   existsr#   r)   r%   r&   r'   r(   r*   r+   loads	read_textr$   )r-   r.   
events_dirr|   failed_nameshistorycurrent_keyr   r   escalate_datar0   r`   @py_format5datarc   @py_assert2@py_format7@py_format4r1   rt   s                      @r3   #test_same_verifier_3_times_escalater      sm    V#&66Kd#H$J!G-9 )G 'X7"#L Wl;Wl; 11':G##G\:**VL12K{+a/JG9I!66MQ:499VLEY;Z:[\)

 	  M!:;`!`!``#```````=```=``````!``````::m--/0D-?h?-????-???-??????????:?:::r5   	run_indexrZ      c                    | dz  dz  }|j                  d       | dz  }|j                          |j                  dt        |              d|d}d	d
g}t        |      D ]  }t	        |||        || dz  }|j                         j                         j                         }	|	dd D 
cg c]  }
t        j                  |
       }}
|D cg c]0  }t        j                  t        |j                  dg                   2 }}t        j                  t        |            }|j                  |      dz   }|dk\  }|| dz  }|r)||d}|j                  t        j                  |             |dk  r|j                  } |       }| }|st!        j"                  d| d      dz   dt%        j&                         v st!        j(                  |      rt!        j*                  |      ndt!        j*                  |      t!        j*                  |      dz  }t-        t!        j.                  |            dx}x}}y|j                  } |       }|st!        j"                  d| d      dz   dt%        j&                         v st!        j(                  |      rt!        j*                  |      ndt!        j*                  |      t!        j*                  |      dz  }t-        t!        j.                  |            dx}}yc c}
w c c}w )uF   5회 시뮬레이션: 3회째에 escalate, 4~5회는 이미 escalated.rm   rn   TrI   ro   ry   z
task-5sim-02dr!   
file_check.fail_history.jsonlNr   rZ   r{   rz   )r|   r~   z
run_index=u*   : 3회 미만에선 escalate 없어야 함zG
>assert not %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r   r   u*   : 3회 이상에선 escalate 있어야 함r   )r   r   r   rangerw   r   strip
splitlinesrA   r   rB   r   getr   r@   r   r#   r)   r%   r&   r'   r(   r*   r+   )r-   r.   r   rt   r   r|   r   _history_filelineslhistory_entriesehistory_keysr   r   should_escalater   r   r0   r`   ra   r1   r   s                           r3   "test_5_simulations_escalate_at_3rdr      sq    V#&66Kd#H$J'X79S/*G"L1L 9 @K,?@ G9,?!@@L""$**,779E.3CRj9tzz!}9O9KZ[aDJJvaeeNB&?@A[L[**VL12K##K014J AoOG9I!66M$+
K  M!:;1} ''m')m))m)mmZ	{Bl+mmmmmmm=mmm=mmm'mmm)mmmmmm##i#%i%iiI;>h'iiiiiii}iii}iii#iii%iiiiii :[s   -K<5Lc                 <   | dz  }|j                          |dz  j                          |j                  dt        |             t        j                  dt        |             }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)uK   PROJECT_PATH 설정 시 git_evidence.verify가 그 경로에서 git 실행.git_projectr
   r   ztask-git-testr   r   r   r   r	   r   zassert %(py7)sr   N)r   r   r   r!   r"   r#   r$   r%   r&   r'   r(   r*   r+   r,   s           r3   'test_git_evidence_uses_env_project_pathr      s    m+LF!!#~s<'89 00#h-PH<((8(((((8(((((((8(((8((((((s(((s((((((<(((<(((((((((((r5   c                    ddl m } | | dz  }|j                         j                  d      t        |      d}t	        |d      5 }|j                  t        j                  |      dz          ddd       y# 1 sw Y   yxY w)	u'   테스트용 fail_history.jsonl 기록.r   )datetimer   z%Y-%m-%dT%H:%M:%S)	timestampr   a
N)r   nowstrftimer   openwriterA   rB   )rt   r|   r   r   r   entryfs          r3   rw   rw      sx    !G9,?!@@L\\^,,-@A|,E 
lC	  *A	

5!D()* * *s   (A77B c                    | | dz  }	 t        |      5 }|D cg c](  }|j                         st        j                  |      * }}ddd       D cg c]0  }t        j                  t        |j                  dg                   2 c}S c c}w # 1 sw Y   JxY wc c}w # t        t        j                  f$ r g cY S w xY w)u   테스트용 history 로드.r   Nr   )	r   r   rA   r   rB   r   r   FileNotFoundErrorJSONDecodeError)rt   r|   r   r   lineentriesr   s          r3   rr   rr      s    G9,?!@@L, 	G145FDtzz$'FGF	GGNO!

6!%%";<=OO G	G 	GOt334 	sJ   B# BBBB	B# 5B
B# BBB# #C C)__doc__builtinsr%   _pytest.assertion.rewrite	assertionrewriter#   rA   rQ   syspytest	WORKSPACEr\   r   	TEAMS_DIRinsertr!   r   r4   r9   rF   rO   rk   r   markparametrizer   r   r   rw   rr    r5   r3   <module>r      s      	 
  "	GGLLG,	 277<<	8[A B 277<<	648 9  
U
WU2U6@"-d eAqk2!j 3!jL
)	*r5   