
    viY                         d Z ddlZddlmc mZ ddlZej                  j                  dd       ddl
mZmZmZmZmZ d Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)uN   
통합 테스트: prompts/gate_instructions.py
task-1837_5.1 - 엔키 작성
    N/home/jay/workspace)GATE_INSTRUCTIONSformat_for_promptget_codex_gate_commandget_gate_instructionsshould_run_codex_checkc                     t        d      D ]  } t        |       }t        |t              }|s%t	        j
                  d|  d      dz   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dt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |      dz  }t        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}}t        |    }||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	)uE   레벨 0~4 각각에 맞는 게이트 dict가 반환되어야 한다.   level=u    반환값이 dict가 아님z7
>assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceresultdictpy0py1py2py4Ng1inz%(py1)s in %(py3)sr   py3assert %(py5)spy5g2g3==z%(py0)s == %(py3)sr   r   )ranger   r   r   
@pytest_ar_format_assertmsg@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation_call_reprcomparer   )	levelr   @py_assert3@py_format5@py_assert0@py_assert2@py_format4@py_format6@py_assert1s	            ?/home/jay/workspace/tests/integration/test_gate_instructions.py>test_get_gate_instructions_returns_correct_dict_for_each_levelr5      s%   q 2&u-&$'U'UU6%8T)UUUUUUUzUUUzUUUUUU&UUU&UUUUUU$UUU$UUU'UUUUUUtv~tvtvvtv~tvtvvtv~tvtvv*511v11111v1111111v111v111111111112    c                  t   t        d      } t        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	)
uV   정의되지 않은 레벨(예: 99)이면 GATE_INSTRUCTIONS[0]을 반환해야 한다.c   r   r   r    r   r!   r   r   N)
r   r   r#   r+   r%   r&   r'   r(   r)   r*   )r   r0   r3   r1   r2   s        r4   5test_get_gate_instructions_fallback_for_unknown_levelr9   !   sm    "2&F&q))6)))))6)))))))6)))6)))))))))))r6   c                  f   dD ]  } t        |       }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d|  d|d         d	z   d
|iz  }t        t        j                  |            dx}x}} y)u3   레벨 0, 1은 g1이 빈 문자열이어야 한다.)r      r    r   z%(py1)s == %(py4)sr   r   r   u    g1이 비어있지 않음: z
>assert %(py6)spy6N)r   r#   r+   r(   r$   r)   r*   )r,   gr/   r-   r0   r.   @py_format7s          r4   5test_get_gate_instructions_level0_and_1_have_empty_g1rB   '   s     V!%(wU"Uw"}UUUw"UUUwUUU"UUUug-I!D'UUUUUUUUVr6   c                     dD ]A  } t        |       }|d   }|sRt        j                  d|  d      dz   dt        j                  |      iz  }t	        t        j
                  |            d}d}|d   }|j                  } |       }||v }|st        j                  d	|fd
||f      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|  d      dz   d|iz  }	t	        t        j
                  |	            dx}x}x}x}}D y)u]   레벨 3, 4는 g1이 비어있지 않아야 하며 sanitize 키워드를 포함해야 한다.      r   r   u    g1이 비어있음z
