
    nai-                        d Z ddl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j                  j                  dd       ej                  j                  dd       ddlmZmZmZ ddlZej$                  j'                  dd      Zej$                  j+                  e      Zej.                  j1                  e       ej2                  Zd	 Zd
 ZdeddfdZd Zd Zd Zd Z y)u}  
task-2384 Phase β 신호등 통합 — 회귀 테스트 스위트
테스터: 모리건(Morrigan), dev3 QA

6개 테스트:
  1. test_resolver_label_to_verdict_mapping     — VERDICT_MAP + classify_status
  2. test_sweep_stale_completed_batches         — _sweep_stale_completed 배치 스윕
  3. test_checklist_auto_check_lv3_task         — Lv.3 체크리스트 자동 [x]
  4. test_checklist_no_op_for_lv0_to_lv2        — Lv.0~2는 체크리스트 no-op
  5. test_resolver_failure_falls_back_to_status — resolve_task_verdict 폴백
  6. test_concurrent_sweep_lock_safety          — _sync_task_timers 동시성 flock 안전
    N)Pathz/home/jay/workspace/scriptsz/home/jay/workspace)_sweep_stale_completed_sync_task_timers_update_plan_checklistwhisper_compile_modz./home/jay/workspace/scripts/whisper-compile.pyc            	         dddddd} | j                         D ]<  \  }}t        j                  |   |k(  rJ d|d|dt        j                  |           t        j                  d	d
dd      dk(  sJ t        j                  d	ddd      dk(  sJ t        j                  dddd      dk(  sJ t        j                  dddd      dk(  sJ y)uS   VERDICT_MAP 5개 라벨-버딕트 매핑 + classify_status 대표 입력값 검증.	completedin_progressstalledunknown)MERGEDALIVEIDLESTALEUNKNOWNzVERDICT_MAP[z] expected z, got T   N)ps_alivelast_commit_age_minpr_merged_at	pr_numberr   
   *   r   F<   r   z
2026-05-03r   )itemsbsrVERDICT_MAPclassify_status)expected_maplabelverdicts      Y/home/jay/workspace/.worktrees/task-2516-dev3/tests/dev3/test_phase_beta_traffic_light.py&test_resolver_label_to_verdict_mappingr"   3   s$   
 L ',,. 
wu%0 	
5);wkPU@V?YZ	
0
 144	  
 2DB	  
 BTT	  
 B\UW	      c                    | dz  }|j                  d       ddddddddddd	i}|d
z  }|j                  t        j                  |dd      d       | dz  j                          fd} |d        |ddd        |ddd       dz  }|j                  d        |dd        |ddd        |dd      }|j                  j                         }|sJ d        t        | |d!t              "      }|d#gk(  s
J d$|        t        j                  |j                  d            }	|	d   }
|
d#   d%   dk(  sJ d&       |
d!   d%   dk(  sJ d'       y())uQ   머지 커밋 메시지에 묶인 task들을 completed로 스윕하는지 검증.memoryTparentstasksrunningdev3statusteam_idr	   )	task-1001	task-1002z	task-1003task-timers.jsonFr   ensure_asciiindentutf-8encodingfakeprojectc                  P    t        j                  dg| ft              ddd|S )NgitT)cwdcapture_outputtext)
subprocessrunstr)argskwargsr7   s     r!   r9   z/test_sweep_stale_completed_batches.<locals>.gitq   s:    ~~NTN
K 	

 
 	
r#   initconfigz
user.emailztest@test.comz	user.nameTesterz	dummy.txthelloaddcommitz-mz3chore: bundle task-1001 task-1002 task-1003 [merge]z	rev-parseHEADu   git rev-parse HEAD 실패r.   )	workspacemerge_commit_shaprimary_task_idproject_pathr/   u   swept 목록 오류: r,   u-   task-1002가 completed로 갱신되지 않음u)   primary task-1001은 변경되면 안 됨N)
mkdir
write_textjsondumpsstdoutstripr   r?   loads	read_text)tmp_path
memory_dirtimerstimers_pathr9   dummy
sha_resultshasweptupdatedr(   r7   s              @r!   "test_sweep_stale_completed_batchesr^   ]   s    H$JT"$-&A$-&A$/FC
F 11K4::f5KV]^ ]*K
 K,0+x(+%E	W{$MN[&)J



!
!
#C+++3 ##%	E [M!B%:5'#BB! jj...@AGGEh';6g8gg6h'94a6aa4r#   rU   returnc                     | dz  dz  }|j                  dd       |dz  j                  dd       | dz  d	z  d
z  }|j                  dd       |dz  j                  dd       y)uH   Test 3/4 공통 픽스처 구성. exist_ok=True로 반복 호출 안전.r%   r(   T)r'   exist_okztask-2000.mdu3   ---
project: dev-system
level: 3
---

본문 내용r4   r5   plans
dev-systemchecklist.mdzY# Plan checklist
- [ ] task-2000: implement traffic light fix
- [ ] task-2001: unrelated
N)rM   rN   )rU   	tasks_dir	plans_dirs      r!   _setup_checklist_workspacerg      s     8#g-IOOD4O0++B ,  8#g-<IOOD4O0++	' 	 , r#   c                 P   t        |        t        | dd      }|du sJ d       | dz  dz  dz  d	z  j                  d
      }|j                         }t	        d |D        d      }t	        d |D        d      }|J d       d|v s
