
    iR                        d Z ddlZddlZddlZddlmZ ddlZ ee      j                  j                  Z
ej                  j                  d ee
             e
dz  Zej                  j!                  de      ZeJ ej                  j%                  e      Zej(                  J ej(                  j+                  e       dededefd	Zdedefd
Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z  G d d      Z! G d d      Z" G d d       Z# G d! d"      Z$y)#u  
test_transcript_learner.py

scripts/transcript-learner.py 단위 테스트 (TDD)

테스트 항목:
1. 지적 패턴(criticism) 감지
2. 칭찬 패턴(praise) 감지
3. 선호 패턴(preference) 감지
4. 중복 방지 (같은 텍스트 2번 → count 증가)
5. 빈 입력 graceful 처리
6. learnings.json 없는 경우 (신규 생성)
7. learnings.json 있는 경우 (누적)
8. stdin 읽기 테스트 (monkeypatch)
9. 여러 키워드가 한 줄에 있는 경우
10. stdout 출력 형식 검증
    N)Pathztranscript-learner.pytranscript_learnertmp_pathdatareturnc                     | dz  }|j                  dd       |dz  }|j                  t        j                  |d      d       | S )	NwhisperTparentsexist_oklearnings.jsonF)ensure_asciiutf-8encoding)mkdir
write_textjsondumps)r   r   whisper_dirfs       V/home/jay/workspace/.worktrees/task-2116-dev1/scripts/tests/test_transcript_learner.pymake_learningsr   ,   sJ    Y&KdT2&&ALLDu5LHO    c                     | dz  dz  S )Nr	   r    )r   s    r   get_learnings_pathr   4   s    i"222r   c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestCriticismDetectionu   지적 패턴 키워드 감지c                     d}t         j                  |      }t        d |D              sJ t        d |D              sJ y )N   이거 왜 이렇게 느려?c              3   ,   K   | ]  }|d    dk(    ywtype	criticismNr   .0ps     r   	<genexpr>z>TestCriticismDetection.test_detect_igeo_wae.<locals>.<genexpr>C        <1V9+<   c              3   ,   K   | ]  }|d    dk(    ywkeyword
   이거 왜Nr   r&   s     r   r)   z>TestCriticismDetection.test_detect_igeo_wae.<locals>.<genexpr>D   s     @A1Y<</@r+   r   extract_patterns_from_lineanyselflineresults      r   test_detect_igeo_waez+TestCriticismDetection.test_detect_igeo_wae@   s?    -#>>tD<V<<<<@@@@@r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   분명히 했잖아 그거를c              3   ,   K   | ]  }|d    dk(    ywr#   r   r&   s     r   r)   z>TestCriticismDetection.test_detect_haetjana.<locals>.<genexpr>I   r*   r+   r0   r3   s      r   test_detect_haetjanaz+TestCriticismDetection.test_detect_haetjanaF   s+    .#>>tD<V<<<<r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   아니 그게 맞냐고c              3   ,   K   | ]  }|d    dk(    ywr#   r   r&   s     r   r)   z?TestCriticismDetection.test_detect_ani_geuge.<locals>.<genexpr>N   r*   r+   r0   r3   s      r   test_detect_ani_geugez,TestCriticismDetection.test_detect_ani_geugeK   +    (#>>tD<V<<<<r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   다시 해줘 이거c              3   ,   K   | ]  }|d    dk(    ywr#   r   r&   s     r   r)   z:TestCriticismDetection.test_detect_dasi.<locals>.<genexpr>S   r*   r+   r0   r3   s      r   test_detect_dasiz'TestCriticismDetection.test_detect_dasiP   s+    %#>>tD<V<<<<r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu!   아까 말했잖아 그 부분을c              3   ,   K   | ]  }|d    dk(    ywr#   r   r&   s     r   r)   zFTestCriticismDetection.test_detect_akka_malhaetjana.<locals>.<genexpr>X   r*   r+   r0   r3   s      r   test_detect_akka_malhaetjanaz3TestCriticismDetection.test_detect_akka_malhaetjanaU   s+    2#>>tD<V<<<<r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   이미 했잖아 이거c              3   ,   K   | ]  }|d    dk(    ywr#   r   r&   s     r   r)   zBTestCriticismDetection.test_detect_imi_haetjana.<locals>.<genexpr>]   r*   r+   r0   r3   s      r   test_detect_imi_haetjanaz/TestCriticismDetection.test_detect_imi_haetjanaZ   r>   r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   또? 왜 또 그래c              3   ,   K   | ]  }|d    dk(    ywr#   r   r&   s     r   r)   z9TestCriticismDetection.test_detect_tto.<locals>.<genexpr>b   r*   r+   r0   r3   s      r   test_detect_ttoz&TestCriticismDetection.test_detect_tto_   s+    $#>>tD<V<<<<r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   아니라고 했잖아c              3   ,   K   | ]  }|d    dk(    ywr#   r   r&   s     r   r)   z=TestCriticismDetection.test_detect_anirago.<locals>.<genexpr>g   r*   r+   r0   r3   s      r   test_detect_aniragoz*TestCriticismDetection.test_detect_aniragod   s+    '#>>tD<V<<<<r   N)__name__
