
    (<i2                         d Z ddlZddlZej                  j	                  dd       ddl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d Zd Zd Zd Zd Zd Zd Zy)uZ   
통합 테스트: scripts/g3_independent_verifier.py
task-1837_5.1 - 닌기르수 작성
    Nz/home/jay/workspace/scriptsc                     |j                  t        dt        |              | dz  dz  }|j                  dd       d}|dz  j	                  |d	       t        j
                  d
      }||k(  sJ y)u?   보고서 파일이 존재하면 내용을 반환해야 한다.WORKSPACE_ROOTmemoryreportsTparentsexist_oku&   # 테스트 보고서
내용입니다.ztask-load-test.mdutf-8encodingztask-load-testNsetattrg3vstrmkdir
write_textload_report)tmp_pathmonkeypatchreports_direxpectedresults        S/home/jay/workspace/.worktrees/task-2057-dev2/tests/integration/test_g3_verifier.py,test_load_report_returns_content_when_existsr      sv    -s8}=X%	1KdT28H&&228g2N__-.FX    c                     |j                  t        dt        |              | dz  dz  }|j                  dd       t        j                  d      }|J y)u:   보고서 파일이 없으면 None을 반환해야 한다.r   r   r   Tr   ztask-nonexistentN)r   r   r   r   r   )r   r   r   r   s       r   *test_load_report_returns_none_when_missingr      sT    -s8}=X%	1KdT2__/0F>>r   c                     |j                  t        dt        |              | dz  dz  }|j                  dd       d}|dz  j	                  |d	       t        j
                  d
      }||k(  sJ y)u5   UTF-8 한글 내용을 정확히 반환해야 한다.r   r   r   Tr   uT   ## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |ztask-korean.mdr
   r   ztask-koreanNr   )r   r   r   koreanr   s        r   test_load_report_utf8_koreanr    %   su    -s8}=X%	1KdT2eF##///I__]+FVr   c                      d} t        j                  |       }t        |      dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   d   d	k(  sJ |d
   d   dk(  sJ |d
   d   dk(  sJ y)uZ   마크다운 테이블에서 file_path/keyword/status를 올바르게 추출해야 한다.u   ## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| scripts/foo.py | 함수 추가 | grep "def foo" OK | verified |
| utils/bar.py | 버그 수정 | grep "fix_bug" OK | verified |
   r   	file_pathzscripts/foo.pykeywordzdef foostatusverified   zutils/bar.pyfix_bugNr   parse_verification_tablelenreportentriess     r   .test_parse_verification_table_extracts_entriesr/   3   s    F **62Gw<11:k"&66661:i I---1:h:---1:k"n4441:i I---r   c                  @    d} t        j                  |       }|g k(  sJ y)u]   '수정 파일별 검증 상태' 테이블이 없으면 빈 리스트를 반환해야 한다.u?   # 보고서
