
    h3i;                     z   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ZdZe
j                  j                  de       ddlmZmZmZmZ ddlm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)uF   test_qc_verify.py - qc_verify.py 자동 추론 + MANUAL_SKIP 테스트    Nz!/home/jay/workspace/teams/dev1/qc)_determine_overall_infer_test_files
_summarize	run_check)test_runnerc                   "    e Zd ZdZd Zd Zd Zy)TestInferTestFilesFoundub   _infer_test_files에 실제 존재하는 파일 경로를 넣으면 관련 테스트 파일 반환c                    |dz  }|j                          |dz  }|j                          |dz  }|j                  d       |dz  }|j                  d       |j                  dt        |             t	        t        |      g      }t        |      }||v }	|	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                  |      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}}	y)u]   임시 디렉토리에 tests/test_foo.py 생성 → foo.py 경로로 추론 → 발견 확인srctestsfoo.py# footest_foo.py
# test fooWORKSPACE_ROOTinz0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} in %(py5)sstrtest_foo_pyresultpy0py1py3py5u4   test_foo.py가 추론 결과에 있어야 함, got: 
>assert %(py7)spy7Nmkdir
write_textsetenvr   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanation)selftmp_pathmonkeypatchsrc_dir	tests_dirfoo_pyr   r   @py_assert2@py_assert4@py_format6@py_format8s               +/home/jay/workspace/tests/test_qc_verify.pytest_infer_test_files_foundz3TestInferTestFilesFound.test_infer_test_files_found   s4    U"g%	8#'"-/|,+S];"CK=1;j6)jjj6jjjjjjsjjjsjjjjjj;jjj;jjjjjjjjj6jjj6jjjj-abhai+jjjjjjj    c                    |dz  dz  }|j                  d       |dz  dz  }|j                          |dz  }|j                  d       |dz  }|j                  d	       |j                  d
t        |             t	        t        |      g      }t        |      }||v }	|	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                  |      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}}	y)u2   부모 디렉토리의 tests/test_foo.py도 발견r   subT)parentsr   r   r   r   r   r   r   r   r   r   r   r   uA   부모 tests/test_foo.py가 추론 결과에 있어야 함, got: r   r   Nr   )r,   r-   r.   sub_dirr0   r1   r   r   r2   r3   r4   r5   s               r6   (test_infer_test_files_found_parent_testsz@TestInferTestFilesFound.test_infer_test_files_found_parent_tests2   sC    U"U*d#u$w.	8#'"-/|,+S];"CK=1;w6)www6wwwwwwswwwswwwwww;www;wwwwwwwww6www6wwww-nounv+wwwwwwwr8   c                    |j                  dt        |             |dz  }|j                          |dz  }|j                          |dz  }|j                  d       |dz  }|j                  d       t	        t        |      g      }t        |      }||v }	|	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                  |      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}}	y)u.   workspace_root/tests/test_foo.py 패턴 발견r   r   r   r   r   r   r   r   r   r   r   r   r   uD   workspace tests/test_foo.py가 추론 결과에 있어야 함, got: r   r   N)r"   r   r    r!   r   r#   r$   r%   r&   r'   r(   r)   r*   r+   )r,   r-   r.   workspace_tests_dirr/   r1   r   r   r2   r3   r4   r5   s               r6   +test_infer_test_files_found_workspace_testszCTestInferTestFilesFound.test_infer_test_files_found_workspace_testsE   s5   +S];&0!!#U"8#'")M9|,"CK=1;z6)zzz6zzzzzzszzzszzzzzz;zzz;zzzzzzzzz6zzz6zzzz-qrxqy+zzzzzzzr8   N)__name__
__module____qualname____doc__r7   r=   r@    r8   r6   r	   r	      s    lk&x&{r8   r	   c                       e Zd ZdZd Zd Zy)TestInferTestFilesNotFoundu9   관련 테스트 파일이 없으면 빈 리스트 반환c                    |j                  dt        |             t        |dz  dz        }t        |g      }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d|       d	z   d
|iz  }t        t        j                  |            dx}}y)u:   존재하지 않는 파일 경로 전달 → 빈 리스트r   r   znonexistent.py==z%(py0)s == %(py3)sr   r   r   u/   테스트 파일 없으면 빈 리스트, got: 
>assert %(py5)sr   N)r"   r   r   r#   r$   r%   r&   r'   r(   r)   r*   r+   )	r,   r-   r.   	fake_pathr   r2   @py_assert1@py_format4r4   s	            r6   test_infer_test_files_not_foundz:TestInferTestFilesNotFound.test_infer_test_files_not_founda   s    +S];5(+;;<	"I;/Wv|WWWvWWWWWWvWWWvWWWWWWNvhWWWWWWWr8   c                    |j                  dt        |             t        g       }g }||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&   빈 리스트 전달 → 빈 리스트r   rI   rK   r   rL   assert %(py5)sr   N)r"   r   r   r#   r$   r%   r&   r'   r(   r*   r+   )r,   r-   r.   r   r2   rO   rP   r4   s           r6   test_infer_empty_listz0TestInferTestFilesNotFound.test_infer_empty_listi   sy    +S];"2&v|vvvr8   N)rA   rB   rC   rD   rQ   rT   rE   r8   r6   rG   rG   ^   s    CXr8   rG   c                       e Zd ZdZd Zy)TestInferTestFilesSkipTestFilesu#   test_ 접두사 파일은 건너뜀c                    |j                  dt        |             |dz  }|j                  d       t        t        |      g      }g }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }t	        j                  d|       d	z   d
|iz  }t        t	        j                  |            dx}}y)u$   test_foo.py 전달 → 빈 리스트r   r   z# testrI   rK   r   rL   u*   test_ 접두사 파일은 건너뜀, got: rM   r   Nr"   r   r!   r   r#   r$   r%   r&   r'   r(   r)   r*   r+   )	r,   r-   r.   	test_filer   r2   rO   rP   r4   s	            r6   %test_infer_test_files_skip_test_fileszETestInferTestFilesSkipTestFiles.test_infer_test_files_skip_test_filesx   s    +S];},	X&"C	N#34Rv|RRRvRRRRRRvRRRvRRRRRRI&RRRRRRRr8   N)rA   rB   rC   rD   rZ   rE   r8   r6   rV   rV   u   s    -Sr8   rV   c                       e Zd ZdZd Zy)TestInferTestFilesSkipNonPythonu!   .py가 아닌 파일은 건너뜀c                    |j                  dt        |             |dz  }|j                  d       |dz  }|j                  d       |dz  }|j                  d       t        t        |      t        |      t        |      g      }g }||k(  }|st	        j
                  d|fd	||f      d
