
    	i-                    v   d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZej                  j                  de
j                  j                  e
j                  j                  e      d             ddlmZmZmZ ddlZ	 	 	 d	 	 	 	 	 	 	 ddZddZ G d d	      Z G d
 d      Z G d d      Z G d d      Zy)u   tests/test_cli_runner.py — CLIRunner TDD 테스트 스위트.

작성 순서: 테스트 먼저(RED), 구현 후 GREEN 확인.
    )annotationsNz..)	AsyncMock	MagicMockpatchc                l    t               }||_        t        | |f      |_        t               |_        |S )uB   asyncio.subprocess.Process를 모킹하는 객체를 반환한다.return_value)r   
returncoder   communicatekill)stdout_datastderr_datar
   procs       D/home/jay/workspace/services/multimodel-bot/tests/test_cli_runner.py_make_mock_processr      s2     ;D DO {K.HIDDIK    c                     t               } d| _        t        t        j                               | _        t               | _        | S )u]   communicate()에서 asyncio.TimeoutError를 발생시키는 목 프로세스를 반환한다.Nside_effect)r   r
   r   asyncioTimeoutErrorr   r   )r   s    r   _make_timeout_processr   $   s4    ;DDO W-A-A-CDDDIKr   c                      e Zd ZdZej
                  j                  dd       Zej
                  j                  dd       Zy)TestRunClaudeu   CLIRunner.run_claude() 검증.c                  K   t        ddd      }t        d|      5  ddlm} |j	                  d       d	{   }d	d	d	       j
                  }d
}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}|j                   }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	7 -# 1 sw Y   -xY ww)uU   Claude CLI 성공 시 stdout 텍스트를 CLIResult.stdout으로 반환해야 한다.s   Claude response textr   r   )r   r   r
   asyncio.create_subprocess_execr   	CLIRunneru   안녕하세요NzClaude response text==z.%(py2)s
{%(py2)s = %(py0)s.stdout
} == %(py5)sresultpy0py2py5assert %(py7)spy7)z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sclaudez.%(py2)s
{%(py2)s = %(py0)s.engine
} == %(py5)sFisz1%(py2)s
{%(py2)s = %(py0)s.timed_out
} is %(py5)s)r   r   engine_v2.cli_runnerr   
run_claudestdout
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr
   engine	timed_out)	self	mock_procr   r"   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s	            r   test_run_claude_successz%TestRunClaude.test_run_claude_success5   s"     '/
	 3)L 	C6$//0ABBF	C
 }}6 66} 66666} 6666666v666v666}666 66666666  %A% A%%%% A%%%%%%v%%%v%%% %%%A%%%%%%%}}((}((((}((((((v(((v(((}(((((((((((5(5((((5((((((v(((v((((((5((((((( C	C 	Cs,   M6M)M&M)L(M6&M))M3.M6c                b	  K   t               }t        d|      5  ddlm} |j	                  dd       d{   }ddd       j
                  }d	}||u }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  }d}| }	||	k(  }|st        j                  d|fd||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}}	|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}g }d}|j                   }	||	v }|}|s'd}|j                   }|j"                  } |       }||v }|}|st        j                  d|fd||	f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      dz  }dd|iz  }|j%                  |       |st        j                  dfdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                        t        j                        t        j                  |      dz  }dd |iz  }|j%                  |       t        j&                  |d      i z  }d!d"|iz  }t        t        j                  |            dx}x}x}x}x}	x}x}x}x}}y7 h# 1 sw Y   hxY ww)#uD   타임아웃 시 timed_out=True이고 returncode=-1이어야 한다.r   r   r   r   u   타임아웃 테스트   )timeoutNTr+   r-   r"   r#   r'   r(   r   z3%(py2)s
{%(py2)s = %(py0)s.returncode
} == -%(py5)sassert %(py8)spy8r)   r*   TimeoutrE   in)z.%(py3)s in %(py7)s
{%(py7)s = %(py5)s.stderr
})py3r&   r(   z%(py9)spy9)zh%(py12)s in %(py20)s
{%(py20)s = %(py18)s
{%(py18)s = %(py16)s
{%(py16)s = %(py14)s.stderr
}.lower
}()
})py12py14py16py18py20z%(py22)spy22zassert %(py25)spy25)r   r   r.   r   r/   r:   r1   r2   r3   r4   r5   r6   r7   r8   r
   r9   stderrlowerappend_format_boolop)r;   r<   r   r"   r=   r>   r?   r@   rA   @py_assert6@py_format7@py_format9@py_assert2@py_assert0@py_assert11@py_assert15@py_assert17@py_assert19@py_assert13@py_format10@py_format21@py_format23@py_format24@py_format26s                           r   test_run_claude_timeoutz%TestRunClaude.test_run_claude_timeoutH   s     *+	3)L 	U6$//0HRS/TTF	U
 '4'4''''4''''''v'''v''''''4'''''''  &Q&QB& B&&&& B&&&&&&v&&&v&&& &&&Q&&&&&&&}}((}((((}((((((v(((v(((}((((((((((OyOFMMOyM)OYO&--O-:M:MO:M:OOY:O-OOOOOyMOOOyOOOOOOFOOOFOOOMOOOOOOOY:OOOOYOOOOOO&OOO&OOO-OOO:MOOO:OOOOOOOOOOOOOOOO U	U 	Us,   R/R"RR"Q#R/R""R,'R/NreturnNone)	__name__
__module____qualname____doc__pytestmarkr   rB   rh    r   r   r   r   2   sA    ([[) )$ [[P Pr   r   c                      e Zd ZdZej
                  j                  dd       Zej
                  j                  dd       Zej
                  j                  dd       Z	ej
                  j                  dd       Z
y)TestRunCodexu   CLIRunner.run_codex() 검증.c                  K   t        dd      }t        d|      5 }ddlm} |j	                  dd	
       d{   }ddd       j
                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}t        j                   j"                        }
dj%                  |
      }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7 # 1 sw Y   xY ww) u\   gpt-5.2-codex 요청 시 gpt-5.1-codex-mini로 치환되고 fallback_used=True여야 한다.s   codex responser   r   r   r   r   r   r   	   테스트zgpt-5.2-codexmodelNTr+   z5%(py2)s
{%(py2)s = %(py0)s.fallback_used
} is %(py5)sr"   r#   r'   r(   codexr   r*    gpt-5.1-codex-minirJ   z%(py1)s in %(py3)scmd_strpy1rL   assert %(py5)sr&   not in)z%(py1)s not in %(py3)sr   r   r.   r   	run_codexfallback_usedr1   r2   r3   r4   r5   r6   r7   r8   r9   list	call_argsargsjoinr;   r<   	mock_execr   r"   r=   r>   r?   r@   rA   r   r   r]   r\   @py_format4s                  r   test_run_codex_fallbackz$TestRunCodex.test_run_codex_fallback`   s     '3DRUV	3)L 	SPY6$..{/.RRF	S
 ##+t+#t++++#t++++++v+++v+++#+++t+++++++}}''}''''}''''''v'''v'''}'''''''''',,112	((9%#.#w....#w...#......w...w.......-g----g---------g---g------- S	S 	Ss,   M!MMMLM!MMM!c                |  K   t        dd      }t        d|      5 }ddlm} |j	                  dd	
       d{   }ddd       j
                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}t        j                   j"                        }
dj%                  |
      }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7 r# 1 sw Y   rxY ww)uM   gpt-5.1-codex-mini 요청 시 치환 없이 fallback_used=False여야 한다.s   mini responser   rv   r   r   r   r   rw   r}   rx   NFr+   rz   r"   r#   r'   r(   r{   r   r*   r|   rJ   r~   r   r   r   r&   r   r   s                  r   test_run_codex_no_fallbackz'TestRunCodex.test_run_codex_no_fallbackr   s     '3CQTU	3)L 	XPY6$..{BV.WWF	X
 ##,u,#u,,,,#u,,,,,,v,,,v,,,#,,,u,,,,,,,}}''}''''}''''''v'''v'''}'''''''''',,112	((9%#.#w....#w...#......w...w....... X	X 	Xs,   J<J/J,J/I-J<,J//J94J<c                4  K   t        dd      }t        d|      5 }ddlm} |j	                  d       d	{    d	d	d	       t        j                  j                        }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	7 # 1 sw Y   xY ww)uK   cmd에 --skip-git-repo-check 플래그가 반드시 포함되어야 한다.   okr   rv   r   r   r   r   u   플래그 확인Nz--skip-git-repo-checkrJ   r~   r   r   r   r&   )r   r   r.   r   r   r   r   r   r1   r2   r6   r3   r4   r5   r7   r8   )	r;   r<   r   r   r   r]   r\   r   r@   s	            r   test_run_codex_skip_git_flagz)TestRunCodex.test_run_codex_skip_git_flag   s      '5cJ	3)L 	:PY6%%&8999	:
 ,,112	&3&)3333&)333&333333)333)3333333 :	: 	:s,   DDD
DCD
DDDc                  K   t        dd      }t        d|      5 }ddlm} |j	                  dd	
       d{   }ddd       j
                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}t        j                  j                         }
dj#                  |
      }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7 # 1 sw Y   xY ww)u\   gpt-5.1-codex 요청 시 gpt-5.1-codex-mini로 치환되고 fallback_used=True여야 한다.r   r   rv   r   r   r   r   rw   zgpt-5.1-codexrx   NTr+   rz   r"   r#   r'   r(   r|   r}   rJ   r~   r   r   r   r&   )r   r   r.   r   r   r   r1   r2   r3   r4   r5   r6   r7   r8   r   r   r   r   r   s                  r   test_run_codex_gpt51_fallbackz*TestRunCodex.test_run_codex_gpt51_fallback   sP     '5cJ	3)L 	SPY6$..{/.RRF	S
 ##+t+#t++++#t++++++v+++v+++#+++t+++++++,,112	((9%#.#w....#w...#......w...w....... S	S 	Ss,   G4G'G$G'F%G4$G''G1,G4Nri   )rl   rm   rn   ro   rp   rq   r   r   r   r   r   rr   r   r   rt   rt   ]   s{    '[[. ." [[/ / [[
4 
4 [[/ /r   rt   c                      e Zd ZdZej
                  j                  dd       Zej
                  j                  dd       Zy)TestExecFileNotFoundu(   _exec() FileNotFoundError 처리 검증.c                  K   t        dt                     5  ddlm} |j	                  d       d{   }ddd       j
                  }d}| }||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}g }d}|j                  }|j                   } |       }||v }|}|s |j                  }t#        |      }d}||kD  }|}|st        j                  d|fd||f      t        j                  |      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }|j%                  |       |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                  |      t        j                  |      dz  }dd|iz  }|j%                  |       t        j&                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}x}x}x}x}}y7 # 1 sw Y   xY ww) u`   명령어가 PATH에 없을 때 returncode=-1이고 stderr에 오류 내용이 있어야 한다.r   r   r   r      명령어 없음NrD   r   rF   r"   r#   rG   rH   r)   r*   r'   r(   z	not foundrJ   )zb%(py3)s in %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.stderr
}.lower
}()
})rL   r&   r(   rM   py11z%(py13)spy13)>)zR%(py20)s
{%(py20)s = %(py15)s(%(py18)s
{%(py18)s = %(py16)s.stderr
})
} > %(py23)slen)py15rP   rQ   rR   py23z%(py25)srT   zassert %(py28)spy28)r   FileNotFoundErrorr.   r   r/   r
   r1   r2   r3   r4   r5   r6   r7   r8   r9   rU   rV   r   rW   rX   )r;   r   r"   r=   r>   rY   r?   rZ   r[   r@   rA   r\   @py_assert8@py_assert10r]   r`   ra   @py_assert22@py_assert21@py_format12@py_format14rf   rg   @py_format27@py_format29s                            r   test_exec_file_not_foundz-TestExecFileNotFound.test_exec_file_not_found   s     ,)+
 	D 7$//0BCCF	D   &Q&QB& B&&&& B&&&&&&v&&&v&&& &&&Q&&&&&&&}}((}((((}((((((v(((v(((}((((((((((M{MfmmMm11M13M{33M6==Ms=7IMAM7IA7MMMMM{3MMM{MMMMMMfMMMfMMMmMMM1MMM3MMMMMMM7IAMMMMMMsMMMsMMMMMM6MMM6MMM=MMM7IMMMAMMMMMMMMMMMMMMM	 D	D 	Ds,   QQP?QPQ?QQQc                  K   t        dt                     5  ddlm} |j	                  d       d{   }ddd       j
                  }d}| }||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}}|j                  }d}||k(  }|st        j                  d|fd||f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            dx}x}}y7 # 1 sw Y   xY ww)uD   codex 명령어가 PATH에 없을 때 returncode=-1이어야 한다.r   r   r   r   r   NrD   r   rF   r"   r#   rG   rH   r{   r*   r'   r(   )r   r   r.   r   r   r
   r1   r2   r3   r4   r5   r6   r7   r8   r9   )r;   r   r"   r=   r>   rY   r?   rZ   r[   r@   rA   s              r   test_exec_codex_file_not_foundz3TestExecFileNotFound.test_exec_codex_file_not_found   s9     ,)+
 	C 7$../ABBF	C   &Q&QB& B&&&& B&&&&&&v&&&v&&& &&&Q&&&&&&&}}''}''''}''''''v'''v'''}'''''''''' C	C 	Cs,   G&GGGFG&GG#G&Nri   )	rl   rm   rn   ro   rp   rq   r   r   r   rr   r   r   r   r      sA    2[[N N [[( (r   r   c                  l   e Zd ZdZej
                  j                  d	d       Zej
                  j                  d	d       Zej
                  j                  d	d       Z	ej
                  j                  d	d       Z
ej
                  j                  d	d       Zej
                  j                  d	d       Zy)
TestRunClaudeJsonParsingu*   run_claude()의 JSON 출력 파싱 검증.c                \  K   d}t        |j                         d      }t        d|      5  ddlm} |j                  d       d{   }ddd       j                  }d	}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}y7 # 1 sw Y   xY ww)u^   JSON {"type":"result","result":"텍스트"} 형식에서 result 필드를 추출해야 한다.uG   {"type":"result","result":"파싱된 응답 텍스트","cost_usd":0.05}r   r   r
   r   r   r   rw   Nu   파싱된 응답 텍스트r   r!   r"   r#   r'   r(   r   encoder   r.   r   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   