## 작업 완료
내용만 있고 테이블 없음.N)r   r*   r,   s     r   4test_parse_verification_table_no_table_returns_emptyr1   E   s#    PF**62Gb==r   c                  l    d} t        j                  |       }t        |      dk(  sJ |d   d   dk(  sJ y)uF   헤더 행과 구분선은 항목으로 파싱되지 않아야 한다.u   ## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| scripts/actual.py | 실제 변경 | grep "actual_func" OK | verified |
r'   r   r#   zscripts/actual.pyNr)   r,   s     r   8test_parse_verification_table_skips_header_and_separatorr3   L   sE    F **62Gw<11:k"&9999r   c                  f    d} t        j                  |       }t        |      dk(  sJ |d   d   J y)uV   grep 검증 셀에 grep 키워드 형식이 없으면 keyword는 None이어야 한다.u   ## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| scripts/no_grep.py | 파일 생성 | N/A | verified |
r'   r   r$   Nr)   r,   s     r   5test_parse_verification_table_no_keyword_when_no_grepr5   Y   sB    F **62Gw<11:i (((r   c                 "   |j                  t        dt        |              | dz  dz  }|j                  j	                  dd       |j                  dd       t        |      d	d
ddg}t        j                  |      \  }}|dk(  sJ |g k(  sJ y
)uO   모든 파일이 존재하면 status='PASS', missing=[]를 반환해야 한다.r   scriptszexisting.pyTr   zdef foo(): passr
   r   u	   테스트Nr&   r#   descriptionr$   r%   PASS)r   r   r   parentr   r   check_file_existencer   r   existingr.   r%   missings         r   -test_check_file_existence_pass_when_all_existr@   h   s    -s8}=)#m3HOO$6)G< ];SWcmnoG..w7OFGVb==r   c                     |j                  t        dt        |              dddddg}t        j                  |      \  }}|dk(  sJ d|v sJ y)uR   파일이 없으면 status='FAIL', missing에 파일명이 포함되어야 한다.r   zscripts/missing_file.py   없는 파일Nr&   r8   FAIL)r   r   r   r<   )r   r   r.   r%   r?   s        r   0test_check_file_existence_fail_when_file_missingrD   u   s\    -s8}=6cgs}~G..w7OFGV$///r   c                    |j                  t        dt        |              | dz  }|j                  dd       t        |      dddd	d
dddd	g}t        j                  |      \  }}|dk(  sJ t        |      dk(  sJ d
|d   v sJ y)uS   일부 파일이 있고 일부가 없을 때 missing 목록이 정확해야 한다.r   z	exists.pypassr
   r   u   있는 파일Nr&   r8   zno_such_file.pyrB   rC   r'   r   )r   r   r   r   r<   r+   r=   s         r   test_check_file_existence_mixedrG   ~   s    -s8}=+%H1 (mOPT`jk'TXdnoG ..w7OFGVw<1
***r   c                     |j                  t        dt        |              t        j                  d      }t        |      dk(  sJ dt        |      vsJ y)uZ   'path:123' 형식에서 라인번호를 제거하고 순수 경로를 반환해야 한다.r   z/absolute/path/file.py:42z/absolute/path/file.py42Nr   r   r   resolve_file_pathr   r   r   s      r   )test_resolve_file_path_strips_line_numberrM      sO    -s8}=""#>?Fv;2222s6{"""r   c                     |j                  t        dt        |              t        j                  d      }|j	                         sJ t        |       t        |      v sJ dt        |      v sJ y)uO   상대 경로는 WORKSPACE_ROOT 기준 절대 경로로 변환되어야 한다.r   zscripts/some_file.pyN)r   r   r   rK   is_absoluterL   s      r   +test_resolve_file_path_relative_to_absoluterP      sd    -s8}=""#9:Fx=CK'''!S[000r   c                     |j                  t        dt        |              d}t        j                  |      }t        |      |k(  sJ y)u2   절대 경로는 그대로 반환되어야 한다.r   z#/home/jay/workspace/scripts/tool.pyNrJ   )r   r   abs_pathr   s       r   )test_resolve_file_path_absolute_unchangedrS      s@    -s8}=4H""8,Fv;("""r   c                     |j                  t        dt        |              t        j                  d      }t        |      j	                  d      rJ dt        |      v sJ y)u]   path:숫자 형식만 라인번호로 인식, 중간 콜론은 제거하지 않아야 한다.r   zscripts/file.py:100z:100zfile.pyN)r   r   r   rK   endswithrL   s      r   4test_resolve_file_path_colon_only_at_end_with_digitsrV      sT    -s8}=""#89F6{##F+++F###r   c                    ddl }|j                  t        dt        |              | dz  dz  }|j	                  dd       | dz  dz  j	                  dd       |j                  t
        d	g d
       |j                  t              5 }t        j                          ddd       j                  j                  dk(  sJ y# 1 sw Y   %xY w)u^   보고서가 없으면 main()은 exit 1을 발생시켜야 한다 (report not found → FAIL).r   Nr   r   r   Tr   eventsargv)g3v.py	--task-idztask-no-report-e2er'   )pytestr   r   r   r   sysraises
SystemExitmainvaluecoder   r   r\   r   exc_infos        r    test_main_exits_0_when_no_reportre      s    -s8}=X%	1KdT28#**4$*GV%RS	z	" h
>>!### s   C  C	c                    ddl }|j                  t        dt        |              | dz  dz  }|j	                  dd       |dz  j                  d	d
       |j                  t        dg d       |j                  t              5 }t        j                          ddd       j                  j                  dk(  sJ y# 1 sw Y   %xY w)uj   보고서가 있지만 검증 테이블 없고 품질 기준 미달이면 FAIL → exit 1이어야 한다.r   Nr   r   r   Tr   ztask-skip-e2e.mdu   # 보고서
내용만 있음r
   r   rY   )rZ   r[   ztask-skip-e2er'   r\   r   r   r   r   r   r]   r^   r_   r`   ra   rb   rc   s        r   2test_main_exits_1_when_report_no_table_low_qualityrh      s    -s8}=X%	1KdT2%%112Q\c1dV%MN	z	" h
>>!### s   B==Cc                    ddl }|j                  t        dt        |              | dz  dz  }|j	                  dd       d}|d	z  j                  |d
       |j                  t        dg d       |j                  t              5 }t        j                          ddd       j                  j                  dk(  sJ y# 1 sw Y   %xY w)uj   보고서가 있고 검증 테이블 없지만 품질 기준 충족이면 SKIP → exit 0이어야 한다.r   Nr   r   r   Tr   u  # task-skip-quality 보고서

**S**: 상황 설명입니다. 기존 시스템에서 특정 기능이 필요했습니다. 여러 모듈 간의 의존성으로 인해 복잡한 구조를 갖고 있었습니다.
**C**: 복잡도가 높아서 추가 분석이 필요했습니다. 기존 코드의 문제점을 파악하고 개선 방향을 수립했습니다.
**Q**: 어떻게 해결할 것인가? 어떤 접근 방식이 가장 효율적인가?
**A**: 다음과 같이 해결했습니다. 코드를 수정하고 테스트를 추가하여 검증을 완료했습니다. 전체 테스트 통과 확인. 리팩터링을 통해 가독성과 유지보수성을 향상시켰습니다.
ztask-skip-quality.mdr
   r   rY   )rZ   r[   ztask-skip-qualityrg   )r   r   r\   r   good_reportrd   s         r   3test_main_exits_0_when_report_no_table_good_qualityrk      s    -s8}=X%	1KdT2K ))55kG5TV%QR	z	" h
