
    Li                        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  G d d      Z G d d      Z G d	 d
      Zy)u$   utils/clarify.py 테스트 스위트    N)Path)AmbiguityReportanalyze_ambiguityc                   (    e Zd ZdZd Zd Zd Zd Zy)TestAmbiguityReportu*   AmbiguityReport dataclass 구조 테스트c                    t        dddgdg      }|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                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|j                  }ddg}||k(  }|st        j                  d|fd||f      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}}|j                  }dg}||k(  }|st        j                  d|fd||f      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<   score, missing_dimensions, suggested_questions 필드 존재   WhatWhyu   무엇을 원하시나요?)scoremissing_dimensionssuggested_questions==z-%(py2)s
{%(py2)s = %(py0)s.score
} == %(py5)sreportpy0py2py5assert %(py7)spy7Nz:%(py2)s
{%(py2)s = %(py0)s.missing_dimensions
} == %(py5)s)z;%(py2)s
{%(py2)s = %(py0)s.suggested_questions
} == %(py5)s)r   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   r   selfr   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s          //home/jay/workspace/utils/tests/test_clarify.py"test_dataclass_has_required_fieldsz6TestAmbiguityReport.test_dataclass_has_required_fields   sz     &!= >

 || q |q    |q      v   v   |   q       ((;VUO;(O;;;;(O;;;;;;v;;;v;;;(;;;O;;;;;;;))K.J-KK)-KKKKK)-KKKKKKKvKKKvKKK)KKK-KKKKKKKK    c                 F   t        d      }|j                  }t        t        f}t	        ||      }|sd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                  |      t        j                  |      dz  }t        t        j                  |            dx}x}}y)u   score는 숫자형   뭔가 해줘zPassert %(py7)s
{%(py7)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.score
}, %(py5)s)
}
isinstancer   )r   py1py3r   r   N)r   r   intfloatr.   r   r   r   r   r   r    r!   )r#   r   @py_assert2r%   @py_assert6r(   s         r)   test_score_type_is_int_or_floatz3TestAmbiguityReport.test_score_type_is_int_or_float   s    "?3 ,,5e5z,55555555z555z555555&555&555,5555555555555r+   c                    t        d      }|j                  }t        |t              }|sd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                  |      dz  }t        t        j                  |            dx}}y)u   missing_dimensions는 리스트r-   z]assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.missing_dimensions
}, %(py4)s)
}r.   r   listr   r/   r0   py4py6N)r   r   r.   r7   r   r   r   r   r   r    r!   r#   r   r3   @py_assert5@py_format7s        r)   test_missing_dimensions_is_listz3TestAmbiguityReport.test_missing_dimensions_is_list!   s    "?3 33:z3T::::::::z:::z::::::&:::&:::3::::::T:::T::::::::::r+   c                    t        d      }|j                  }t        |t              }|sd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                  |      dz  }t        t        j                  |            dx}}y)u    suggested_questions는 리스트r-   z^assert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.suggested_questions
}, %(py4)s)
}r.   r   r7   r8   N)r   r   r.   r7   r   r   r   r   r   r    r!   r;   s        r)    test_suggested_questions_is_listz4TestAmbiguityReport.test_suggested_questions_is_list&   s    "?3 44;z4d;;;;;;;;z;;;z;;;;;;&;;;&;;;4;;;;;;d;;;d;;;;;;;;;;r+   N)__name__
__module____qualname____doc__r*   r5   r>   r@    r+   r)   r   r      s    4	L6
;
<r+   r   c                   d    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y)TestAnalyzeAmbiguityu+   analyze_ambiguity() 핵심 동작 테스트c                 Z   t        d      }t        |t              }|sd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                  |      dz  }t        t        j                  |            d}y)u    반환 타입은 AmbiguityReportr-   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r.   resultr   )r   r/   r   r9   N)
r   r.   r   r   r   r   r   r   r    r!   )r#   rI   r&   @py_format5s       r)   test_returns_ambiguity_reportz2TestAnalyzeAmbiguity.test_returns_ambiguity_report/   s    "?3&/22222222z222z222222&222&222222/222/2222222222r+   c                    t        d      }|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                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u%   빈 요청은 높은 모호성 점수    >=z-%(py2)s
{%(py2)s = %(py0)s.score
} >= %(py5)sr   r   r   r   N
r   r   r   r   r   r   r   r   r    r!   r"   s          r)   test_empty_request_high_scorez2TestAnalyzeAmbiguity.test_empty_request_high_score4   sy    "2&|| q |q    |q      v   v   |   q       r+   c                    t        d      }|j                  }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                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}x}}y
)u'   빈 요청은 모든 5W1H 차원 누락rM      r   )zX%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.missing_dimensions
})
} == %(py8)slenr   r   r/   r0   r   py8assert %(py10)spy10N)r   r   rV   r   r   r   r   r   r   r    r!   r#   r   r3   r%   @py_assert7r4   @py_format9@py_format11s           r)   )test_empty_request_all_dimensions_missingz>TestAnalyzeAmbiguity.test_empty_request_all_dimensions_missing9   s    "2&,,2s,-22-2222-222222s222s22222262226222,222-2222222222r+   c                    t        d      }|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                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u!   모호한 요청은 높은 점수u   뭔가 만들어줘r	   rO   rQ   r   r   r   r   NrR   r"   s          r)   test_vague_request_high_scorez2TestAnalyzeAmbiguity.test_vague_request_high_score>   sz    "#89|| q |q    |q      v   v   |   q       r+   c                    d}t        |      }|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                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u+   상세한 요청은 낮은 모호성 점수u   파이썬으로 CSV 파일을 읽어서 데이터를 분석하는 스크립트를 이번 주 금요일까지 작성해줘. 팀장님 보고용으로 평균과 합계를 계산하는 방식으로 구현해줘.r	   )<)z,%(py2)s
{%(py2)s = %(py0)s.score
} < %(py5)sr   r   r   r   NrR   )r#   detailedr   r$   r%   r&   r'   r(   s           r)   test_detailed_request_low_scorez4TestAnalyzeAmbiguity.test_detailed_request_low_scoreC   s    6 	
 #8,||a|a|avv|ar+   c           	         dD ]  }t        |      }d}|j                  }||k  }d}||k  }|r|st        j                  d||fd|||f      t        j                  |      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}x}x}} y
)u   score는 0~10 범위)rM   r-   u)   상세하고 구체적인 요청입니다r   
   )<=rh   )z-%(py1)s <= %(py6)s
{%(py6)s = %(py4)s.score
}z-%(py6)s
{%(py6)s = %(py4)s.score
} <= %(py8)sr   )r/   r9   r:   rX   rY   rZ   N)
r   r   r   r   r   r   r   r   r    r!   )
r#   reqr   @py_assert0r<   r3   r\   r&   r]   r^   s
             r)   test_score_range_0_to_10z-TestAnalyzeAmbiguity.test_score_range_0_to_10M   s    U 	+C&s+F**1********1***1***********************	+r+   c                    t        d      }|j                  }t        |      }d}||kD  }|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                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}x}}y
)u+   모호한 요청에는 제안 질문 포함r-   r   )>)zX%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.suggested_questions
})
} > %(py8)srV   r   rW   rY   rZ   N)r   r   rV   r   r   r   r   r   r   r    r!   r[   s           r)   1test_suggested_questions_not_empty_when_ambiguouszFTestAnalyzeAmbiguity.test_suggested_questions_not_empty_when_ambiguousS   s    "?3--2s-.22.2222.222222s222s22222262226222-222.2222222222r+   c                    t        d      }d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      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}x}}y	)
uA   범위/대상(What) 정보 없으면 missing_dimensions에 포함u   언제까지 해줘r
   )in)z:%(py1)s in %(py5)s
{%(py5)s = %(py3)s.missing_dimensions
}r   r/   r0   r   r   r   N
r   r   r   r   r   r   r   r   r    r!   r#   r   rj   r%   r3   r'   r(   s          r)   $test_what_dimension_detected_missingz9TestAnalyzeAmbiguity.test_what_dimension_detected_missingX   s    "#892222v22222v2222v22222222222222222222r+   c                    t        d      }d}|j                  }||v}|st        j                  d|fd||f      t        j                  |      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}x}}y	)
u=   일정(When) 정보 있으면 missing_dimensions에 미포함u'   이번 주 금요일까지 완료해줘Whennot inz>%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.missing_dimensions
}r   rq   r   r   Nrr   rs   s          r)   $test_when_dimension_detected_presentz9TestAnalyzeAmbiguity.test_when_dimension_detected_present]   s    "#LM6V666v66666v6666v666666V666V66666666666r+   c                    t        d      }d}|j                  }||v}|st        j                  d|fd||f      t        j                  |      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}x}}y	)
u<   목적(Why) 정보 있으면 missing_dimensions에 미포함u1   성능 향상을 위해 코드를 최적화해줘r   rw   ry   r   rq   r   r   Nrr   rs   s          r)   #test_why_dimension_detected_presentz8TestAnalyzeAmbiguity.test_why_dimension_detected_presentb   s    "#VW5F555u55555u5555u555555F555F55555555555r+   c                    t        d      }d}|j                  }||v}|st        j                  d|fd||f      t        j                  |      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}x}}y	)
u3   이해관계자(Who) 정보 있으면 누락 아님u-   개발팀이 사용할 도구를 만들어줘Whorw   ry   r   rq   r   r   Nrr   rs   s          r)   #test_who_dimension_detected_presentz8TestAnalyzeAmbiguity.test_who_dimension_detected_presentg   s    "#RS5F555u55555u5555u555555F555F55555555555r+   c                    t        d      }d}|j                  }||v}|st        j                  d|fd||f      t        j                  |      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}x}}y	)
u*   방법(How) 정보 있으면 누락 아님u"   REST API 방식으로 구현해줘Howrw   ry   r   rq   r   r   Nrr   rs   s          r)   #test_how_dimension_detected_presentz8TestAnalyzeAmbiguity.test_how_dimension_detected_presentl   s    "#GH5F555u55555u5555u555555F555F55555555555r+   c                    t        d      }|j                  }t        |      }|j                  }t        |      }||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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}x}x}}y	)
u;   missing_dimensions 각 항목에 대응하는 질문 생성rM   rO   )z%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.suggested_questions
})
} >= %(py12)s
{%(py12)s = %(py7)s(%(py10)s
{%(py10)s = %(py8)s.missing_dimensions
})
}rV   r   )r   r/   r0   r   r   rX   rZ   py12zassert %(py14)spy14N)r   r   rV   r   r   r   r   r   r   r   r    r!   )	r#   r   r3   r%   @py_assert9@py_assert11r4   @py_format13@py_format15s	            r)   1test_suggested_questions_cover_missing_dimensionszFTestAnalyzeAmbiguity.test_suggested_questions_cover_missing_dimensionsq   s   "2&--Ps-.Pf6O6OP#6O2PP.2PPPPP.2PPPPPPPsPPPsPPPPPP6PPP6PPP-PPP.PPPPPP#PPP#PPPPPPfPPPfPPP6OPPP2PPPPPPPPPr+   c                    t        d      }|j                  }t        |      }|j                  }t        |      }t        |      }||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t        j                         v st	        j                  t              rt	        j                  t              nd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                  |      t	        j                  |      d
z  }dd	|iz  }	t        t	        j                  |	            d
x}x}x}x}x}}y
)u#   missing_dimensions에 중복 없음r-   r   )z%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.missing_dimensions
})
} == %(py15)s
{%(py15)s = %(py7)s(%(py13)s
{%(py13)s = %(py8)s(%(py11)s
{%(py11)s = %(py9)s.missing_dimensions
})
})
}rV   r   set)
r   r/   r0   r   r   rX   py9py11py13py15zassert %(py17)spy17N)r   r   rV   r   r   r   r   r   r   r   r    r!   )
r#   r   r3   r%   @py_assert10@py_assert12@py_assert14r4   @py_format16@py_format18s
             r)   $test_no_duplicate_missing_dimensionsz9TestAnalyzeAmbiguity.test_no_duplicate_missing_dimensionsw   sK   "?3,,Ts,-T9R9RTS9R5ST5S1TT-1TTTTT-1TTTTTTTsTTTsTTTTTT6TTT6TTT,TTT-TTTTTTTTTTTTTTTSTTTSTTTTTTTTTTTT9RTTT5STTT1TTTTTTTTTr+   N)rA   rB   rC   rD   rK   rS   r_   ra   re   rk   rn   rt   rz   r|   r   r   r   r   rE   r+   r)   rG   rG   ,   sM    53