>assert %(py1)sr   Nsanitizer   )zD%(py1)s in %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.lower
}()
})r   r   r?   py8u    g1에 sanitize 없음z
>assert %(py10)spy10)r   r#   r$   r(   r)   r*   lowerr+   )
r,   r@   r/   @py_format2r-   @py_assert5@py_assert7r0   @py_format9@py_format11s
             r4   8test_get_gate_instructions_level3_and_4_have_nonempty_g1rP   .   s     U!%(w;w;;&':;;;;w;;;;;TQtWTW]]T]_Tz_,TTTz_TTTzTTTWTTT]TTT_TTTug=S.TTTTTTTTUr6   c                  d   t        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}}y	)
uV   레벨 0은 g1이 비어있으므로 [G1 설계 게이트] 섹션이 없어야 한다.r      [G1 설계 게이트]not inz%(py1)s not in %(py3)soutputr   r   r   N	r   r#   r+   r(   r%   r&   r'   r)   r*   rV   r/   r0   r1   r2   s        r4   +test_format_for_prompt_level0_no_g1_sectionrY   8   sh    q!F"0"&0000"&000"000000&000&0000000r6   c                     t        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	)uV   레벨 1도 g1이 비어있으므로 [G1 설계 게이트] 섹션이 없어야 한다.r;   rR   rS   rU   rV   r   r   r   N   [G2 구현 게이트]r   r      [G3 머지 게이트]rW   rX   s        r4   +test_format_for_prompt_level1_no_g1_sectionr]   >   s    q!F"0"&0000"&000"000000&000&0000000","f,,,,"f,,,",,,,,,f,,,f,,,,,,,","f,,,,"f,,,",,,,,,f,,,f,,,,,,,r6   c                     t        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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}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}}y	)uP   레벨 3은 sanitize 키워드가 포맷된 문자열에 포함되어야 한다.rE   rG   r   zD%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.lower
}()
}rV   r   r   r   py7assert %(py9)spy9NrR   r   r   r   r   r[   r\   
r   rJ   r#   r+   r(   r%   r&   r'   r)   r*   )	rV   r/   @py_assert4@py_assert6r0   @py_format8@py_format10r1   r2   s	            r4   /test_format_for_prompt_level3_contains_sanitizeri   F   s   q!F''':'''':''':''''''''''''''''''''''","f,,,,"f,,,",,,,,,f,,,f,,,,,,,","f,,,,"f,,,",,,,,,f,,,f,,,,,,,","f,,,,"f,,,",,,,,,f,,,f,,,,,,,r6   c                     t        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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}x}}y	)
u9   레벨 4도 sanitize 키워드가 포함되어야 한다.rF   rG   r   r_   rV   r`   rb   rc   Nrd   )rV   r/   re   rf   r0   rg   rh   s          r4   /test_format_for_prompt_level4_contains_sanitizerk   O   s    q!F''':'''':''':''''''''''''''''''''''r6   c                     t        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	)u\   레벨 2는 g1, g2, g3 모두 비어있지 않으므로 3개 섹션 모두 있어야 한다.   rR   r   r   rV   r   r   r   Nr[   r\   rW   rX   s        r4   +test_format_for_prompt_level2_has_all_gatesrn   U   s    q!F","f,,,,"f,,,",,,,,,f,,,f,,,,,,,","f,,,,"f,,,",,,,,,f,,,f,,,,,,,","f,,,,"f,,,",,,,,,f,,,f,,,,,,,r6   c                  j   dD ]-  } t        |       }d}||u }|st        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  }t        j                  d|  d	      d
z   d|iz  }t        t        j                  |            dx}x}}0 y)u/   레벨 0, 1, 2는 False를 반환해야 한다.)r   r;   rm   Fisz0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} is %(py6)sr   r,   r   r   r   r?   r   u   이 True 반환
>assert %(py8)srH   N
r   r#   r+   r%   r&   r'   r(   r$   r)   r*   r,   r0   rL   re   rA   rN   s         r4   1test_should_run_codex_check_below_3_returns_falserw   _   s     W%e,VV,5VVV,VVVVVV%VVV%VVVVVVeVVVeVVV,VVVVVVwo7VVVVVVVVWr6   c                  j   dD ]-  } t        |       }d}||u }|st        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  }t        j                  d|  d	      d
z   d|iz  }t        t        j                  |            dx}x}}0 y)u+   레벨 3, 4는 True를 반환해야 한다.rD   Trp   rr   r   r,   rs   r   u   이 False 반환rt   rH   Nru   rv   s         r4   4test_should_run_codex_check_3_and_above_returns_truery   e   s     W%e,VV,4VVV,VVVVVV%VVV%VVVVVVeVVVeVVV,VVVVVVugEU6VVVVVVVVWr6   c                     d} t        |       }d}||u }|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
} t        |       }d}||u }|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	)u2   경계값 레벨 3이 정확히 True인지 확인.rE   Trp   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} is %(py7)sr   )r   r   r   ra   rb   rc   Nrm   F)	r   r#   r+   r%   r&   r'   r(   r)   r*   )r3   r-   rf   rL   rg   rh   s         r4   $test_should_run_codex_check_boundaryr{   k   s
   "#,!!$,,$,,,,$,,,,,,!,,,!,,,!,,,$,,,,,,,,,,"#-!!$--$----$------!---!---!---$----------r6   c                  	   t        dg d      } t        | t              }|sd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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        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   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}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}}y	)u_   기본 명령어 리스트 구조: python3, script_path, --task-file, path, --workspace 포함./tmp/task.mdr   	task_fileaffected_filesworkspace_rootz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r   cmdlistr   Nr   python3r   r=   r>   assert %(py6)sr?   zcodex_gate_check.pyr;   r   )z%(py1)s in %(py4)sz--task-filer   r   r   r   --workspace-root)r   r   r   r%   r&   r#   r'   r(   r)   r*   r+   )r   r-   r.   r/   r0   rA   r1   r2   s           r4   +test_get_codex_gate_command_basic_structurer   s   s   
  ,C
 c4        :   :      c   c      4   4          q6Y6Y6Y6Y *CF* F**** F*** ***F*******=C=C=CC >S    >S   >      S   S       $$$$$$$$$$$$$$$$$$$$$$$$ ' C'''' C''' ''''''C'''C'''''''r6   c                     ddg} t        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}}|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}}||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)uX   affected_files가 있으면 --affected-files 뒤에 파일들이 포함되어야 한다.zdispatch.pyzutils/logger.pyr}   r   r~   --affected-filesr   r   r   r   r   r   Nr;   r   r=   r>   r   r?   rm   )
r   r#   r+   r(   r%   r&   r'   r)   r*   index)
filesr   r/   r0   r1   r2   idxr-   r.   rA   s
             r4   /test_get_codex_gate_command_with_affected_filesr      s5   -.E
  ,C
 $$$$$$$$$$$$$$$$$$$$$$$$
))&
'CsQw<(=(<=((((<=(((<(((=(((((((sQw<,,,<,,,,,<,,,,<,,,,,,,,,,,r6   c                  j   t        dg 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}}y)uH   affected_files가 빈 리스트면 --affected-files가 없어야 한다.r}   r   r~   r   rS   rU   r   r   r   r   N)	r   r#   r+   r(   r%   r&   r'   r)   r*   )r   r/   r0   r1   r2   s        r4   2test_get_codex_gate_command_without_affected_filesr      ss    
  ,C
 (S((((S(((((((((S(((S(((((((r6   c                     d} t        ddg|       }|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}}|j                  d      }||dz      }|| k(  }|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)uR   workspace_root 인자가 script_path와 --workspace 값에 반영되어야 한다.z/custom/workspacer}   za.pyr~   r;   r   )z%(py0)s in %(py3)scustom_rootr!   r   r   Nr   r   )z%(py1)s == %(py3)sr   )
r   r#   r+   r%   r&   r'   r(   r)   r*   r   )r   r   r0   r3   r1   r2   ws_idxr/   s           r4   /test_get_codex_gate_command_uses_workspace_rootr      s    %K
  x"C a& ;&    ;&      ;   ;   &       YY)*Fvz?)?k))))?k)))?))))))k)))k)))))))r6   ) __doc__builtinsr%   _pytest.assertion.rewrite	assertionrewriter#   syspathinsertprompts.gate_instructionsr   r   r   r   r   r5   r9   rB   rP   rY   r]   ri   rk   rn   rw   ry   r{   r   r   r   r    r6   r4   <module>r      s   
  
 ( ) 	2*VU1--(-WW.( -)*r6   