__module____qualname____doc__r7   r:   r=   rA   rD   rG   rJ   rM   r   r   r   r   r   =   s.    (A=
=
=
=
=
=
=r   r   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestPraiseDetectionu   칭찬 패턴 키워드 감지c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   오 좋아 이렇게 해줘c              3   ,   K   | ]  }|d    dk(    ywr$   praiseNr   r&   s     r   r)   z7TestPraiseDetection.test_detect_joha.<locals>.<genexpr>u        9Q1V9(9r+   r0   r3   s      r   test_detect_johaz$TestPraiseDetection.test_detect_johar   s+    ,#>>tD9&9999r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   오 괜찮은데 이거c              3   ,   K   | ]  }|d    dk(    ywrV   r   r&   s     r   r)   zDTestPraiseDetection.test_detect_o_gwaenchanheunde.<locals>.<genexpr>z   rX   r+   r0   r3   s      r   test_detect_o_gwaenchanheundez1TestPraiseDetection.test_detect_o_gwaenchanheundew   s+    (#>>tD9&9999r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu"   이거 맞어 이렇게 하면 돼c              3   ,   K   | ]  }|d    dk(    ywrV   r   r&   s     r   r)   z=TestPraiseDetection.test_detect_igeo_majeo.<locals>.<genexpr>   rX   r+   r0   r3   s      r   test_detect_igeo_majeoz*TestPraiseDetection.test_detect_igeo_majeo|   +    3#>>tD9&9999r   c                 Z    d}t         j                  |      }t        d |D              sJ y )N   잘했어 이번엔c              3   ,   K   | ]  }|d    dk(    ywrV   r   r&   s     r   r)   z=TestPraiseDetection.test_detect_jalhaesseo.<locals>.<genexpr>   rX   r+   r0   r3   s      r   test_detect_jalhaesseoz*TestPraiseDetection.test_detect_jalhaesseo   s+    $#>>tD9&9999r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   결과 좋네 마음에 들어c              3   ,   K   | ]  }|d    dk(    ywrV   r   r&   s     r   r)   z8TestPraiseDetection.test_detect_johne.<locals>.<genexpr>   rX   r+   r0   r3   s      r   test_detect_johnez%TestPraiseDetection.test_detect_johne   s+    /#>>tD9&9999r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   괜찮다 이 방식c              3   ,   K   | ]  }|d    dk(    ywrV   r   r&   s     r   r)   z>TestPraiseDetection.test_detect_gwaenchanta.<locals>.<genexpr>   rX   r+   r0   r3   s      r   test_detect_gwaenchantaz+TestPraiseDetection.test_detect_gwaenchanta   s+    %#>>tD9&9999r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu"   그래 이거야 딱 원하던 거c              3   ,   K   | ]  }|d    dk(    ywrV   r   r&   s     r   r)   zATestPraiseDetection.test_detect_geuraee_igeoya.<locals>.<genexpr>   rX   r+   r0   r3   s      r   test_detect_geuraee_igeoyaz.TestPraiseDetection.test_detect_geuraee_igeoya   r`   r   N)rN   rO   rP   rQ   rY   r\   r_   rd   rg   rj   rm   r   r   r   rS   rS   o   s(    (:
:
:
:
:
:
:r   rS   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestPreferenceDetectionu   선호 패턴 키워드 감지c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   항상 이렇게 해줘c              3   ,   K   | ]  }|d    dk(    ywr$   
preferenceNr   r&   s     r   r)   z?TestPreferenceDetection.test_detect_hangsang.<locals>.<genexpr>        =1V9,=r+   r0   r3   s      r   test_detect_hangsangz,TestPreferenceDetection.test_detect_hangsang   s+    (#>>tD=f====r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   그렇게 하지 마c              3   ,   K   | ]  }|d    dk(    ywrr   r   r&   s     r   r)   z>TestPreferenceDetection.test_detect_haji_ma.<locals>.<genexpr>   rt   r+   r0   r3   s      r   test_detect_haji_maz+TestPreferenceDetection.test_detect_haji_ma   s+    %#>>tD=f====r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   영어로 해줘c              3   ,   K   | ]  }|d    dk(    ywrr   r   r&   s     r   r)   z?TestPreferenceDetection.test_detect_euro_hae.<locals>.<genexpr>   rt   r+   r0   r3   s      r   test_detect_euro_haez,TestPreferenceDetection.test_detect_euro_hae   s+    !#>>tD=f====r   c                 Z    d}t         j                  |      }t        d |D              sJ y )Nu   난 이 방식이 좋아c              3   ,   K   | ]  }|d    dk(    ywrr   r   r&   s     r   r)   zBTestPreferenceDetection.test_detect_nan_ga_joha.<locals>.<genexpr>   rt   r+   r0   r3   s      r   test_detect_nan_ga_johaz/TestPreferenceDetection.test_detect_nan_ga_joha   s+    )#>>tD=f====r   N)rN   rO   rP   rQ   ru   rx   r{   r~   r   r   r   ro   ro      s    (>
>
>
>r   ro   c                   "    e Zd ZdZd Zd Zd Zy)TestNoMatchu   패턴 없는 줄c                 @    d}t         j                  |      }|g k(  sJ y )Nu   오늘 날씨가 맑습니다r   r1   r3   s      r   test_no_match_plain_textz$TestNoMatch.test_no_match_plain_text   s#    .#>>tD||r   c                 @    d}t         j                  |      }|g k(  sJ y )N r   r3   s      r   test_no_match_empty_linez$TestNoMatch.test_no_match_empty_line   s#    #>>tD||r   c                 @    d}t         j                  |      }|g k(  sJ y )Nz   r   r3   s      r   test_no_match_whitespace_onlyz)TestNoMatch.test_no_match_whitespace_only   s#    #>>tD||r   N)rN   rO   rP   rQ   r   r   r   r   r   r   r   r      s    

r   r   c                   "    e Zd ZdZd Zd Zd Zy)TestMultipleKeywordsOneLineu   한 줄에 여러 키워드c                 x    d}t         j                  |      }|D cg c]  }|d   	 }}d|v sJ d|v sJ y c c}w )Nu%   이거 왜 이러지 그래도 좋아r$   r%   rW   r   )r4   r5   r6   r(   typess        r   #test_criticism_and_praise_same_linez?TestMultipleKeywordsOneLine.test_criticism_and_praise_same_line   sO    6#>>tD$*+q6++e###5    ,s   7c                     d}t         j                  |      }|D cg c]  }|d   dk(  s| }}t        |      dk\  sJ y c c}w )Nu   이거 왜 다시 했잖아r$   r%      )r   r1   len)r4   r5   r6   r(   criticism_resultss        r    test_multiple_criticism_keywordsz<TestMultipleKeywordsOneLine.test_multiple_criticism_keywords   sP    ,#>>tD(.K1!F){2JQKK$%*** Ls
   AAc                 `    dt         j                        }t        fd|D              sJ y )Nu   이거 왜 이렇게 했어?c              3   .   K   | ]  }|d    k(    yw)contextNr   )r'   r(   r5   s     r   r)   zHTestMultipleKeywordsOneLine.test_context_is_full_line.<locals>.<genexpr>   s     8A1Y<4'8s   )r   r1   all)r4   r6   r5   s     @r   test_context_is_full_linez5TestMultipleKeywordsOneLine.test_context_is_full_line   s,    -#>>tD88888r   N)rN   rO   rP   rQ   r   r   r   r   r   r   r   r      s    %!+9r   r   c                   X    e Zd ZdZdefdZdefdZdefdZdefdZdefdZ	defdZ
y	)
TestNewLearningsFileu   learnings.json 신규 생성r   c                 X    t         j                  |      }|d   dk(  sJ |d   g k(  sJ y )Nbase_dirversion   patterns)r   load_learningsr4   r   r6   s      r   )test_load_learnings_missing_returns_emptyz>TestNewLearningsFile.test_load_learnings_missing_returns_empty   s;    #22H2Ei A%%%j!R'''r   c                 p    d}t         j                  ||       t        |      }|j                         sJ y )Nr!   r   )r   process_transcriptr   exists)r4   r   textpaths       r   $test_process_transcript_creates_filez9TestNewLearningsFile.test_process_transcript_creates_file   s2    ---dX-F!(+{{}}r   c                     d}t         j                  ||       t        j                  t	        |      j                  d            }t        |d         dk\  sJ t        d |d   D              sJ y )Nr!   r   r   r   r   r   c              3   ,   K   | ]  }|d    dk(    ywr-   r   r&   s     r   r)   zQTestNewLearningsFile.test_process_transcript_new_pattern_saved.<locals>.<genexpr>   s     JA1Y<</Jr+   )r   r   r   loadsr   	read_textr   r2   r4   r   r   r   s       r   )test_process_transcript_new_pattern_savedz>TestNewLearningsFile.test_process_transcript_new_pattern_saved   sm    ---dX-Fzz,X6@@'@RS4
#$)))Jj9IJJJJr   c                     d}t         j                  ||       t        j                  t	        |      j                  d            }|d   dk(  sJ y )Nu%   좋아 이 방식이 마음에 들어r   r   r   r   r   r   r   r   r   r   r   r   s       r   !test_process_transcript_version_1z6TestNewLearningsFile.test_process_transcript_version_1   sN    6--dX-Fzz,X6@@'@RSI!###r   c                     d}t         j                  ||       t        j                  t	        |      j                  d            }d|v sJ |d   dk7  sJ y )N	   잘했어r   r   r   last_updatedr   r   r   s       r   (test_process_transcript_has_last_updatedz=TestNewLearningsFile.test_process_transcript_has_last_updated  s]    --dX-Fzz,X6@@'@RS%%%N#r)))r   c                    d}t         j                  ||       t        j                  t	        |      j                  d            }t        d |d   D              }d|v sJ d|v sJ d	|v sJ d
|v sJ d|v sJ d|v sJ |d
   dk(  sJ y )Nu   이거 왜 이렇게 됐어?r   r   r   c              3   2   K   | ]  }|d    dk(  s|  ywr-   r   r&   s     r   r)   zHTestNewLearningsFile.test_pattern_has_required_fields.<locals>.<genexpr>       SQa	ll6RqS   r   r$   r.   r   count
first_seen	last_seenr   r   r   r   r   r   r   nextr4   r   r   r   patterns        r    test_pattern_has_required_fieldsz5TestNewLearningsFile.test_pattern_has_required_fields  s    ---dX-Fzz,X6@@'@RSS$z"2SS   G###G###'!!!w&&&g%%%w1$$$r   N)rN   rO   rP   rQ   r   r   r   r   r   r   r   r   r   r   r   r      sO    &($ (
T K$ K$$ $* *% %r   r   c                   4    e Zd ZdZdefdZdefdZdefdZy)TestExistingLearningsFileu   기존 learnings.json에 누적r   c           	          dddddddddgd	}t        ||       d
}t        j                  ||       t        j                  t        |      j                  d            }t        |d         dk\  sJ y )Nr   2026-03-10T09:00:00r%   r/   r!   r   
2026-03-10r$   r.   r   r   r   r   r   r   r   rb   r   r   r   r   )r   r   r   r   r   r   r   r   )r4   r   existingr   r   s        r   test_accumulates_new_patternz6TestExistingLearningsFile.test_accumulates_new_pattern#  s    1 (+=".!-	
 	x*$--dX-Fzz,X6@@'@RS4
#$)))r   c           	          dddddddddgd}t        ||       t        j                  |	      }t        |d
         dk(  sJ |d
   d   d   dk(  sJ y )Nr   r   rW      좋아u   좋아 이거r   r   r   r   r   r   r.   )r   r   r   r   )r4   r   r   r6   s       r   test_load_learnings_existingz6TestExistingLearningsFile.test_load_learnings_existing9  s    1 %'.".!-	
 	x*#22H2E6*%&!+++j!!$Y/8;;;r   c                     |dz  }|j                  dd       |dz  j                  dd       t        j                  |      }|d	   g k(  sJ y
)u4   손상된 learnings.json → 빈 데이터로 계속r	   Tr
   r   z{ not valid json!!!r   r   r   r   N)r   r   r   r   )r4   r   r   r6   s       r   +test_load_learnings_corrupted_returns_emptyzETestExistingLearningsFile.test_load_learnings_corrupted_returns_emptyM  s`    *$6	'	'334IT[3\#22H2Ej!R'''r   N)rN   rO   rP   rQ   r   r   r   r   r   r   r   r   r      s)    )*T *,<T <((D (r   r   c                   @    e Zd ZdZdefdZdefdZdefdZdefdZy)TestDuplicatePreventionu   중복 학습 방지r   c                     d}t         j                  ||       t         j                  ||       t        j                  t	        |      j                  d            }t        d |d   D              }|d   dk(  sJ y )	Nr!   r   r   r   c              3   2   K   | ]  }|d    dk(  s|  ywr-   r   r&   s     r   r)   zLTestDuplicatePrevention.test_same_context_increases_count.<locals>.<genexpr>c  r   r   r   r   r   r   r   s        r   !test_same_context_increases_countz9TestDuplicatePrevention.test_same_context_increases_count^  sw    ---dX-F--dX-Fzz,X6@@'@RSS$z"2SSw1$$$r   c                 N   d}t         j                  ||       t         j                  ||       t        j                  t	        |      j                  d            }|d   D cg c]$  }|d   dk(  s|d   |j                         k(  s#|& }}t        |      d	k(  sJ y c c}w )
Nr!   r   r   r   r   r.   r/   r   r   )r   r   r   r   r   r   stripr   )r4   r   r   r   r(   matchings         r   $test_same_context_no_duplicate_entryz<TestDuplicatePrevention.test_same_context_no_duplicate_entryf  s    ---dX-F--dX-Fzz,X6@@'@RS#J/q!1Y<<3OTUV_T`dhdndndpTpAqq8}!!! rs   &B"4B"B"c                 $   d}d}t         j                  ||       t         j                  ||       t        j                  t	        |      j                  d            }|d   D cg c]  }|d   dk(  s| }}t        |      d	k(  sJ y c c}w )
Nr!   u   이거 왜 안 되는 거야?r   r   r   r   r.   r/   r   r   r   r   r   r   r   r   )r4   r   text1text2r   r(   igeo_wae_patternss          r   %test_different_context_adds_new_entryz=TestDuplicatePrevention.test_different_context_adds_new_entryn  s    ./--eh-G--eh-Gzz,X6@@'@RS(,Z(8Y1AiLL<XQYY$%*** Zs   (B6Bc           	         dddddddddgd}t        ||       d}t        j                  ||	       t        j                  t        |      j                  d
            }t        d |d   D              }|d   dk\  sJ |d   dk(  sJ y )Nr   r   r%   r/   r!   r   r   r   r   r   r   c              3   2   K   | ]  }|d    dk(  s|  ywr-   r   r&   s     r   r)   zNTestDuplicatePrevention.test_last_seen_updated_on_duplicate.<locals>.<genexpr>  r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )r4   r   r   r   r   r   s         r   #test_last_seen_updated_on_duplicatez;TestDuplicatePrevention.test_last_seen_updated_on_duplicatew  s    1 (+=".!-	
 	x*---dX-Fzz,X6@@'@RSS$z"2SS{#|333w1$$$r   N)	rN   rO   rP   rQ   r   r   r   r   r   r   r   r   r   r   [  s5    %$ %"T "+d +%D %r   r   c                   @    e Zd ZdZdefdZdefdZdefdZdefdZy)TestEmptyInputu   빈 입력 처리r   c                     	 t         j                  d|       y # t        $ r"}t        j                  d|        Y d }~y d }~ww xY w)Nr   r   u    빈 입력에서 예외 발생: r   r   	Exceptionpytestfailr4   r   es      r   test_empty_string_no_exceptionz-TestEmptyInput.test_empty_string_no_exception  sD    	@11"x1H 	@KK:1#>??	@    	AA  Ac                 Z    t         j                  d|      }|d   dk(  sJ |d   dk(  sJ y )Nr   r   new_patternsr   updated_patternsr   r   r   s      r   "test_empty_string_returns_zero_newz1TestEmptyInput.test_empty_string_returns_zero_new  s>    #66rH6Mn%***()Q...r   c                     	 t         j                  d|       y # t        $ r"}t        j                  d|        Y d }~y d }~ww xY w)Nz   

   r   u#   공백 입력에서 예외 발생: r   r   s      r   !test_whitespace_only_no_exceptionz0TestEmptyInput.test_whitespace_only_no_exception  sD    	C11,1R 	CKK=aSABB	Cr   c                 Z    t         j                  d|      }|d   dk(  sJ |d   dk(  sJ y )Nu   오늘 날씨가 좋다r   r   r   r   r   r   s      r   &test_no_matching_text_returns_zero_newz5TestEmptyInput.test_no_matching_text_returns_zero_new  s@    #667P[c6dn%***()Q...r   N)	rN   rO   rP   rQ   r   r   r   r   r   r   r   r   r   r     s9    @t @/4 /
