
    ^i*                     b   d Z ddlZddlmc m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mZmZ dZdZdZdZ G d	 d
      Z G d d      Z G d d      Zedk(  r e
j:                  edg       yy)u/   utils/patch_parser.py 테스트 스위트 (TDD)    N)Path)apply_patchgenerate_patchparse_patchverify_patchzS--- a/hello.py
+++ b/hello.py
@@ -1,3 +1,3 @@
 line1
-line2
+line2_modified
 line3
z--- a/multi.py
+++ b/multi.py
@@ -1,4 +1,4 @@
 alpha
-beta
+beta_new
 gamma
 delta
@@ -10,4 +10,4 @@
 echo
-foxtrot
+foxtrot_new
 golf
 hotel
zH--- a/add.py
+++ b/add.py
@@ -1,2 +1,4 @@
 first
 second
+third
+fourth
zJ--- a/del.py
+++ b/del.py
@@ -1,4 +1,2 @@
 keep1
-remove1
-remove2
 keep2
c                   R    e 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)TestParsePatchu   parse_patch() 단위 테스트c                 B   t        t              }t        |      }d}||k(  }|st        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  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u.   단순 패치 파싱 — 파일 엔트리 1개   ==)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenresultpy0py1py3py6assert %(py8)spy8Nr   SIMPLE_PATCHr   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)selfr   @py_assert2@py_assert5@py_assert4@py_format7@py_format9s          4/home/jay/workspace/utils/tests/test_patch_parser.py(test_simple_patch_returns_one_file_entryz7TestParsePatch.test_simple_patch_returns_one_file_entryJ   s    \*6{a{a{ass66{a    c                 .   t        t              }|d   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   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}}y	)u!   old_file / new_file 경로 파싱r   old_file
a/hello.pyr   z%(py1)s == %(py4)sr   py4assert %(py6)sr   Nnew_file
b/hello.pyr   r   r   r   r   r   r    )r!   r   @py_assert0@py_assert3r"   @py_format5r%   s          r'   test_simple_patch_file_namesz+TestParsePatch.test_simple_patch_file_namesO   s    \*ay$44$4444$444$4444444444ay$44$4444$444$4444444444r)   c                    t        t              }|d   d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}x}}y
)u   단순 패치 hunk 1개r   hunksr   r   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   r   py2r/   py7assert %(py9)spy9Nr   r!   r   @py_assert1r5   @py_assert6r#   @py_format8@py_format10s           r'   test_simple_patch_hunk_countz+TestParsePatch.test_simple_patch_hunk_countU   s    \*!9W%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!+++++++r)   c                 4   t        t              d   d   d   }|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   }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   }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   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}y
)u?   hunk 헤더 파싱 (old_start, old_count, new_start, new_count)r   r9   	old_startr   r   r-   r.   r0   r   N	old_count   	new_start	new_countr3   r!   hunkr4   r5   r"   r6   r%   s          r'   test_simple_patch_hunk_headerz,TestParsePatch.test_simple_patch_hunk_headerZ   sc   <(+G4Q7K %A% A%%%% A%%% %%%A%%%%%%%K %A% A%%%% A%%% %%%A%%%%%%%K %A% A%%%% A%%% %%%A%%%%%%%K %A% A%%%% A%%% %%%A%%%%%%%r)   c                 .   t        t              d   d   d   }d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}y
)u   hunk lines 내용 확인r   r9   z line1linesin)z%(py1)s in %(py4)sr.   r0   r   Nz-line2z+line2_modifiedr3   rL   s          r'   test_simple_patch_hunk_linesz+TestParsePatch.test_simple_patch_hunk_linesb   s   <(+G4Q7(4=(x=((((x=(((x(((=((((((((4=(x=((((x=(((x(((=((((((( 1DM1 M1111 M111 111M1111111r)   c                    t        t              }|d   d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}x}}y
)u    여러 hunk 파싱 — hunk 2개r   r9      r   r:   r   r;   r>   r?   N)r   MULTI_HUNK_PATCHr   r   r   r   r   r   r   r   r    r@   s           r'   test_multi_hunk_patch_countz*TestParsePatch.test_multi_hunk_patch_counti   s    -.!9W%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!+++++++r)   c                 4   t        t              d   d   d   }|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   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}y)u   두 번째 hunk 헤더 파싱r   r9   r   rG   
   r   r-   r.   r0   r   NrJ   )r   rV   r   r   r   r   r    rL   s          r'   "test_multi_hunk_second_hunk_headerz1TestParsePatch.test_multi_hunk_second_hunk_headern   s    +,Q/8;K &B& B&&&& B&&& &&&B&&&&&&&K &B& B&&&& B&&& &&&B&&&&&&&r)   c                 f   t        d      }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   z%(py0)s == %(py3)sr   r   r   assert %(py5)spy5N	r   r   r   r   r   r   r   r   r    r!   r   r"   rA   @py_format4@py_format6s         r'   #test_empty_patch_returns_empty_listz2TestParsePatch.test_empty_patch_returns_empty_listt   sc    Rv|vvvr)   c                 f   t        d      }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)   공백만 있는 패치 → 빈 리스트z   

   r   r]   r   r^   r_   r`   Nra   rb   s         r'   -test_whitespace_only_patch_returns_empty_listz<TestParsePatch.test_whitespace_only_patch_returns_empty_listy   sd    \*v|vvvr)   c                 4   t        t              d   d   d   }|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   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}y
)u&   추가 라인 패치 hunk count 확인r   r9   rH   rU   r   r-   r.   r0   r   NrK      )r   ADDED_LINES_PATCHr   r   r   r   r    rL   s          r'   "test_added_lines_patch_hunk_countsz1TestParsePatch.test_added_lines_patch_hunk_counts~   s    ,-a09!<K %A% A%%%% A%%% %%%A%%%%%%%K %A% A%%%% A%%% %%%A%%%%%%%r)   c                 4   t        t              d   d   d   }|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   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}y
)u&   삭제 라인 패치 hunk count 확인r   r9   rH   ri   r   r-   r.   r0   r   NrK   rU   )r   DELETED_LINES_PATCHr   r   r   r   r    rL   s          r'   $test_deleted_lines_patch_hunk_countsz3TestParsePatch.test_deleted_lines_patch_hunk_counts   s    ./27;A>K %A% A%%%% A%%% %%%A%%%%%%%K %A% A%%%% A%%% %%%A%%%%%%%r)   N)__name__
__module____qualname____doc__r(   r7   rE   rN   rS   rW   rZ   re   rg   rk   rn    r)   r'   r	   r	   G   s<    ( 
5,
&2,
'

&&r)   r	   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestGeneratePatchu!   generate_patch() 단위 테스트c                    t        dd      }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}}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$   unified diff --- / +++ 헤더 생성zline1
line2
zline1
line2_new
z---rQ   z%(py1)s in %(py3)spatchr   r   r_   r`   Nz+++	r   r   r   r   r   r   r   r   r    r!   rx   r4   r"   rc   rd   s         r'   *test_generate_produces_unified_diff_headerz<TestGeneratePatch.test_generate_produces_unified_diff_header   s    /1EFu~uuu~uur)   c                    t        dddd      }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}}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%   fromfile / tofile 파라미터 반영zold
znew
zsrc.pyzdst.pyfromfiletofilerQ   rw   rx   ry   r_   r`   Nrz   r{   s         r'   #test_generate_with_custom_filenamesz5TestGeneratePatch.test_generate_with_custom_filenames   s    w(8T x5    x5   x      5   5        x5    x5   x      5   5       r)   c                 h   t        dd      }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   동일 내용 → 빈 패치zsame
r\   r   r]   rx   r^   r_   r`   N)	r   r   r   r   r   r   r   r   r    )r!   rx   r"   rA   rc   rd   s         r'   +test_generate_identical_content_empty_patchz=TestGeneratePatch.test_generate_identical_content_empty_patch   sf    x2u{uuur)   c                    t        dd      }d}||k7  }|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}}t        |      }t        |      }d}||k\  }|st        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  }	dd|	iz  }
t        t        j                  |
            d
