
    i                     L   d Z ddlZddlZddlZddlZddlmZ  eej                  j                  dd            Z	ej                  j                  d ee	             ej                  j                  d ee	dz               ddlZddZd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zy)u/   P2-3: A/B 분석 스크립트 단위 테스트.    N)PathWORKSPACE_ROOTz/home/jay/workspacescriptsc           
          g }t        |       D ]&  }|j                  d| dd|dz  dz    |ddd       ( t        |      D ]&  }|j                  d	| d
d|dz  dz    |ddd       ( |S )u%   테스트용 결과 데이터 생성.zh-haikuzLv.      Fz2026-04-01T00:00:00+09:00)
request_idassigned_model
task_levelfnr
is_recheck	timestampzs-sonnet)rangeappend)haiku_nsonnet_n	haiku_fnr
sonnet_fnrresultsis         G/home/jay/workspace/.worktrees/task-2116-dev1/tests/test_ab_analysis.py_make_resultsr      s    G7^ 

 "1#h") #QUaK=1 #8		


 8_ 

 "1#h"* #QUaK=1!#8		


 N    c                     t        |dd      5 }| D ]+  }|j                  t        j                  |d      dz          - 	 d d d        y # 1 sw Y   y xY w)Nwutf-8encodingF)ensure_ascii
)openwritejsondumps)datapathfitems       r   _write_jsonlr+   ,   sV    	dC'	* Aa 	ADGGDJJt%84?@	AA A As   1A

Ac                  B   ddl m}  t        j                  ddd      5 }|j	                  d       |j	                  d       |j	                  d	       |j
                  }d
d
d
        |       }t        j                  |       t        |      dk(  sJ y
# 1 sw Y   7xY w)u   JSONL 파일 로드 테스트.r   )load_resultsr   z.jsonlF)modesuffixdeletez4{"request_id": "test-1", "assigned_model": "haiku"}
z5{"request_id": "test-2", "assigned_model": "sonnet"}
r"   N   )	
analyze_abr-   tempfileNamedTemporaryFiler$   nameosunlinklen)r-   r)   r(   r   s       r   test_load_resultsr9   2   s    '		$	$#hu	M QR	GH	HI	vv	 4 GIIdOw<1 s   A BBc                  z    ddl m}  t        dddd      } | |d      \  }}t        |dz
        dk  sJ |dk(  sJ y	)
u   FNR 계산 테스트.r   )compute_fnr
   g?皙?r   r   r   r   r   gMbP?N)r2   r;   r   abs)r;   r   r   ns       r   test_compute_fnrrA   A   sF    &BssSG'*FCsSy>E!!!7N7r   c                  <    ddl m}   | dddd      }|d   dk(  sJ y	)
u0   채택 판정 테스트: FNR < 15% AND p < 0.05.r   determine_verdict皙?{Gz?   r   p_valuer   r   verdictADOPTNr2   rD   rD   vs     r   test_verdict_adoptrO   K   s'    ,D$cRAY<7"""r   c                  <    ddl m}   | dddd      }|d   dk(  sJ y	)
u$   기각 판정 테스트: FNR >= 15%.r   rC   r=   rF   rG   rH   rJ   REJECTNrL   rM   s     r   test_verdict_rejectrR   S   s'    ,D$cRAY<8###r   c                  <    ddl m}   | dddd      }|d   dk(  sJ y	)
u"   연장 판정 테스트: n <= 150.r   rC   rE   rF   2   rH   rJ   EXTENDNrL   rM   s     r   test_verdict_extendrV   [   s'    ,D$RPAY<8###r   c                      ddl m}  t        dd      } | |      }|j                         D ]  \  }}|d   rJ | d|d    d        y	)
u#   층화 추출 균등 분배 검증.r   )stratification_checki,  )r   r   balancedu    불균형: haiku 	haiku_pct%N)r2   rX   r   items)rX   r   stratlevelinfos        r   test_stratification_checkr`   c   s]    /C#6G )E{{} RtJQE7*<T+=N<Oq!QQRr   c                     t        t        dz  dz        } t        j                  j	                  |       st        j                  d       h d}t        | dd      5 }t        |d      D ]X  \  }}|j                         }|st        j                  |      }|t        |j                               z
  }|sMJ d	| d
|         	 ddd       y# 1 sw Y   yxY w)u1   logs/ab_results.jsonl 스키마 유효성 검사.logszab_results.jsonlu   ab_results.jsonl 미존재>   r   r   r   r
   r   r   rr   r   r	   zLine u   : 필수 필드 누락: N)str
_WORKSPACEr6   r(   existspytestskipr#   	enumeratestripr%   loadssetkeys)
jsonl_pathrequired_fieldsr)   line_numlinerecordmissings          r   test_ab_results_jsonl_schemart   m   s    Z&(+==>J77>>*%01fO	j#	0 TA'1o 	TNHd::<DZZ%F%FKKM(::GS%z1I' SS;	TT T Ts   AC6CCc                      ddl m}  t        dddd      } | |      }d|v r2dt        |j	                  dd	            v rt        j                  d
       d|v sJ t        |d   t              sJ y)u9   Fisher's exact test 계산 결과 검증 (목 데이터).r   )fishers_exact_testrG   rE   {Gz?r>   errorscipy u   scipy 미설치rI   N)	r2   rv   r   rd   getrg   rh   
isinstancefloat)rv   r   results      r   test_fishers_exact_mockr   ~   so    -C#RVWG(F&WFJJw,C(DD%&fY'///r   )d   r   rE   rw   )__doc__r%   r6   sysr3   pathlibr   environr{   re   r(   insertrd   rg   r   r+   r9   rA   rO   rR   rV   r`   rt   r    r   r   <module>r      s    5  	 
  "**..!13HIJ
 3z? # 3zI-. / 8A#$$RT"	0r   