
    ib                    H   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mZ  ee      j                         j                   d   Z ee      ej&                  vr"ej&                  j)                  d ee             ddlmZ ddlmZmZ  G d d	      Z G d
 d      Zy)u   tests/regression/test_g3_fail_classification.py — T9: g3_fail 분류 + enum 4종.

헤임달 (개발2팀 테스트 엔지니어) 작성.
    )annotationsN)Path   )classify_g3_fail)RECONCILE_CLASSIFICATIONSSUPPORTED_CLASSIFICATIONSc                  4    e Zd ZddZddZddZddZddZy)TestClassifyG3Failc                   |dz  }|j                  t        j                  ddgi      d       d}t        j                  t        |      ||f       |dz  }|j                  dd       t        j                  t        |      |d	z   |d	z   f       t        ||      }d
}||k(  }|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)uU   report mtime > g3-fail mtime + fail_reasons에 'report not found'만 → false_alert.task-x.g3-failfail_reasonsreport not foundutf-8encoding   @TA	task-x.md# task-x report
<   #false_alert_resolved_by_late_report==z%(py0)s == %(py3)sresultpy0py3assert %(py5)spy5N
write_textjsondumpsosutimestrr   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation
selftmp_pathg3_fail_path	base_timereport_pathr   @py_assert2@py_assert1@py_format4@py_format6s
             _/home/jay/workspace/.worktrees/task-2472+1-dev2/tests/regression/test_g3_fail_classification.py(test_false_alert_resolved_by_late_reportz;TestClassifyG3Fail.test_false_alert_resolved_by_late_report   s    "22JJ);(<=> 	  	

 !	
\"Y	$:;,2WE
[!ININ#CD!,<>>v>>>>>v>>>>>>>v>>>v>>>>>>>>>>>    c                   |dz  }|j                  t        j                  ddgi      d       |dz  }t        ||      }d}||k(  }|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)u$   report 파일 없음 → unresolved.r   r   r   r   r   r   
unresolvedr   r   r   r   r   r   N)r!   r"   r#   r   r'   r(   r)   r*   r+   r,   r-   r.   	r0   r1   r2   r4   r   r5   r6   r7   r8   s	            r9   #test_unresolved_when_report_missingz6TestClassifyG3Fail.test_unresolved_when_report_missing1   s    "22JJ);(<=> 	  	

 ,!,<%%v%%%%v%%%%%%v%%%v%%%%%%%%%%r;   c                   |dz  }|j                  t        j                  ddgi      d       d}|dz  }|j                  dd       t        j                  t        |      ||f       t        j                  t        |      |d	z   |d	z   f       t        ||      }d
}||k(  }|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)u,   report mtime < g3-fail mtime → unresolved.r   r   r   r   r   r   r   r   x   r=   r   r   r   r   r   r   Nr    r/   s
             r9   -test_unresolved_when_report_older_than_g3failz@TestClassifyG3Fail.test_unresolved_when_report_older_than_g3fail>   s    "22JJ);(<=> 	  	
 !	,2WE
[!Iy#9:
\"Y_i#o$FG!,<%%v%%%%v%%%%%%v%%%v%%%%%%%%%%r;   c                   |dz  }|j                  t        j                  ddgi      d       d}t        j                  t        |      ||f       |dz  }|j                  dd       t        j                  t        |      |d	z   |d	z   f       t        ||      }d
}||k(  }|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)uD   fail_reasons에 'report not found' 외 다른 이유 → unresolved.r   r   ztest failure: exit code 1r   r   r   r   r   r   r=   r   r   r   r   r   r   Nr    r/   s
             r9   'test_unresolved_when_other_fail_reasonsz:TestClassifyG3Fail.test_unresolved_when_other_fail_reasonsP   s    "22JJ)D(EFG 	  	
 !	
\"Y	$:;,2WE
[!ININ#CD!,<%%v%%%%v%%%%%%v%%%v%%%%%%%%%%r;   c                   |dz  }|dz  }|j                  dd       t        ||      }d}||k(  }|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)u4   .g3-fail 파일 없음 → unresolved (fail-closed).znonexistent.g3-failr   r   r   r   r=   r   r   r   r   r   r   N)
r!   r   r'   r(   r)   r*   r+   r,   r-   r.   r>   s	            r9   #test_unresolved_when_g3fail_missingz6TestClassifyG3Fail.test_unresolved_when_g3fail_missinga   s    "77,2WE!,<%%v%%%%v%%%%%%v%%%v%%%%%%%%%%r;   N)r1   r   )__name__
__module____qualname__r:   r?   rB   rD   rF    r;   r9   r
   r
      s    ?&&&$&"&r;   r
   c                      e Zd Zd Zd Zd Zy)TestClassificationEnumsc                   h d}t         |k(  }|st        j                  d|fdt         |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dz  }dd|iz  }t        t        j                  |            d	}y	)
