
    Si                     T   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  G d d      Z G d 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/prompt_cache.py 테스트 스위트    N)Pathapply_cache_markersc                       e Zd ZdZd Zd Zy)TestApplyCacheMarkersEmptyu&   엣지 케이스: 빈 메시지 목록c                 $    t        g       g k(  sJ y)u   빈 리스트 → 빈 리스트Nr   )selfs    N/home/jay/workspace/.worktrees/task-2117-dev1/utils/tests/test_prompt_cache.py!test_empty_messages_returns_emptyz<TestApplyCacheMarkersEmpty.test_empty_messages_returns_empty   s    "2&",,,    c                 j    dddg}t        |      }d|d   vsJ |d   j                  d      dk(  sJ y)u:   원본 메시지 목록을 변경하지 않음 (deep copy)userhellorolecontentcache_controlr   r   N)r   get)r	   messagesresults      r
   test_returns_deep_copyz1TestApplyCacheMarkersEmpty.test_returns_deep_copy   sF    #89$X.hqk111{y)W444r   N)__name__
__module____qualname____doc__r   r    r   r
   r   r      s    0-5r   r   c                       e Zd ZdZd Zd Zy)!TestApplyCacheMarkersSystemPromptu+   시스템 프롬프트 캐시 마커 적용c                     ddddddg}t        |      }|d   }|j                  d      }t        |t              r|d   j                  d	      d
dik(  sJ y|j                  d	      d
dik(  sJ y)u:   system 역할 첫 번째 메시지에 cache_control 삽입systemzYou are a helpful assistant.r   r   Hellor   r   r   type	ephemeralNr   r   
isinstancelist)r	   r   r   sys_msgr   s        r
   $test_system_prompt_gets_cache_markerzFTestApplyCacheMarkersSystemPrompt.test_system_prompt_gets_cache_marker!   s     *HI0
 %X.)++i(gt$2;???37LLLL ;;/FK3HHHHr   c                     dddg}t        |      }|d   j                  d      }t        |t              sJ |d   d   dk(  sJ |d   d   dk(  sJ y)	uI   문자열 content를 가진 system 메시지 → list 형식으로 변환r    zSystem instruction here.r   r   r   textr#   Nr%   r	   r   r   r   s       r
   ,test_system_string_content_converted_to_listzNTestApplyCacheMarkersSystemPrompt.test_system_string_content_converted_to_list1   sq     *DE
 %X.)--	*'4(((qz&!%????qz&!V+++r   N)r   r   r   r   r)   r-   r   r   r
   r   r      s    5I 	,r   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)&TestApplyCacheMarkersNonSystemMessagesuA   비시스템 메시지 캐시 마커 적용 (system_and_3 전략)c                     dddg}t        |      }|d   j                  d      }t        |t              r|d   j                  d      dd	ik(  sJ y
|d   j                  d      dd	ik(  sJ y
)u)   사용자 메시지 1개에 마커 적용r   r!   r   r   r   r"   r   r#   r$   Nr%   r,   s       r
   $test_single_user_message_gets_markerzKTestApplyCacheMarkersNonSystemMessages.test_single_user_message_gets_marker@   su    #89$X.)--	*gt$2;???37LLLL!9==1fk5JJJJr   c           	          ddddddddddddddddd	ddd