!
3
!
 +3
3
7
6
6
6
QUr+   rG   c                   "    e Zd ZdZd Zd Zd Zy)TestDimensions5W1Hu-   5W1H 각 차원별 키워드 감지 테스트c                    t        d      }d}|j                  }||v}|st        j                  d|fd||f      t        j                  |      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}x}}y	)
uJ   What 키워드(구현, 작성, 분석 등)가 있으면 What 차원 충족u&   파이썬 스크립트를 작성해줘r
   rw   ry   r   rq   r   r   Nrr   rs   s          r)   test_what_keywords_reduce_scorez2TestDimensions5W1H.test_what_keywords_reduce_score   s    "#KL6V666v66666v6666v666666V666V66666666666r+   c                    t        d      }d}|j                  }||v}|st        j                  d|fd||f      t        j                  |      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}x}}y	)
uH   Where 키워드(서버, DB, 파일 등)가 있으면 Where 차원 충족u"   데이터베이스에 저장해줘Whererw   ry   r   rq   r   r   Nrr   rs   s          r)    test_where_keywords_reduce_scorez3TestDimensions5W1H.test_where_keywords_reduce_score   s    "#GH7f777w77777w7777w777777f777f77777777777r+   c                 >   d}t        |      }|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                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}|j                  }g }||k(  }|st        j                  d|fd
||f      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%   6개 차원 모두 충족 시 score 0u   백엔드 개발팀이 사용할 REST API를 성능 향상을 위해 파이썬으로 구현해줘. 이번 달 말까지 서버에 배포 완료해야 해.r   r   r   r   r   r   r   Nr   )r   r   r   r   r   r   r   r   r    r!   r   )r#   full_requestr   r$   r%   r&   r'   r(   s           r)   +test_all_dimensions_present_gives_low_scorez>TestDimensions5W1H.test_all_dimensions_present_gives_low_score   s    F 	
 #<0|| q |q    |q      v   v   |   q       ((.B.(B....(B......v...v...(...B.......r+   N)rA   rB   rC   rD   r   r   r   rE   r+   r)   r   r   }   s    77
8
	/r+   r   )rD   builtinsr   _pytest.assertion.rewrite	assertionrewriter   syspathlibr   pytestpathinsertstr__file__parentutils.clarifyr   r   r   rG   r   rE   r+   r)   <module>r      sh    *   
   3tH~,,33::; < << <<NU NUb/ /r+   