u0   4종 classification enum이 정확히 정의됨.>    state_orphaned_after_valid_merge!state_missing_after_taskctl_crash"state_corrupted_with_partial_merge#state_inconsistent_after_force_pushr   )z%(py0)s == %(py2)sr   expected)r   py2zassert %(py4)spy4N)	r   r'   r(   r)   r*   r+   r,   r-   r.   )r0   rR   r6   @py_format3@py_format5s        r9   test_4_classifications_definedz6TestClassificationEnums.test_4_classifications_definedq   sv    
 )H4444(H444444(444(444444H444H4444444r;   c                r   dh}t         |k(  }|st        j                  d|fdt         |f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}t         j                  } |t              }|sd	dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      d
t        j                         v st        j
                  t              rt        j                  t              nd
t        j                  |      dz  }t        t        j                  |            dx}}y)u3   1차 지원은 state_orphaned_after_valid_merge만.rN   r   r   r   r   r   r   NzJassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.issubset
}(%(py3)s)
}r   )r   rS   r   r   )r   r'   r(   r)   r*   r+   r,   r-   r.   issubsetr   )r0   r5   r6   r7   r8   @py_assert4s         r9   test_supported_subsetz-TestClassificationEnums.test_supported_subset{   s    -O,PP(,PPPPP(,PPPPPPP(PPP(PPP,PPPPPPPP(11L12KLLLLLLLL(LLL(LLL1LLLLLL2KLLL2KLLLLLLLLLLr;   c                <   ddl }|j                  t        j                  t	        t
        dz  dz        ddddd	d
dd
ddddgdddi t        j                  dt	        t
              i      }|j                  }d}||k7  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                   d|j                    d|j"                         dz   d|iz  }t%        t        j&                  |            dx}x}}|j                   |j"                  z   }g }d}	|	|v }|}
|sd}||v }|}
|
sqt        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  }|j)                  |       |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  }|j)                  |       t        j*                  |d(      i z  }t        j                  d)|       d*z   d+|iz  }t%        t        j&                  |            dx}
x}x}	x}x}}y),uK   subprocess로 cmd_reconcile 호출 — 미지원 classification → exit 1.r   Nscriptsz
taskctl.py	reconcilez	--task-idztask-2472+1-testz--classificationrP   z
--evidencezpr=99zmerge-commit=abc1234z--approved-by-chairmanz--evidence-pathz/tmp/dummy.jsonlT   WORKSPACE_ROOT)capture_outputtexttimeoutenv)!=)z2%(py2)s
{%(py2)s = %(py0)s.returncode
} != %(py5)sr   )r   rS   r   u   기대: exit 1, 실제: z	
stdout: z	
stderr: z
>assert %(py7)spy7u   enum 인식만 지원u   1차 실 동작)in)z%(py3)s in %(py5)scombined)r   r   z%(py7)s)z%(py10)s in %(py12)s)py10py12z%(py14)spy14   u*   예상 메시지 없음. combined output:
z
>assert %(py17)spy17)
subprocessrunsys
executabler&   _WT_ROOTr$   environ
returncoder'   r(   r)   r*   r+   r,   _format_assertmsgstdoutstderrr-   r.   append_format_boolop)r0   rn   r   r6   rZ   @py_assert3r8   @py_format8rh   r5   @py_assert0@py_assert9@py_assert11@py_format13@py_format15@py_format16@py_format18s                    r9   /test_unsupported_classification_via_cli_rejectszGTestClassificationEnums.test_unsupported_classification_via_cli_rejects   s   Hy(<78/"$Hg4(!#5
  ?2::?/X?   
"    	
A 	
 A% 	
 	
 A 	
 	
 
6	
 	
   	
 	
 
	  	
 	
 
	 ! 	
 	
 
	 %& 	
 	
  'v'8'8&9 :}}oZ@	
 	
 	
 	
 	
 ==6==0	
& 	
&(2 	
6G 	
6G86S 	
 	
 	
&( 	
 	
 		 ' 	
 	
	6	
 	
  +3 	
 	
 		 +3 	
 	
 	
	6	
		
 	
6G8 	
 	
 		 7H 	
 	
	6	
 	
  LT 	
 	
 		 LT 	
 	
 	
	6	
		
 	
 	
  :(D	
 	
 	
 	
 	
 	
r;   N)rG   rH   rI   rW   r[   r   rJ   r;   r9   rL   rL   p   s    5M

r;   rL   )__doc__
__future__r   builtinsr)   _pytest.assertion.rewrite	assertionrewriter'   r"   r$   rp   pathlibr   __file__resolveparentsrr   r&   pathinsertutils.g3_fail_classifierr   utils.state_repairr   r   r
   rL   rJ   r;   r9   <module>r      s    #    	 
  >!!#++A.x= HHOOAs8}% 5K& K&f,
 ,
r;   