dg}t        |      }dt        dt        fd} ||d         sJ  ||d         sJ  ||d         sJ  ||d         rJ  ||d         rJ y)u6   마지막 3개 비시스템 메시지에 마커 적용r   msg1r   	assistantresp1msg2resp2msg3resp3msg4msgreturnc                     | j                  d      }t        |t              r|r|d   j                  d      ddik(  S | j                  d      ddik(  S Nr   r"   r   r#   r$   r   r&   r'   r;   r   s     r
   has_cache_markerzaTestApplyCacheMarkersNonSystemMessages.test_last_3_messages_get_markers.<locals>.has_cache_markerX   R    ggi(G'4(Wr{7FK;PPP77?+/DDDr            r      Nr   dictboolr	   r   r   rA   s       r
    test_last_3_messages_get_markerszGTestApplyCacheMarkersNonSystemMessages.test_last_3_messages_get_markersJ   s     / W5/ W5/ W5/
 %X.	E$ 	E4 	E  q	***q	***q	***#F1I...#F1I....r   c           	      ,   dddddddddddddd	ddd
ddddg}t        |      }dt        dt        fd} ||d         sJ  ||d         sJ  ||d         sJ  ||d         sJ  ||d         rJ  ||d         rJ  ||d         rJ y)u-   system + 3 메시지 = 최대 4개 breakpointr    zSystem prompt.r   r   r3   r4   r5   r6   r7   r8   r9   r;   r<   c                     | j                  d      }t        |t              r|r|d   j                  d      ddik(  S | j                  d      ddik(  S r>   r?   r@   s     r
   rA   zfTestApplyCacheMarkersNonSystemMessages.test_system_and_3_total_4_breakpoints.<locals>.has_cache_markerr   rB   r   r   rC   rD   rE   rF         NrG   rJ   s       r
   %test_system_and_3_total_4_breakpointszLTestApplyCacheMarkersNonSystemMessages.test_system_and_3_total_4_breakpointse   s     *:;/ W5/ W5/ W5
 %X.	E$ 	E4 	E  q	***q	***q	***q	*** $F1I...#F1I...#F1I....r   c                     ddddddg}t        |      }dt        dt        fd} ||d	         sJ  ||d
         sJ y)u+   3개 미만 메시지: 모두 마커 적용r   ar   r4   br;   r<   c                     | j                  d      }t        |t              r|r|d   j                  d      ddik(  S | j                  d      ddik(  S r>   r?   r@   s     r
   rA   zkTestApplyCacheMarkersNonSystemMessages.test_fewer_than_3_messages_all_get_markers.<locals>.has_cache_marker   rB   r   r   rF   NrG   rJ   s       r
   *test_fewer_than_3_messages_all_get_markerszQTestApplyCacheMarkersNonSystemMessages.test_fewer_than_3_messages_all_get_markers   sc     , S1
 %X.	E$ 	E4 	E  q	***q	***r   N)r   r   r   r   r1   rK   rP   rU   r   r   r
   r/   r/   =   s    KK/6/<+r   r/   c                       e Zd ZdZd Zd Zy) TestApplyCacheMarkersListContentu.   list 형식 content를 가진 메시지 처리c                     dddddddgdg}t        |      }|d   d   }t        |t              sJ |d	   j                  d
      ddik(  sJ d
|d   vsJ y)u8   list content의 마지막 블록에 cache_control 추가r   r+   firstr#   r+   secondr   r   r   r"   r   r#   r$   N)r   r&   r'   r   r,   s       r
   &test_list_content_marker_on_last_blockzGTestApplyCacheMarkersListContent.test_list_content_marker_on_last_block   s     #W5#X6
 %X.)I&'4(((r{/FK3HHHHgaj000r   c                 L    ddddgdg}t        |       d|d   d   d   vsJ y	)
u'   원본 메시지가 변경되지 않음r   r+   r   rZ   r   r   r   r   Nr   )r	   r   s     r
   test_original_not_mutatedz:TestApplyCacheMarkersListContent.test_original_not_mutated   sD     %+W=>
 	H%hqk)&<Q&????r   N)r   r   r   r   r\   r^   r   r   r
   rW   rW      s    81$
@r   rW   c                       e Zd ZdZd Zy)"TestApplyCacheMarkersEphemeralTypeu   cache_control 형식 검증c                     dddg}t        |      }|d   j                  d      }t        |t              r|d   j                  di       }n|d   j                  di       }|j                  d      d	k(  sJ y
)z!cache_control.type == 'ephemeral'r   testr   r   r   r"   r   r#   r$   Nr%   )r	   r   r   r   ccs        r
   $test_cache_control_type_is_ephemeralzGTestApplyCacheMarkersEphemeralType.test_cache_control_type_is_ephemeral   ss    #78$X.)--	*gt$"5B3Bvvf~,,,r   N)r   r   r   r   rd   r   r   r
   r`   r`      s
    %	-r   r`   __main__z-v)r   syspathlibr   pytestpathinsertstr__file__parentutils.prompt_cacher   r   r   r/   rW   r`   r   mainr   r   r
   <module>rp      s    / 
   3tH~,,33::; < 25 5 , ,>U+ U+p@ @D- - zFKK4 ! r   