
     j                        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	ej                  j                  ej                  j                  ej                  j                  e      dd            Zej                  j                  eddd      Zej                  j                  eddd      Zg dZd	ed
ee   fdZded
ej,                  fdZ G d d      Z G d d      Z G d d      Zy)u   
회귀 테스트: .github/workflows/guard.yml 및 ci.yml의 task_id 추출 regex 검증.

목적: task-N+M 형식(예: task-2472+1)이 task-N 으로 잘리지 않고 전체 매칭되는지 확인.
    Nz..z.github	workflowsz	guard.ymlzci.yml))ztask/task-2472-dev1z	task-2472)ztask/task-2472+1-dev1ztask-2472+1)ztask/task-2467+3-dev2ztask-2467+3)ztask/task-2483-dev3z	task-2483yml_pathreturnc                     g }t        | d      5 }|D ]B  }t        j                  d|      }|s|j                  d      }d|v s2|j	                  |       D 	 ddd       |S # 1 sw Y   |S xY w)u   
    yml 파일에서 `grep -oE '...'` 형태의 ERE 패턴 문자열을 모두 추출한다.
    단일 따옴표 내의 패턴만 추출 (쉘 스크립트 관행).
    zutf-8)encodingzgrep\s+-oE\s+'([^']+)'   ztask-N)openresearchgroupappend)r   patternsflinemeres         B/home/jay/workspace/tests/regression/test_workflow_taskid_regex.py_extract_ere_patternsr      sv    
 H	h	) )Q 	)D		3T:Aggajc>OOC(	)) O) Os   A#A#A##A-r   c                 ,    t        j                  |       S )u   
    ERE 패턴을 파이썬 re 모듈용 패턴으로 변환한다.

    ERE에서 백슬래시+플러스는 리터럴 '+' 이고,
    파이썬 re에서도 동일하게 동작하므로 변환 없이 사용 가능.
    )r
   compile)r   s    r   _ere_to_python_patternr   *   s     ::c?    c                   d    e Zd ZdZd Zej                  j                  de      de	de	fd       Z
y)TestGuardYmlRegexu3   guard.yml의 task_id 추출 regex 회귀 테스트.c                    t        t              }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                  |      dz  }t        j                  dt        |       d|       d	z   d
|iz  }t        t        j                  |            dx}x}}y)uU   guard.yml에서 task-id 관련 grep -oE 패턴이 2건 이상 추출되어야 한다.   >=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slenr   py0py1py3py6u(   guard.yml에서 task-id regex 패턴이 u9   건만 추출됨 (최소 2건 필요). 추출된 패턴: 
>assert %(py8)spy8N)r   
_GUARD_YMLr    
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationselfr   @py_assert2@py_assert5@py_assert4@py_format7@py_format9s          r   test_patterns_foundz%TestGuardYmlRegex.test_patterns_found7   s*   (48} 	
 	
}! 	
 	
 	
} 	
 	
 
6	
 	
   	
 	
 
	  	
 	
 
6	
 	
   	
 	
 
	  	
 	
 
	  	
 	
 
	 !" 	
 	
  7s8}o F!!)
,	
 	
 	
 	
 	
 	
r   input_str,expected	input_strexpectedc                    t        t              }|st        j                  dt               dz   ddt	        j
                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            |D ]  }t        |      }|j                  |      }d}||u}	|	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| d      dz   d|
iz  }t        t        j                  |            dx}	}|j                  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| d| d| d	      dz   d|iz  }t        t        j                  |            d}	 y)ue   각 입력에 대해 guard.yml의 모든 task-id regex가 기대값을 정확히 매칭해야 한다.u,   guard.yml에서 추출된 패턴이 없음: 
>assert %(py0)sr"   r   Nis notz%(py0)s is not %(py3)smatchr"   r$   u   [guard.yml] 패턴 '   '이 입력 '   '에 매칭 없음
>assert %(py5)spy5r   ==z%(py0)s == %(py2)sactualr<   r"   py2   ': 입력='   ', 기대='   ', 실제='   ' — 잘림 감지!
>assert %(py4)spy4)r   r(   r)   r/   r+   r,   r-   r.   r0   r1   r   r   r*   r   r3   r;   r<   r   @py_format1r   compiledrB   r4   @py_assert1@py_format4@py_format6rK   @py_format3@py_format5s                  r   test_regex_matchingz%TestGuardYmlRegex.test_regex_matching?   s    )4TTG
|TTTTTTTxTTTxTTTTT 
	C-c2HOOI.E $ 5$  5  v     I   I !%    'se=CUV     [[^FX%  6X   v      I    v   &   I &    'se;yk B#*Kx7KM    
	r   N__name__