t        j                         v st	        j                  |      rt	        j                  |      nd
t	        j                  |      dz  }	t	        j                  d|       dz   d|	iz  }
t        t	        j                  |
            dx}}y)u+   js, txt, md 파일 전달 → 빈 리스트r   zfoo.jsz// jszfoo.txttxtz	README.mdz# mdrI   rK   r   rL   u%   .py 아닌 파일은 건너뜀, got: rM   r   NrX   )r,   r-   r.   js_filetxt_filemd_filer   r2   rO   rP   r4   s              r6   %test_infer_test_files_skip_non_pythonzETestInferTestFilesSkipNonPython.test_infer_test_files_skip_non_python   s    +S];X%7#i'E"[(6""CL#h-W#NOMv|MMMvMMMMMMvMMMvMMMMMMDVHMMMMMMMr8   N)rA   rB   rC   rD   rb   rE   r8   r6   r\   r\      s    +Nr8   r\   c                       e Zd ZdZd Zd Zy) TestRunCheckTestRunnerManualSkipu0   --skip test_runner 시 MANUAL_SKIP 상태 반환c           	      \   t        ddgddg 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)uT   run_check('test_runner', skip_list=['test_runner'], ...) → status == 'MANUAL_SKIP'r   	task-test name	skip_listtask_idapi_baseapi_endpointstest_dir