C$ C/t /r   r   c                   L    e Zd ZdZdefdZdefdZdefdZdefdZdefdZ	y)	TestOutputFormatu%   process_transcript() 반환값 형식r   c                 V    t         j                  d|      }d|v sJ d|v sJ d|v sJ y )N   이거 왜 느려?r   r   r   total_patternsr   r   s      r   $test_returns_dict_with_required_keysz5TestOutputFormat.test_returns_dict_with_required_keys  sC    #667KV^6_'''!V+++6)))r   c                 J    d}t         j                  ||      }|d   dk\  sJ y )Nu    이거 왜 느려?
좋아 이거r   r   r   r   r4   r   r   r6   s       r   test_new_patterns_countz(TestOutputFormat.test_new_patterns_count  s/    2#66th6On%***r   c                 x    d}t         j                  ||       t         j                  ||      }|d   dk\  sJ y )Nr   r   r   r   r   r   s       r   test_updated_patterns_countz,TestOutputFormat.test_updated_patterns_count  sC    #--dX-F#66th6O()Q...r   c                     d}t         j                  ||      }t        j                  t	        |      j                  d            }|d   t        |d         k(  sJ y )Nu&   이거 왜 느려?
잘했어 이번엔r   r   r   r   r   r   )r4   r   r   r6   r   s        r    test_total_patterns_matches_filez1TestOutputFormat.test_total_patterns_matches_file  s\    8#66th6Ozz,X6@@'@RS&'3tJ/?+@@@@r   c                 t    t         j                  d|       t         j                  d|      }|d   dk\  sJ y )Nr   r   rb   r   r   r   r   s      r   #test_total_accumulates_across_callsz4TestOutputFormat.test_total_accumulates_across_calls  sA    --.BX-V#667LW_6`&'1,,,r   N)
rN   rO   rP   rQ   r   r   r   r   r  r  r   r   r   r   r     sC    /*T *+ +
/D /A A-D -r   r   c                   @    e Zd ZdZdefdZdefdZdefdZdefdZy)TestStdinReadingu   stdin 입력 처리r   c                     dd l }|j                  d      }|j                  t        d|       t        j                  d       }d|v sJ d|v sJ y )Nr   u*   이거 왜 이렇게 느려?
좋아 이거stdin
input_filer/   r   )ioStringIOsetattrsysr   
read_input)r4   monkeypatchr   r  
fake_stdinr   s         r   test_read_from_stdinz%TestStdinReading.test_read_from_stdin  sU    [[!NO
C*5!,,,=t###4r   c                     |dz  }|j                  dd       t        j                  t        |            }d|v sJ d|v sJ y )Nzsession.txtu+   잘했어 이번에
항상 이렇게 해줘r   r   r	  r   u   항상)r   r   r  str)r4   r   r   r   s       r   test_read_from_filez$TestStdinReading.test_read_from_file  sP    }$	CgV!,,A,?d"""4r   c                     t        j                  t        t        f      5  t        j                  t        |dz               d d d        y # 1 sw Y   y xY w)Nznonexistent.txtr	  )r   raisesFileNotFoundErrorOSErrorr   r  r  )r4   r   s     r   "test_read_from_missing_file_raisesz3TestStdinReading.test_read_from_missing_file_raises  sI    ]]-w78 	X))SDU9U5V)W	X 	X 	Xs   #AAc                     dd l }|j                  d      }|j                  t        d|       t        j                  d       }t        j                  ||      }|d   dk\  sJ y )Nr   r!   r  r	  r   r   r   )r  r  r  r  r   r  r   )r4   r  r   r  r  r   r6   s          r   #test_stdin_text_processed_correctlyz4TestStdinReading.test_stdin_text_processed_correctly  sa    [[!?@
C*5!,,,=#66th6On%***r   N)	rN   rO   rP   rQ   r   r  r  r  r  r   r   r   r  r    s7     $   D  X4 X+ +r   r  c                   (    e Zd ZdZdefdZdefdZy)TestMultilineProcessingu   여러 줄 텍스트 처리r   c                 J    d}t         j                  ||      }|d   dk\  sJ y )Nu   오늘 회의 내용입니다
이거 왜 이렇게 됐어?
잘했어 이번엔
항상 이렇게 해줘
그냥 평범한 문장
또? 왜 또 이래
r   r      r   r   s       r   #test_multiline_detects_all_patternsz;TestMultilineProcessing.test_multiline_detects_all_patterns  s3     $66th6On%***r   c                     d}t         j                  ||       t        j                  t	        |      j                  d            }|d   D ch c]  }|d   	 }}d|v sJ d|v sJ d	|v sJ y c c}w )
Nu8   이거 왜 느려?
좋아 이거야
항상 이렇게 해r   r   r   r   r$   r%   rW   rs   r   )r4   r   r   r   r(   r   s         r   !test_multiline_saves_each_patternz9TestMultilineProcessing.test_multiline_saves_each_pattern  s    K--dX-Fzz,X6@@'@RS$($45q655e###5   u$$$ 6s   A0N)rN   rO   rP   rQ   r   r!  r#  r   r   r   r  r    s    %	+D 	+%$ %r   r  )%rQ   importlib.util	importlibr   r  pathlibr   r   __file__parent_SCRIPTS_DIRr   insertr  _MODULE_PATHutilspec_from_file_locationspecmodule_from_specr   loaderexec_moduledictr   r   r   rS   ro   r   r   r   r   r   r   r   r  r  r   r   r   <module>r3     s]  $   
   H~$$++ 3|$ % 55~~--.BLQ ^^44T: {{    * +T  $ 3 3$ 3*= *=d$: $:X> >: 09 96-% -%j3( 3(v1% 1%r/ />- -J+ +L% %r   