
    i"                     j   d Z ddlZddlmc m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             ddlmZmZ ddlmZmZmZ  G d d	      Z G d
 d      Z G d d      Z G d d      Zy)u"  
test_token_optimization_green.py

토큰 최적화 GREEN 4건 (G-1~G-4) 검증 테스트 (task-1269.1)

G-1: 선택적 노하우 로딩 — phase_group 파라미터
G-2: Overview QC 이중 적재 해결
G-3: 에스컬레이션 섹션 중복 제거
G-4: 서브에이전트 결과 구조화
    N)PathWORKSPACE_ROOTz/home/jay/workspace)build_phase_minus1_promptbuild_workflow_overview_prompt)_assemble_composite_prompt_build_design_prompt_build_marketing_promptc                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestG1SelectiveKnowhowLoadingu>   G-1: build_phase_minus1_prompt phase_group 파라미터 검증c                 B   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}}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-   기본값(final)은 3개 파일 모두 포함test-g1knowhow-marketing.mdinz%(py1)s in %(py3)sresultpy1py3assert %(py5)spy5Nknowhow-design.mddesign-qc-knowhow.mdu   3개 모두	r   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_nameAssertionError_format_explanationselfr   @py_assert0@py_assert2@py_format4@py_format6s         :/home/jay/workspace/tests/test_token_optimization_green.py(test_default_phase_group_loads_all_threezFTestG1SelectiveKnowhowLoading.test_default_phase_group_loads_all_three$   sy   *95%/%////%///%////////////////","f,,,,"f,,,",,,,,,f,,,f,,,,,,,%/%////%///%////////////////&}&&&&}&&&}&&&&&&&&&&&&&&&&    c                 F   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}}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%   copy 그룹은 marketing + qc 2개만r   copyphase_groupr   r   r   r   r   r   r   Nr   r   not inz%(py1)s not in %(py3)s   2개 모두r   r#   s         r)   test_copy_phase_groupz3TestG1SelectiveKnowhowLoading.test_copy_phase_group,   s{   *9&I%/%////%///%////////////////%/%////%///%////////////////"0"&0000"&000"000000&000&0000000&}&&&&}&&&}&&&&&&&&&&&&&&&&r+   c                 F   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}}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$   design 그룹은 design + qc 2개만r   designr.   r   r   r   r   r   r   r   Nr   r   r0   r2   r3   r   r#   s         r)   test_design_phase_groupz5TestG1SelectiveKnowhowLoading.test_design_phase_group4   s{   *9(K","f,,,,"f,,,",,,,,,f,,,f,,,,,,,%/%////%///%////////////////%3%V3333%V333%333333V333V3333333&}&&&&}&&&}&&&&&&&&&&&&&&&&r+   c                    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}}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   명시적 final도 3개 포함r   finalr.   r   r   r   r   r   r   r   Nr   r   r   r#   s         r)   test_final_phase_group_explicitz=TestG1SelectiveKnowhowLoading.test_final_phase_group_explicit<   s"   *9'J%/%////%///%////////////////","f,,,,"f,,,",,,,,,f,,,f,,,,,,,%/%////%///%////////////////r+   c                 ~    t        j                  t        d      5  t        dd       ddd       y# 1 sw Y   yxY w)u#   잘못된 phase_group은 ValueErroru   유효하지 않은 phase_group)matchr   invalidr.   N)pytestraises
ValueErrorr   )r$   s    r)   test_invalid_phase_group_raisesz=TestG1SelectiveKnowhowLoading.test_invalid_phase_group_raisesC   s4    ]]:-NO 	H%iYG	H 	H 	Hs   3<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	)uF   phase_group 미지정 시 기존 동작과 동일 (3개 파일 포함)r   r   r   r   r   r   r   r   Nr   r   r   r#   s         r)   test_backward_compatibilityz9TestG1SelectiveKnowhowLoading.test_backward_compatibilityH   s    *95%/%////%///%////////////////%/%////%///%////////////////","f,,,,"f,,,",,,,,,f,,,f,,,,,,,r+   N)
__name__
__module____qualname____doc__r*   r4   r7   r:   rA   rC    r+   r)   r   r   !   s$    H'''0H
-r+   r   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestG2OverviewQCRemovalu:   G-2: build_workflow_overview_prompt에서 QC 상세 제거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}}y	)u+   카테고리 A 상세가 overview에 없음test-g2zA-01r0   r2   r   r   r   r   Nu   글자 겹침	r   r   r   r   r   r   r    r!   r"   r#   s         r)   test_no_category_a_detailsz2TestG2OverviewQCRemoval.test_no_category_a_detailsS       /	:#vV####vV###v######V###V#######,f,,,,f,,,,,,,,,f,,,f,,,,,,,r+   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}}y	)u+   카테고리 B 상세가 overview에 없음rL   zB-01r0   r2   r   r   r   r   Nu   CTA 명확성rM   r#   s         r)   test_no_category_b_detailsz2TestG2OverviewQCRemoval.test_no_category_b_detailsY   rO   r+   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}}y	)u.   FAIL 카테고리 상세가 overview에 없음rL   TEXT_OVERLAPr0   r2   r   r   r   r   Nu   FAIL 사유 카테고리rM   r#   s         r)   test_no_fail_categories_detailsz7TestG2OverviewQCRemoval.test_no_fail_categories_details_   s    /	:+~V++++~V+++~++++++V+++V+++++++)7)7777)777)7777777777777777r+   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	)
u/   에스컬레이션 상세가 overview에 없음rL      카피 QC 루프 상한r0   r2   r   r   r   r   NrM   r#   s         r)   test_no_escalation_detailsz2TestG2OverviewQCRemoval.test_no_escalation_detailse   sh    /	:(6(6666(666(6666666666666666r+   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}}y	)u6   QC 기준은 Phase에서 로딩된다는 안내 포함rL   u	   QC 기준r   r   r   r   r   r   Nu   각 Phase에서 로딩rM   r#   s         r)   test_qc_loading_note_presentz4TestG2OverviewQCRemoval.test_qc_loading_note_presentj   s    /	:${f$$$${f$$${$$$$$$f$$$f$$$$$$$'1'61111'6111'111111611161111111r+   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}}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   Phase 목록은 유지rL   zPhase -1r   r   r   r   r   r   NzPhase 0zPhase 1zPhase 3zPhase 5rM   r#   s         r)   test_phase_list_preservedz1TestG2OverviewQCRemoval.test_phase_list_preservedp   s   /	:#zV####zV###z######V###V#######"yF""""yF"""y""""""F"""F""""""""yF""""yF"""y""""""F"""F""""""""yF""""yF"""y""""""F"""F""""""""yF""""yF"""y""""""F"""F"""""""r+   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	)
u   시작 조건은 유지rL   u   제이회장님 승인 필수r   r   r   r   r   r   NrM   r#   s         r)   test_start_condition_preservedz6TestG2OverviewQCRemoval.test_start_condition_preservedy   sh    /	:.8.&8888.&888.888888&888&8888888r+   N)rD   rE   rF   rG   rN   rQ   rT   rW   rY   r[   r]   rH   r+   r)   rJ   rJ   P   s(    D--87
2#9r+   rJ   c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestG3EscalationDedupu,   G-3: 에스컬레이션 섹션 중복 제거c                    t         dz  dz  dz  }|j                  } |       }|st        j                  d|       dz   dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}y)	u   외부 파일이 존재memoryspecsescalation-rules.mdz!escalation-rules.md not found at zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}path)py0py2py4N)
	workspaceexistsr   _format_assertmsgr   r   r    r   r!   r"   )r$   rd   @py_assert1@py_assert3@py_format5s        r)   !test_escalation_rules_file_existsz7TestG3EscalationDedup.test_escalation_rules_file_exists   s    8#g-0EE{{H{}H}HH A$HHHHHHHtHHHtHHH{HHH}HHHHHHr+   c                 n   t         dz  dz  dz  }|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}}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%   외부 파일에 핵심 규칙 포함ra   rb   rc   zutf-8)encodingrV   r   r   contentr   r   r   Nu   디자인 QC 루프 상한u   동일 FAIL 카테고리u   에스컬레이션)
rh   	read_textr   r   r   r   r   r    r!   r"   )r$   rd   rq   r%   r&   r'   r(   s          r)   "test_escalation_rules_file_contentz8TestG3EscalationDedup.test_escalation_rules_file_content   s   8#g-0EE..'.2(3(G3333(G333(333333G333G3333333+6+w6666+w666+666666w666w6666666)4)W4444)W444)444444W444W4444444#.#w....#w...#......w...w.......r+   c                    ddl m}  |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}}y)u,   Phase 0 프롬프트가 참조 문구 사용r   )build_phase0_prompttest-g3   escalation-rules.md 참조r   r   r   r   r   r   Nu   카피 QC 루프 상한: 5회r0   r2   )
prompts.image_workflowru   r   r   r   r   r   r    r!   r"   )r$   ru   r   r%   r&   r'   r(   s          r)   test_phase0_uses_referencez0TestG3EscalationDedup.test_phase0_uses_reference   s    >$Y/+5+v5555+v555+555555v555v5555555.<.f<<<<.f<<<.<<<<<<f<<<f<<<<<<<r+   c                 l   ddl m}  |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}}y)u,   Phase 1 프롬프트가 참조 문구 사용r   )build_phase1_promptrv   z/tmp/brief.mdrw   r   r   r   r   r   r   N)
rx   r{   r   r   r   r   r   r    r!   r"   )r$   r{   r   r%   r&   r'   r(   s          r)   test_phase1_uses_referencez0TestG3EscalationDedup.test_phase1_uses_reference   sm    >$Y@+5+v5555+v555+555555v555v5555555r+   c                 l   ddl m}  |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}}y)u,   Phase 2 프롬프트가 참조 문구 사용r   )build_phase2_promptrv   z/tmp/copy.mdrw   r   r   r   r   r   r   N)
rx   r~   r   r   r   r   r   r    r!   r"   )r$   r~   r   r%   r&   r'   r(   s          r)   test_phase2_uses_referencez0TestG3EscalationDedup.test_phase2_uses_reference   m    >$Y?+5+v5555+v555+555555v555v5555555r+   c                 l   ddl m}  |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}}y)u,   Phase 3 프롬프트가 참조 문구 사용r   )build_phase3_promptrv   z/tmp/plan.mdrw   r   r   r   r   r   r   N)
rx   r   r   r   r   r   r   r    r!   r"   )r$   r   r   r%   r&   r'   r(   s          r)   test_phase3_uses_referencez0TestG3EscalationDedup.test_phase3_uses_reference   r   r+   c                 n   ddl m}  |ddg      }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,   Phase 4 프롬프트가 참조 문구 사용r   )build_phase4_promptrv   /tmp/img.pngrw   r   r   r   r   r   r   N)
rx   r   r   r   r   r   r   r    r!   r"   )r$   r   r   r%   r&   r'   r(   s          r)   test_phase4_uses_referencez0TestG3EscalationDedup.test_phase4_uses_reference   sp    >$Y0@A+5+v5555+v555+555555v555v5555555r+   c                 n   ddl m}  |ddg      }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.   Phase 3.5 프롬프트가 참조 문구 사용r   )build_phase3_5_promptrv   r   rw   r   r   r   r   r   r   N)
rx   r   r   r   r   r   r   r    r!   r"   )r$   r   r   r%   r&   r'   r(   s          r)   test_phase3_5_uses_referencez2TestG3EscalationDedup.test_phase3_5_uses_reference   sp    @&y>2BC+5+v5555+v555+555555v555v5555555r+   N)rD   rE   rF   rG   rn   rs   ry   r|   r   r   r   r   rH   r+   r)   r_   r_      s.    6I
/=66666r+   r_   c                   "    e Zd ZdZd Zd Zd Zy)TestG4SubagentResultRulesuS   G-4: 복합팀/디자인팀/마케팅팀에 서브에이전트 결과 규칙 포함c                    ddl m}  |dd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}}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)uD   마케팅팀 프롬프트에 서브에이전트 결과 규칙 포함r   build_prompt	marketingtest-g4	test tasknormalteam_idtask_id	task_desclevel+   서브에이전트(Task tool) 결과 규칙r   r   r   r   r   r   N   500자 이내)   FAIL 코드와 사유를 요약에 포함
prompts.team_promptsr   r   r   r   r   r   r    r!   r"   r$   r   r   r%   r&   r'   r(   s          r)   -test_marketing_prompt_contains_subagent_ruleszGTestG4SubagentResultRules.test_marketing_prompt_contains_subagent_rules   s.   5!	
 =F<FFFF<FFF<FFFFFFFFFFFFFFFF(&((((&(((((((((&(((&(((((((:D:fDDDD:fDDD:DDDDDDfDDDfDDDDDDDr+   c                    ddl m}  |dd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}}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)uD   디자인팀 프롬프트에 서브에이전트 결과 규칙 포함r   r   r6   r   r   r   r   r   r   r   r   r   r   r   Nr   r   r   s          r)   *test_design_prompt_contains_subagent_ruleszDTestG4SubagentResultRules.test_design_prompt_contains_subagent_rules   s    5!	
 =F<FFFF<FFF<FFFFFFFFFFFFFFFF(&((((&(((((((((&(((&(((((((r+   c                 
   ddl m}  |ddgd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}}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)uA   복합팀 프롬프트에 서브에이전트 결과 규칙 포함r   )build_composite_promptr   r6   r   ztest composite taskr   )composite_teamsr   r   r   r   r   r   r   r   r   r   Nr   r   )
r   r   r   r   r   r   r   r    r!   r"   )r$   r   r   r%   r&   r'   r(   s          r)   -test_composite_prompt_contains_subagent_ruleszGTestG4SubagentResultRules.test_composite_prompt_contains_subagent_rules   s3   ?'((3+	
 =F<FFFF<FFF<FFFFFFFFFFFFFFFF(&((((&(((((((((&(((&(((((((:D:fDDDD:fDDD:DDDDDDfDDDfDDDDDDDr+   N)rD   rE   rF   rG   r   r   r   rH   r+   r)   r   r      s    ]E)Er+   r   )rG   builtinsr   _pytest.assertion.rewrite	assertionrewriter   ossyspathlibr   r>   environgetrh   strrd   insertrx   r   r   r   r   r   r	   r   rJ   r_   r   rH   r+   r)   <module>r      s   	  	 
   02GHI	y>!HHOOAs9~& ,- ,-^,9 ,9^:6 :6z*E *Er+   