
    Aie                     4   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dlZddlmZ ddlmZ ddlZ ee      j"                  Z ee      e
j(                  vr"e
j(                  j+                  d ee             ddlmZmZmZmZ ddlmZmZmZmZm Z   eedz        Z! G d d	      Z" G d
 d      Z# G d d      Z$ G d d      Z% G d d      Z& G d d      Z' G d d      Z( G d d      Z) G d d      Z* G d d      Z+ G d d      Z, G d d      Z-y) u  
test_qc_verify.py - qc_verify.py 단위 테스트 (아르고스 작성)

테스트 항목:
1. data_integrity - 정상 케이스 (task-31.1: completed + .done.clear 파일)
2. data_integrity - 비정상 케이스 (task-4.4: completed but no .done file)
3. file_check - 존재하는 파일 → PASS
4. file_check - 없는 파일 → FAIL
5. api_health - --skip api_health 시 SKIP
6. test_runner - --skip test_runner 시 FAIL (MANDATORY)
7. CLI 출력 JSON 형식 검증
8. overall 판정 로직: FAIL 항목 있으면 overall=FAIL
9. critical_gap verifier 테스트
10. MANDATORY blocklist 테스트
11. Skip 로그 추적 테스트
12. .done 파일에 skip 정보 기록 테스트
    N)datetime)Path)_determine_overall
