
    	iR                     
   d Z ddlZddlmc m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dZeeuZes ej4                  defdeef      d ej6                         v s ej8                  e      r ej:                  e      nd ej:                  e      d	z  Zd
deiz  Z e  ejB                  e            dxZZej*                  jE                  e      Z#ejH                  ZdZ%ee%uZ&e&s ej4                  de&fdee%f      d ej6                         v s ej8                  e      r ej:                  e      nd ej:                  e       ej:                  e%      dz  Zddeiz  Z' e  ejB                  e'            dxZxZ&Z%ejH                  jQ                  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      Z0 G d d       Z1 G d! d"      Z2 G d# d$      Z3 G d% d&      Z4 G d' d(      Z5 G d) d*      Z6 G d+ d,      Z7y)-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)is not)z%(py0)s is not %(py3)sspecpy0py3assert %(py5)spy5)z2%(py2)s
{%(py2)s = %(py0)s.loader
} is not %(py5)s)r   py2r   zassert %(py7)spy7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       </home/jay/workspace/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                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}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+<   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr   r   py4c              3   ,   K   | ]  }|d    dk(    ywkeyword
   이거 왜Nr%   r/   s     r!   r2   z>TestCriticismDetection.test_detect_igeo_wae.<locals>.<genexpr>D   s     @A1Y<</@r4   
r   extract_patterns_from_liner6   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanationselflineresult@py_assert1@py_assert3@py_format5s         r!   test_detect_igeo_waez+TestCriticismDetection.test_detect_igeo_wae@   s    -#>>tD<V<<s<<<<<<<<<s<<<s<<<<<<<<<<<<<<@@@s@@@@@@@@@s@@@s@@@@@@@@@@@@@@r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   분명히 했잖아 그거를c              3   ,   K   | ]  }|d    dk(    ywr,   r%   r/   s     r!   r2   z>TestCriticismDetection.test_detect_haetjana.<locals>.<genexpr>I   r3   r4   r5   r6   r7   r=   rF   s         r!   test_detect_haetjanaz+TestCriticismDetection.test_detect_haetjanaF   sv    .#>>tD<V<<s<<<<<<<<<s<<<s<<<<<<<<<<<<<<r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   아니 그게 맞냐고c              3   ,   K   | ]  }|d    dk(    ywr,   r%   r/   s     r!   r2   z?TestCriticismDetection.test_detect_ani_geuge.<locals>.<genexpr>N   r3   r4   r5   r6   r7   r=   rF   s         r!   test_detect_ani_geugez,TestCriticismDetection.test_detect_ani_geugeK   v    (#>>tD<V<<s<<<<<<<<<s<<<s<<<<<<<<<<<<<<r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   다시 해줘 이거c              3   ,   K   | ]  }|d    dk(    ywr,   r%   r/   s     r!   r2   z:TestCriticismDetection.test_detect_dasi.<locals>.<genexpr>S   r3   r4   r5   r6   r7   r=   rF   s         r!   test_detect_dasiz'TestCriticismDetection.test_detect_dasiP   sv    %#>>tD<V<<s<<<<<<<<<s<<<s<<<<<<<<<<<<<<r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu!   아까 말했잖아 그 부분을c              3   ,   K   | ]  }|d    dk(    ywr,   r%   r/   s     r!   r2   zFTestCriticismDetection.test_detect_akka_malhaetjana.<locals>.<genexpr>X   r3   r4   r5   r6   r7   r=   rF   s         r!   test_detect_akka_malhaetjanaz3TestCriticismDetection.test_detect_akka_malhaetjanaU   sv    2#>>tD<V<<s<<<<<<<<<s<<<s<<<<<<<<<<<<<<r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   이미 했잖아 이거c              3   ,   K   | ]  }|d    dk(    ywr,   r%   r/   s     r!   r2   zBTestCriticismDetection.test_detect_imi_haetjana.<locals>.<genexpr>]   r3   r4   r5   r6   r7   r=   rF   s         r!   test_detect_imi_haetjanaz/TestCriticismDetection.test_detect_imi_haetjanaZ   rT   r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   또? 왜 또 그래c              3   ,   K   | ]  }|d    dk(    ywr,   r%   r/   s     r!   r2   z9TestCriticismDetection.test_detect_tto.<locals>.<genexpr>b   r3   r4   r5   r6   r7   r=   rF   s         r!   test_detect_ttoz&TestCriticismDetection.test_detect_tto_   sv    $#>>tD<V<<s<<<<<<<<<s<<<s<<<<<<<<<<<<<<r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   아니라고 했잖아c              3   ,   K   | ]  }|d    dk(    ywr,   r%   r/   s     r!   r2   z=TestCriticismDetection.test_detect_anirago.<locals>.<genexpr>g   r3   r4   r5   r6   r7   r=   rF   s         r!   test_detect_aniragoz*TestCriticismDetection.test_detect_aniragod   sv    '#>>tD<V<<s<<<<<<<<<s<<<s<<<<<<<<<<<<<<r#   N)__name__
__module____qualname____doc__rM   rP   rS   rW   rZ   r]   r`   rc   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                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   오 좋아 이렇게 해줘c              3   ,   K   | ]  }|d    dk(    ywr-   praiseNr%   r/   s     r!   r2   z7TestPraiseDetection.test_detect_joha.<locals>.<genexpr>u        9Q1V9(9r4   r5   r6   r7   r=   rF   s         r!   test_detect_johaz$TestPraiseDetection.test_detect_johar   sv    ,#>>tD9&99s999999999s999s99999999999999r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   오 괜찮은데 이거c              3   ,   K   | ]  }|d    dk(    ywrl   r%   r/   s     r!   r2   zDTestPraiseDetection.test_detect_o_gwaenchanheunde.<locals>.<genexpr>z   rn   r4   r5   r6   r7   r=   rF   s         r!   test_detect_o_gwaenchanheundez1TestPraiseDetection.test_detect_o_gwaenchanheundew   sv    (#>>tD9&99s999999999s999s99999999999999r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu"   이거 맞어 이렇게 하면 돼c              3   ,   K   | ]  }|d    dk(    ywrl   r%   r/   s     r!   r2   z=TestPraiseDetection.test_detect_igeo_majeo.<locals>.<genexpr>   rn   r4   r5   r6   r7   r=   rF   s         r!   test_detect_igeo_majeoz*TestPraiseDetection.test_detect_igeo_majeo|   v    3#>>tD9&99s999999999s999s99999999999999r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )N   잘했어 이번엔c              3   ,   K   | ]  }|d    dk(    ywrl   r%   r/   s     r!   r2   z=TestPraiseDetection.test_detect_jalhaesseo.<locals>.<genexpr>   rn   r4   r5   r6   r7   r=   rF   s         r!   test_detect_jalhaesseoz*TestPraiseDetection.test_detect_jalhaesseo   sv    $#>>tD9&99s999999999s999s99999999999999r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   결과 좋네 마음에 들어c              3   ,   K   | ]  }|d    dk(    ywrl   r%   r/   s     r!   r2   z8TestPraiseDetection.test_detect_johne.<locals>.<genexpr>   rn   r4   r5   r6   r7   r=   rF   s         r!   test_detect_johnez%TestPraiseDetection.test_detect_johne   sv    /#>>tD9&99s999999999s999s99999999999999r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   괜찮다 이 방식c              3   ,   K   | ]  }|d    dk(    ywrl   r%   r/   s     r!   r2   z>TestPraiseDetection.test_detect_gwaenchanta.<locals>.<genexpr>   rn   r4   r5   r6   r7   r=   rF   s         r!   test_detect_gwaenchantaz+TestPraiseDetection.test_detect_gwaenchanta   sv    %#>>tD9&99s999999999s999s99999999999999r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu"   그래 이거야 딱 원하던 거c              3   ,   K   | ]  }|d    dk(    ywrl   r%   r/   s     r!   r2   zATestPraiseDetection.test_detect_geuraee_igeoya.<locals>.<genexpr>   rn   r4   r5   r6   r7   r=   rF   s         r!   test_detect_geuraee_igeoyaz.TestPraiseDetection.test_detect_geuraee_igeoya   rv   r#   N)rd   re   rf   rg   ro   rr   ru   rz   r}   r   r   r%   r#   r!   ri   ri   o   s(    (:
:
:
:
:
:
:r#   ri   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestPreferenceDetectionu   선호 패턴 키워드 감지c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   항상 이렇게 해줘c              3   ,   K   | ]  }|d    dk(    ywr-   
preferenceNr%   r/   s     r!   r2   z?TestPreferenceDetection.test_detect_hangsang.<locals>.<genexpr>        =1V9,=r4   r5   r6   r7   r=   rF   s         r!   test_detect_hangsangz,TestPreferenceDetection.test_detect_hangsang   sv    (#>>tD=f==s=========s===s==============r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   그렇게 하지 마c              3   ,   K   | ]  }|d    dk(    ywr   r%   r/   s     r!   r2   z>TestPreferenceDetection.test_detect_haji_ma.<locals>.<genexpr>   r   r4   r5   r6   r7   r=   rF   s         r!   test_detect_haji_maz+TestPreferenceDetection.test_detect_haji_ma   sv    %#>>tD=f==s=========s===s==============r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   영어로 해줘c              3   ,   K   | ]  }|d    dk(    ywr   r%   r/   s     r!   r2   z?TestPreferenceDetection.test_detect_euro_hae.<locals>.<genexpr>   r   r4   r5   r6   r7   r=   rF   s         r!   test_detect_euro_haez,TestPreferenceDetection.test_detect_euro_hae   sv    !#>>tD=f==s=========s===s==============r#   c                    d}t         j                  |      }d |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   난 이 방식이 좋아c              3   ,   K   | ]  }|d    dk(    ywr   r%   r/   s     r!   r2   zBTestPreferenceDetection.test_detect_nan_ga_joha.<locals>.<genexpr>   r   r4   r5   r6   r7   r=   rF   s         r!   test_detect_nan_ga_johaz/TestPreferenceDetection.test_detect_nan_ga_joha   sv    )#>>tD=f==s=========s===s==============r#   N)rd   re   rf   rg   r   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)TestNoMatchu   패턴 없는 줄c                 ~   d}t         j                  |      }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 )Nu   오늘 날씨가 맑습니다==z%(py0)s == %(py3)srI   r   r
   r   
r   r>   rA   _call_reprcomparer?   r@   rB   rC   rD   rE   rG   rH   rI   @py_assert2rJ   @py_format4@py_format6s          r!   test_no_match_plain_textz$TestNoMatch.test_no_match_plain_text   so    .#>>tDv|vvvr#   c                 ~   d}t         j                  |      }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 )N r   r   rI   r   r
   r   r   r   s          r!   test_no_match_empty_linez$TestNoMatch.test_no_match_empty_line   so    #>>tDv|vvvr#   c                 ~   d}t         j                  |      }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 )Nz   r   r   rI   r   r
   r   r   r   s          r!   test_no_match_whitespace_onlyz)TestNoMatch.test_no_match_whitespace_only   so    #>>tDv|vvvr#   N)rd   re   rf   rg   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                    d}t         j                  |      }|D cg c]  }|d   	 }}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}d
}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}y c c}w )Nu%   이거 왜 이러지 그래도 좋아r-   r.   inz%(py1)s in %(py3)stypespy1r	   r
   r   rm   )
r   r>   rA   r   rC   r?   r@   rB   rD   rE   )	rG   rH   rI   r1   r   @py_assert0r   r   r   s	            r!   #test_criticism_and_praise_same_linez?TestMultipleKeywordsOneLine.test_criticism_and_praise_same_line   s    6#>>tD$*+q6++#{e####{e###{######e###e####### x5    x5   x      5   5        ,s   E5c                    d}t         j                  |      }|D cg c]  }|d   dk(  s| }}t        |      }d}||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	z  }d
d|iz  }	t        t        j                  |	            d x}x}}y c c}w )Nu   이거 왜 다시 했잖아r-   r.      >=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slencriticism_resultsr   r   r	   py6assert %(py8)spy8)r   r>   r   rA   r   r?   r@   rB   rC   rD   rE   )
rG   rH   rI   r1   r   r   @py_assert5@py_assert4@py_format7@py_format9s
             r!    test_multiple_criticism_keywordsz<TestMultipleKeywordsOneLine.test_multiple_criticism_keywords   s    ,#>>tD(.K1!F){2JQKK$%**%****%******s***s******$***$***%********** Ls
   EEc                    dt         j                        }fd|D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nu   이거 왜 이렇게 했어?c              3   .   K   | ]  }|d    k(    yw)contextNr%   )r0   r1   rH   s     r!   r2   zHTestMultipleKeywordsOneLine.test_context_is_full_line.<locals>.<genexpr>   s     8A1Y<4'8s   r5   allr7   )
r   r>   r   r?   r@   rA   rB   rC   rD   rE   )rG   rI   rJ   rK   rL   rH   s        @r!   test_context_is_full_linez5TestMultipleKeywordsOneLine.test_context_is_full_line   sw    -#>>tD888s888888888s888s88888888888888r#   N)rd   re   rf   rg   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                 0   t         j                  |      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d	   }g }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )
Nbase_dirversion   r   z%(py1)s == %(py4)sr   r8   assert %(py6)sr   patterns)r   load_learningsrA   r   rC   rD   rE   rG   r   rI   r   rK   r   rL   r   s           r!   )test_load_learnings_missing_returns_emptyz>TestNewLearningsFile.test_load_learnings_missing_returns_empty   s    #22H2Ei %A% A%%%% A%%% %%%A%%%%%%%j!'R'!R''''!R'''!'''R'''''''r#   c                    d}t         j                  ||       t        |      }|j                  } |       }|sddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            d x}}y )Nr*   r   zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}pathr7   )r   process_transcriptr&   existsr?   r@   rA   rB   rC   rD   rE   )rG   r   textr   rJ   rK   rL   s          r!   $test_process_transcript_creates_filez9TestNewLearningsFile.test_process_transcript_creates_file   s{    ---dX-F!(+{{{}}tt{}r#   c                    d}t         j                  ||       t        j                  t	        |      j                  d            }|d   }t        |      }d}||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}}d |d   D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }
t        t        j                  |
            d x}}y )Nr*   r   r   r   r   r   r   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)sr   r   r   r8   r   assert %(py9)spy9c              3   ,   K   | ]  }|d    dk(    ywr:   r%   r/   s     r!   r2   zQTestNewLearningsFile.test_process_transcript_new_pattern_saved.<locals>.<genexpr>   s     JA1Y<</Jr4   r5   r6   r7   )r   r   r   loadsr&   	read_textr   rA   r   r?   r@   rB   rC   rD   rE   r6   )rG   r   r   r   rJ   rK   @py_assert6r   @py_format8@py_format10rL   s              r!   )test_process_transcript_new_pattern_savedz>TestNewLearningsFile.test_process_transcript_new_pattern_saved   s(   ---dX-Fzz,X6@@'@RS
#)s#$))$))))$))))))s)))s)))#)))$))))))))))Jj9IJJsJJJJJJJJJsJJJsJJJJJJJJJJJJJJr#   c                    d}t         j                  ||       t        j                  t	        |      j                  d            }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            d x}x}}y )Nu%   좋아 이 방식이 마음에 들어r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r&   r   rA   r   rC   rD   rE   )	rG   r   r   r   r   rK   r   rL   r   s	            r!   !test_process_transcript_version_1z6TestNewLearningsFile.test_process_transcript_version_1   s    6--dX-Fzz,X6@@'@RSI#!#!####!######!#######r#   c                    d}t         j                  ||       t        j                  t	        |      j                  d            }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }t        t        j                  |            d x}}|d   }d}||k7  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}y )N	   잘했어r   r   r   last_updatedr   r   r   r   r
   r   r   )!=)z%(py1)s != %(py4)sr   r   r   r   r   r   r   r&   r   rA   r   rC   r?   r@   rB   rD   rE   )rG   r   r   r   r   r   r   r   rK   rL   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))))#r)))#)))r)))))))r#   c                 x	   d}t         j                  ||       t        j                  t	        |      j                  d            }t        d |d   D              }d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }t        t        j                  |            d x}}|d   }d}	||	k(  }|slt        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
dd|
iz  }t        t        j                  |            d x}x}}	y )Nu   이거 왜 이렇게 됐어?r   r   r   c              3   2   K   | ]  }|d    dk(  s|  ywr:   r%   r/   s     r!   r2   zHTestNewLearningsFile.test_pattern_has_required_fields.<locals>.<genexpr>       SQa	ll6RqS   r   r-   r   r   patternr   r
   r   r;   r   count
first_seen	last_seenr   r   r   r   r   r   )r   r   r   r   r&   r   nextrA   r   rC   r?   r@   rB   rD   rE   )rG   r   r   r   r   r   r   r   r   rK   rL   r   s               r!    test_pattern_has_required_fieldsz5TestNewLearningsFile.test_pattern_has_required_fields  s   ---dX-Fzz,X6@@'@RSS$z"2SS v    v   v                #yG####yG###y######G###G########yG####yG###y######G###G#######!w'!!!!w'!!!w!!!!!!'!!!'!!!!!!!&|w&&&&|w&&&|&&&&&&w&&&w&&&&&&&%{g%%%%{g%%%{%%%%%%g%%%g%%%%%%%w$1$1$$$$1$$$$$$1$$$$$$$r#   N)rd   re   rf   rg   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            }|d   }t        |      }d}||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 )Nr   2026-03-10T09:00:00r.   r<   r*   r   
2026-03-10r-   r;   r   r   r   r   r   r   r   rx   r   r   r   r   r   r   r   r   r   r   )r"   r   r   r   r   r&   r   r   rA   r   r?   r@   rB   rC   rD   rE   )rG   r   existingr   r   rJ   rK   r   r   r   r   s              r!   test_accumulates_new_patternz6TestExistingLearningsFile.test_accumulates_new_pattern#  s    1 (+=".!-	
 	x*$--dX-Fzz,X6@@'@RS
#)s#$))$))))$))))))s)))s)))#)))$))))))))))r#   c           	      D   dddddddddgd}t        ||       t        j                  |	      }|d
   }t        |      }d}||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}}|d
   d   d   }
d}|
|k(  }|slt	        j
                  d|fd|
|f      t	        j                  |
      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}
x}}y )Nr   r   rm      좋아u   좋아 이거r   r   r   r   r   r   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   r   r   r   r   r;   r   r   r   r   )r"   r   r   r   rA   r   r?   r@   rB   rC   rD   rE   )rG   r   r   rI   rJ   rK   r   r   r   r   r   r   rL   r   s                 r!   test_load_learnings_existingz6TestExistingLearningsFile.test_load_learnings_existing9  s0   1 %'.".!-	
 	x*#22H2E*%+s%&+!+&!++++&!++++++s+++s+++%+++&+++!+++++++j!!$Y/;8;/8;;;;/8;;;/;;;8;;;;;;;r#   c                    |dz  }|j                  dd       |dz  j                  dd       t        j                  |      }|d	   }g }||k(  }|slt	        j
                  d
|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}y)u4   손상된 learnings.json → 빈 데이터로 계속r   Tr   r   z{ not valid json!!!r   r   r   r   r   r   r   r   r   N)	r   r   r   r   rA   r   rC   rD   rE   )	rG   r   r   rI   r   rK   r   rL   r   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''''!R'''!'''R'''''''r#   N)rd   re   rf   rg   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(  }|slt        j                  d	|fd
||f      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}}y )Nr*   r   r   r   c              3   2   K   | ]  }|d    dk(  s|  ywr:   r%   r/   s     r!   r2   zLTestDuplicatePrevention.test_same_context_increases_count.<locals>.<genexpr>c  r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r&   r   r   rA   r   rC   rD   rE   )
rG   r   r   r   r   r   rK   r   rL   r   s
             r!   !test_same_context_increases_countz9TestDuplicatePrevention.test_same_context_increases_count^  s    ---dX-F--dX-Fzz,X6@@'@RSS$z"2SSw$1$1$$$$1$$$$$$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(  }|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z  }	dd|	iz  }
t        t        j                  |
            d x}x}}y c c}w )Nr*   r   r   r   r   r;   r<   r   r   r   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   matchingr   r   r   )r   r   r   r   r&   r   stripr   rA   r   r?   r@   rB   rC   rD   rE   )rG   r   r   r   r1   r  r   r   r   r   r   s              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}!!}!!!!}!!!!!!s!!!s!!!!!!8!!!8!!!}!!!!!!!!!! rs   &F"4F"F"c                 $   d}d}t         j                  ||       t         j                  ||       t        j                  t	        |      j                  d            }|d   D cg c]  }|d   dk(  s| }}t        |      }d	}||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z  }
dd|
iz  }t        t        j                  |            d x}x}	}y c c}w )Nr*   u   이거 왜 안 되는 거야?r   r   r   r   r;   r<   r   r   r  r   igeo_wae_patternsr   r   r   )r   r   r   r   r&   r   r   rA   r   r?   r@   rB   rC   rD   rE   )rG   r   text1text2r   r1   r  r   r   r   r   r   s               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$%**%****%******s***s******$***$***%********** Zs   (F6F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\  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}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!   r2   zNTestDuplicatePrevention.test_last_seen_updated_on_duplicate.<locals>.<genexpr>  r   r   r   r   r   z%(py1)s >= %(py4)sr   r   r   r   r   r   r   )r"   r   r   r   r   r&   r   r   rA   r   rC   rD   rE   )rG   r   r   r   r   r   r   rK   r   rL   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333#|333#333|3333333w$1$1$$$$1$$$$$$1$$$$$$$r#   N)	rd   re   rf   rg   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rG   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                 2   t         j                  d|      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}|d
   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}y )Nr   r   new_patternsr   r   r   r   r   r   updated_patternsr   r   rA   r   rC   rD   rE   r   s           r!   "test_empty_string_returns_zero_newz1TestEmptyInput.test_empty_string_returns_zero_new  s    #66rH6Mn%**%****%***%**********().Q.)Q....)Q...)...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                 2   t         j                  d|      }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}|d
   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}y )Nu   오늘 날씨가 좋다r   r%  r   r   r   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.)Q....)Q...)...Q.......r#   N)	rd   re   rf   rg   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                    t         j                  d|      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}d
}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}y )N   이거 왜 느려?r   r%  r   r   rI   r   r
   r   r&  total_patterns)
r   r   rA   r   rC   r?   r@   rB   rD   rE   )rG   r   rI   r   r   r   r   s          r!   $test_returns_dict_with_required_keysz5TestOutputFormat.test_returns_dict_with_required_keys  s*   #667KV^6_'~''''~'''~''''''''''''''''!+!V++++!V+++!++++++V+++V+++++++)6))))6)))))))))6)))6)))))))r#   c                 6   d}t         j                  ||      }|d   }d}||k\  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nu    이거 왜 느려?
좋아 이거r   r%  r   r   r  r   r   r   r'  	rG   r   r   rI   r   rK   r   rL   r   s	            r!   test_new_patterns_countz(TestOutputFormat.test_new_patterns_count  sn    2#66th6On%**%****%***%**********r#   c                 d   d}t         j                  ||       t         j                  ||      }|d   }d}||k\  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nr0  r   r&  r   r   r  r   r   r   r'  r4  s	            r!   test_updated_patterns_countz,TestOutputFormat.test_updated_patterns_count  s    #--dX-F#66th6O().Q.)Q....)Q...)...Q.......r#   c                 l   d}t         j                  ||      }t        j                  t	        |      j                  d            }|d   }|d   }t        |      }||k(  }|st        j                  d|fd||f      t        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      d
z  }	dd|	iz  }
t        t        j                  |
            d x}x}x}}y )Nu&   이거 왜 느려?
잘했어 이번엔r   r   r   r1  r   r   )z0%(py1)s == %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
}r   )r   r	   r   r   r   r   )r   r   r   r   r&   r   r   rA   r   rC   r?   r@   rB   rD   rE   )rG   r   r   rI   r   r   r   r   r   r   r   s              r!    test_total_patterns_matches_filez1TestOutputFormat.test_total_patterns_matches_file  s    8#66th6Ozz,X6@@'@RS&'@tJ/?@3/?+@@'+@@@@@'+@@@@'@@@@@@3@@@3@@@/?@@@+@@@@@@@@r#   c                 `   t         j                  d|       t         j                  d|      }|d   }d}||k\  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}}y )Nr0  r   rx   r1  r   r   r  r   r   r   r'  r   s           r!   #test_total_accumulates_across_callsz4TestOutputFormat.test_total_accumulates_across_calls  s    --.BX-V#667LW_6`&',1,'1,,,,'1,,,',,,1,,,,,,,r#   N)
rd   re   rf   rg   r   r2  r5  r7  r9  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 }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }	t        t        j                  |	            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }	t        t        j                  |	            d x}}y )Nr   u*   이거 왜 이렇게 느려?
좋아 이거stdin
input_filer<   r   r   r   r   r
   r   r  )ioStringIOsetattrsysr   
