
    di}&                        d 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j$                  j'                  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J d| d	|        y
)u<   PROJECT_PATH 환경변수가 있으면 그 경로를 사용.fake_project.gitPROJECT_PATHWORKTREE_PATHFraising	task-test	Expected , got N)mkdirsetenvstrdelenvgit_evidence_resolve_project_dirtmp_pathmonkeypatchr	   resolveds       ?/home/jay/workspace/teams/dev7/qc/tests/test_finish_loop_fix.py(test_env_var_project_path_takes_priorityr      s     n,LF!!#~s<'89600c(mLHs<((TIl^6(*TT(    c                 $   | dz  }|j                          |dz  j                          |j                  dd       |j                  dt	        |             t        j                  dt	        |             }|t	        |      k(  sJ d| d	|        y
)u=   WORKTREE_PATH 환경변수가 있으면 그 경로를 사용.fake_worktreer
   r   Fr   r   r   r   r   N)r   touchr   r   r   r   r   )r   r   r    r   s       r   )test_env_var_worktree_path_takes_priorityr"   +   s    .MV""$~u5M(:;00c(mLHs=))VY}oVH:+VV)r   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J d
| d|        y)u/   task-timers.json에서 worktree_path로 폴백.r   Fr   r   memory
my_projectztask-timer-testworktree_pathtask-timers.jsonr   r   Nr   r   r   
write_textjsondumpsr   r   )r   r   
memory_dirr	   timerstimers_pathr   s          r   test_task_timers_json_fallbackr/   :   s    ~u56 H$Jl*L 	S.
F
 11K4::f-.001BCMRHs<((TIl^6(*TT(r   c                    |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J d| d|        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   Nr(   )	r   r   r,   	tasks_dirr	   task_content	task_filer.   r   s	            r   test_task_file_fallbackr8   S   s    ~u56H$JW$IOODO!..L ?s<?P>QQfgL//I& 11K4::b>*001A3x=QHs<((TIl^6(*TT(r   c                 f   |j                  dd       |j                  dd       | dz  }|j                          |dz  j                  t        j                  i              t        j                  dt        |             }t        j                  j                  |      s|t        |       k(  sJ yy)	u<   어느 것도 없으면 workspace_root 기반 폴백 사용.r   Fr   r   r$   r'   ztask-nonexistentN)r   r   r)   r*   r+   r   r   r   ospathisdir)r   r   r,   r   s       r   test_workspace_fallbackr=   n   s    ~u56 H$J$$00B@001CS]SH77=="h#h-&???&?"r   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                         sJ d       t        j                  |j!                               }
d|
d   v sJ |dk\  sJ y)u<   같은 verifier 3회 FAIL 시 escalate 파일 생성 확인.logsretry-countersTr2   eventsztask-sim-escalatez#qc_verify._get_failed_check_historyc                     t        |       S N)_build_fake_history)tidcounter_dirs    r   <lambda>z5test_same_verifier_3_times_escalate.<locals>.<lambda>   s    'S9 r   zqc_verify._record_failed_checksc                     t        | |      S rC   )_write_fake_history)rE   namesrF   s     r   rG   z5test_same_verifier_3_times_escalate.<locals>.<lambda>   s    .{CG r   WORKSPACE_ROOTr      	.escalate   u"   동일 verifier 3회 연속 FAIL: z, )task_idreasonsame_fail_countu;   3회 연속 FAIL 시 escalate 파일이 생성되어야 함u    동일 verifier 3회 연속 FAILrP   N)r   setattrr   r   rI   	qc_verify_get_failed_check_history_record_failed_checksr*   r+   sortedcountjoinr)   existsloads	read_text)r   r   
events_dirrO   failed_nameshistorycurrent_key
same_countescalate_pathescalate_datadatarF   s              @r   #test_same_verifier_3_times_escalaterd      s    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?????r   	run_indexrL      c                 n   | 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                         rJ d| d       y|j                         sJ d| d       yc c}
w c c}w )uF   5회 시뮬레이션: 3회째에 escalate, 4~5회는 이미 escalated.r?   r@   Tr2   rA   rK   z
task-5sim-02dr   
file_check.fail_history.jsonlNr]   rL   rN   rM   )rO   rQ   z
run_index=u*   : 3회 미만에선 escalate 없어야 함u*   : 3회 이상에선 escalate 있어야 함)r   r   r   rangerI   r[   strip
splitlinesr*   rZ   r+   rV   getrW   r)   rY   )r   r   re   rF   r\   rO   r]   _history_filelineslhistory_entriesehistory_keysr_   r`   should_escalatera   rb   s                      r   "test_5_simulations_escalate_at_3rdrx      s    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} '')mZ	{Bl+mm))##%iI;>h'ii% :[s   -F-5F2c                     | dz  }|j                          |dz  j                          |j                  dt        |             t        j                  dt        |             }|t        |      k(  sJ y)uK   PROJECT_PATH 설정 시 git_evidence.verify가 그 경로에서 git 실행.git_projectr
   r   ztask-git-testN)r   r   r   r   r   r   s       r   'test_git_evidence_uses_env_project_pathr{      si    m+LF!!#~s<'89 00#h-PHs<((((r   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   )datetimerj   z%Y-%m-%dT%H:%M:%S)	timestampr]   a
N)r}   nowstrftimerV   openwriter*   r+   )rF   rO   r]   r}   rq   entryfs          r   rI   rI      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 로드.rj   Nr]   )	r   rm   r*   rZ   r+   rV   ro   FileNotFoundErrorJSONDecodeError)rF   rO   rq   r   lineentriesru   s          r   rD   rD      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__r*   r:   syspytest	WORKSPACEr;   rX   	TEAMS_DIRinsertr   rS   r   r"   r/   r8   r=   rd   markparametrizerl   rx   r{   rI   rD    r   r   <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
)	*r   