file_pathsstatusMANUAL_SKIPrI   z%(py1)s == %(py4)sr   py4u   MANUAL_SKIP 기대, got: 
>assert %(py6)spy6Nr   r#   r$   r(   r)   r*   r+   r,   r   @py_assert0@py_assert3r2   @py_format5@py_format7s          r6   &test_run_check_test_runner_manual_skipzGTestRunCheckTestRunnerManualSkip.test_run_check_test_runner_manual_skip   s    $o
 hV=V=0VVV=VVVVVV=VVV4MfX2VVVVVVVVr8   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j                  |d         }g }d}||v }	|	}|	s%d}
|
|v }|}|sd}|j                  } |       }||v }|}|st        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                  |       |	sBt        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t        j                        t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }d d!|iz  }t	        t        j
                  |            dx}x}x}x}	x}
x}x}x}x}}y)"u.   MANUAL_SKIP details에 경고 메시지 포함r   rf   rg   rh   rp   rq   rI   rr   rs   zassert %(py6)srv   N
detailsu   경고WARNr   z%(py3)s in %(py5)sdetails_strr   r   %(py7)sr   z%(py10)s in %(py12)spy10py12%(py14)spy14zJ%(py17)s in %(py23)s
{%(py23)s = %(py21)s
{%(py21)s = %(py19)s.upper
}()
}py17py19py21py23%(py25)spy25   assert %(py28)spy28)r   r#   r$   r(   r*   r+   joinupperr%   r&   r'   append_format_boolop)r,   r   ry   rz   r2   r{   r|   r   rO   r3   @py_assert9@py_assert11@py_assert16@py_assert20@py_assert22@py_assert18r4   r5   @py_format13@py_format15@py_format24@py_format26@py_format27@py_format29s                           r6   )test_manual_skip_details_contains_warningzJTestRunCheckTestRunnerManualSkip.test_manual_skip_details_contains_warning   s   $o
 h0=0=0000=000000=0000000iiy 12g}g}+gxgx;/Fg&gT_TeTegTeTgg&TgJggggg}ggg}gggggggggggggggggx;gggxgggggg;ggg;ggggggg&Tgggg&ggggggT_gggT_gggTegggTggggggggggggggggr8   N)rA   rB   rC   rD   r}   r   rE   r8   r6   rd   rd      s    :Whr8   rd   c                       e Zd ZdZd Zd Zy)&TestRunCheckTestRunnerAutoInferNoFiles=   check_files로 추론했으나 테스트 파일 0개 → SKIPc                    |j                  dt        |             |dz  }|j                  d       t        dg ddg dt        |      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)r   r   zbar.pyz# barr   rf   rg   rh   rp   SKIPrI   rr   rs   u,   테스트 파일 0개 → SKIP 기대, got: ru   rv   N)
