
    i                      x   d Z ddlZddlZddlZddlmZ ddlZej                  j                  d e	 ee
      j                  j                  j                               ddlmZ  G d d      Z G d d      Z G d	 d
      Z G d d      Z G d d      Z G d d      Zedk(  r ej*                  e
dg       yy)u3   utils/persistent_shell.py 테스트 스위트 (TDD)    N)PathPersistentShellc                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestBasicCommandsu   단순 명령 실행 테스트c                     t               5 }|j                  d      \  }}d|v sJ |dk(  sJ 	 ddd       y# 1 sw Y   yxY w)u$   echo 명령 실행 — 출력 반환
echo hellohellor   Nr   runselfshoutcodes       R/home/jay/workspace/.worktrees/task-2116-dev1/utils/tests/test_persistent_shell.pytest_echo_returns_outputz*TestBasicCommands.test_echo_returns_output   sI     	"|,ICc>!>199	 	 		   "7A c                 z    t               5 }|j                  d      \  }}|dk(  sJ 	 ddd       y# 1 sw Y   yxY w)u   성공 명령의 exit code = 0truer   Nr   r   r   _r   s       r   test_exit_code_successz(TestBasicCommands.test_exit_code_success   s<     	"ffVnGAt199	 	 	   1:c                 z    t               5 }|j                  d      \  }}|dk7  sJ 	 ddd       y# 1 sw Y   yxY w)u   실패 명령의 exit code != 0falser   Nr   r   s       r   test_exit_code_failurez(TestBasicCommands.test_exit_code_failure%   s<     	"ffWoGAt199	 	 	r   c                 ~    t               5 }|j                  dd      \  }}|dk(  sJ 	 ddd       y# 1 sw Y   yxY w)u   특정 exit code 값 확인zexit 42      @timeout*   Nr   r   s       r   test_exit_code_specific_valuez/TestBasicCommands.test_exit_code_specific_value+   sA     	"ffYf4GAt2::	 	 	s   3<c                     t               5 }|j                  d      \  }}d|v sJ d|v sJ d|v sJ |dk(  sJ 	 ddd       y# 1 sw Y   yxY w)u   여러 줄 출력 반환zprintf 'line1\nline2\nline3\n'line1line2line3r   Nr   r   s       r   test_multiline_outputz'TestBasicCommands.test_multiline_output2   sb     	"BCICc>!>c>!>c>!>199	 	 	s   .AAc                     t               5 }|j                  d      \  }}d|v sJ |dk(  sJ 	 ddd       y# 1 sw Y   yxY w)u   인자가 있는 명령 실행zecho -n test_value
test_valuer   Nr   r   s       r   test_command_with_argumentsz-TestBasicCommands.test_command_with_arguments;   sL     	"34IC3&&&199	 	 	r   N)
__name__
__module____qualname____doc__r   r   r   r#   r(   r+        r   r   r      s#    (r1   r   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestDirectoryPersistenceu+   cd 후 디렉토리 상태 유지 테스트c                     t               5 }|j                  d|        |j                  d      \  }}t        |      |v sJ |dk(  sJ 	 ddd       y# 1 sw Y   yxY w)u#   cd 명령으로 디렉토리 변경cd pwdr   Nr   r   str)r   tmp_pathr   r   r   s        r   test_cd_changes_directoryz2TestDirectoryPersistence.test_cd_changes_directoryK   sa     	"FFS
#$uICx=C'''199		 	 	s   ?AAc                     t               5 }|j                  d|        |j                  d       |j                  d      \  }}t        |      |v sJ 	 ddd       y# 1 sw Y   yxY w)u.   cd 후 다음 명령에도 디렉토리 유지r5   r   r6   Nr7   )r   r9   r   r   r   s        r   &test_cd_state_persists_across_commandsz?TestDirectoryPersistence.test_cd_state_persists_across_commandsS   s`     	("FFS
#$FF6NVVE]FCx=C'''		( 	( 	(s   A	AA'c                     t               5 }|j                  d|        |j                         }t        |      |v sJ 	 ddd       y# 1 sw Y   yxY w)u*   get_cwd()가 cd 이후 디렉토리 반환r5   N)r   r   get_cwdr8   )r   r9   r   cwds       r   test_get_cwd_reflects_cdz1TestDirectoryPersistence.test_get_cwd_reflects_cd[   sO     	("FFS
#$**,Cx=C'''	( 	( 	(s   4A		Ac                     |dz  }|j                          t               5 }|j                  d|        |j                  d       |j                         }d|v sJ 	 ddd       y# 1 sw Y   yxY w)u*   연속 cd 명령으로 디렉토리 추적subdirr5   z	cd subdirN)mkdirr   r   r>   )r   r9   rB   r   r?   s        r   test_multiple_cd_commandsz2TestDirectoryPersistence.test_multiple_cd_commandsb   sh    H$ 	#"FFS
#$FF;**,Cs?"?		# 	# 	#s   <A&&A/N)r,   r-   r.   r/   r:   r<   r@   rD   r0   r1   r   r3   r3   H   s    5((#r1   r3   c                   (    e Zd ZdZd Zd Zd Zd Zy)TestEnvironmentPersistenceu(   환경변수 설정 및 조회 테스트c                     t               5 }|j                  d       |j                  d      }|dk(  sJ 	 ddd       y# 1 sw Y   yxY w)u   환경변수 설정 후 조회zexport MY_VAR=hello_worldMY_VARhello_worldNr   r   get_envr   r   vals      r   test_set_and_get_env_varz3TestEnvironmentPersistence.test_set_and_get_env_varu   sH     	("FF./**X&C-'''	( 	( 	(s	   *?Ac                     t               5 }|j                  d       |j                  d       |j                  d      \  }}d|v sJ 	 ddd       y# 1 sw Y   yxY w)u.   환경변수가 여러 명령에 걸쳐 유지zexport PERSIST_VAR=persistentr   zecho $PERSIST_VAR
persistentNr   )r   r   r   r   s       r   %test_env_var_persists_across_commandsz@TestEnvironmentPersistence.test_env_var_persists_across_commands|   sX     	'"FF23FF6NVV/0FC3&&&		' 	' 	's   =AAc                 n    t               5 }|j                  d      }|J 	 ddd       y# 1 sw Y   yxY w)u)   존재하지 않는 환경변수 → None__NONEXISTENT_VAR_12345__N)r   rK   rL   s      r   %test_get_env_returns_none_for_missingz@TestEnvironmentPersistence.test_get_env_returns_none_for_missing   s8     	"**89C;;	 	 	s   +4c                     t               5 }|j                  d       |j                  d       |j                  d      }|dk(  sJ 	 ddd       y# 1 sw Y   yxY w)u   환경변수 덮어쓰기zexport OVERRIDE_VAR=firstzexport OVERRIDE_VAR=secondOVERRIDE_VARsecondNrJ   rL   s      r   test_env_var_overridez0TestEnvironmentPersistence.test_env_var_override   sS     	#"FF./FF/0**^,C(?"?		# 	# 	#   ;AAN)r,   r-   r.   r/   rN   rQ   rT   rX   r0   r1   r   rF   rF   r   s    2('#r1   rF   c                   "    e Zd ZdZd Zd Zd Zy)TestContextManageru'   컨텍스트 매니저 사용 테스트c                     t               5 }|j                  d      \  }}d|v sJ |dk(  sJ 	 ddd       y# 1 sw Y   yxY w)u    with 블록 정상 진입/종료zecho context_ok
context_okr   Nr   r   s       r   %test_context_manager_enters_and_exitsz8TestContextManager.test_context_manager_enters_and_exits   sL     	"01IC3&&&199	 	 	r   c                 N    t               5 }|}ddd       J y# 1 sw Y   xY w)u*   with 블록 종료 후 프로세스 정리Nr   )r   r   procs      r   &test_context_manager_cleans_up_on_exitz9TestContextManager.test_context_manager_cleans_up_on_exit   s2     	"D	 		 	s   $c                 z    t               }|j                  d       |j                          |j                          y)u   명시적 close() 호출zecho before_closeN)r   r   close)r   r   s     r   test_explicit_closez&TestContextManager.test_explicit_close   s)    
"#