J d|       |J d       d|v s
J d|       y)uA   Lv.3 task 머지 시 checklist.md의 해당 줄을 [x]로 체크.	task-2000   levelTz2_update_plan_checklist(level=3) should return Truer%   rb   rc   rd   r4   r5   c              3   *   K   | ]  }d |v s|  ywri   N .0ls     r!   	<genexpr>z5test_checklist_auto_check_lv3_task.<locals>.<genexpr>        @{a/?1@   	Nc              3   *   K   | ]  }d |v s|  yw)z	task-2001Nro   rp   s     r!   rs   z5test_checklist_auto_check_lv3_task.<locals>.<genexpr>   rt   ru   u*   task-2000 줄이 체크리스트에 없음z- [x]u-   task-2000 줄이 [x]로 변경되지 않음: u*   task-2001 줄이 체크리스트에 없음- [ ]u1   task-2001 줄이 변경됨 (no-op이어야 함): )rg   r   rT   
splitlinesnext)rU   result	checklistlinestask_2000_linetask_2001_lines         r!   "test_checklist_auto_check_lv3_taskr      s    x(#HkCFT>OOO>H$w.=NYYcjYkI  "E@e@$GN@e@$GN%S'SS%n$h(UVdUg&hh$%S'SS%n$l(YZhYk&ll$r#   c                    dD ]  }t        |        t        | d|      }|du sJ d| d       | dz  dz  d	z  d
z  j                  d      }t        d |j	                         D        d      }|J d| d       d|v r|J d| d|        y)u=   Lv.0, 1, 2 task는 체크리스트를 수정하지 않는다.)r      r   ri   rk   Fz_update_plan_checklist(level=z) should return Falser%   rb   rc   rd   r4   r5   c              3   *   K   | ]  }d |v s|  ywrn   ro   rp   s     r!   rs   z6test_checklist_no_op_for_lv0_to_lv2.<locals>.<genexpr>   s     C1+2BQCru   Nu   task-2000 줄 없음 (level=)rw   zlevel=u8   에서 task-2000 줄이 변경됨 (no-op이어야 함): )rg   r   rT   ry   rx   )rU   rl   rz   r{   r}   s        r!   #test_checklist_no_op_for_lv0_to_lv2r      s     
"8,'+UK\"?wF[ \\(72\ANR]] ^ 
	 C	,,.CT
 )R-I%PQ+RR).( 	
UGSTbSef	
(
r#   c                     | j                  t        dd       t        ddi       dk(  sJ t        ddi       dk(  sJ t        dd	i       d
k(  sJ d }| j                  t        d|       t        ddi       dk(  sJ y)u_   _resolve_bot_status가 None이거나 예외를 던질 때 fallback_status에서 verdict 도출._resolve_bot_statusNztask-XYZr)   r
   z	task-XYZ2r	   z	task-XYZ3 r   c                      ~ ~t        d      )Nboom)RuntimeError)r@   rA   s     r!   _exploding_resolverzGtest_resolver_failure_falls_back_to_status.<locals>._exploding_resolver   s    &6""r#   z	task-BOOM)setattrr   resolve_task_verdict)monkeypatchr   s     r!   *test_resolver_failure_falls_back_to_statusr      s     +-BDI
Ir:mKKK["=LLLR4	AAA# +-BDWX  Y;}LLLr#   c                 2     dz  }|j                  d       ddddddddi}|d	z  }|j                  t        j                  |d
d      d       t	        j
                  d      g dt        dt        f fd}t	        j                  |d      }t	        j                  |d      }|j                          |j                          |j                  d       |j                  d       r
J d        |j                  d      }	 t        j                  |      }j                  di       }
|
d   d   dk(  sJ d       |
d   d   dk(  sJ d        y# t        j                  $ r%}	t        j                  d|	 d|        Y d}	~	jd}	~	ww xY w)!uh   두 스레드가 동시에 _sync_task_timers를 호출해도 task-timers.json이 손상되지 않는다.r%   Tr&   r(   r)   r*   r+   )	task-3001	task-3002r0   Fr   r1   r4   r5   task_idr[   c                     	 j                          t        | |d       y # t        $ r}j                  |       Y d }~y d }~ww xY w)Ntest)waitr   	Exceptionappend)r   r[   excbarriererrorsrU   s      r!   workerz1test_concurrent_sweep_lock_safety.<locals>.worker  s>    	LLNhf= 	MM#	s   " 	AAA)r   sha1)targetr@   )r   sha2r   )timeoutu   스레드 예외 발생: u.   task-timers.json이 유효하지 않은 JSON: u	   
내용:
Nr   r,   r	   u    task-3001이 completed가 아님r   u    task-3002이 completed가 아님)rM   rN   rO   rP   	threadingBarrierr?   ThreadstartjoinrT   rS   JSONDecodeErrorpytestfailget)rU   rV   rW   rX   r   t1t2rawdatar   r(   r   r   s   `          @@r!   !test_concurrent_sweep_lock_safetyr      s    H$JT" 	$-&A$-&A
F 11K4::f5KV]^"G F #  
		.C	DB			.C	DBHHJHHJGGBGGGBG;26(;;: 



1C\zz# HHWb!Eh';6Z8ZZ6h';6Z8ZZ6  \DSEUXTYZ[[\s   E F1FF)!__doc__importlib.util	importlibrO   r=   sysr   pathlibr   r   pathinsert
auto_merger   r   r   bot_status_resolverr   utilspec_from_file_location_wc_specmodule_from_specr   loaderexec_moduler   r"   r^   rg   r   r   r   r   ro   r#   r!   <module>r      s       
   
 0 1 ( ) 
 " >>114  nn55h?    / 0*?? #T:bB $ *m0
2M2+[r#   