r"   r   r!   r   r#   r$   r(   r)   r*   r+   )
r,   r-   r.   src_filer   ry   rz   r2   r{   r|   s
             r6   .test_run_check_test_runner_auto_infer_no_fileszUTestRunCheckTestRunnerAutoInferNoFiles.test_run_check_test_runner_auto_infer_no_files   s    +S]; h&G$H
 hb6b6)bbb6bbbbbb6bbb-YZ`Ya+bbbbbbbbr8   c           	      Z   t        dg ddg 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)u/   test_dir도 없고 file_paths도 없으면 SKIPr   rf   rg   rh   rp   r   rI   rr   rs   u"   아무것도 없으면 SKIP, got: ru   rv   Nrw   rx   s          r6   /test_run_check_test_runner_no_dir_no_files_skipzVTestRunCheckTestRunnerAutoInferNoFiles.test_run_check_test_runner_no_dir_no_files_skip   s    
 hX6X6)XXX6XXXXXX6XXX-OPVx+XXXXXXXXr8   N)rA   rB   rC   rD   r   r   rE   r8   r6   r   r      s    Gc&Yr8   r   c                       e Zd ZdZd Zy)&TestRunCheckTestRunnerWithTestDirWarnsu)   test_dir 사용 시 stderr에 WARN 출력c           
      H   |dz  }|j                          t        dg ddg t        |      g       }|j                         }g }d}|j                  }||v }	|	}
|	sd}|j                  }||v }|}
|
st        j                  d|	fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
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
t        j                  |      dz  }dd|iz  }|j                  |       t        j                  |d      i z  }t        j                  d|j                        dz   d|iz  }t        t        j                  |            dx}
x}x}x}	x}x}x}}y)u=   test_dir 사용 시 stderr에 --test-dir 관련 경고 출력r   r   rf   rg   rh   z
--test-dirztest-dirr   )z+%(py3)s in %(py7)s
{%(py7)s = %(py5)s.err
}captured)r   r   r   z%(py9)spy9)z/%(py12)s in %(py16)s
{%(py16)s = %(py14)s.err
})r   r   py16z%(py18)spy18r   u0   stderr에 --test-dir 관련 경고 기대, got: z
>assert %(py21)sr   N)r    r   r   
readouterrerrr#   r$   r(   r%   r&   r'   r   r   r)   r*   r+   )r,   r-   capsysrn   r   r   rO   r2   @py_assert6r3   ry   r   @py_assert15@py_assert13r5   @py_format10@py_format17@py_format19@py_format20@py_format22s                       r6   .test_run_check_test_runner_with_test_dir_warnszUTestRunCheckTestRunnerWithTestDirWarns.test_run_check_test_runner_with_test_dir_warns   s:    g%]
 $$&	O	O$LL	OL(	O,6	O:B,,	O,6,,F	O 	O=N=N	OL	O 	OENY 	O 	OHN	O 	O6N6N %	O 	OENY %	O 	OENY )	O 	O 	OHN	OHN	O=N=N	O,6,	O 	OENY -7	O 	OHN	O 	O6N6N ;C	O 	OENY ;C	O 	OENY ;G	O 	O 	OHN	OHN	O@N	O 	O=N=N=hll=MN	O 	O 	O;N;N	O 	O 	O 	Or8   N)rA   rB   rC   rD   r   rE   r8   r6   r   r      s    3Or8   r   c                       e Zd ZdZd Zd Zy)TestSummarizeWithManualSkipu#   MANUAL_SKIP이 _summarize에 반영c                    dg ddg ddg dd}t        |      }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}}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)u    MANUAL_SKIP이 summary에 포함rq   rp   r   PASS)r   
file_checkdata_integrityr   )z%(py1)s in %(py3)ssummaryr   r   u.   MANUAL_SKIP이 summary에 있어야 함, got: rM   r   Nz2 PASSr   r   r   r   r   r   r   r   r   zassert %(py17)sr   )r   r#   r$   r(   r%   r&   r'   r)   r*   r+   r   r   )r,   checksr   ry   r2   rP   r4   rO   r3   r   r   r5   r   r   @py_format16@py_format18s                   r6   test_summarize_with_manual_skipz;TestSummarizeWithManualSkip.test_summarize_with_manual_skip  sb    '4C%+;)/B?

 V$e}'eee}eee}eeeeeeeeeeeee+YZaYd)eeeeeee7x7x7"7f7f&77777x7777x777777777777777777f777f77777777777777777777777r8   c                 z   dg ddg dd}t        |      }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)u*   MANUAL_SKIP 없으면 summary에 미포함r   r   r   r   r   rq   )not in)z%(py1)s not in %(py3)sr   r   rS   r   N)	r   r#   r$   r(   r%   r&   r'   r*   r+   )r,   r   r   ry   r2   rP   r4   s          r6   &test_summarize_no_manual_skip_no_entryzBTestSummarizeWithManualSkip.test_summarize_no_manual_skip_no_entry  s     &,;)/B?
 V$+}G++++}G+++}++++++G+++G+++++++r8   N)rA   rB   rC   rD   r   r   rE   r8   r6   r   r   
  s    -	8,r8   r   c                   "    e Zd ZdZd Zd Zd Zy)$TestDetermineOverallManualSkipIsWarnu,   MANUAL_SKIP 포함 시 전체 결과가 WARNc                    dg ddg dd}t        |g       }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      d	z  }t        j                  d
|       dz   d|iz  }t        t        j                  |            dx}}y)u%   MANUAL_SKIP이 있으면 overall WARNrq   r   r   r   r   r   rI   rK   overallrL   u"   MANUAL_SKIP → WARN 기대, got: rM   r   N
r   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r   r   r2   rO   rP   r4   s          r6   *test_determine_overall_manual_skip_is_warnzOTestDetermineOverallManualSkipIsWarn.test_determine_overall_manual_skip_is_warn*  s     '4C%+;
 %VR0 Pw& PPPw&PPPPPPwPPPwPPP&PPP$Fwi"PPPPPPPr8   c                    dg ddg dd}t        |g       }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d	|       d
z   d|iz  }t        t        j                  |            dx}}y)u"   FAIL + MANUAL_SKIP 혼재 시 FAILrq   r   FAILr   rI   rK   r   rL   u   FAIL이 있으면 FAIL, got: rM   r   Nr   r   s          r6   -test_determine_overall_fail_beats_manual_skipzRTestDetermineOverallManualSkipIsWarn.test_determine_overall_fail_beats_manual_skip3  s     '4C%+;
 %VR0 Kw& KKKw&KKKKKKwKKKwKKK&KKK$A'"KKKKKKKr8   c                 ~   dg ddg dd}t        |g       }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   모두 PASS면 PASSr   r   r   rI   rK   r   rL   rS   r   N)	r   r#   r$   r%   r&   r'   r(   r*   r+   r   s          r6   .test_determine_overall_all_pass_no_manual_skipzSTestDetermineOverallManualSkipIsWarn.test_determine_overall_all_pass_no_manual_skip<  s     &,;)/B?
 %VR0  w&    w&      w   w   &       r8   N)rA   rB   rC   rD   r   r   r   rE   r8   r6   r   r   '  s    6QL!r8   r   c                   `    e Zd ZdZ ej
                  d      d        Zd Zd Zd Z	d Z