r1   N)r,   r-   r.   r/   r^   ra   rd   r0   r1   r   r[   r[      s    1 r1   r[   c                       e Zd ZdZd Zd Zy)TestTimeoutu   타임아웃 처리 테스트c                 0   t               5 }t        j                         }	 |j                  dd      \  }}t        j                         |z
  }|dk  sJ 	 ddd       y# t        $ r! t        j                         |z
  }|dk  sJ Y 2w xY w# 1 sw Y   yxY w)u!   긴 명령에 타임아웃 발생zsleep 60g      ?r    g      $@N)r   timer   	Exception)r   r   startr   r   elapseds         r   .test_timeout_raises_or_returns_on_long_commandz:TestTimeout.test_timeout_raises_or_returns_on_long_command   s     		&"IIKE&FF:sF;	T))+-~%~		& 		&  &))+-~%~&		& 		&s.   B4AB'B	BB		BBc                     t               5 }|j                  dd      \  }}d|v sJ |dk(  sJ 	 ddd       y# 1 sw Y   yxY w)u+   빠른 명령은 타임아웃 없이 완료z	echo fastr   r    fastr   Nr   r   s       r   test_fast_command_no_timeoutz(TestTimeout.test_fast_command_no_timeout   sM     	"{C8ICS= =199	 	 	s	   $9AN)r,   r-   r.   r/   rl   ro   r0   r1   r   rf   rf      s    '&r1   rf   c                   "    e Zd ZdZd Zd Zd Zy)TestSequentialStateu,   연속 명령 실행 상태 유지 테스트c                    t               5 }|j                  d|        |j                  d       |j                  d      \  }}|j                  d      \  }}t        |      |v sJ d|v sJ 	 ddd       y# 1 sw Y   yxY w)u-   여러 명령 연속 실행 시 상태 유지r5   zexport SEQ_VAR=sequentialr6   zecho $SEQ_VAR