_summarizebuild_result	run_check)
api_healthcritical_gapdata_integrity
file_checktest_runnerzqc_verify.pyc                   "    e Zd ZdZd Zd Zd Zy)TestDataIntegrityNormaluQ   task-31.1: completed 상태이고 .done.clear 파일이 실제로 존재 → PASSc                 `   t        j                  d      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|       dz   d	|iz  }t        t        j                  |            d x}x}}y )
N	task-31.1statusPASS==z%(py1)s == %(py4)spy1py4uB   task-31.1은 completed + .done.clear 존재 → PASS 기대, got: 
>assert %(py6)spy6r   verify
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanationselfresult@py_assert0@py_assert3@py_assert2@py_format5@py_format7s          3/home/jay/workspace/teams/dev1/qc/test_qc_verify.py"test_completed_with_done_file_passz:TestDataIntegrityNormal.test_completed_with_done_file_pass0   sy    &&{3hx6x6)xxx6xxxxxx6xxx-opvow+xxxxxxxx    c                    t        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	   }t        |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 )Nr   r   inz%(py1)s in %(py3)sr&   r   py3assert %(py5)spy5details5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}
isinstancelistpy0py2r4   r6   )r   r   r   r   r    @py_builtinslocals_should_repr_global_namer"   r#   r9   r:   r%   r&   r'   r)   @py_format4@py_format6@py_assert1@py_assert4s           r,   test_result_has_required_keysz5TestDataIntegrityNormal.test_result_has_required_keys4   sD   &&{3!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!"yF""""yF"""y""""""F"""F""""""" +2z+T22222222z222z222+222222T222T2222222222r.   c                    t        j                  d      }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}}g }d
}||v }|}|sd}	|	|v }
|
}|sXt        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  }dd|iz  }t        t        j                  |            d x}x}x}x}x}	}
y )Nr   
r7   r0   r2   details_strr3   r5   r6   	completedzstatus=z%(py3)s in %(py5)sr4   r6   %(py7)spy7z%(py10)s in %(py12)spy10py12%(py14)spy14   assert %(py17)spy17)r   r   joinr   r   r    r>   r?   r@   r"   r#   append_format_boolop)r%   r&   rI   r'   r)   rB   rC   rD   rE   @py_assert9@py_assert11@py_format8@py_format13@py_format15@py_format16@py_format18s                   r,    test_details_contain_status_infoz8TestDataIntegrityNormal.test_details_contain_status_info:   sC   &&{3iiy 12){k)))){k))){))))))k)))k)))))))E{E{k)EYEY+-EEEEE{kEEE{EEEEEEkEEEkEEEEEEEY+EEEYEEEEEE+EEE+EEEEEEEEEEEEEEr.   N)__name__
__module____qualname____doc__r-   rF   rb    r.   r,   r   r   -   s    [y3Fr.   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestDataIntegrityAbnormalu=   task-4.4: completed 상태지만 .done 파일 없음 → FAILc                 `   t        j                  d      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|       dz   d	|iz  }t        t        j                  |            d x}x}}y )
Ntask-4.4r   FAILr   r   r   uI   task-4.4는 completed이지만 .done 파일 없음 → FAIL 기대, got: r   r   r   r$   s          r,   %test_completed_without_done_file_failz?TestDataIntegrityAbnormal.test_completed_without_done_file_failI   sy    &&z2h66)66-vw}v~+r.   c                 L   t        j                  d      }dj                  |d         }g }d}||v }|}|sd}||v }|}|sXt        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  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}y )Nrk   rH   r7   rl   z	NOT FOUNDr0   rK   rI   rL   rM   rN   rO   rP   rS   rT   rU   rV   rW   )r   r   rX   r   r   r    r>   r?   r@   rY   rZ   r"   r#   )r%   r&   rI   rD   r)   rE   r'   r[   r\   rC   r]   r^   r_   r`   ra   s                  r,   &test_fail_details_mention_no_done_filez@TestDataIntegrityAbnormal.test_fail_details_mention_no_done_fileM   s    &&z2iiy 12BvBv$BB{(BBBBBvBBBvBBBBBBBBBBBBBBBB{BBBBBBBBB{BBB{BBBBBBBBBBBBBBr.   c                 .   t        j                  d      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u$   존재하지 않는 task_id → FAILztask-99999.9r   rl   r   r   r   assert %(py6)sr   Nr   r   r   r   r    r"   r#   r$   s          r,   test_nonexistent_task_failz4TestDataIntegrityAbnormal.test_nonexistent_task_failS   sd    &&~6h)6)6))))6))))))6)))))))r.   c                 .   t        j                  d      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u   빈 task_id → SKIP r   SKIPr   r   r   rq   r   Nrr   r$   s          r,   test_empty_task_id_skipz1TestDataIntegrityAbnormal.test_empty_task_id_skipX   sd    &&r*h)6)6))))6))))))6)))))))r.   N)rc   rd   re   rf   rm   ro   rs   rw   rg   r.   r,   ri   ri   F   s    G@C*
*r.   ri   c                   "    e Zd ZdZd Zd Zd Zy)TestFileCheckExistingFileu*   실제 존재하는 파일 경로 → PASSc                 |   t        j                  dt        g      }|d   }d}||k(  }|st        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }t        j                  dt         d	|       d
z   d|iz  }t        t        j                  |            d x}x}}y )Nru   task_id
file_pathsr   r   r   r   r   u   존재하는 파일 u    → PASS 기대, got: r   r   )	r   r   _QC_VERIFY_PATHr   r   r    r!   r"   r#   r$   s          r,   test_existing_file_passz1TestFileCheckExistingFile.test_existing_file_passf   s    ""2?:KLhr6r6)rrr6rrrrrr6rrr-A/ARRijpiq+rrrrrrrrr.   c                    t        j                  dt        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}}y )Nru   r{   rH   r7   OKr0   r2   rI   r3   r5   r6   )r   r   r~   rX   r   r   r    r>   r?   r@   r"   r#   r%   r&   rI   r'   r)   rB   rC   s          r,   "test_existing_file_details_show_okz<TestFileCheckExistingFile.test_existing_file_details_show_okj   s    ""2?:KLiiy 12"t{""""t{"""t""""""{"""{"""""""r.   c                 2   t        j                  dg       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}y
)u*   파일도 없고 task_id도 없으면 SKIPru   r{   r   rv   r   r   r   rq   r   N)r   r   r   r   r    r"   r#   r$   s          r,   test_no_files_no_task_skipz4TestFileCheckExistingFile.test_no_files_no_task_skipo   sf    ""2"=h)6)6))))6))))))6)))))))r.   N)rc   rd   re   rf   r   r   r   rg   r.   r,   ry   ry   c   s    4s#
*r.   ry   c                       e Zd ZdZd Zd Zy)TestFileCheckMissingFileu*   존재하지 않는 파일 경로 → FAILc                 f   t        j                  ddg      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d	|       d
z   d|iz  }t        t        j                  |            d x}x}}y )Nru   #/tmp/nonexistent_argos_test_file.pyr{   r   rl   r   r   r   u+   없는 파일 경로 → FAIL 기대, got: r   r   )r   r   r   r   r    r!   r"   r#   r$   s          r,   test_missing_file_failz/TestFileCheckMissingFile.test_missing_file_fail}   s    ""2;`:abha6a6)aaa6aaaaaa6aaa-XY_X`+aaaaaaaar.   c                    t        j                  dd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}}y )Nru   r   r{   rH   r7   MISSINGr0   r2   rI   r3   r5   r6   )r   r   rX   r   r   r    r>   r?   r@   r"   r#   r   s          r,   &test_missing_file_details_show_missingz?TestFileCheckMissingFile.test_missing_file_details_show_missing   s    ""2;`:abiiy 12'yK''''yK'''y''''''K'''K'''''''r.   N)rc   rd   re   rf   r   r   rg   r.   r,   r   r   z   s    4b(r.   r   c                   "    e Zd ZdZd Zd Zd Zy)TestApiHealthSkipu+   --skip api_health 플래그 시 SKIP 반환c           	      *   t        ddgddg dg       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t	        t        j
                  |            d x}x}}y )Nr	   rk   ru   name	skip_listr|   api_baseapi_endpointstest_dirr}   r   rv   r   r   r   rq   r   r   r   r   r    r"   r#   r$   s          r,   "test_api_health_skip_via_run_checkz4TestApiHealthSkip.test_api_health_skip_via_run_check   sw    #n
 h)6)6))))6))))))6)))))))r.   c                 2   t        j                  ddg      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}y
)u.   base_url 없으면 SKIP (직접 verify 호출)ru   z/api/statusr   rv   r   r   r   rq   r   Nr	   r   r   r   r    r"   r#   r$   s          r,    test_api_health_no_base_url_skipz2TestApiHealthSkip.test_api_health_no_base_url_skip   sh    ""27h)6)6))))6))))))6)))))))r.   c                 0   t        j                  dg       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u   endpoints 없으면 SKIPzhttp://localhost:8000r   rv   r   r   r   rq   r   Nr   r$   s          r,   !test_api_health_no_endpoints_skipz3TestApiHealthSkip.test_api_health_no_endpoints_skip   sg    ""#:B?h)6)6))))6))))))6)))))))r.   N)rc   rd   re   rf   r   r   r   rg   r.   r,   r   r      s    5
**
*r.   r   c                       e Zd ZdZd Zd Zy)TestTestRunnerSkipuX   --skip test_runner 플래그 시 MANUAL_SKIP 반환 (MANDATORY 아님, 하지만 경고)c           	      *   t        ddgddg dg       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t	        t        j
                  |            d x}x}}y )Nr   rk   ru   r   r   MANUAL_SKIPr   r   r   rq   r   r   r$   s          r,   #test_test_runner_skip_via_run_checkz6TestTestRunnerSkip.test_test_runner_skip_via_run_check   sw    $o
 h0=0=0000=000000=0000000r.   c                 .   t        j                  d      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u.   test_dir 없으면 SKIP (직접 verify 호출)ru   r   rv   r   r   r   rq   r   N)r   r   r   r   r    r"   r#   r$   s          r,   test_test_runner_no_dir_skipz/TestTestRunnerSkip.test_test_runner_no_dir_skip   sd    ##B'h)6)6))))6))))))6)))))))r.   N)rc   rd   re   rf   r   r   rg   r.   r,   r   r      s    b1*r.   r   c                   "    e Zd ZdZd Zd Zd Zy)TestCLIJsonOutputu^   qc_verify.py --task-id task-4.4 --skip api_health,test_runner 실행 시 유효한 JSON 출력c           	         t        j                  dt        ddddgddd      }|j                  j	                         }|st        j                  d	|j                  d d
        dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            	 t        j                  |      }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 # t        j                   $ r)}t#        j$                  d| d|d d         Y d }~Xd }~ww xY w)Npython3	--task-idrk   --skipapi_health,test_runnerT   capture_outputtexttimeoutu   stdout 비어있음. stderr: i,  z
>assert %(py0)sr<   stdoutu   JSON 파싱 실패: z	
stdout:    5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r9   parseddictr<   r   r=   r   )
subprocessrunr~   r   stripr   r!   stderrr>   r?   r@   r    r"   r#   jsonloadsJSONDecodeErrorpytestfailr9   r   )r%   procr   @py_format1r   er(   r*   s           r,   test_cli_outputs_valid_jsonz-TestCLIJsonOutput.test_cli_outputs_valid_json   sn   ~~(  
 ""$JJ6t{{4C7H6IJJJJJJJvJJJvJJJJJ	LZZ'F &$''''''''z'''z''''''&'''&''''''$'''$'''''''''' ## 	LKK.qcF4CL>JKK	Ls   H H>H99H>c                    t        j                  dt        ddddgddd      }t        j                  |j
                  j                               }d	D ]  }||v }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                  d| d      dz   d|iz  }t        t        j                  |            d } y )Nr   r   rk   r   r   Tr   r   )r|   overallcheckssummaryverified_atr0   )z%(py0)s in %(py2)sfieldr   r<   r=   u   필드 'u   ' 누락
>assert %(py4)sr   )r   r   r~   r   r   r   r   r   r   r>   r?   r@   r    r!   r"   r#   )r%   r   r   r   rD   @py_format3r*   s          r,   !test_cli_json_has_required_fieldsz3TestCLIJsonOutput.test_cli_json_has_required_fields   s    ~~(  
 DKK--/0O 	?EF?>>>5F>>>>>>5>>>5>>>>>>F>>>F>>>>hugX$>>>>>>>	?r.   c                    t        j                  dt        ddddgddd      }t        j                  |j
                  j                               }|d	   }d}||k(  }|slt        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )Nr   r   rk   r   r   Tr   r   r|   r   r   r   rq   r   )r   r   r~   r   r   r   r   r   r   r    r"   r#   )r%   r   r   r'   r(   r)   r*   r+   s           r,   test_cli_task_id_matchesz*TestCLIJsonOutput.test_cli_task_id_matches   s    ~~(  
 DKK--/0i .J. J.... J... ...J.......r.   N)rc   rd   re   rf   r   r   r   rg   r.   r,   r   r      s    h(,?$/r.   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestOverallDeterminationu%   FAIL 항목이 있으면 overall=FAILc                    dg dddgddg ddg dd}g }t        ||      }d}||k(  }|s
t        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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )Nrv   r   r7   rl   zMISSING: /tmp/xr   r	   r   r   r   r   z9%(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
} == %(py8)sr   r   r<   r   r4   r6   py8assert %(py10)srQ   	r   r   r   r>   r?   r@   r    r"   r#   r%   r   r)   rE   @py_assert7@py_assert6@py_format9@py_format11s           r,    test_fail_in_checks_overall_failz9TestOverallDetermination.test_fail_in_checks_overall_fail  s    %+;%+9J8KL)/B?&,<	
 +-7!&"-77-7777-777777!777!7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                 ~   dg ddg ddg ddg dd}g }t        ||      }d}||k(  }|s
t        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                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            d x}x}x}}y )Nrv   r   r   r   r   r   r   r   r   r   rQ   r   r   s           r,   test_all_pass_overall_passz3TestOverallDetermination.test_all_pass_overall_pass  s    %+;%+;)/B?&,<	
 +-7!&"-77-7777-777777!777!7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                 n   dg ddg dd}g }t        ||      }d}||k(  }|s
t        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                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            d x}x}x}}y )NWARNr   r   )r   r   r   r   r   r   r   r   rQ   r   r   s           r,   test_warn_only_overall_warnz4TestOverallDetermination.test_warn_only_overall_warn  s    )/B?%+;
 +-7!&"-77-7777-777777!777!7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                 4   ddgddg dd}t        d|      }|d   }d}||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t	        t        j
                  |            d x}x}}y )Nrl   xr   r   )r   r   	task-testr   r   r   r   rq   r   )r   r   r   r    r"   r#   )r%   r   r&   r'   r(   r)   r*   r+   s           r,   ,test_build_result_overall_fail_when_has_failzETestOverallDetermination.test_build_result_overall_fail_when_has_fail$  s{    %+>)/B?
 k62i *F* F**** F*** ***F*******r.   c                    t        j                  dt        ddddgddd      }t        j                  |j
                  j                               }|d	   d
k(  r|j                  }d}||k(  }|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z   d|iz  }t        t        j                   |            dx}x}}yy)u!   FAIL인 경우 CLI 종료코드 1r   r   rk   r   r   Tr   r   r   rl   rU   r   )z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sr   )r<   r=   r6   u!   FAIL 시 exit code 1 기대, got 
>assert %(py7)srN   N)r   r   r~   r   r   r   r   
returncoder   r   r>   r?   r@   r    r!   r"   r#   )r%   r   r   rD   rE   r(   rC   r]   s           r,   "test_cli_exit_code_nonzero_on_failz;TestOverallDetermination.test_cli_exit_code_nonzero_on_fail,  s    ~~(  
 DKK--/0)&??^a^?a'^^^?a^^^^^^4^^^4^^^?^^^a^^^+LT__L])^^^^^^^^ 'r.   N)	rc   rd   re   rf   r   r   r   r   r   rg   r.   r,   r   r     s    /888+_r.   r   c                   p    e Zd ZdZdedededefdZd Zd Zd	 Zd
 Z	d Z
d Zd Zd Zd Zd Zd Zd Zy)TestCriticalGapu8   critical_gap.verify() - CRITICAL 이슈 미수정 탐지tmp_dirr|   contentreturnc                     t         j                  j                  || d      }t        |dd      5 }|j	                  |       ddd       |S # 1 sw Y   |S xY w)uA   임시 디렉토리에 보고서 파일 생성 후 경로 반환.z.mdwzutf-8)encodingN)ospathrX   openwrite)r%   r   r|   r   r   fs         r,   _write_reportzTestCriticalGap._write_reportH  sP    ww||Gy_5$g. 	!GGG		s   AAc                 T   d}t        j                         5 }| j                  |d|      }t        j                  d|      }ddd       d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }t        j                  d
|       dz   d|iz  }	t        t        j                  |	            dx}x}}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}}y# 1 sw Y   ]xY w)u0   CRITICAL 이슈 있고 수정 미확인 → FAILuF   ## 이슈
- CRITICAL: DB 연결 실패
## 기타
아무 수정 없음
ztask-test-failreport_pathNr   rl   r   r   r   u)   CRITICAL 미수정 → FAIL 기대, got: r   r   rH   r7   
UNRESOLVEDr0   r2   rI   r3   r5   r6   tempfileTemporaryDirectoryr   r
   r   r   r   r    r!   r"   r#   rX   r>   r?   r@   r%   r   r   r   r&   r'   r(   r)   r*   r+   rI   rB   rC   s                r,   test_critical_unresolved_failz-TestCriticalGap.test_critical_unresolved_failO  s+   ^((* 	Mg%%g/?ID!(()9tLF	M h_6_6)___6______6___-VW]V^+________iiy 12*|{****|{***|******{***{*******	M 	M   +FF'c                 T   d}t        j                         5 }| j                  |d|      }t        j                  d|      }ddd       d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }t        j                  d
|       dz   d|iz  }	t        t        j                  |	            dx}x}}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}}y# 1 sw Y   ]xY w)u-   CRITICAL 이슈 있고 수정 확인 → PASSuf   ## 이슈
- CRITICAL: API 응답 오류
## 수정 결과
- 수정 완료: 오류 처리 로직 추가
ztask-test-passr   Nr   r   r   r   r   u-   CRITICAL 수정 확인 → PASS 기대, got: r   r   rH   r7   RESOLVEDr0   r2   rI   r3   r5   r6   r   r  s                r,   test_critical_resolved_passz+TestCriticalGap.test_critical_resolved_passY  s.    H((* 	Mg%%g/?ID!(()9tLF	M hc6c6)ccc6cccccc6ccc-Z[aZb+cccccccciiy 12(z[((((z[(((z(((((([((([(((((((	M 	Mr  c                    d}t        j                         5 }| j                  |d|      }t        j                  d|      }ddd       d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }t        j                  d
|       dz   d|iz  }	t        t        j                  |	            dx}x}}y# 1 sw Y   xY w)u   CRITICAL 이슈 없음 → PASSuW   ## 완료 보고서
정상적으로 구현 완료.
- 마이너 개선 사항만 있음
ztask-test-no-criticalr   Nr   r   r   r   r   u&   CRITICAL 없음 → PASS 기대, got: r   r   r   r  r   r
   r   r   r   r    r!   r"   r#   
r%   r   r   r   r&   r'   r(   r)   r*   r+   s
             r,   test_no_critical_passz%TestCriticalGap.test_no_critical_passc  s    n((* 	Tg%%g/FPD!(()@dSF	T h\6\6)\\\6\\\\\\6\\\-STZS[+\\\\\\\\	T 	Ts   +C$$C-c                    t        j                  d      }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d|       dz   d	|iz  }t        t        j                  |            d
x}x}}dj                  |d         }g }d}|j                  }	 |	       }
||
v }|}|sd}||v }|}|st        j                  d|fd||
f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      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  }dd|iz  }t        t        j                  |            d
x}x}x}x}x}	x}
x}}y
)u    보고서 파일 없음 → SKIPtask-nonexistent-99999r   rv   r   r   r   u$   파일 없음 → SKIP 기대, got: r   r   NrH   r7   z	not foundzReport not foundr0   )zD%(py3)s in %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.lower
}()
}rI   )r4   r6   rN   py9z%(py11)spy11)z%(py14)s in %(py16)s)rT   py16z%(py18)spy18rU   zassert %(py21)spy21)r
   r   r   r   r    r!   r"   r#   rX   lowerr>   r?   r@   rY   rZ   )r%   r&   r'   r(   r)   r*   r+   rI   rD   r   @py_assert8rE   @py_assert13@py_assert15@py_format10@py_format12@py_format17@py_format19@py_format20@py_format22s                       r,   test_report_not_found_skipz*TestCriticalGap.test_report_not_found_skipk  s   $$%=>hZ6Z6)ZZZ6ZZZZZZ6ZZZ-QRXQY+ZZZZZZZZiiy 12V{Vk//V/1V{11V5GV5G;5VVVVV{1VVV{VVVVVVkVVVkVVV/VVV1VVVVVVV5G;VVV5GVVVVVV;VVV;VVVVVVVVVVVVVVVr.   c                    t        j                         5 }| j                  |dd      }t        j                  d|      }ddd       d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }t        j                  d
|       dz   d|iz  }t        t        j                  |            dx}x}}y# 1 sw Y   xY w)u   빈 보고서 → PASSztask-test-emptyru   r   Nr   r   r   r   r   u$   빈 보고서 → PASS 기대, got: r   r   r	  )	r%   r   r   r&   r'   r(   r)   r*   r+   s	            r,   test_empty_report_passz&TestCriticalGap.test_empty_report_passr  s    ((* 	Ng%%g/@"ED!(():MF	N hZ6Z6)ZZZ6ZZZZZZ6ZZZ-QRXQY+ZZZZZZZZ	N 	Ns   +C""C+c                    d}t        j                         5 }| j                  |d|      }t        j                  d|      }ddd       d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            dx}x}}y# 1 sw Y   xY w)u%   '블로커' 키워드 탐지 → FAILuG   ## 이슈
- 블로커: 빌드 실패
## 마무리
별도 수정 없음
ztask-test-blockerr   Nr   rl   r   r   r   rq   r   
r   r  r   r
   r   r   r   r    r"   r#   r
  s
             r,   $test_critical_korean_keyword_blockerz4TestCriticalGap.test_critical_korean_keyword_blockery  s    _((* 	Pg%%g/BGLD!(()<$OF	P h)6)6))))6))))))6)))))))	P 	P   +CCc                    d}t        j                         5 }| j                  |d|      }t        j                  d|      }ddd       d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            dx}x}}y# 1 sw Y   xY w)u"   '심각' 키워드 탐지 → FAILu,   ## 문제
심각한 메모리 누수 발견
ztask-test-seriousr   Nr   rl   r   r   r   rq   r   r!  r
  s
             r,   $test_critical_korean_keyword_seriousz4TestCriticalGap.test_critical_korean_keyword_serious  s    B((* 	Pg%%g/BGLD!(()<$OF	P h)6)6))))6))))))6)))))))	P 	Pr#  c                    d}t        j                         5 }| j                  |d|      }t        j                  d|      }ddd       d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            dx}x}}y# 1 sw Y   xY w)u2   'fixed' 영어 키워드로 수정 확인 → PASSzY## Issues
- CRITICAL: race condition detected
## Resolution
- fixed by adding mutex lock
ztask-test-fixedr   Nr   r   r   r   r   rq   r   r!  r
  s
             r,   )test_critical_resolved_by_english_keywordz9TestCriticalGap.test_critical_resolved_by_english_keyword  s     u 	 ((* 	Ng%%g/@'JD!(():MF	N h)6)6))))6))))))6)))))))	N 	Nr#  c                    t        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
   }t        |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	)u)   결과 dict에 status, details 키 존재r  r   r0   r2   r&   r3   r5   r6   Nr7   r8   r9   r:   r;   )r
   r   r   r   r    r>   r?   r@   r"   r#   r9   r:   rA   s           r,   rF   z-TestCriticalGap.test_result_has_required_keys  sE   $$%=>!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!"yF""""yF"""y""""""F"""F""""""" +2z+T22222222z222z222+222222T222T2222222222r.   c           	      (   t        dg ddg dg       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t	        t        j
                  |            dx}x}}y)u6   run_check()에서 critical_gap 케이스 정상 호출r
   r  ru   r   r   rv   r   r   r   rq   r   Nr   r$   s          r,   test_critical_gap_in_run_checkz.TestCriticalGap.test_critical_gap_in_run_check  su    ,
 h)6)6))))6))))))6)))))))r.   c           	      *   t        ddgddg dg       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t	        t        j
                  |            dx}x}}y)u-   --skip critical_gap 플래그 시 SKIP 반환r
   rk   ru   r   r   rv   r   r   r   rq   r   Nr   r$   s          r,   $test_critical_gap_skip_via_skip_listz4TestCriticalGap.test_critical_gap_skip_via_skip_list  sx    %&
 h)6)6))))6))))))6)))))))r.   c                 Z   ddl m} 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
)uA   ALL_CHECKS 목록에 'critical_gap'이 포함되어 있어야 함r   )
ALL_CHECKSr
   r0   r2   r.  r3   r5   r6   N)
	qc_verifyr.  r   r   r    r>   r?   r@   r"   r#   )r%   r.  r'   r)   rB   rC   s         r,   test_critical_gap_in_all_checksz/TestCriticalGap.test_critical_gap_in_all_checks  s^    (+~++++~+++~++++++++++++++++r.   N)rc   rd   re   rf   strr   r  r  r  r  r  r"  r%  r'  rF   r*  r,  r0  rg   r.   r,   r   r   E  se    BS 3   +)]W[***3**,r.   r   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestMandatoryBlocklistu.   MANDATORY 체크는 --skip으로 우회 불가c           	         t        ddgddg dg       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t	        t        j
                  |            dx}x}}d |d   D        }t        |      }|sd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)uV   test_runner는 더 이상 MANDATORY가 아님 → skip 시도 시 MANUAL_SKIP (경고)r   r   ru   r   r   r   r   r   r   rq   r   Nc              3   0   K   | ]  }d |v xs d|v   yw)r   u   경고Nrg   ).0ds     r,   	<genexpr>zPTestMandatoryBlocklist.test_mandatory_check_cannot_be_skipped.<locals>.<genexpr>  s!     R1=A%6Q6Rs   r7   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}any)r<   r=   r   )
r   r   r   r    r"   r#   r9  r>   r?   r@   )r%   r&   r'   r(   r)   r*   r+   rD   s           r,   &test_mandatory_check_cannot_be_skippedz=TestMandatoryBlocklist.test_mandatory_check_cannot_be_skipped  s    $o
 h0=0=0000=000000=0000000Ry@QRRsRRRRRRRRRsRRRsRRRRRRRRRRRRRRr.   c           	      *   t        ddgddg dg       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t	        t        j
                  |            dx}x}}y)u   data_integrity도 MANDATORYr   r   ru   r   r   rl   r   r   r   rq   r   Nr   r$   s          r,   test_data_integrity_mandatoryz4TestMandatoryBlocklist.test_data_integrity_mandatory  sx    !'(
 h)6)6))))6))))))6)))))))r.   c           	      *   t        ddgddg dg       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t	        t        j
                  |            dx}x}}y)u   file_check도 MANDATORYr   r   ru   r   r   rl   r   r   r   rq   r   Nr   r$   s          r,   test_file_check_mandatoryz0TestMandatoryBlocklist.test_file_check_mandatory  w    #n
 h)6)6))))6))))))6)))))))r.   c           	      *   t        ddgddg dg       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t	        t        j
                  |            dx}x}}y)u.   api_health는 MANDATORY 아님 → skip 가능r	   r   ru   r   r   rv   r   r   r   rq   r   Nr   r$   s          r,   "test_non_mandatory_still_skippablez9TestMandatoryBlocklist.test_non_mandatory_still_skippable  r?  r.   c           	      *   t        ddgddg dg       }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t	        t        j
                  |            dx}x}}y)u/   style_check는 MANDATORY 아님 → skip 가능style_checkr   ru   r   r   rv   r   r   r   rq   r   Nr   r$   s          r,    test_style_check_still_skippablez7TestMandatoryBlocklist.test_style_check_still_skippable  sw    $o
 h)6)6))))6))))))6)))))))r.   c                 x   ddl m} 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}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)uo   MANDATORY_CHECKS 상수가 존재하고 data_integrity, file_check, spec_compliance 포함 (test_runner 제외)r   )MANDATORY_CHECKSr   r9   rF  setr   Nr   r0   r2   r3   r5   r6   r   spec_compliancer   not in)z%(py1)s not in %(py3)s)r/  rF  r9   rG  r>   r?   r   r@   r    r"   r#   r   )r%   rF  r(   r*   r'   r)   rB   rC   s           r,   %test_mandatory_checks_constant_existsz<TestMandatoryBlocklist.test_mandatory_checks_constant_exists  s
   .*C00000000z000z000000*000*000000C000C00000000003#33333#3333333333#3333#33333333/|/////|////|////////////////// 4 $44444 $4444 444444$4444$444444444}$44444}$4444}444444$4444$44444444r.   N)
rc   rd   re   rf   r:  r<  r>  rA  rD  rK  rg   r.   r,   r3  r3    s$    8S****5r.   r3  c                   "    e Zd ZdZd Zd Zd Zy)TestSkipLogTrackingu%   --skip 사용 시 JSONL 로그 기록c           
      	   d}d}t         j                  j                  |      r&t        |      5 }t	        d |D              }ddd       t        j                  dt        dddd	d
dgddd      }t         j                  }|j                  } ||      }|s t        j                  d      dz   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  }t        t        j                  |            dx}x}}t        |      5 }|j!                         }	ddd       t#        	      }
|
|kD  }|s9t        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                  |
      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}
}t'        j(                  |	d         }|d   }d}||k(  }
|
slt        j$                  d|
fd ||f      t        j                  |      t        j                  |      d!z  }d"d#|iz  }t        t        j                  |            dx}x}
}d$}|d%   }||v }
|
slt        j$                  d&|
fd'||f      t        j                  |      t        j                  |      d!z  }d"d#|iz  }t        t        j                  |            dx}x}
}|d(   }d}||k(  }
|
slt        j$                  d|
fd ||f      t        j                  |      t        j                  |      d!z  }d"d#|iz  }t        t        j                  |            dx}x}
}y# 1 sw Y   hxY w# 1 sw Y   xY w))u'   skip 사용 시 로그 파일에 기록1/home/jay/workspace/memory/logs/qc-skip-log.jsonlr   c              3       K   | ]  }d   ywrU   Nrg   r6  _s     r,   r8  zBTestSkipLogTracking.test_skip_creates_log_entry.<locals>.<genexpr>        .1.   Nr   r   ztest-skip-logr   pyright_check,style_check--team	dev1-teamTr   r   u)   Skip 로그 파일이 생성되어야 함zd
>assert %(py7)s
{%(py7)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py5)s)
}r   log_path)r<   r=   r   r6   rN   )>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py5)slenlinesbefore_count)r<   r   r4   r6   u+   새 로그 엔트리가 추가되어야 함r   rN   r|   r   r   r   rq   r   pyright_checkskipped_checksr0   z%(py1)s in %(py4)steam)r   r   existsr   sumr   r   r~   r   r!   r>   r?   r@   r    r"   r#   	readlinesr[  r   r   r   )r%   rY  r]  r   r   rD   r(   r   r]   r\  r)   rE   rC   
last_entryr'   r*   r+   s                    r,   test_skip_creates_log_entryz/TestSkipLogTracking.test_skip_creates_log_entry  s   F77>>(#h 11".a.01 ~~+	  
  wwTw~~T~h'T'TT)TTTTTTTrTTTrTTTwTTT~TTTTTThTTThTTT'TTTTTT(^ 	"qKKME	"5zWzL(WWWzLWWWWWWsWWWsWWWWWW5WWW5WWWzWWWWWWLWWWLWWWW*WWWWWWWZZb	*
)$77$7777$777$7777777777>*-=">>">>>>>">>>>>>>">>>>>>>>&!0[0![0000![000!000[000000071 1(	" 	"s   R('R5(R25R?c           
         d}t        j                  dt        ddddddgd	d	d
      }t        |      5 }|j	                         }ddd       t        j                  d         }d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}d}|d   }||v}|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}y# 1 sw Y   !xY w)uT   MANDATORY skip 시도 시 blocked_mandatory 필드에 기록 (data_integrity 사용)rO  r   r   ztest-mandatory-logr   zdata_integrity,style_checkrW  rX  Tr   r   Nr^  r   blocked_mandatoryr0   ra  r   rq   r   r   rI  )z%(py1)s not in %(py4)s)r   r   r~   r   re  r   r   r   r   r    r"   r#   )r%   rY  r   r   r\  rf  r'   r(   r)   r*   r+   s              r,   (test_skip_log_contains_blocked_mandatoryz<TestSkipLogTracking.test_skip_log_contains_blocked_mandatory<  s#   F~~$,	  
  (^ 	"qKKME	"ZZb	*
B:.A#BB#BBBBB#BBBBBBB#BBBBBBBBCJ/B$CC}$CCCCC}$CCCC}CCC$CCCCCCCC	" 	"s   E##E-c           
      j   d}d}t         j                  j                  |      r&t        |      5 }t	        d |D              }ddd       t        j                  dt        dddd	d
dgddd      }t         j                  j                  |      rt        |      5 }t	        d |D              }ddd       |k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nd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}yy# 1 sw Y   \xY w# 1 sw Y   xY w)u$   skip 없으면 로그 추가 안 됨rO  r   c              3       K   | ]  }d   ywrQ  rg   rR  s     r,   r8  z:TestSkipLogTracking.test_no_skip_no_log.<locals>.<genexpr>^  rT  rU  Nr   r   ztest-no-skipr   ru   rW  rX  Tr   r   c              3       K   | ]  }d   ywrQ  rg   rR  s     r,   r8  z:TestSkipLogTracking.test_no_skip_no_log.<locals>.<genexpr>r  s     !rU  r   )z%(py0)s == %(py2)safter_countr]  r   u-   skip 없으면 로그가 추가되면 안 됨r   r   )r   r   rc  r   rd  r   r   r~   r   r   r>   r?   r@   r    r!   r"   r#   )	r%   rY  r]  r   r   rn  rD   r   r*   s	            r,   test_no_skip_no_logz'TestSkipLogTracking.test_no_skip_no_logX  s7   F77>>(#h 11".a.01 ~~	  
  77>>(#h 01!Q/0,.___;,______;___;______,___,____0_______ $'1 1(0 0s   FF)F&)F2N)rc   rd   re   rf   rg  rj  ro  rg   r.   r,   rM  rM    s    / 1DD8`r.   rM  c                       e Zd ZdZd Zd Zy)TestDoneFileSkipInfou,   .done 파일에 skipped_checks 정보 포함c                    dt        t        j                         j                                }d| d}	 t	        j
                  dt        d|dddd	d
g	ddd      }t        j                  j                  |      rt        |      5 }t        j                  |      }dd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}|d   }
||
v }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t)        t        j*                  |            dx}x}}
d}|d   }
||
v }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t)        t        j*                  |            dx}x}}
t        j                  j                  |      rt        j,                  |       yy# 1 sw Y   xY w# t        j                  j                  |      rt        j,                  |       w w xY w)u9   --gate 모드에서 .done에 skipped_checks 필드 포함ztest-done-skip-"/home/jay/workspace/memory/events/.doner   r   r   rV  --gaterW  rX  Tr   r   Nr`  r0   r2   	done_datar3   u%   .done에 skipped_checks 필드 필요z
>assert %(py5)sr6   r_  ra  r   rq   r   rC  )intr   now	timestampr   r   r~   r   r   rc  r   r   loadr   r   r    r>   r?   r@   r!   r"   r#   remove)r%   r|   	done_pathr   r   rv  r'   r)   rB   rC   r(   r*   r+   s                r,   &test_done_file_contains_skipped_checksz;TestDoneFileSkipInfo.test_done_file_contains_skipped_checks~  s   #C(@(@(B$C#DE8	G		%>>#/
  $D" ww~~i()_ - $		!I-']'94]]]'9]]]']]]]]]9]]]9]]]]6]]]]]]]&E)4D*EE*EEEEE*EEEEEEE*EEEEEEEE$C	2B(CC}(CCCCC}(CCCC}CCC(CCCCCCCCww~~i(		)$ )- - ww~~i(		)$ )s%   AJ! JGJ! JJ! !7Kc           	         dt        t        j                         j                                }d| d}	 t	        j
                  dt        d|dddgd	d	d
      }t        j                  j                  |      rt        |      5 }t        j                  |      }ddd       g }j                  }d} ||      }	g }
|	|
k(  }|}|sd}||v }|}|st        j                  d|fd|	|
f      dt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      t        j&                  |      t        j&                  |	      t        j&                  |
      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  }dd|iz  }t-        t        j.                  |            dx}x}x}x}x}	x}x}
x}}t        j                  j                  |      rt        j0                  |       yy# 1 sw Y   xY w# t        j                  j                  |      rt        j0                  |       w w xY w)u.   skip 없으면 skipped_checks는 빈 리스트ztest-done-noskip-rs  rt  r   r   ru  rW  rX  Tr   r   Nr`  r   )zJ%(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s.get
}(%(py6)s)
} == %(py11)srv  )r=   r   r   r   r  z%(py13)spy13r0   )z%(py16)s in %(py18)s)r  r  z%(py20)spy20rU   zassert %(py23)spy23)rw  r   rx  ry  r   r   r~   r   r   rc  r   r   rz  getr   r   r>   r?   r@   r    rY   rZ   r"   r#   r{  )r%   r|   r|  r   r   rv  rD   r(   @py_assert5r   @py_assert10r[   r'   r  @py_assert17r  @py_format14r  @py_format21r  @py_format24s                        r,   !test_done_file_no_skip_empty_listz6TestDoneFileSkipInfo.test_done_file_no_skip_empty_list  s   %c(,,.*B*B*D&E%FG8	G		%>>#  $D ww~~i()_ - $		!I-]y}}]%5]}%56]"]6"<]@P]@PT]@]]]]]6"]]]]]]y]]]y]]]}]]]%5]]]6]]]"]]]]]]]@PT]]]]@P]]]]]]T]]]]T]]]]]]]]]]]]]]]]ww~~i(		)$ )	- - ww~~i(		)$ )s%   AJ: J-GJ: -J72J: :7K1N)rc   rd   re   rf   r}  r  rg   r.   r,   rq  rq  {  s    6%B%r.   rq  ).rf   builtinsr>   _pytest.assertion.rewrite	assertionrewriter   r   r   r   sysr   r   pathlibr   r   __file__parent_QC_DIRr1  r   insertr/  r   r   r   r   	verifiersr	   r
   r   r   r   r~   r   ri   ry   r   r   r   r   r   r   r3  rM  rq  rg   r.   r,   <module>r     s  $   	  
     x.

w<sxxHHOOAs7|$ M M W Wg./F F2* *:* *.
( 
($* *>* *6:/ :/D5_ 5_zt, t,xN5 N5l\` \`H?% ?%r.   