r;   json_outputr<   r   r"   r=   r>   r?   r@   rA   s
             r   %test_json_result_format_extracts_textz>TestRunClaudeJsonParsing.test_json_result_format_extracts_text   s      `&;3E3E3GTUV	3)L 	=6$//<<F	= }}< <<} <<<<<} <<<<<<<v<<<v<<<}<<< <<<<<<<< =	= 	=/   +D,D D	D CD,D  D)%D,c                P  K   ddl }|j                  dddddi dd	d
ddddg      }t        |j                         d      }t	        d|      5  ddlm} |j                  d       d{   }ddd       d}j                  }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t        t        j                   |
            dx}x}}d}|j                  }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t        t        j                   |
            dx}x}}d}|j                  }||v}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t        t        j                   |
            dx}x}}d}|j                  }||v}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }	dd|	iz  }
t        t        j                   |
            dx}x}}y7 *# 1 sw Y   *xY ww)uL   JSON 배열 형식에서 type=text인 블록의 text만 추출해야 한다.r   Ntextu   첫 번째 텍스트)typer   tool_useRead)r   nameinputtool_resultzfile contents...r   contentu   두 번째 텍스트r   r   r   r   rw   rJ   )z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.stdout
}r"   )r   rL   r&   r'   r(   r   )z2%(py1)s not in %(py5)s
{%(py5)s = %(py3)s.stdout
}zfile contents)jsondumpsr   r   r   r.   r   r/   r0   r1   r2   r6   r3   r4   r5   r7   r8   )r;   r   r   r<   r   r"   r]   r>   r\   r@   rA   s              r   +test_json_array_format_extracts_text_blockszDTestRunClaudeJsonParsing.test_json_array_format_extracts_text_blocks   sR     	jj)?@#VbA&3EF)?@	
 ';3E3E3GTUV	3)L 	=6$//<<F	= &66%6666%666%6666666666666666666%66%6666%666%6666666666666666666..z....z...z...................3fmm3m3333m333333333f333f333m3333333	 =	= 	=s1   AN&N,N-N1L%N&NN#N&c                  K   d}t        |j                         d      }t        d|      5  ddlm} |j                  d       d{   }ddd       j                  }||k(  }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      nd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7 # 1 sw Y   xY ww)uT   JSON 파싱 실패 시 원본 텍스트를 그대로 반환해야 한다 (fallback).u2   이것은 JSON이 아닌 일반 텍스트입니다r   r   r   r   r   rw   Nr   )z.%(py2)s
{%(py2)s = %(py0)s.stdout
} == %(py4)sr"   raw_text)r$   r%   py4assert %(py6)spy6r   )	r;   r   r<   r   r"   r=   r?   @py_format5rZ   s	            r   .test_json_parse_failure_falls_back_to_raw_textzGTestRunClaudeJsonParsing.test_json_parse_failure_falls_back_to_raw_text   s      H&8??3DQRS	3)L 	=6$//<<F	= }}(}((((}((((((v(((v(((}(((((((((((((((( =	= 	=s/   +EE	E	E	C:EE		EEc                \  K   d}t        |j                         d      }t        d|      5  ddlm} |j                  d       d{   }ddd       j                  }d	}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}y7 # 1 sw Y   xY ww)uH   JSON result가 빈 문자열이면 빈 문자열을 반환해야 한다.z-{"type":"result","result":"","cost_usd":0.01}r   r   r   r   r   rw   N r   r!   r"   r#   r'   r(   r   r   s
             r   $test_json_empty_result_returns_emptyz=TestRunClaudeJsonParsing.test_json_empty_result_returns_empty   s      F&;3E3E3GTUV	3)L 	=6$//<<F	= }}""}""""}""""""v"""v"""}"""""""""" =	= 	=r   c                  K   ddl }|j                  ddddddg      }t        |j                         d	      }t	        d
|      5  ddlm} |j                  d       d{   }ddd       j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                   |
            dx}x}}y7 # 1 sw Y   xY ww)uM   JSON 배열에 text 블록이 없으면 빈 문자열을 반환해야 한다.r   Nr   r   )r   r   r   datar   r   r   r   r   rw   r   r   r!   r"   r#   r'   r(   )r   r   r   r   r   r.   r   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   )r;   r   r   r<   r   r"   r=   r>   r?   r@   rA   s              r   ,test_json_array_no_text_blocks_returns_emptyzETestRunClaudeJsonParsing.test_json_array_no_text_blocks_returns_empty  s      	jj:v"FQ^kqHr!st&;3E3E3GTUV	3)L 	=6$//<<F	= }}""}""""}""""""v"""v"""}"""""""""" =	= 	=s1   AED;#D9$D;(CE9D;;E Ec                  K   t        dd      }t        d|      5 }ddlm} |j	                  d       d{    ddd       t        j                  j                        }|j                  d	      }||d
z      }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7 # 1 sw Y   xY ww)u<   run_claude()가 --output-format json을 사용해야 한다.s   {"type":"result","result":"ok"}r   r   r   r   r   rw   Nz--output-formatrD   r   r   )z%(py1)s == %(py4)s)r   r   r   r   )r   r   r.   r   r/   r   r   r   indexr1   r2   r6   r7   r8   )r;   r<   r   r   r   fmt_idxr]   r?   r\   r   rZ   s              r   test_uses_json_output_formatz5TestRunClaudeJsonParsing.test_uses_json_output_format  s      '3Ubcd	3)L 	4PY6&&{333	4 ,,112	//"341%//%////%///%//////////	 4	4 	4s,   DC;C9C;B<D9C;;D DNri   )rl   rm   rn   ro   rp   rq   r   r   r   r   r   r   r   rr   r   r   r   r      s    4[[= = [[4 4, [[) ) [[# # [[
# 
# [[
0 
0r   r   )r   r   r   )r   bytesr   r   r
   intrj   r   )rj   r   )ro   
__future__r   builtinsr3   _pytest.assertion.rewrite	assertionrewriter1   r   ossyspathinsertr   dirname__file__unittest.mockr   r   r   rp   r   r   r   rt   r   r   rr   r   r   <module>r      s   
 #    	 
 277<< 94@ A 5 5  


 
 	
#P #PV?/ ?/N( (LS0 S0r   