sequentialNr7   )r   r9   r   out_pwdr   out_envs         r   'test_sequential_commands_maintain_statez;TestSequentialState.test_sequential_commands_maintain_state   s     	+"FFS
#$FF./JGQ0JGQx=G+++7***	+ 	+ 	+s   A#A88Bc                     t               5 }|j                  d      }t        |t              sJ t	        |      dk(  sJ t        |d   t
              sJ t        |d   t              sJ 	 ddd       y# 1 sw Y   yxY w)u!   run()이 (str, int) 튜플 반환r	      r      N)r   r   
isinstancetuplelenr8   int)r   r   results      r   test_run_returns_tuplez*TestSequentialState.test_run_returns_tuple   sw     	."VVL)Ffe,,,v;!###fQi---fQi---	. 	. 	.s   AA33A<c                     t               5 }|j                  d|        |j                  d       |dz  j                         sJ 	 ddd       y# 1 sw Y   yxY w)u@   cd 후 파일 생성 — 실제 해당 디렉토리에 생성됨r5   zecho content > testfile.txtztestfile.txtN)r   r   exists)r   r9   r   s      r   #test_file_created_in_persistent_dirz7TestSequentialState.test_file_created_in_persistent_dir   sV     	8"FFS
#$FF01~-55777	8 	8 	8rY   N)r,   r-   r.   r/   rv   r   r   r0   r1   r   rq   rq      s    6+.8r1   rq   __main__z-v)r/   ossysrh   pathlibr   pytestpathinsertr8   __file__parentutils.persistent_shellr   r   r3   rF   r[   rf   rq   r,   mainr0   r1   r   <module>r      s    9 	 
    3tH~,,33::; < 2+ +f"# "#T# #L @ :8 8< zFKK4 ! r1   