
    (<i                         d 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  G d d      Z G d d      Z G d	 d
      Zy)u(   utils/fuzzy_match.py 테스트 스위트    N)Path)fuzzy_matchlevenshtein_distancesimilarity_ratioc                   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)TestLevenshteinDistanceu    levenshtein_distance() 테스트Nc                 &    t        dd      dk(  sJ y)u   동일 문자열 → 거리 0hellor   Nr   selfs    M/home/jay/workspace/.worktrees/task-2057-dev2/utils/tests/test_fuzzy_match.pytest_identical_stringsz.TestLevenshteinDistance.test_identical_strings   s    #GW5:::    c                 &    t        dd      dk(  sJ y)u   빈 문자열 간 거리 r   Nr   r   s    r   test_empty_stringsz*TestLevenshteinDistance.test_empty_strings   s    #B+q000r   c                 H    t        dd      dk(  sJ t        dd      dk(  sJ y)u   한쪽이 빈 문자열abcr      xyzNr   r   s    r   test_one_emptyz&TestLevenshteinDistance.test_one_empty   s,    #E2.!333#B.!333r   c                 &    t        dd      dk(  sJ y)u   1자 삽입catcats   Nr   r   s    r   test_single_insertionz-TestLevenshteinDistance.test_single_insertion"   s    #E62a777r   c                 &    t        dd      dk(  sJ y)u   1자 삭제r   r   r   Nr   r   s    r   test_single_deletionz,TestLevenshteinDistance.test_single_deletion&   s    #FE2a777r   c                 &    t        dd      dk(  sJ y)u   1자 치환r   batr   Nr   r   s    r   test_single_substitutionz0TestLevenshteinDistance.test_single_substitution*       #E51Q666r   c                 &    t        dd      dk(  sJ y)u   복합 편집kittensittingr   Nr   r   s    r   test_complex_editz)TestLevenshteinDistance.test_complex_edit.   s    #Hi8A===r   c                 &    t        dd      dk(  sJ y)u   완전히 다른 문자열r   r   r   Nr   r   s    r   test_completely_differentz1TestLevenshteinDistance.test_completely_different2   r#   r   c                 :    t        dd      t        dd      k(  sJ y)u   대칭성: d(a,b) == d(b,a)saturdaysundayNr   r   s    r   test_symmetryz%TestLevenshteinDistance.test_symmetry6   s(    #J9=Qj>
 
 	
 
r   c                 @    t        dd      }t        |t              sJ y)u   반환 타입은 intfoobarN)r   
isinstanceintr   results     r   test_returns_intz(TestLevenshteinDistance.test_returns_int<   s    %eU3&#&&&r   c                 &    t        dd      dk\  sJ y)u   항상 비음수testtextr   Nr   r   s    r   test_non_negativez)TestLevenshteinDistance.test_non_negativeA   s    #FF3q888r   returnN)__name__
__module____qualname____doc__r   r   r   r   r   r"   r'   r)   r-   r5   r9    r   r   r   r      s<    *;14
887>7
'
9r   r   c                   P    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y)TestSimilarityRatiou   similarity_ratio() 테스트Nc                 &    t        dd      dk(  sJ y)u   동일 문자열 → 1.0r
         ?Nr   r   s    r   r   z*TestSimilarityRatio.test_identical_stringsI   s    1S888r   c                 &    t        dd      dk(  sJ y)u   둘 다 빈 문자열 → 1.0r   rD   NrE   r   s    r   r   z&TestSimilarityRatio.test_empty_stringsM   s    B'3...r   c                 <    t        dd      }d|cxk  rdk  sJ  J y)u/   완전히 다른 문자열 → 낮은 유사도r   r                 ?NrE   r   ratios     r   r)   z-TestSimilarityRatio.test_completely_differentQ   s'     .e!c!!!!!r   c                 <    t        dd      }d|cxk  rdk  sJ  J y)u   결과는 0.0~1.0 범위r   carrH   rD   NrE   rJ   s     r   test_range_0_to_1z%TestSimilarityRatio.test_range_0_to_1V   s'     .e"s"""""r   c                 *    t        dd      }|dkD  sJ y)u'   비슷한 문자열은 높은 유사도r
   helogffffff?NrE   rJ   s     r   test_high_similarityz(TestSimilarityRatio.test_high_similarity[   s     &1s{{r   c                 @    t        dd      }t        |t              sJ y)u   반환 타입은 floatr/   r0   N)r   r1   floatr3   s     r   test_returns_floatz&TestSimilarityRatio.test_returns_float`   s    !%/&%(((r   c                 H    t        dd      dk(  sJ t        dd      dk(  sJ y)u   한쪽 빈 문자열 → 0.0r
   r   rH   worldNrE   r   s    r   test_one_empty_stringz)TestSimilarityRatio.test_one_empty_stringe   s,    ,333G,333r   c                 :    t        dd      t        dd      k(  sJ y)u#   대칭성: ratio(a,b) == ratio(b,a)pythontyphonNrE   r   s    r   r-   z!TestSimilarityRatio.test_symmetryj   s(    (37Gh8
 
 	
 
r   r:   )r<   r=   r>   r?   r   r   r)   rN   rQ   rT   rW   r-   r@   r   r   rB   rB   F   s-    &9/"
#

)
4

r   rB   c                   x    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y)TestFuzzyMatchu   fuzzy_match() 테스트Nc                 l    t        dg d      }t        |      dk\  sJ |d   \  }}|dk(  sJ |dk(  sJ y)u+   정확히 일치하는 항목은 1.0 점수r
   )r
   rV   r/   r   r   rD   Nr   len)r   results	best_name
best_scores       r   test_exact_matchzTestFuzzyMatch.test_exact_matcht   sK    g'@A7|q    '
	:G###S   r   c                     t        dg d      }t        |t              sJ |D ]M  }t        |t              sJ t	        |      dk(  sJ |\  }}t        |t
              sJ t        |t              rMJ  y)u&   반환 타입: list[tuple[str, float]]r   )r   rM   r!      N)r   r1   listtupler_   strrS   )r   r`   itemnamescores        r   test_returns_list_of_tuplesz*TestFuzzyMatch.test_returns_list_of_tuples|   sw    e%:;'4((( 	,DdE***t9>!>KD%dC(((eU+++	,r   c                 h    g d}t        d|d      }|D cg c]  \  }}|	 }}}d|vsJ yc c}}w )u   threshold 이하 결과 제외)r
   rV   completely_different_xyz_abcr
   g?	thresholdrn   Nr   )r   
