
    il$                       d Z ddlmZ ddlZddlZddlZddlmZ ddlZej                  j                  d e ee      j                  j                  j                               ddlmZmZ  G d d      Z G d d	      Zy)
ut   utils/context_refs.py 테스트 스위트 (M-05 @ 참조 시스템)

모리건(테스터) 작성 — TDD RED 단계
    )annotationsN)Path)
parse_refsresolve_refsc                  h    e Zd ZdZddZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZddZy)TestParseRefsu*   parse_refs() — @ 참조 파싱 테스트c                    t        d      }t        |      dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   d   d	k(  sJ y
)u   @file:path 단일 파싱zhello @file:src/main.py world   r   typefilepathzsrc/main.pyrawz@file:src/main.pyNr   lenselfrefss     N/home/jay/workspace/.worktrees/task-2116-dev1/utils/tests/test_context_refs.pytest_parse_file_ref_simplez(TestParseRefs.test_parse_file_ref_simple   s`    9:4yA~~Awv&(((Awv-///Awu~!4444    c                N    t        d      }|d   d   dk(  sJ |d   d   dk(  sJ y)u'   @file:/abs/path.py 절대 경로 파싱z0@file:/home/jay/workspace/utils/config_loader.pyr   r   r   r   z*/home/jay/workspace/utils/config_loader.pyNr   r   s     r   !test_parse_file_ref_absolute_pathz/TestParseRefs.test_parse_file_ref_absolute_path    s:    LMAwv&(((Awv"NNNNr   c                n    t        d      }t        |      dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ y)	u   @folder:path 파싱u   참조: @folder:utils/r
   r   r   folderr   zutils/Nr   r   s     r   test_parse_folder_refz#TestParseRefs.test_parse_folder_ref&   sI    234yA~~Awv(***Awv(***r   c                    t        d      }t        |      dk(  sJ |d   d   dk(  sJ |d   d   J |d   d   d	k(  sJ y)
u   @diff 파싱u!   변경 사항: @diff 확인해줘r
   r   r   diffr   Nr   z@diffr   r   s     r   test_parse_diff_refz!TestParseRefs.test_parse_diff_ref-   s]    =>4yA~~Awv&(((Awv&&&Awu~(((r   c                h    t        d      }t        |      dk(  sJ |d   d   dk(  sJ |d   d   J y)u   @staged 파싱u   staged 파일 목록: @stagedr
   r   r   stagedr   Nr   r   s     r   test_parse_staged_refz#TestParseRefs.test_parse_staged_ref5   sG    9:4yA~~Awv(***Awv&&&r   c                    d}t        |      }|D cg c]  }|d   	 }}|j                  d      dk(  sJ |j                  d      dk(  sJ t        |      dk(  sJ yc c}w )	u   여러 @ 참조 동시 파싱u1   @file:a.py 그리고 @file:b.py, @diff 도 포함r   r      r   r
      N)r   countr   )r   textr   rtypess        r   test_parse_multiple_refsz&TestParseRefs.test_parse_multiple_refs<   sk    B$$()q6)){{6"a'''{{6"a'''4yA~~ *s   Ac                (    t        d      }|g k(  sJ y)u   @ 참조 없으면 빈 목록zhello world, no refs hereNr   r   s     r    test_parse_no_refs_returns_emptyz.TestParseRefs.test_parse_no_refs_returns_emptyE   s    56rzzr   c                (    t        d      }|g k(  sJ y)u   빈 문자열은 빈 목록 Nr   r   s     r   test_parse_empty_stringz%TestParseRefs.test_parse_empty_stringJ   s    "~rzzr   c                8    d}t        |      }|d   d   dk(  sJ y)u(   raw 필드가 원본 텍스트를 보존z!@folder:/home/jay/workspace/utilsr   r   Nr   )r   r'   r   s      r   test_parse_ref_raw_preservedz*TestParseRefs.test_parse_ref_raw_preservedO   s(    2$Awu~!DDDDr   c                T    t        d      }t        |      dk(  sJ |d   d   dk(  sJ y)u&   공백으로 둘러싸인 @file 참조z  @file:config.yaml  r
   r   r   zconfig.yamlNr   r   s     r   &test_parse_file_ref_with_spaces_aroundz4TestParseRefs.test_parse_file_ref_with_spaces_aroundU   s3    124yA~~Awv-///r   c                B    t        d      }t        d |D              sJ y)u)   미지원 @ 태그는 파싱하지 않음u*   @unknown:something @email이나 다른 것c              3  *   K   | ]  }|d    dv   yw)r   )r   r   r   r!   N ).0r(   s     r   	<genexpr>zATestParseRefs.test_parse_unknown_at_not_parsed.<locals>.<genexpr>_   s     S1V9 DDSs   N)r   allr   s     r    test_parse_unknown_at_not_parsedz.TestParseRefs.test_parse_unknown_at_not_parsed[   s!    FGSdSSSSr   NreturnNone)__name__
__module____qualname____doc__r   r   r   r   r"   r*   r,   r/   r1   r3   r:   r6   r   r   r   r      s?    45O+)'

E0Tr   r   c                      e Zd ZdZddZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZddZddZddZddZy)TestResolveRefsu,   resolve_refs() — @ 참조 치환 테스트c                v    |dz  }|j                  dd       t        d| d|      }d|v sJ d	| d|vsJ y
)u(   @file:path를 파일 내용으로 치환z	hello.txtzhello content
utf-8encodingzbefore @file:z afterbase_dirzhello content@file:N
write_textr   r   tmp_pathfresults       r   test_resolve_file_ref_contentz-TestResolveRefs.test_resolve_file_ref_contente   sW    {"	&9aS7(K&(((s&!///r   c                2    t        d      }d|v sJ d|v sJ y)u;   존재하지 않는 파일은 not found 코멘트로 치환z @file:/nonexistent/path/file.txt	not foundNr   r   rP   s     r   test_resolve_file_not_foundz+TestResolveRefs.test_resolve_file_not_foundn   s)    @Af$$$1V;;;r   c                    |dz  }|j                  ddz         t        d| |      }d|v sd|v st        |      dk  sJ y	y	y	)
u7   50KB 초과 파일은 not found 또는 잘라서 처리zbig.txt   xi   rJ   rH   z	too largerS   i  N)write_bytesr   r   )r   rN   big_filerP   s       r   test_resolve_file_size_limitz,TestResolveRefs.test_resolve_file_size_limitt   s[    i'TY/0xj1HEf$v(=VuATTTAT(=$r   c                    |dz  }|dz  }|j                  dd       |j                  dd       t        d| d|       }d|v sJ d|v sJ y	)
u$   여러 @file 참조를 모두 치환za.txtzb.txtz	content ArE   rF   z	content BrJ   z and @file:NrK   )r   rN   f1f2rP   s        r   test_resolve_multiple_file_refsz/TestResolveRefs.test_resolve_multiple_file_refs|   si    
kG4
kG4rd+bT:;f$$$f$$$r   c                    |dz  }|j                          |dz  j                  dd       |dz  j                  dd       t        d| |	      }d|v sd|v sJ y
y
)u3   @folder:path 치환 — 파일 목록/내용 포함mydirzfile1.pyzprint('one')rE   rF   zfile2.pyzprint('two')@folder:rH   N)mkdirrL   r   )r   rN   subrP   s       r   test_resolve_folder_refz'TestResolveRefs.test_resolve_folder_ref   ss     			z	%%nw%G	z	%%nw%G.BV#zV';;;';#r   c                    |dz  }|j                          t        d      D ]  }|d| dz  j                  d| d       ! t        d|       t	        fd	t        d      D              }|d
k  sJ y)u'   @folder는 최대 5개 파일만 포함big_dir   r   z.py# filerE   rF   rb   c              3  2   K   | ]  }d | v sd  yw)ri   r
   Nr6   )r7   irP   s     r   r8   zBTestResolveRefs.test_resolve_folder_max_5_files.<locals>.<genexpr>   s     Gq&0FGs      N)rc   rangerL   r   sum)r   rN   rd   rk   
file_countrP   s        @r   test_resolve_folder_max_5_filesz/TestResolveRefs.test_resolve_folder_max_5_files   s    "		q 	MAT!C= ,,vaS\G,L	M./GE!HGG
Qr   c                `    t        d      }d|v rd|v sJ t        |      t        d      kD  sJ y)uF   @diff 치환 — git diff 출력 포함 (git 없어도 에러 안 남)zcheck @diff herecheckhereNr   r   )r   rN   rP   s      r   test_resolve_diff_refz%TestResolveRefs.test_resolve_diff_ref   s<     01& Vv%5556{S!34444r   c                L    t        d      }t        |      t        d      kD  sJ y)uQ   @staged 치환 — git staged 파일 목록 포함 (git 없어도 에러 안 남)zstaged: @stagedNrt   rU   s     r   test_resolve_staged_refz'TestResolveRefs.test_resolve_staged_ref   s%    /06{S!23333r   c                Z    |dz  }|j                  dd       t        d|      }d|v sJ y)u*   base_dir 기준으로 상대 경로 해석zrel.txtzrelative contentrE   rF   z@file:rel.txtrH   NrK   rM   s       r   #test_resolve_base_dir_relative_pathz3TestResolveRefs.test_resolve_base_dir_relative_path   s7    y 	'':oA!V+++r   c                ,    d}t        |      }||k(  sJ y)u-   @ 참조 없으면 원본 텍스트 그대로zhello world, no refsNrT   )r   r'   rP   s      r   test_resolve_no_refs_unchangedz.TestResolveRefs.test_resolve_no_refs_unchanged   s    %d#~~r   c                   g }t        d      D ]0  }|d| dz  }|j                  ddz         |j                  |       2 dj                  d |D              }t	        ||      }t        |j                  d	            d
k  sJ y)u    컨텍스트 합계 100KB 제한   largez.txt   yi x   c              3  &   K   | ]	  }d |   yw)rJ   Nr6   )r7   rO   s     r   r8   z@TestResolveRefs.test_resolve_total_size_limit.<locals>.<genexpr>   s     4&4   rH   rE   i  N)rm   rY   appendjoinr   r   encode)r   rN   filesrk   rO   r'   rP   s          r   test_resolve_total_size_limitz-TestResolveRefs.test_resolve_total_size_limit   s    q 	AU1#T?*AMM$),-LLO	 xx4e44dX66==)*Z777r   c                l    |dz  }|j                  dd       t        dt        |            }d|v sJ y)u!   base_dir를 Path 객체로 전달zpath_test.txtzpath object contentrE   rF   z@file:path_test.txtrH   N)rL   r   r   rM   s       r   $test_resolve_base_dir_as_path_objectz4TestResolveRefs.test_resolve_base_dir_as_path_object   s<    &	*W=3d8nM$...r   c                    |dz  }|j                          dj                  d t        d      D              }|dz  j                  |d       t	        d| |	      }t        d      D cg c]	  }d
| |v  }}t        |      dk  sJ yc c}w )u"   폴더 내 파일은 200줄 제한limitdir
c              3  &   K   | ]	  }d |   yw)line Nr6   )r7   rk   s     r   r8   zCTestResolveRefs.test_resolve_file_ref_line_limit.<locals>.<genexpr>   s     :!E!+:r   i,  zbig.pyrE   rF   rb   rH   r      N)rc   r   rm   rL   r   rn   )r   rN   rd   linesrP   rk   included_liness          r    test_resolve_file_ref_line_limitz0TestResolveRefs.test_resolve_file_ref_line_limit   s    #				:uSz::	x##EG#<.B9>sDAE!+/DD>"c))) Es   *Bc                &    t        d      }d|v sJ y)u1   존재하지 않는 폴더는 not found 메시지z@folder:/nonexistent/dir/rS   NrT   rU   s     r   test_resolve_folder_not_foundz-TestResolveRefs.test_resolve_folder_not_found   s    9:f$$$r   N)rN   r   r<   r=   r;   )r>   r?   r@   rA   rQ   rV   r[   r_   re   rp   ru   rw   ry   r{   r   r   r   r   r6   r   r   rC   rC   b   sL    60<U%<	54,
8/
*%r   rC   )rA   
__future__r   
subprocesssystempfilepathlibr   pytestr   insertstr__file__parentutils.context_refsr   r   r   rC   r6   r   r   <module>r      si   
 #  
    3tH~,,33::; < 7JT JTZw% w%r   