d	 Zy
)TestVerifyWithTestFilesu2   test_runner.verify(test_files=[...]) 동작 확인T)autousec                     ddl }t        t        j                  j	                               D ]J  }d|v st        t        j                  |   |j                  j                        s:t        j                  |= L y)uX   test_qc_gate.py의 sys.modules MagicMock 오염 방지를 위해 실제 모듈로 교체r   N	verifiers)unittest.mocklistsysmoduleskeys
isinstancemock	MagicMock)r,   unittestmod_names      r6   _ensure_real_test_runnerz0TestVerifyWithTestFiles._ensure_real_test_runnerN  sZ     	 S[[--/0 	*Hh&:ckk(6KX]]MdMd+eKK)	*r8   c                 f   ddl m} |j                  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)u   빈 test_files → SKIPr   N
test_filesrp   r   rI   rr   rs   u%   빈 test_files → SKIP 기대, got: ru   rv   	verifiers.test_runnerr   verifyr#   r$   r(   r)   r*   r+   r,   trr   ry   rz   r2   r{   r|   s           r6   +test_verify_with_test_files_empty_list_skipzCTestVerifyWithTestFiles.test_verify_with_test_files_empty_list_skipX  s|    *b)h[6[6)[[[6[[[[[[6[[[-RSYRZ+[[[[[[[[r8   c                 >   ddl m} |j                  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}}dj                  |d         }g }	d}||v }
|
}|
s%d}||v }|}|sd}|j                  } |       }||v }|}|st        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                  |       |
sBt        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t        j
                        t        j
                  |      dz  }dd|iz  }|	j                  |       t        j                  |	d      i z  }d d!|iz  }t        t        j                  |            dx}x}	x}x}