candidatesr`   rj   _namess         r   test_threshold_filteringz'TestFuzzyMatch.test_threshold_filtering   s?    G
gzSA%,-'$---U::: .s   .c                     t        d      D cg c]  }d| 	 }}t        d|d      }t        |      dk  sJ yc c}w )u   max_results 개수 제한   item_item_5r   )max_resultsNranger   r_   r   irr   r`   s       r   test_max_results_limitz%TestFuzzyMatch.test_max_results_limit   sD    +095aaSk5
5h
B7|q    6s   ;c                 x    t        dg d      }|D cg c]  \  }}|	 }}}|t        |d      k(  sJ yc c}}w )u$   결과는 점수 내림차순 정렬rY   )rY   rZ   javaythonT)reverseN)r   sorted)r   r`   rs   rk   scoress        r   test_sorted_by_score_descendingz.TestFuzzyMatch.test_sorted_by_score_descending   s@    h(MN(/0HAu%005555 1s   6c                 *    t        dg       }|g k(  sJ y)u    빈 후보 목록 → 빈 결과r
   Nrq   r   r`   s     r   test_empty_candidatesz$TestFuzzyMatch.test_empty_candidates   s    gr*"}}r   c                 2    t        dg dd      }|g k(  sJ y)u%   threshold 이상 없으면 빈 결과r
   )r   r   qqqg?ro   Nrq   r   s     r   test_no_matches_above_thresholdz.TestFuzzyMatch.test_no_matches_above_threshold   s    g'<L"}}r   c                 T    t        dg d      }|D ]  \  }}d|cxk  rdk  rJ  J  y)u   모든 점수는 0.0~1.0r7   )r7   r8   testingbestrH   rD   Nrq   )r   r`   rs   rk   s       r   test_score_between_0_and_1z)TestFuzzyMatch.test_score_between_0_and_1   s;    f&IJ 	'HAu%&3&&&&&	'r   c                 `    t        dg d      }|D cg c]  \  }}|	 }}}d|v sJ yc c}}w )u"   기본 threshold=0.6 동작 확인	calculate)r   calculationcalcNrq   )r   r`   rj   rs   rt   s        r   test_default_thresholdz%TestFuzzyMatch.test_default_threshold   s9    k+OP%,-'$--e### .s   *c                     t        d      D cg c]	  }d|dd }}t        d|      }t        |      dk  sJ yc c}w )u   기본 max_results=5 제한d   file_03dz.pyzfile_005.py   Nr{   r}   s       r   test_default_max_resultsz'TestFuzzyMatch.test_default_max_results   sG    27*=QaWC(=
=mZ87|q    >s   ;c                 :    t        dddg      }|d   d   dk(  sJ y)u1   대소문자 구별 여부 확인 (기본 동작)r
   HELLOr   Nrq   )r   results_lowers     r   test_case_sensitivityz$TestFuzzyMatch.test_case_sensitivity   s+    #Ggw-?@Q"g---r   c                 D    t        dg d      }t        |t              sJ y)u.   부분 일치도 threshold 이상이면 포함r   )r   
calculator	calibrateN)r   r1   rf   r   s     r   test_partial_match_includedz*TestFuzzyMatch.test_partial_match_included   s    f&NO'4(((r   c                 v    t        ddgd      }t        |      dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ y)u   후보 1개r
   rI   ro   r   r   rD   Nr^   r   s     r   test_single_candidatez$TestFuzzyMatch.test_single_candidate   sP    gyC@7|q   qz!}'''qz!}###r   r:   )r<   r=   r>   r?   rc   rl   ru   r   r   r   r   r   r   r   r   r   r   r@   r   r   r\   r\   q   sF    !!	,;!6

'$!.)$r   r\   )r?   syspathlibr   pytestpathinsertrh   __file__parentutils.fuzzy_matchr   r   r   r   rB   r\   r@   r   r   <module>r      sj    . 
   3tH~,,33::; < 19 19h(
 (
VX$ X$r   