
    :i                        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
Z
ddlZddlmZ ddlZ ee
j                  j!                  dd            Z ee      ej&                  vr"ej&                  j)                  d ee             edz  dz  Zd Z e       Zej0                  Zej2                  Zej6                  Zd	 ZddlmZ   G d
 d      Z! G d d      Z" G d d      Z# G d d      Z$y)ul  
회귀 테스트 (test_regression.py)

이전 버그가 재발하지 않도록 핵심 회귀 케이스 등록:
1. TestCLIMain 재귀 이슈 방어 (monkeypatch 안전성)
2. dev3 GLM 프롬프트에 팀원 이름 대신 팀 ID 포함 확인
3. task-timer.py --help 미지원 확인 (run_tests.py 호환성)
4. generate_task_id() 기존 ID와 충돌 없음 확인
    N)PathWORKSPACE_ROOTz/home/jay/workspacememorytask-timer.pyc                     t         j                  j                  dt              } g }d }| |u}|}|r| j                  }d }||u}|}|slt        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  }	|j                  |	       |rt        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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}x}}t         j                  j                  |       }| j                  j!                  |       |S )N
task_timeris not)z%(py2)s is not %(py5)sspec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16r   zassert %(py19)spy19)	importlibutilspec_from_file_location_TIMER_MODULE_PATHloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolopAssertionError_format_explanationmodule_from_specexec_module)r   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20modules                  ,/home/jay/workspace/tests/test_regression.py_load_task_timer_moduler4      s   >>11,@RSD7t74t77474 777774t77777747774777t77777774777777777777777477777777777777^^,,T2FKKF#M    c                     dd l }t        t        j                  j	                               D ]  }|dk(  s	t        j                  |=  dd l}| |_        |S )Nr   dispatch)prompts.team_promptslistsysmoduleskeysr7   	WORKSPACE)tmp_pathpromptsmod_name	_dispatchs       r3   _load_dispatch_with_workspacerB   ,   sM    ))+, &z!H%& !"Ir5   c                       e Zd ZdZd Zd Zy)TestRegressionCLIRecursionu7   회귀 #1: TestCLIMain monkeypatch 재귀 이슈 방어c                    dz  j                  dd       dfd	}|t        _        	 t               }|j                  }d}|z  }d}||z  }||k(  }	|	st	        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
t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            dx}x}	x}x}x}}t        t        _        y# t        t        _        w xY w)uV   monkeypatch된 __init__이 원본을 호출하며 무한 재귀가 발생하지 않음r   Tparentsexist_okNc                 0    t        | t                     y N_original_initstrselfworkspace_pathr>   s     r3   patched_initzSTestRegressionCLIRecursion.test_patched_init_does_not_recurse.<locals>.patched_initB       4X/r5   task-timers.json==)zJ%(py2)s
{%(py2)s = %(py0)s.timer_file
} == ((%(py4)s / %(py6)s) / %(py9)s)timerr>   )py0r   py4py6r   zassert %(py12)spy12rJ   )mkdir	TaskTimer__init__
timer_filer   r   r   r   r   r   r!   r"   rL   )rO   r>   rQ   rV   r%   @py_assert5@py_assert7@py_assert8r)   r'   @py_format11@py_format13s    `          r3   "test_patched_init_does_not_recursez=TestRegressionCLIRecursion.test_patched_init_does_not_recurse>   s   	H	##D4#@	0 *		0KE##O(Ox(':O=OO':=O'OO#'OOOOO#'OOOOOOO5OOO5OOO#OOOOOOxOOOxOOO(OOO=OOOOOOOOO!/IIs   D:E4 4Fc                 (   d}t         |u}|st        j                  d|fdt         |f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}t        t               }|sdd	t        j                         v st        j
                  t              rt        j                  t              nd	dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      d
z  }t        t        j                  |            d}y)u&   원본 __init__이 보존되어 있음Nr	   )z%(py0)s is not %(py3)srL   rW   py3assert %(py5)sr   z,assert %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}callable)rW   py1rg   )
rL   r   r   r   r   r   r   r!   r"   ri   )rO   @py_assert2r%   @py_format4r,   s        r3   test_original_init_preservedz7TestRegressionCLIRecursion.test_original_init_preservedM   s    %))~T))))~T))))))~)))~)))T)))))))''''''''x'''x'''''''''''''''''''r5   N)__name__
__module____qualname____doc__rd   rm    r5   r3   rD   rD   ;   s    A0(r5   rD   c                   J    e Zd ZdZ ej
                         d        Zd Zd Zy)TestRegressionDev8GLMPromptue   회귀 #2: dev8 GLM 프롬프트에 팀 ID 포함, 개별 팀원 이름이 직접 표시되지 않음c                    |dz  dz  j                  dd       t        j                  t        j                   dfd	}dfd	}ddl}|j                  j
                  j                  t        d	|      5  |j                  j
                  j                  t        d
