
    (<i                        d 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j$                  Zej&                  Zej*                  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              } | | j                  J t         j                  j                  |       }| j                  j                  |       |S )N
task_timer)	importlibutilspec_from_file_location_TIMER_MODULE_PATHloadermodule_from_specexec_module)specmodules     F/home/jay/workspace/.worktrees/task-2057-dev2/tests/test_regression.py_load_task_timer_moduler      sY    >>11,@RSD 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keysr   	WORKSPACE)tmp_pathpromptsmod_name	_dispatchs       r   _load_dispatch_with_workspacer!   ,   sM    ))+, &z!H%& !"Ir   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J 	 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     r   patched_initzSTestRegressionCLIRecursion.test_patched_init_does_not_recurse.<locals>.patched_initB       4X/r   task-timers.jsonr)   )mkdir	TaskTimer__init__
timer_filer+   )r.   r   r0   timers    `  r   "test_patched_init_does_not_recursez=TestRegressionCLIRecursion.test_patched_init_does_not_recurse>   sf    	H	##D4#@	0 *		0KE##x(':=O'OOOO!/IIs   !A A-c                 6    t         J t        t               sJ y)u&   원본 __init__이 보존되어 있음N)r+   callabler.   s    r   test_original_init_preservedz7TestRegressionCLIRecursion.test_original_init_preservedM   s    )))'''r   N)__name__
__module____qualname____doc__r8   r<    r   r   r#   r#   ;   s    A0(r   r#   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   tasksTr%   Nc                 ~    t        |       }t         d|v r| j                  }|z  } |||      S  | ||      S )Nz/memory/tasks/encoding)r,   
_WORKSPACEname)	self_pathcontentrH   path_strfilename
redirectedoriginal_write_texttask_dirs         r   patched_write_textzCTestRegressionDev8GLMPrompt.dev8_prompt.<locals>.patched_write_text_   sL    9~H^,8$>>%0
*:wRR&y'HMMr   c                 H    t        |       }t         d|v ry  | ||      S )Nz/memory/tasksr%   )r,   rI   )rK   r&   r'   rM   original_mkdirs       r   patched_mkdirz>TestRegressionDev8GLMPrompt.dev8_prompt.<locals>.patched_mkdirg   s-    9~H]+x7!)WxPPr   r   
write_textr3   	dev8-teamz
task-reg-1u   GLM 회귀 테스트r)   )FF)	r3   r   rV   unittest.mockmockpatchobjecttpbuild_prompt)	r.   r   rR   rU   unittestpromptrT   rP   rQ   s	         @@@r   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                     d|v sJ y)u'   dev8 프롬프트에 'dev8-team' 포함rW   NrA   )r.   r`   s     r   !test_dev8_prompt_contains_team_idz=TestRegressionDev8GLMPrompt.test_dev8_prompt_contains_team_idw   s    k)))r   c                 :    t         j                  d   d   dk(  sJ y)u   dev8-team의 type이 'mcp'rW   typemcpN)r\   	TEAM_INFOr;   s    r   test_dev8_prompt_type_is_mcpz8TestRegressionDev8GLMPrompt.test_dev8_prompt_type_is_mcp{   s    ||K(0E999r   N)	r=   r>   r?   r@   pytestfixturer`   rb   rg   rA   r   r   rC   rC   S   s+    oV^^ @*:r   rC   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(  sJ |j                         }d|j                  v sJ y# 1 sw Y   ExY w)u3   인자 없이 실행하면 Usage 출력 후 exit(1)argvr   N   Usage)
setattrr   rh   raises
SystemExit
_main_funcvaluecode
readouterrout)r.   monkeypatchcapsysexc_infocaptureds        r   test_no_args_exits_with_usagez9TestRegressionTaskTimerHelp.test_no_args_exits_with_usage   sw    C/):;]]:& 	(L	~~""a'''$$&(,,&&&		 	s   BB
c                     dfd	}|j                  t        d|       |j                  t        dddg       t                |j	                         }t        j                  |j                        }d|v sJ y)	u0   list 명령어는 인자 없이도 정상 동작Nc                 0    t        | t                     y r)   r*   r-   s     r   r0   zVTestRegressionTaskTimerHelp.test_list_command_works_without_args.<locals>.patched_init   r1   r   r5   rm   r   r   totalr)   )rp   r4   r   rs   rv   jsonloadsrw   )r.   r   rx   ry   r0   r{   outputs    `     r   $test_list_command_works_without_argsz@TestRegressionTaskTimerHelp.test_list_command_works_without_args   sf    	0 	Iz<@C/6)BC$$&HLL)&   r   N)r=   r>   r?   r@   r|   r   rA   r   r   rk   rk      s    H'!r   rk   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   Tr%   rE   )r3   r!   )r.   r   s     r   dispatch_modz2TestRegressionGenerateTaskIdCollision.dispatch_mod   sB    	H	##D4#@	H	w	&--dT-J,X66r   c                     |dz  dz  }dddiddidi}|j                  t        j                  |      d	       |j                         }||d   vsJ y
)u,   기존 ID가 있을 때 새 ID는 다른 값r   r2   rE   status	completedrunning)ztask-1.1ztask-2.1utf-8rG   NrV   r   dumpsgenerate_task_idr.   r   r   r6   existingnew_ids         r   #test_no_collision_with_existing_idszITestRegressionGenerateTaskIdCollision.test_no_collision_with_existing_ids   sp    (+==
%{3%y1
 	djj2WE..0Xg....r   c                     t               }t        d      D ]1  }|j                         }||vs
J d|        |j                  |       3 y)u4   연속 생성된 ID들이 서로 충돌하지 않음
   u   중복 ID 발생: N)setranger   add)r.   r   r   ids_task_ids         r   !test_sequential_ids_never_collidezGTestRegressionGenerateTaskIdCollision.test_sequential_ids_never_collide   sQ    er 	A"335G#%E);G9'EE%GGG	r   c                     |dz  dz  }dddiddidi}|j                  t        j                  |      d	       |j                         }|d
k(  sJ y)u.   새 ID의 숫자가 기존 최대 ID보다 큼r   r2   rE   r   r   r   )ztask-5.1z	task-10.1r   rG   ztask-11Nr   r   s         r   #test_new_id_is_higher_than_existingzITestRegressionGenerateTaskIdCollision.test_new_id_is_higher_than_existing   sk    (+==
%{3&	2
 	djj2WE..0"""r   N)
r=   r>   r?   r@   rh   ri   r   r   r   r   rA   r   r   r   r      s/    BV^^7 7
/#r   r   )r@   r	   importlib.utilr   osr   pathlibr   rh   environgetrI   r,   pathinsertr   r   _task_timer_modr4   mainrs   r5   r+   r!   r   team_promptsr\   r#   rC   rk   r   rA   r   r   <module>r      s       	 
   "**..!13HIJ
z?#(("HHOOAs:'  (*_<  *+%%	!!
##	 "( (0*: *:Z! !4*# *#r   