
    {i                       d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
mZ ddlZ ed      Zedz  dz  Zedz  dz  Ze	j                   j#                  d ee             e	j                   j#                  d ee             g d	Zdd
Zej*                  j-                  d e             d        Zd ZddZej*                  j5                   e        d      d        Zd Zy)u  IDS Phase 1 — 한글 100% OCR 회귀 검증 (구조 + 폰트 fallback 차단).

목적:
1. 출력 PNG가 존재할 경우 OCR로 한글 추출, 입력과 100% 일치 확인
2. OCR 라이브러리 미설치 환경에서는 graceful skip
3. 폰트 fallback 차단 — 시스템 sans-serif/Arial이 HTML/CSS에 절대 들어가지 않음
4. 실패 시 폰트 fallback 차단 + 명확한 에러 (assert 메시지)

OCR 도구는 환경 의존이므로 미설치 시 skip — 단, 폰트 차단 검증은 항상 수행.
    )annotationsN)Pathz/home/jay/workspaceskillszsatori-cardnewszhybrid-image)Arial	Helveticaz	Open SansRobotozMalgun Gothicc                 D    t        t        dz  j                  d            S )N	templatesz*.html)listSATORI_SKILLglob     </home/jay/workspace/tests/dev6/test_ids_phase1_korean_ocr.py_scan_html_filesr   *   s    +11(;<<r   	html_pathc           
        | j                  d      }t        D ]2  }|j                         D ]  }d|j                         vr||v}|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      nddt        j                         v st	        j                  |      rt	        j                  |      nddz  }t	        j                  | j                   d	| d
|j                         d      dz   d|iz  }t        t	        j                  |            d} 5 y)uT   템플릿 HTML에 시스템 fallback 폰트가 명시되어 있으면 한글 깨짐.zutf-8)encodingzfont-familynot inz%(py0)s not in %(py2)stokenlinepy0py2u%   : 한글 fallback 차단 위반 — 'u   ' 발견. line=u,   . Pretendard/Noto Sans KR 외 사용 금지.
>assert %(py4)spy4N)	read_textFORBIDDEN_FALLBACK_TOKENS
splitlineslower
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgnamestripAssertionError_format_explanation)r   textr   r   @py_assert1@py_format3@py_format5s          r   #test_template_no_forbidden_fallbackr2   .   s4    0D* OO% 	DDJJL0$  5   v      I    v   !%   I !%    >>""Gw O