x}x}x}x}x}}y)"uB   존재하지 않는 test_files → SKIP (존재하는 파일 0개)r   Nz$/tmp/nonexistent_test_file_abc123.pyr   rp   r   rI   rr   rs   u1   존재하지 않는 파일 → SKIP 기대, got: ru   rv   r   r   u   존재하는u   없음r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r#   r$   r(   r)   r*   r+   r   r   r%   r&   r'   r   r   )r,   r   r   ry   rz   r2   r{   r|   r   rO   r3   r   r   r   r   r   r   r4   r5   r   r   r   r   r   r   s                            r6   ,test_verify_with_nonexistent_test_files_skipzDTestVerifyWithTestFiles.test_verify_with_nonexistent_test_files_skip_  s   *'M&NOhg6g6)ggg6gggggg6ggg-^_e^f+ggggggggiiy 12h~h~,hhK0Gh6hU`UfUfhUfUhh6UhKhhhhh~hhh~hhhhhhhhhhhhhhhhhKhhhhhhhhhKhhhKhhhhhhh6Uhhhh6hhhhhhU`hhhU`hhhUfhhhUhhhhhhhhhhhhhhhhr8   c                    ddl m} |dz  }|j                  d       |j                  t	        |      g      }|d   }d}||v }|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)uB   존재하는 테스트 파일 → pytest 실행 (PASS 또는 FAIL)r   Nztest_sample.pyz*def test_always_pass():
    assert 1 == 1
r   rp   )r   r   r   r   )z%(py1)s in %(py4)srs   u   유효한 상태 기대, got: ru   rv   )r   r   r!   r   r   r#   r$   r(   r)   r*   r+   )
r,   r-   r   rY   r   ry   rz   r2   r{   r|   s
             r6   #test_verify_with_existing_test_filez;TestVerifyWithTestFiles.test_verify_with_existing_test_fileh  s    * //	KLs9~&67hf#;f#;;fff#;ffffff#;fff?]^d]e=ffffffffr8   c                 b   ddl m} |j                         }|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)u(   test_dir도 test_files도 없으면 SKIPr   Nrp   r   rI   rr   rs   u#   인수 없으면 SKIP 기대, got: ru   rv   r   r   s           r6   test_verify_with_no_args_skipz5TestVerifyWithTestFiles.test_verify_with_no_args_skipt  sw    *hY6Y6)YYY6YYYYYY6YYY-PQWPX+YYYYYYYYr8   c                    ddl m} t        |dz        }|j                  |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)u   test_files가 주어지면 test_dir 무시하지 않고 test_files로만 실행
        (test_files가 None이 아니면 test_dir 경로보다 test_files 우선)r   Nnonexistent_dirz/tmp/nonexistent_test_xyz.py)rn   r   rp   r   rI   rr   rs   u(   test_files 우선 → SKIP 기대, got: ru   rv   )
r   r   r   r   r#   r$   r(   r)   r*   r+   )
r,   r-   r   r  r   ry   rz   r2   r{   r|   s
             r6   )test_verify_test_files_overrides_test_dirzATestVerifyWithTestFiles.test_verify_test_files_overrides_test_dir{  s     	+h)::; $67  

 h^6^6)^^^6^^^^^^6^^^-UV\U]+^^^^^^^^r8   N)rA   rB   rC   rD   pytestfixturer   r   r   r   r   r  rE   r8   r6   r   r   K  s@    <V^^D!* "*\i
gZ_r8   r   )!rD   builtinsr%   _pytest.assertion.rewrite	assertionrewriter#   	importlibjsonosr   tempfiler  QC_DIRpathinsert	qc_verifyr   r   r   r   r   r   r	   rG   rV   r\   rd   r   r   r   r   r   rE   r8   r6   <module>r     s    L      	 
   
- 6   ":{ :{D .S S&N N.h hJ!Y !YRO O:, ,:! !H=_ =_r8   