
    Mi                        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Z
dZdedefdZdde
d	fd
edee   dz  dededef
dZedk(  rddlZddlZ eej.                        dkD  rej.                  d   ndZ eej.                        dkD  r eej.                  d         ne
Z eee      Z e ej8                  ed	d             yy)ui   
test_runner.py - pytest 자동 재실행 verifier
subprocess로 pytest를 실행하고 결과를 파싱
    N<      outputreturnc                     g d}t        | j                               D ]U  }|j                         }|D ]>  }t        j                  ||t        j
                        }|s+|j                  d      c c S  W y)u7   pytest stdout에서 통과/실패 요약 줄을 추출.)z(\d+ passed.*?in \d+\.?\d*s)z(\d+ failed.*?in \d+\.?\d*s)z(no tests ran.*?in \d+\.?\d*s)z(\d+ error.*?in \d+\.?\d*s)    )reversed
splitlinesstripresearch
IGNORECASEgroup)r   patternslinepatternmatchs        :/home/jay/workspace/teams/dev1/qc/verifiers/test_runner.py_parse_pytest_outputr      sn    H **,- &zz| 	&GIIgtR]];E{{1~%	&&     r	   Ftest_dir
test_filestimeout
full_suitec                 	   |rt         j                  j                  dd      }t         j                  j	                  |d      }t         j                  j                  |      s	dd| gdS ddd	|d
ddg}|t        k7  r|nt        }ddj	                  |       g}	 t        j                  |dd|      }	|	j                  j                         }
|	j                  j                         }t        |
      }|r|j                  d|        |	j                  }|dk(  r|j                  d| d       d|dS |dk(  r|j                  d| d| d       d|dS |j                  d| d       |
rc|
j!                         D cg c]  }d|v sd|v sd|j#                         v r|  }}|dd D ]$  }|j                  d |j                                 & |r|j                  d!|dd"         d|dS |E|D cg c]$  }t         j                  j+                  |      s#|& }}|sdd'gdS ddd	g|d(d
d}na| sdd)gdS t         j                  j                  |       s	dd|  gdS t         j                  j-                  |       s	dd*|  gdS ddd	| d(d
dg}ddj	                  |       g}	 t        j                  |dd|      }	|	j                  j                         }
|	j                  j                         }t        |
      }|r|j                  d|        |	j                  }|dk(  r|j                  d| d       d|dS |dk(  r|j                  d| d|  d       d|dS |j                  d| d       |
rc|
j!                         D cg c]  }d|v sd|v sd|j#                         v r|  }}|dd D ]$  }|j                  d |j                                 & |r|j                  d!|dd"         d|dS c c}w # t        j$                  $ r |j                  d#| d$       d|dcY S t&        $ r	 dd%gdcY S t(        $ r}dd&| gdcY d}~S d}~ww xY wc c}w c c}w # t        j$                  $ r |j                  d#| d$       d|dcY S t&        $ r	 dd%gdcY S t(        $ r}dd&| gdcY d}~S d}~ww xY w)+u  
    지정된 디렉토리 또는 파일 목록에서 pytest를 실행합니다.

    Args:
        test_dir: pytest를 실행할 디렉토리 경로
        test_files: pytest에 개별 파일로 전달할 경로 목록 (None이면 미사용)
        timeout: 최대 실행 시간 (초), 초과 시 SKIP
        full_suite: True이면 워크스페이스 루트의 tests/ 전체를 실행

    Returns:
        {"status": "PASS"|"FAIL"|"SKIP", "details": [...]}
    WORKSPACE_ROOTz/home/jay/workspacetestsFAILzTest directory not found: )statusdetailspython3z-mpytestz-qz
--tb=shortz--continue-on-collection-errorsz	Running:  T)capture_outputtextr   zpytest result: r   zExit code: z (all tests passed)PASS   z (no tests collected in )SKIPz (tests failed or error)FAILEDERRORerrorN
   z  zstderr: i,  zTimeout after u   s — skipping test runu'   python3 not found — cannot run pytestz!Unexpected error running pytest: u9   추론된 테스트 파일 중 존재하는 파일 없음z-xzNo test directory specifiedzNot a directory: )osenvirongetpathjoinexistsDEFAULT_TIMEOUTFULL_SUITE_TIMEOUT
subprocessrunstdoutr   stderrr   append
returncoder   lowerTimeoutExpiredFileNotFoundError	Exceptionisfileisdir)r   r   r   r   workspace_root	tests_dircmdeffective_timeoutr!   resultr9   r:   summary	exit_coder   
fail_linesefexisting_filess                      r   verifyrN       s   & (8:OPGGLL9	ww~~i($4Nyk2Z1[\\$)T<Ijk'./'AGGYsxx}o./&	\^^#)	F ]]((*F]]((*F*62G	:;))IA~YK7JKL"(W==aYK7OPY{Z[\]"(W==YK7OPQ %+$5$5$7" #t+w$'TZZ\BY "J "
 !+3B <DJJL>':;<NNXfTcl^#<="(W== %/E277>>!3D!EE WX 
 
 	

 
 
 
  .K-LMMww~~h'$4Nxj2Y1Z[[ww}}X&$4EhZ2P1QRR 
 388C=/*+G:
	
 $$&$$& 'v.NN_WI67
 %%	>NN[3FGH$99!^NN[3KH:UVWX$99 NN[3KLM !' 1 1 34'7d?g>U 
 
 'sO 8DNNR

~#678&#,89$99E" (( 	:NN^,=+>>UVW$99  	^$2[1\]] 	\$4UVWUX2Y1Z[[	\
 FJ $$ 6y0GHI W55 
AB
 	

  
;A3?@
 	

s   BP 5!P )P  #P #AP 5$Q"Q"-BQ, !Q, ()Q, #Q'4AQ,  P -Q4QQQQQ'Q, ,-SS+S3S;SS__main__r      )r   r   )ensure_asciiindent)__doc__builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arr/   r   r7   r5   r6   strr   listintbooldictrN   __name__jsonsyslenargvr   trG   printdumps r   r   <module>rh      s  
  	 	    & #'"	c
c
S	D c
 c
 	c

 
c
L z!#((ma/sxx{RHMA-CHHQK?AXq1F	*$**V%
:; r   