|      5  t        j                  ddd      }ddd       ddd       S # 1 sw Y   xY w# 1 sw Y   S xY w)u7   dev8-team 프롬프트를 생성 (파일 쓰기 격리)r   tasksTrF   Nc                 ~    t        |       }t         d|v r| j                  }|z  } |||      S  | ||      S )Nz/memory/tasks/encoding)rM   
_WORKSPACEname)	self_pathcontentry   path_strfilename
redirectedoriginal_write_texttask_dirs         r3   patched_write_textzCTestRegressionDev8GLMPrompt.dev8_prompt.<locals>.patched_write_text_   sL    9~H^,8$>>%0
*:wRR&y'HMMr5   c                 H    t        |       }t         d|v ry  | ||      S )Nz/memory/tasksrF   )rM   rz   )r|   rG   rH   r~   original_mkdirs       r3   patched_mkdirz>TestRegressionDev8GLMPrompt.dev8_prompt.<locals>.patched_mkdirg   s-    9~H]+x7!)WxPPr5   r   
write_textr[   	dev8-teamz
task-reg-1u   GLM 회귀 테스트rJ   )FF)	r[   r   r   unittest.mockmockpatchobjecttpbuild_prompt)	rO   r>   r   r   unittestpromptr   r   r   s	         @@@r3   dev8_promptz'TestRegressionDev8GLMPrompt.dev8_promptV   s     h&0td3"oo	N	Q 	 MM&&t\;MN	XMM&&tWmD	X __[,@VWF		X 	X 	X 	X 	X s$   ;,C'C?CC	CC'c                 N   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)	u'   dev8 프롬프트에 'dev8-team' 포함r   inz%(py1)s in %(py3)sr   rj   rg   rh   r   N)r   r   r   r   r   r   r!   r"   )rO   r   r(   rk   rl   r,   s         r3   !test_dev8_prompt_contains_team_idz=TestRegressionDev8GLMPrompt.test_dev8_prompt_contains_team_idw   s[    ){k)))){k))){))))))k)))k)))))))r5   c                 &   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	)
u   dev8-team의 type이 'mcp'r   typemcprT   )z%(py1)s == %(py4)s)rj   rX   zassert %(py6)srY   N)r   	TEAM_INFOr   r   r   r!   r"   )rO   r(   r'   rk   @py_format5@py_format7s         r3   test_dev8_prompt_type_is_mcpz8TestRegressionDev8GLMPrompt.test_dev8_prompt_type_is_mcp{   s]    ||K(09E90E99990E9990999E9999999r5   N)	rn   ro   rp   rq   pytestfixturer   r   r   rr   r5   r3   rt   rt   S   s+    oV^^ @*:r5   rt   c                       e Zd ZdZd Zd Zy)TestRegressionTaskTimerHelpu>   회귀 #3: task-timer.py --help 미지원 (argparse 미사용)c                 (   |j                  t        ddg       t        j                  t              5 }t                ddd       j                  }|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                  |      t        j                  |      dz  }d	d
|iz  }	t        t        j                  |	            dx}x}x}}|j!                         }
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# 1 sw Y   xY w)u3   인자 없이 실행하면 Usage 출력 후 exit(1)argvr   N   rT   )zG%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.value
}.code
} == %(py7)sexc_info)rW   r   rX   r   zassert %(py9)sr   Usager   )z+%(py1)s in %(py5)s
{%(py5)s = %(py3)s.out
}captured)rj   rg   r   zassert %(py7)sr   )setattrr:   r   raises
SystemExit
_main_funcvaluecoder   r   r   r   r   r   r!   r"   
readouterrout)rO   monkeypatchcapsysr   r%   r'   @py_assert6r_   r-   @py_format10r   r(   r&   rk   r,   s                  r3   test_no_args_exits_with_usagez9TestRegressionTaskTimerHelp.test_no_args_exits_with_usage   s@   C/):;]]:& 	(L	~~'~""'a'"a''''"a''''''x'''x'''~'''"'''a'''''''$$&&(,,&w,&&&&w,&&&w&&&&&&(&&&(&&&,&&&&&&&		 	s   HHc                 .   dfd	}|j                  t        d|       |j                  t        dddg       t                |j	                         }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)u0   list 명령어는 인자 없이도 정상 동작Nc                 0    t        | t                     y rJ   rK   rN   s     r3   rQ   zVTestRegressionTaskTimerHelp.test_list_command_works_without_args.<locals>.patched_init   rR   r5   r]   r   r   r9   totalr   r   outputr   rh   r   rJ   )r   r\   r:   r   r   jsonloadsr   r   r   r   r   r   r   r!   r"   )rO   r>   r   r   rQ   r   r   r(   rk   rl   r,   s    `         r3   $test_list_command_works_without_argsz@TestRegressionTaskTimerHelp.test_list_command_works_without_args   s    	0 	Iz<@C/6)BC$$&HLL) w&    w&   w      &   &       r5   N)rn   ro   rp   rq   r   r   rr   r5   r3   r   r      s    H'!r5   r   c                   P    e Zd ZdZ ej
                         d        Zd Zd Zd Z	y)%TestRegressionGenerateTaskIdCollisionu8   회귀 #4: generate_task_id() 기존 ID와 충돌 없음c                 v    |dz  j                  dd       |dz  dz  j                  dd       t        |      S )Nr   TrF   rv   )r[   rB   )rO   r>   s     r3   dispatch_modz2TestRegressionGenerateTaskIdCollision.dispatch_mod   sB    	H	##D4#@	H	w	&--dT-J,X66r5   c                    |dz  dz  }dddiddidi}|j                  t        j                  |      d	       |j                         }|d   }||v}|st	        j
                  d