''SU    	r   c                    ddl m}  | j                  }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        D ]  }||v}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j
                  |      nddt        j                         v st        j                  |      rt        j
                  |      nddz  }t        j                  d|       dz   d|iz  }	t        t        j                  |	            d
} y
)uf   hybrid-image 패턴 모듈은 KOREAN_FONT_STACK ('Pretendard', 'Noto Sans KR')를 사용해야 한다.r   )_satori
Pretendardinz%(py1)s in %(py3)sstackpy1py3zassert %(py5)spy5NzNoto Sans KRr   r   r   r   u.   KOREAN_FONT_STACK에 forbidden 폰트 발견: r   r   )patternsr4   KOREAN_FONT_STACKr#   r$   r(   r%   r&   r'   r,   r-   r    r)   )
r4   r9   @py_assert0@py_assert2@py_format4@py_format6r   r/   r0   r1   s
             r   *test_pattern_modules_use_korean_font_stackrD   =   sP    %%E <5    <5   <      5   5       ">U"""">U""">""""""U"""U"""""""* \E![[[uE[[[[[[u[[[u[[[[[[E[[[E[[[[%STYSZ#[[[[[[[\r   c                 |    dd l } | j                  j                  d      y| j                  j                  d      yy)Nr   pytesseractT	paddleocrF)importlib.utilutil	find_spec)	importlibs    r   	_have_ocrrL   N   s8    ~~.:~~,8r   u5   OCR 도구 미설치 — pytesseract/paddleocr 필요)reasonc                   ddl m} d}d}| dz  } ||||d      }|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}}|j                  } |       }|j                  }	d}
|	|
kD  }|st        j                  d|fd|	|
f      d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      t        j                  |	      t        j                  |
      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}x}	x}}
	 ddl}ddlm} |j#                  |j%                  |      d      }g }d}|v }|}|sd}||v }|}|swt        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  }|j-                  |       |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  }|j-                  |       t        j.                  |d$      i z  }t        j                  d%|d&|d'|      d(z   d)|iz  }t        t        j                  |            dx}x}x}x}x}}y# t&        $ r t)        j*                  d       Y w xY w)*u_   H4 (gradient, 외부 호출 0) 패턴으로 한글 PNG 생성 → OCR → 입력 일치 확인.r   )render_h4_gradient_cardu   보험은 안심u&   가족을 지키는 첫걸음입니다zocr_test.png)8  rP   )sizeu   PNG 생성 실패zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}result)r   r   r   Ni  )>)z_%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.stat
}()
}.st_size
} > %(py9)s)r   r   r   py6py9u*   PNG 너무 작음 — 렌더 실패 의심z
>assert %(py11)spy11)Imagekor)langu   pytesseract 미설치u   보험u   안심r6   )z%(py3)s in %(py5)sr.   )r<   r=   z%(py7)spy7)z%(py10)s in %(py12)s)py10py12z%(py14)spy14   u"   OCR 한글 추출 실패: 입력=(z, u
   ), 출력=z
>assert %(py17)spy17)r>   rO   existsr#   r)   r%   r&   r'   r(   r,   r-   statst_sizer$   rF   PILrW   image_to_stringopenImportErrorpytestskipappend_format_boolop)tmp_pathrO   titlebodyoutrR   r/   @py_assert3r1   @py_assert5@py_assert8@py_assert7@py_format10@py_format12rF   rW   r.   rA   @py_assert4r@   @py_assert9@py_assert11rC   @py_format8@py_format13@py_format15@py_format16@py_format18s                               r   test_korean_ocr_roundtripr}   X   s    1E3D
^
#C$UD#LIF==/=?/?/////////6///6///=///?//////;;U;=U=  U4U 4'UUU 4UUUUUU6UUU6UUU;UUU=UUU UUU4UUU)UUUUUUUU-**5::f+=E*J
8 8t x x4/   8t                   x4     (      ,0    ,0        -UIRxz$R     	  -+,-s   6,N= =OOc                 n   ddl m}  ddlm} d}d} |||ddd | d	       d
ddddd
      }||v }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      nddt        j                         v st	        j                  |      rt	        j                  |      nddz  }t	        j                  d|      dz   d|iz  }t        t	        j                  |            d}||v }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      nddt        j                         v st	        j                  |      rt	        j                  |      nddz  }t	        j                  d|      dz   d|i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  }
t	        j                  d      d z   d!|
iz  }t        t	        j                  |            dx}}	y)"uR   H4 패턴이 만든 HTML 안에 입력 한글이 그대로 들어있어야 한다.r   )default_gradient)build_text_overlay_htmlu   한글 테스트 헤드라인u+   본문 한글이 깨지지 않아야 한다rP   iF  z<div style="background:navyz ;width:100%;height:100%;"></div>z#ffffffz#e8e8eczrgba(0,0,0,0.5)H   &   )
rl   rm   widthheightbackground_layertitle_color
body_color
overlay_bg
title_size	body_sizer6   )z%(py0)s in %(py2)srl   htmlr   u4   제목 한글이 HTML에 보존되지 않음: title=r   r   Nrm   u3   본문 한글이 HTML에 보존되지 않음: body=r5   r8   r:   u   Pretendard 폰트 명시 누락z
>assert %(py5)sr=   )patterns._backgroundsr   patterns._satorir   r#   r$   r%   r&   r'   r(   r)   r,   r-   )r   r   rl   rm   r   r/   r0   r1   r@   rA   rB   rC   s               r   !test_h4_html_preserves_korean_rawr   v   s   68+E8D"23CF3K2LLlm$D D=ZZZ5DZZZZZZ5ZZZ5ZZZZZZDZZZDZZZZPQVPYZZZZZZZ4<WWW44WWWWWW4WWW4WWWWWW4WWW4WWWWNthWWWWWWWB<4BBB<4BBB<BBBBBB4BBB4BBBB!BBBBBBBr   )returnz
list[Path])r   bool)__doc__
__future__r   builtinsr%   _pytest.assertion.rewrite	assertionrewriter#   syspathlibr   rg   WORKSPACE_ROOTr   HYBRID_SKILLpathinsertstrr    r   markparametrizer2   rD   rL   skipifr}   r   r   r   r   <module>r      s   	 #   
  +,(+<<(>9 3|$ % 3|$ % = &6&89 :	\" 	O,cd e:Cr   