
    Ti                       d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
mZ  ee      j                         j                  d   Z ee      e	j"                  vr"e	j"                  j%                  d ee             ddlmZ  G d d      Zy)	uK   task-2478: blast_radius_parser 단위 테스트 — 카마소츠/모리건.    )annotationsN)Path   )parse_blast_radiusc                  L    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y)TestParseBlastRadiusu7   list/dict 양쪽 입력에 대한 parser 동작 검증.c                   ddgdgdd}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}}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)u2   단일 파일 출력 (dict + blast_radius 중첩).z
src/foo.py
src/baz.pytests/test_foo.pydirect_importers
test_fileschanged_fileblast_radius==z%(py0)s == %(py3)sdipy0py3assert %(py5)spy5Ntf	r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationselfdatar   r   @py_assert2@py_assert1@py_format4@py_format6s           =/home/jay/workspace/tests/scripts/test_blast_radius_parser.py&test_single_dict_with_blast_radius_keyz;TestParseBlastRadius.test_single_dict_with_blast_radius_key   s     )%1N23
 $D)B"^#r^####r^######r###r###^#######)**r*****r*******r***r***********    c                   ddgdgddddgdgddg}t        |      \  }}d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}}d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)uZ   다파일 출력 (list) — 모든 항목 집계, .get() 호출 시 AttributeError 없음.a.pyx.pyzt1.pyr   r   b.pyy.pyzt2.pyr   r   r   r   r   r   Nr   r   r%   s           r,   $test_list_input_aggregates_all_itemsz9TestParseBlastRadius.test_list_input_aggregates_all_items   s    $6(cjbk5lm#6(cjbk5lm
 $D)Bf%%r%%%%%r%%%%%%%r%%%r%%%%%%%%%%%w''r'''''r'''''''r'''r'''''''''''r.   c                   dddgg didddgg dig}t        |      \  }}g 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}}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)u5   list 입력 시 중복 제거 + 입력 순서 유지.r   r1   r3   r   z.py)r1   r3   r6   r   r   r   r   r   r   Nr   r   r%   s           r,   test_list_dedupes_duplicatesz1TestParseBlastRadius.test_list_dedupes_duplicates)   s     662BRTUV662BRTUV
 $D)B--r-----r-------r---r-----------rRxrRrrRr.   c                   dgdgd}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}}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\   legacy 평탄 dict (테스트 mock 호환): {"direct_importers": [...], "test_files": [...]}r
   r   r   r   r   r   r   r   r   Nr   r   r%   s           r,   test_legacy_flat_dict_schemaz1TestParseBlastRadius.test_legacy_flat_dict_schema3   s    %1NCVBWX#D)B"^#r^####r^######r###r###^#######)**r*****r*******r***r***********r.   c                   g }t        |      }g g f}||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   빈 list → 빈 tuple.r   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   r   py2py4py7assert %(py9)spy9Nr   r&   r)   @py_assert3@py_assert6@py_assert5@py_format8@py_format10s          r,   test_empty_listz$TestParseBlastRadius.test_empty_list:       "$1!"%1"b1%1111%111111!111!111"111%1111111111r.   c                   i }t        |      }g g f}||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   빈 dict → 빈 tuple.r   r;   r   r<   r@   rA   Nr   rB   s          r,   test_empty_dictz$TestParseBlastRadius.test_empty_dict>   rI   r.   c                   ddgg d}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}}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
)uX   blast_radius 값이 dict가 아닐 때(예: list/str) → legacy 평탄 schema fallback.unexpected_stringzfallback.py)r   r   r   r   r   r   r   r   r   Nr   r   r%   s           r,   $test_malformed_blast_radius_not_dictz9TestParseBlastRadius.test_malformed_blast_radius_not_dictB   s     3-hjk#D)B#_$r_$$$$r_$$$$$$r$$$r$$$_$$$$$$$rRxrRrrRr.   c                   ddgg didddddgg dig}t        |      \  }}d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)   list 내 dict가 아닌 항목은 스킵.r   r0   r   z
not a dict{   Nr2   r   r   r   r   r   r   r   r%   s           r,   #test_non_dict_items_in_list_skippedz8TestParseBlastRadius.test_non_dict_items_in_list_skippedI   s     6("MN6("MN
 $D)Bf%%r%%%%%r%%%%%%%r%%%r%%%%%%%%%%%r.   c                   ddddi}t        |      \  }}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}}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;   direct_importers/test_files가 None이어도 안전 처리.r   Nr   r   r   r   r   r   r   r   r   r%   s           r,   test_none_values_safez*TestParseBlastRadius.test_none_values_safeU   s    T NO#D)BrRxrRrrRrRxrRrrRr.   c                   ddddi}t        |      \  }}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}}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)u8   direct_importers/test_files가 list가 아니면 무시.r   r1   *   r   r   r   r   r   r   r   Nr   r   r%   s           r,   "test_non_list_inner_values_ignoredz7TestParseBlastRadius.test_non_list_inner_values_ignored\   s    V2 NO#D)BrRxrRrrRrRxrRrrRr.   N)__name__
__module____qualname____doc__r-   r4   r7   r9   rH   rK   rN   rQ   rS   rV    r.   r,   r   r      s7    A+(+22
&r.   r   )rZ   
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   syspathlibr   __file__resolveparents_WS_ROOTstrpathinsertutils.blast_radius_parserr   r   r[   r.   r,   <module>rk      sg    Q "   
 >!!#++A.x= HHOOAs8}% 8R Rr.   