|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}}y)u,   기존 ID가 있을 때 새 ID는 다른 값r   rS   rv   status	completedrunning)ztask-1.1ztask-2.1utf-8rx   not in)z%(py0)s not in %(py3)snew_idrf   rh   r   Nr   r   dumpsgenerate_task_idr   r   r   r   r   r   r!   r"   
rO   r   r>   r^   existingr   rk   r%   rl   r,   s
             r3   #test_no_collision_with_existing_idszITestRegressionGenerateTaskIdCollision.test_no_collision_with_existing_ids   s    (+==
%{3%y1
 	djj2WE..0%g..v.....v.......v...v...........r5   c                 L   t               }t        d      D ]  }|j                         }||v}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                  d|       dz   d	|iz  }t        t        j                  |            d
}|j                  |        y
)u4   연속 생성된 ID들이 서로 충돌하지 않음
   r   )z%(py0)s not in %(py2)stask_idids)rW   r   u   중복 ID 발생: z
>assert %(py4)srX   N)setranger   r   r   r   r   r   r   _format_assertmsgr!   r"   add)	rO   r   r>   r   _r   r%   @py_format3r   s	            r3   !test_sequential_ids_never_collidezGTestRegressionGenerateTaskIdCollision.test_sequential_ids_never_collide   s    er 	A"335G#%EEE7#EEEEEE7EEE7EEEEEE#EEE#EEEE);G9'EEEEEEEGGG	r5   c                    |dz  dz  }dddiddidi}|j                  t        j                  |      d	       |j                         }d
}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}}y)u.   새 ID의 숫자가 기존 최대 ID보다 큼r   rS   rv   r   r   r   )ztask-5.1z	task-10.1r   rx   ztask-11rT   )z%(py0)s == %(py3)sr   rf   rh   r   Nr   r   s
             r3   #test_new_id_is_higher_than_existingzITestRegressionGenerateTaskIdCollision.test_new_id_is_higher_than_existing   s    (+==
%{3&	2
 	djj2WE..0""v""""v""""""v"""v""""""""""r5   N)
rn   ro   rp   rq   r   r   r   r   r   r   rr   r5   r3   r   r      s/    BV^^7 7
/#r5   r   )%rq   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r   importlib.utilr   osr:   pathlibr   r   environgetrz   rM   pathinsertr   r4   _task_timer_modr\   mainr   r]   rL   rB   r8   team_promptsr   rD   rt   r   r   rr   r5   r3   <module>r      s         	 
   "**..!13HIJ
z?#(("HHOOAs:'  (*_<  *+%%	!!
##	 "( (0*: *:Z! !4*# *#r5   