__module____qualname____doc__r9   pytestmarkparametrize
TEST_CASESstrr\    r   r   r   r   4   s>    =
 [[1:>S C  ?r   r   c                   d    e Zd ZdZd Zej                  j                  de      de	de	fd       Z
y)TestCiYmlRegexu0   ci.yml의 task_id 추출 regex 회귀 테스트.c                    t        t              }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                  |      dz  }t        j                  dt        |       d|       d	z   d
|iz  }t        t        j                  |            dx}x}}y)uR   ci.yml에서 task-id 관련 grep -oE 패턴이 4건 이상 추출되어야 한다.   r   r   r    r   r!   u%   ci.yml에서 task-id regex 패턴이 u9   건만 추출됨 (최소 4건 필요). 추출된 패턴: r&   r'   N)r   _CI_YMLr    r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   s          r   r9   z"TestCiYmlRegex.test_patterns_foundU   s*   (18} 	
 	
}! 	
 	
 	
} 	
 	
 
6	
 	
   	
 	
 
	  	
 	
 
6	
 	
   	
 	
 
	  	
 	
 
	  	
 	
 
	 !" 	
 	
  4CM? C!!)
,	
 	
 	
 	
 	
 	
r   r:   r;   r<   c                    t        t              }|st        j                  dt               dz   ddt	        j
                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            |D ]  }t        |      }|j                  |      }d}||u}	|	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| d      dz   d|
iz  }t        t        j                  |            dx}	}|j                  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| d| d| d	      dz   d|iz  }t        t        j                  |            d}	 y)ub   각 입력에 대해 ci.yml의 모든 task-id regex가 기대값을 정확히 매칭해야 한다.u)   ci.yml에서 추출된 패턴이 없음: r>   r"   r   Nr?   rA   rB   rC   u   [ci.yml] 패턴 'rD   rE   rF   rG   r   rH   rJ   rK   r<   rL   rN   rO   rP   rQ   rR   rS   )r   rl   r)   r/   r+   r,   r-   r.   r0   r1   r   r   r*   r   rT   s                  r   r\   z"TestCiYmlRegex.test_regex_matching]   s    )1NNDWINNNNNNNxNNNxNNNNN 
	C-c2HOOI.E $ 5$  5  v     I   I !%    $C5i[@RS     [[^FX%  6X   v      I    v   &   I &    $C5I; ?#*Kx7KM    
	r   Nr]   rg   r   r   ri   ri   R   s>    :
 [[1:>S C  ?r   ri   c                       e Zd ZdZd Zy)TestTotalPatternCountuI   두 파일 합산 패턴 수가 6건 이상인지 검증 (누락 방지).c           
         t        t              }t        t              }t        |      t        |      z   }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t        |       dt        |       d	      d
z   d|iz  }t        t	        j                  |            d x}}y )N   r   )z%(py0)s >= %(py3)stotalrC   u   전체 패턴 수 u   건 (guard=z, ci=u3   ). 최소 6건 필요. 누락 가능성 점검 요.rF   rG   )r   r(   rl   r    r)   r*   r+   r,   r-   r.   r/   r0   r1   )r3   guard_patternsci_patternsrr   r4   rW   rX   rY   s           r   test_total_patterns_at_least_6z4TestTotalPatternCount.test_total_patterns_at_least_6s   s    .z:+G4N#c+&66 	
uz 	
 	
u 	
 	
 
6	
 	
   	
 	
 
	  	
 	
 
	  	
 	
  !{3~3F2GuSQ\M]L^ _? @	
 	
 	
 	
 	
r   N)r^   r_   r`   ra   ru   rg   r   r   ro   ro   p   s
    S
r   ro   )ra   builtinsr+   _pytest.assertion.rewrite	assertionrewriter)   r
   osrb   pathabspathjoindirname__file__
_REPO_ROOTr(   rl   re   rf   listr   Patternr   r   ri   ro   rg   r   r   <module>r      s     	 	  WW__RWW\\"''//(*CT4PQ
WW\\*ikJ

'',,z9k8
D
C DI " 

  < <

 

r   