x}x}}y
)u0   생성된 패치가 parse_patch로 파싱 가능za
b
c
z
a
b_new
c
r\   )!=)z%(py0)s != %(py3)srx   r^   r_   r`   Nr   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr   r   r   r   r   )r   r   r   r   r   r   r   r   r    r   r   )r!   rx   r"   rA   rc   rd   r   r#   r$   r%   r&   s              r'   test_generate_patch_parseablez/TestGeneratePatch.test_generate_patch_parseable   s    {O<u{uuuU#6{a{a{ass66{ar)   N)ro   rp   rq   rr   r|   r   r   r   rs   r)   r'   ru   ru      s    +!
 r)   ru   c                   j    e 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)TestApplyPatchu/   apply_patch() / verify_patch() 통합 테스트c                 z   |dz  }|j                  d       t        dddd      }t        ||      }d}||u }|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}}|j                  } |       }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}x}	x}}
y)u   단순 패치 적용 성공zhello.pyline1
line2
line3
zline1
line2_modified
line3
r,   r2   r~   Tisz%(py0)s is %(py3)sr   r^   r_   r`   Nr   )zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.read_text
}()
} == %(py7)stargetr;   r>   r?   
write_textr   r   r   r   r   r   r   r   r   r    	read_text)r!   tmp_pathr   rx   r   r"   rA   rc   rd   r5   rB   r#   rC   rD   s                 r'   test_apply_simple_patch_successz.TestApplyPatch.test_apply_simple_patch_success   s%   J&1268Xco  yE  FVU+v~vvvE!E%EE!%EEEEE!%EEEEEEEvEEEvEEEEEE!EEE%EEEEEEEEr)   c                    |dz  }d}d}|j                  |       t        ||      }t        ||       |j                  } |       }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      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}x}}y)u-   패치 적용 후 파일 내용 변경 확인zfile.txtzalpha
beta
gamma
zalpha
beta_changed
gamma
r   zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.read_text
}()
} == %(py6)sr   modifiedr   r<   r/   r   r   r   N)r   r   r   r   r   r   r   r   r   r   r   r    )r!   r   r   originalr   rx   rA   r5   r#   r%   r&   s              r'   test_apply_patch_modifies_filez-TestApplyPatch.test_apply_patch_modifies_file   s    J&)1(#x2FE"-!-!X----!X------v---v------!------X---X-------r)   c                    |dz  }|j                  d       t        |t              }d}||u }|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'   컨텍스트 불일치 시 False 반환zmismatch.pycompletely
different
content
Fr   r   r   r^   r_   r`   N)r   r   r   r   r   r   r   r   r   r   r    r!   r   r   r   r"   rA   rc   rd   s           r'   /test_apply_patch_context_mismatch_returns_falsez>TestApplyPatch.test_apply_patch_context_mismatch_returns_false   s    M)<=V\2vvvvr)   c                 p   |dz  }d}|j                  |       t        |t               |j                  } |       }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      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}x}}y
)u&   패치 실패 시 원본 파일 유지zsafe.pyr   r   r   r   r   r   r   r   N)r   r   r   r   r   r   r   r   r   r   r   r    )	r!   r   r   r   rA   r5   r#   r%   r&   s	            r'   -test_apply_patch_file_not_modified_on_failurez<TestApplyPatch.test_apply_patch_file_not_modified_on_failure   s    I%5(#FL)-!-!X----!X------v---v------!------X---X-------r)   c                 t   t        |dz  t              }d}||u }|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	)
u5   존재하지 않는 파일에 패치 시 False 반환zghost.pyFr   r   r   r^   r_   r`   N)
r   r   r   r   r   r   r   r   r   r    )r!   r   r   r"   rA   rc   rd   s          r'   /test_apply_patch_nonexistent_file_returns_falsez>TestApplyPatch.test_apply_patch_nonexistent_file_returns_false   sk    X
2LAvvvvr)   c                    |dz  }d}|j                  |       t        |d      }t        t        |      |      }d}||u }|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-   문자열 경로로 apply_patch 호출 가능zstr_path.txtr   line1
line2_mod
line3
Tr   r   r   r^   r_   r`   N)r   r   r   strr   r   r   r   r   r   r   r    )
r!   r   r   r   rx   r   r"   rA   rc   rd   s
             r'   $test_apply_patch_accepts_string_pathz3TestApplyPatch.test_apply_patch_accepts_string_path   s    N**(#x)DES[%0v~vvvr)   c                    d}d}|dz  }|j                  |       t        ||      }t        ||      }d}||u }|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}}|j                  } |       }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      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}x}}y)u.   generate_patch → apply_patch 라운드트립zfoo
bar
baz
zfoo
bar_updated
baz
qux
zroundtrip.txtTr   r   r   r^   r_   r`   Nr   r   r   r   r   r   r   r   )r!   r   r   r   r   rx   r   r"   rA   rc   rd   r5   r#   r%   r&   s                  r'   "test_roundtrip_generate_then_applyz1TestApplyPatch.test_roundtrip_generate_then_apply   s*   $1O+(#x2VU+v~vvv-!-!X----!X------v---v------!------X---X-------r)   c                    |dz  }d}|j                  |       t        |d      }t        ||      }d}||u }|s7t        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d	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      d
z  }dd|iz  }	t        t        j                  |	            dx}x}}y)u0   verify_patch — 적용 가능한 패치에 Truez
verify.txtr   r   Tr   z9%(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
} is %(py7)sr   r   rx   r   r   r<   r/   r=   r>   r?   N)r   r   r   r   r   r   r   r   r   r   r    )
r!   r   r   r   rx   r5   rB   r#   rC   rD   s
             r'   (test_verify_patch_returns_true_for_validz7TestApplyPatch.test_verify_patch_returns_true_for_valid   s    L(*(#x)DEFE*2d2*d2222*d222222|222|222222F222F222222E222E222*222d2222222r)   c                    |dz  }|j                  d       t        |t              }d}||u }|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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}y)u0   verify_patch — 컨텍스트 불일치에 Falsezno_match.pyr   Fr   r   r   r   r   r   r>   r?   N)r   r   r   r   r   r   r   r   r   r   r    )r!   r   r   r5   rB   r#   rC   rD   s           r'   ,test_verify_patch_returns_false_for_mismatchz;TestApplyPatch.test_verify_patch_returns_false_for_mismatch   s    M)<=FL1:U:1U::::1U::::::|:::|::::::F:::F::::::L:::L:::1:::U:::::::r)   c                    |dz  }d}|j                  |       t        |d      }t        ||       |j                  } |       }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      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}x}}y)u3   verify_patch 호출 후 파일 내용 변경 없음zunchanged.txtr   r   r   r   r   r   r   r   r   N)r   r   r   r   r   r   r   r   r   r   r   r    )