>>!### s   B??Cc                    ddl }|j                  t        dt        |              | dz  dz  }|j	                  dd       | dz  }|j	                  dd       |d	z  }|j                  d
d       dt        |       d}|dz  j                  |d       |j                  t        dg d       |j                  t              5 }t        j                          ddd       j                  j                  dk(  sJ y# 1 sw Y   %xY w)u>   보고서 + 파일 모두 존재하면 exit 0이어야 한다.r   Nr   r   r   Tr   r7   zreal_file.pyzdef actual_func(): passr
   r      # 보고서

## 수정 파일별 검증 상태

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| u6    | 함수 추가 | grep "actual_func" OK | verified |
ztask-pass-e2e.mdrY   )rZ   r[   ztask-pass-e2erg   )r   r   r\   r   scripts_dirtarget_filereport_contentrd   s           r   &test_main_exits_0_when_all_files_existrq      s   -s8}=X%	1KdT2 Y&KdT2.K4wG { N %%11.71SV%MN	z	" h
>>!### s   C<<Dc                    ddl }|j                  t        dt        |              | dz  dz  }|j	                  dd       | dz  dz  j	                  dd       d	t        |        d
}|dz  j                  |d       |j                  t        dg d       |j                  t              5 }t        j                          ddd       j                  j                  dk(  sJ y# 1 sw Y   %xY w)uE   보고서는 있지만 파일이 누락되면 exit 1이어야 한다.r   Nr   r   r   Tr   rX   rm   uG   /scripts/missing_file.py | 함수 추가 | grep "func" OK | verified |
ztask-fail-e2e.mdr
   r   rY   )rZ   r[   ztask-fail-e2er'   rg   )r   r   r\   r   rp   rd   s         r   #test_main_exits_1_when_file_missingrs     s    -s8}=X%	1KdT28#**4$*G x=/ N %%11.71SV%MN	z	" h
>>!### s   ,C%%C.)__doc__jsonr]   pathinsertg3_independent_verifierr   r   r   r    r/   r1   r3   r5   r@   rD   rG   rM   rP   rS   rV   re   rh   rk   rq   rs    r   r   <module>rz      s   
  
 0 1 %
		.$
:
)
0+$#1#$$$$,$:$r   