read_inputrA   r   rC   r?   r@   rB   rD   rE   )
rG   monkeypatchr   rB  
fake_stdinr   r   r   r   r   s
             r!   test_read_from_stdinz%TestStdinReading.test_read_from_stdin  s    [[!NO
C*5!,,,=#|t####|t###|######t###t#######x4x4x44r#   c                    |dz  }|j                  dd       t        j                  t        |            }d}||v }|st	        j
                  d|fd||f      t	        j                  |      d	t        j                         v st	        j                  |      rt	        j                  |      nd	d
z  }dd|iz  }t        t	        j                  |            d x}}d}||v }|st	        j
                  d|fd||f      t	        j                  |      d	t        j                         v st	        j                  |      rt	        j                  |      nd	d
z  }dd|iz  }t        t	        j                  |            d x}}y )Nzsession.txtu+   잘했어 이번에
항상 이렇게 해줘r   r   r@  r   r   r   r   r   r
   r   u   항상)r   r   rF  strrA   r   rC   r?   r@   rB   rD   rE   )rG   r   r    r   r   r   r   r   s           r!   test_read_from_filez$TestStdinReading.test_read_from_file  s    }$	CgV!,,A,?"{d""""{d"""{""""""d"""d"""""""x4x4x4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   rF  rK  )rG   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\  }	|	slt        j                  d|	fd	||f      t        j                  |      t        j                  |      d
z  }
dd|
iz  }t        t        j                  |            d x}x}	}y )Nr   r*   r?  r@  r   r%  r   r   r  r   r   r   )rB  rC  rD  rE  r   rF  r   rA   r   rC   rD   rE   )rG   rG  r   rB  rH  r   rI   r   rK   r   rL   r   s               r!   #test_stdin_text_processed_correctlyz4TestStdinReading.test_stdin_text_processed_correctly  s    [[!?@
C*5!,,,=#66th6On%**%****%***%**********r#   N)	rd   re   rf   rg   r   rI  rL  rQ  rS  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                 6   d}t         j                  ||      }|d   }d}||k\  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}y )
Nu   오늘 회의 내용입니다
이거 왜 이렇게 됐어?
잘했어 이번엔
항상 이렇게 해줘
그냥 평범한 문장
또? 왜 또 이래
r   r%     r   r  r   r   r   r'  r4  s	            r!   #test_multiline_detects_all_patternsz;TestMultilineProcessing.test_multiline_detects_all_patterns  sr     $66th6On%**%****%***%**********r#   c                    d}t         j                  ||       t        j                  t	        |      j                  d            }|d   D ch c]  }|d   	 }}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }	t        t        j                  |	            d x}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }	t        t        j                  |	            d x}}d}||v }|st        j                  d|fd	||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
dz  }dd|iz  }	t        t        j                  |	            d x}}y c c}w )Nu8   이거 왜 느려?
좋아 이거야
항상 이렇게 해r   r   r   r   r-   r.   r   r   r   r   r
   r   rm   r   r   )
rG   r   r   r   r1   r   r   r   r   r   s
             r!   !test_multiline_saves_each_patternz9TestMultilineProcessing.test_multiline_saves_each_pattern  sh   K--dX-Fzz,X6@@'@RS$($45q655#{e####{e###{######e###e####### x5    x5   x      5   5       $|u$$$$|u$$$|$$$$$$u$$$u$$$$$$$ 6s   IN)rd   re   rf   rg   r   rX  rZ  r%   r#   r!   rU  rU    s    %	+D 	+%$ %r#   rU  )8rg   builtinsr?   _pytest.assertion.rewrite	assertionrewriterA   importlib.util	importlibr   rE  pathlibr   r  __file__parent_SCRIPTS_DIRr   insertrK  _MODULE_PATHutilspec_from_file_locationr   r   rJ   r   r@   rB   rC   r   r   rD   rE   module_from_specr   loaderr   rK   r   exec_moduledictr"   r&   r(   ri   r   r   r   r   r   r  r  r.  r=  rU  r%   r#   r!   <module>rm     s  $     
   H~$$++ 3|$ % 55~~--.BLQ t4   t4     t   t   4      ^^44T: {{ $ {$   {$     t   t   {  $         * +T  $ 3 3$ 3*= *=d$: $:X> >: 09 96-% -%j3( 3(v1% 1%r/ />- -J+ +L% %r#   