r!   r   r   r   rx   rA   r5   r#   r%   r&   s
             r'   &test_verify_patch_does_not_modify_filez5TestApplyPatch.test_verify_patch_does_not_modify_file   s    O+*(#x)DEVU#-!-!X----!X------v---v------!------X---X-------r)   c                    |dz  }|j                  d       t        |d      }d}||u }|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)u0   빈 패치(변경 없음) 적용 시 True 반환zno_change.txtzcontent
r\   Tr   r   r   r^   r_   r`   N)
r   r   r   r   r   r   r   r   r   r    r   s           r'   #test_apply_empty_patch_returns_truez2TestApplyPatch.test_apply_empty_patch_returns_true  s~    O++&VR(v~vvvr)   c                    |dz  }d}d}|j                  |       t        ||      }t        ||      }d}||u }|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}}|j                  } |       }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      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}x}}y)u   라인 추가 패치 적용zadd.txtzfirst
second
zfirst
second
third
fourth
Tr   r   r   r^   r_   r`   Nr   r   r   r   r   r   r   r   r!   r   r   r   r   rx   r   r"   rA   rc   rd   r5   r#   r%   r&   s                  r'   test_apply_added_lines_patchz+TestApplyPatch.test_apply_added_lines_patch  s*   I%$3(#x2VU+v~vvv-!-!X----!X------v---v------!------X---X-------r)   c                    |dz  }d}d}|j                  |       t        ||      }t        ||      }d}||u }|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}}|j                  } |       }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      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}x}}y)u   라인 삭제 패치 적용zdel.txtzkeep1
remove1
remove2
keep2
zkeep1
keep2
Tr   r   r   r^   r_   r`   Nr   r   r   r   r   r   r   r   r   s                  r'   test_apply_deleted_lines_patchz-TestApplyPatch.test_apply_deleted_lines_patch  s*   I%5#(#x2VU+v~vvv-!-!X----!X------v---v------!------X---X-------r)   c           	         d}||z  }t        |t              }d}||u }|sSt        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                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}x}x}}y)u1   존재하지 않는 파일 verify_patch → Falsezmissing.txtFr   )zF%(py7)s
{%(py7)s = %(py0)s((%(py1)s / %(py3)s), %(py5)s)
} is %(py10)sr   r   r   )r   r   r   r`   r=   py10zassert %(py12)spy12N)
r   r   r   r   r   r   r   r   r   r    )	r!   r   r"   r$   rB   @py_assert9@py_assert8@py_format11@py_format13s	            r'   0test_verify_patch_nonexistent_file_returns_falsez?TestApplyPatch.test_verify_patch_nonexistent_file_returns_false#  s    '4LH}4L|4lCLuLCuLLLLCuLLLLLL|LLL|LLLLLLHLLLHLLL}LLLLLLlLLLlLLLCLLLuLLLLLLLLr)   c                    |dz  }d}d}|j                  |d       t        ||      }t        ||      }d}||u }|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}}|j                  }d} ||      }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      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}x}x}}y)u+   유니코드 내용 파일에 패치 적용zunicode.txtu   안녕
세계
끝
u   안녕
세상
끝
zutf-8)encodingTr   r   r   r^   r_   r`   Nr   )zX%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.read_text
}(encoding=%(py4)s)
} == %(py8)sr   r   )r   r<   r/   r   r   zassert %(py10)sr   r   )r!   r   r   r   r   rx   r   r"   rA   rc   rd   r5   r#   @py_assert7r&   r   s                   r'   $test_apply_multiline_unicode_contentz3TestApplyPatch.test_apply_multiline_unicode_content'  sD   M)**(W5x2VU+v~vvv==1=1X====1X======v===v=========1======X===X========r)   N)ro   rp   rq   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rs   r)   r'   r   r      sR    9F..
	.3;.	.	.M	>r)   r   __main__z-v)rr   builtinsr   _pytest.assertion.rewrite	assertionrewriter   syspathlibr   pytestpathinsertr   __file__parentutils.patch_parserr   r   r   r   r   rV   rj   rm   r	   ru   r   ro   mainrs   r)   r'   <module>r      s    5   
   3tH~,,33::; < U U "   A& A&R   B> >D zFKK4 ! r)   