
     `j1A                    &   d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZmZ ddlmZmZmZmZmZ  e	e      j)                         j*                  d   Zedz  Zdd	Zddd
ZdddZdddZddZddZddZedk(  r e  e             y)zLSmoke-test field_character_review.html character grid and foot-tile overlay.    )annotationsN)Path)	urlencodeurljoin)WebDriverError
execute_js	free_portrequest_jsonwait_for_driver   outc                      y)Na  
const marker = window.HWANSE_LAST_FIELD_CHARACTER_REVIEW || null;
return {
  readyState: document.readyState,
  title: document.title,
  marker,
  assetOptions: document.querySelectorAll('#assetSelect option').length,
  frameCards: document.querySelectorAll('#frameStrip .frame-card').length,
  transparentFrameCards: document.querySelectorAll('#transparentFrameStrip .transparent-frame-card').length,
  transparentFrameCanvases: Array.from(document.querySelectorAll('#transparentFrameStrip canvas')).map((canvas) => ({
    width: canvas.width,
    height: canvas.height,
    clean: canvas.dataset.cleanTransparentFrame,
    transparentPixels: (() => {
      const pixels = canvas.getContext('2d').getImageData(0, 0, canvas.width, canvas.height).data;
      let count = 0;
      for (let index = 3; index < pixels.length; index += 4) if (pixels[index] === 0) count += 1;
      return count;
    })(),
    visiblePixels: (() => {
      const pixels = canvas.getContext('2d').getImageData(0, 0, canvas.width, canvas.height).data;
      let count = 0;
      for (let index = 3; index < pixels.length; index += 4) if (pixels[index] > 0) count += 1;
      return count;
    })(),
  })),
  frameRows: document.querySelectorAll('#frameTable tr').length,
  specialRows: document.querySelectorAll('#specialTable tr').length,
  previewWidth: document.getElementById('previewCanvas')?.width || 0,
  previewHeight: document.getElementById('previewCanvas')?.height || 0,
  sheetWidth: document.getElementById('sheetCanvas')?.width || 0,
  sheetHeight: document.getElementById('sheetCanvas')?.height || 0,
  assetListClientHeight: document.getElementById('assetList')?.clientHeight || 0,
  assetListScrollHeight: document.getElementById('assetList')?.scrollHeight || 0,
  assetListOverflowY: getComputedStyle(document.getElementById('assetList')).overflowY,
  assetListSummary: document.getElementById('assetListSummary')?.textContent || '',
  gridStatus: document.getElementById('gridStatus')?.textContent || '',
  touchAction: getComputedStyle(document.getElementById('previewCanvas')).touchAction,
  bodyText: document.body?.innerText || '',
  bootError: window.HWANSE_BOOT_ERROR || null,
};
 r       .tools/verify_field_character_review_browser.pystate_scriptr      s    )r   c                   t        j                         |z   }d }t        j                         |k  rt        | |t               d      }|j	                  d      xs i }|j	                  d      dk(  r|j	                  d      du r|j	                  d      du r}|j	                  d	d
      dk\  rh|j	                  d      dk(  rT|j	                  d      dk(  r@|j	                  d      dk(  r,|j	                  dd
      d
kD  r|j	                  dd
      d
kD  r|S t        j
                  d       t        j                         |k  rt        d|      )N   timeoutmarker
readyStatecomplete&browserFieldCharacterReviewImplementedTready
assetCountr   %   
frameWidth0   frameHeight@   directionFrameCount   previewWidth
sheetWidth皙?z-field character review did not become ready: time	monotonicr   r   getsleepr   )port
session_idr   deadline
last_stater   s         r   wait_for_reviewr0   G   s$   ~~')H"J
..
X
%j,.!L
)/RNN<(J6

CDL

7#t+

<+r1

<(B.

=)R/

01Q6~q1A5|Q/!3

3 ..
X
%  HW
XXr   c                   t        j                         |z   }d }t        j                         |k  rt        | |t               d      }|j	                  d      xs i }|j	                  d      |k(  r|j	                  d      |k(  r|S t        j
                  d       t        j                         |k  rt        d|      )Nr   r   r   asset	directionr&   z1field character review selection did not settle: r'   )r,   r-   r2   r3   r   r.   r/   r   s           r   wait_for_selectionr4   ]   s    ~~')H"J
..
X
%j,.!L
)/R::g%'FJJ{,Cy,P

3 ..
X
% LZN[
\\r   c                   t        j                         |z   }d }t        j                         |k  rt        | |t               d      }|j	                  d      xs i }|j	                  d      xs g }|j	                  d      dk(  r|r|d   j	                  d      |k(  r|S t        j
                  d	       t        j                         |k  rt        d
|      )Nr   r   r   animationSequenceanimationSequenceModecustomr   indexr&   z7field character review custom sequence did not settle: r'   )r,   r-   first_indexr   r.   r/   r   sequences           r   wait_for_custom_sequencer<   i   s    ~~')H"J
..
X
%j,.!L
)/R::128b::-.(:xHUVKOO\cLdhsLs

3 ..
X
% RS]R`a
bbr   c                    t         j                  dd       t         dz  j                  t        j                  | dd      dz   d	       y )
NTparentsexist_okz)field_character_review_browser_smoke.jsonF   )ensure_asciiindent
zutf-8)encoding)OUTmkdir
write_textjsondumps)payloads    r   write_reportrL   v   sD    IIdTI*66BB

7q9D@ C r   c                   t        j                  d      }|st        d      t               }t        dz  }|j
                  j                  dd       |j                  d      5 }t        j                  |dd| d	g|t        j                  
      }d}	 t        ||       t        |ddddddiiid      }t        |xs i j                  di       j                  d      xs d      }|st        d|      t        |dd| ddddddd       t        |dd      }	t!        | j#                  d       d z   d!|	       }
t        |dd| d"d#|
id       t%        ||      }|d$   }|j                  d%      |k7  rt        d&|      |j                  d'      d(k7  rt        d)|      |j                  d*      dd+d+d,d-k7  rt        d.|      |j                  d/      d0k7  rt        d1|      |j                  d2      dus|j                  d3      durt        d4|      |j                  d5      durt        d6|      |j                  d7      durt        d8|      |j                  d9      durt        d:|      |j                  d;      durt        d<|      |j                  d=      dus&|j                  d>      dus|j                  d?      durt        d@|      |j                  dA      dus|j                  dB      durt        dC|      |j                  dDd      dEk  s|j                  dFd      dGkD  rt        dH|      |j                  dI      dJurt        dK|      dL|j                  dMd      vrt        dN|      dOt        |j                  dP      xs d      vrt        dQ|      |j                  dRd      dSk  s|j                  dT      dUk7  rt        dV|      |j                  dW      dUk7  rt        dX|      |j                  dY      xs g }|rt'        dZ |D              rt        d[|      |j                  d\      d]vrt        d^|      |j                  d_d      |j                  d`d      k  rt        da|      |j                  dbd      dk  rt        dc|      t)        ||dddU      }|durt        de      t+        ||dfdg      }|d$   }|j                  dh      d+k7  s|j                  di      dUk7  rt        dj|      t)        ||dkdU      }|durt        dl      t-        ||dm      }|d$   }|j                  dI      dJurt        dn|      |j                  dog       d dp D cg c]  }|j                  dq       c}g drk7  rt        ds|      t)        ||dtdU      }|durt        du      t+        ||dvdw      }|d$   }|j                  dx      dJus|j                  dy      durt        dz|      |j                  d{      d|k7  rt        d}|      |j                  d~      dyk7  rt        d|      |j                  dh      d+k7  s|j                  did      dk  rt        d|      t)        ||ddU      }|durt        d      t+        ||dvd      }|d$   }|j                  dh      dk7  s|j                  di      dmk7  rt        d|      |j                  d{      dk7  rt        d|      d|||||d}t/        |       t1        |       |r	 t        |dd| dU       |j5                          	 |j7                  d0       d d d        y c c}w # t2        $ r Y <w xY w# t        j8                  $ r |j;                          Y Bw xY w# |r#	 t        |dd| dU       n# t2        $ r Y nw xY w|j5                          	 |j7                  d0       w # t        j8                  $ r |j;                          Y w w xY wxY w# 1 sw Y   y xY w)NWebKitWebDriverzNWebKitWebDriver is not installed; install webkit2gtk-driver and run under Xvfbz'field_character_review_webkitdriver.logTr>   wbz--host=127.0.0.1z--port=z--replace-on-new-session)stdoutstderr POSTz/sessioncapabilitiesalwaysMatchbrowserNameMiniBrowser   r   value	sessionIdz!could not create WebKit session: z	/session/z/window/rectr   iP  i  )xywidthheight   down)r2   r3   /z web/field_character_review.html?z/urlurlr   r2   zunexpected asset loaded: footprintRulezbottom-3x1-horizontal-footprintzfootprint marker mismatch: footRectr      )r[   r\   whzfoot rect mismatch: spriteTileWidthr   zsprite tile width mismatch: customSequenceImplementedcustomSequenceFreeStartz custom sequence marker missing: canonicalCnsRectDataAppliedz#canonical CNS rect marker missing: opaqueBboxOverlayRemovedz$opaque bbox removal marker missing: "allCaraRowsLoadedFromCnsRectReviewz#all cara rect load marker missing: manualGridControlsImplementedz%manual grid controls marker missing: !transparentFrameExportImplemented transparentFrameExportNativeSize&transparentFrameExportOverlaysExcludedz)transparent frame export marker missing: assetListScrollAppliedhiddenAssetFilterImplementedz)asset list scroll/filter marker missing: confirmedCharacterCount$   reviewRequiredCharacterCountr   z5confirmed/review-required character counts mismatch: forcedInitialFrameZeroFzEfield character review should not force #0 as first animation frame: u   하단 48x16 충돌 발판bodyTextzfoot tile label missing: pantouchActionz)canvas touch-action should favor scroll: assetOptionsr   
frameCardsr#   zasset/frame UI did not render: transparentFrameCardsz/transparent frame export cards did not render: transparentFrameCanvasesc              3     K   | ]r  }|j                  d       dk7  xsX |j                  d      dk7  xsB |j                  d      dk7  xs, |j                  dd      dk  xs |j                  dd      dk   t y	w)
r]   r   r^   r!   cleantruetransparentPixelsr   visiblePixelsN)r*   ).0rows     r   	<genexpr>z!verify_browser.<locals>.<genexpr>   s      /   B& 4778$*4777#v-4 77.2a74 77?A.!3	4/s   A8A:z7transparent frame canvases are not native clean rects: assetListOverflowY>   autoscrollz/asset list should be independently scrollable: assetListScrollHeightassetListClientHeightz9asset list should have scrollable overflow with 37 rows: specialRowsz$special frame table did not render: a"  
const dir = document.getElementById('directionSelect');
dir.value = 'left';
dir.dispatchEvent(new Event('change', { bubbles: true }));
const asset = document.getElementById('assetSelect');
asset.value = 'cara_rs1';
asset.dispatchEvent(new Event('change', { bubbles: true }));
return true;
z+could not change character review selectioncara_rs1leftr   r"   z2selection change did not preserve frame metadata: z
const seq = document.getElementById('customSequenceInput');
seq.value = '2,12,2,14';
document.getElementById('applySequenceButton')?.click();
return true;
zcould not apply custom sequencerA   z3custom sequence should allow non-zero first frame: r6      r9   )rA      rA      z custom sequence order mismatch: z
const seq = document.getElementById('customSequenceInput');
seq.value = '';
const asset = document.getElementById('assetSelect');
asset.value = 'cara_01';
asset.dispatchEvent(new Event('change', { bubbles: true }));
return true;
z-could not select canonical character rect rowcara_01T0	candidate	confirmedz:canonical character rect row did not render as confirmed: classificationzexe-source-rect-table-unionz(canonical rect classification mismatch: 
confidencez(canonical rect row confidence mismatch: z*canonical character frame count mismatch: a  
document.getElementById('gridWInput').value = '32';
document.getElementById('gridHInput').value = '64';
document.getElementById('gridColsInput').value = '2';
document.getElementById('gridRowsInput').value = '1';
document.getElementById('applyGridButton')?.click();
return true;
z%could not apply manual candidate gridrow0    z%manual candidate grid did not apply: z confirmed-overridden-manual-gridz%manual grid classification mismatch: ok)statusinitialchangedr8   r   manualDELETE)shutilwhichr   r	   rF   parentrG   open
subprocessPopenSTDOUTr   r
   strr*   r   r   rstripr0   anyr   r4   r<   rL   print	Exception	terminatewaitTimeoutExpiredkill)baser2   driver_pathr,   log_pathlogprocr-   sessionqueryrb   initial_stater   transparent_canvasesr   changed_statechanged_markerr8   custom_statecustom_markersteprect_reviewcandidate_statecandidate_markermanual_gridmanual_statemanual_markerreports                               r   verify_browserr   ~   s	   ,,01Kmnn;D>>HOO$6	t	 H"$ *	 $$	
 
|	D$'"--1O!PQG gm00"=AA+NTRTUJ$'H%TUUJ<|4a$#> FCDE$++c*S04TUZT[2\]Cv:,d'CeS\[]^+D*=M"8,Fzz'"e+$'@@Q%RSSzz/*.OO$'B=BS%TUUzz*%qr)LL$';M;L%MNNzz+,1$'CMCT%UVVzz56dBfjjQjFkswFw$'GGX%YZZzz78D$'J=J[%\]]zz45TA$'KMK\%]^^zz>?tK$'J=J[%\]]zz9:$F$'L]L]%^__

>?tK::@AM::FGtS$'PQ^Pa%bcczz234?6::NlCmuyCy$'PQ^Pa%bcczz3Q7"<

Kikl@mpq@q$'\]j\m%noozz235@$'lmzl}%~+=3D3DZQS3TT$'@@Q%RSSC 1 1- @ FBGG$'PQ^Pa%bcc  3b8M<M<Ml<[_`<`$'F}FW%XYY  !89Q>$'VWdVg%hii#0#4#45O#P#VTV '3 / 0/ , %'^_l^o%pqq  !56>PP$'VWdVg%hii  !8!<@Q@QRikl@mm$'`an`q%rss  2a7$'KMK\%]^^  G d"$%RSS.tZVTM*84N!!,/259K9KLa9bfg9g$'YZgYj%kll 
F T!$%FGG3D*aHL(2M  !9:%G$'Z[gZj%kll.;.?.?@SUW.XY[Z[.\]d!]aoo$'GGW%XYY$ K $&$%TUU0z9dSO.x8##K0=AQAUAUVaAbjnAn$'abqat%uvv##$459VV$'OP_Ob%cdd##L1[@$'OP_Ob%cdd##L1R7;K;O;OPegh;imn;n$'QRaQd%eff$ K $&$%LMM-dJ	6RL(2M  ."48I8IJ_8`de8e$'L\L\%]^^  !126XX$'L\L\%]^^ ((&,&F  &M x9ZL1ISTU NN		!	$MH HB ^B ! 
 ,, 		  x9ZL1ISTU  NN		!	$,, 		OH Hs   $0aT_'^?F_a ^#2a^2_#	^/,a.^//a2#_a_aa_21a2	_>	;a=_>	>a`%$a%#a	a
a	aaac                     t        j                  t              } | j                  dd       | j                  dd       | j	                         }t        |j                  |j                         y)N)descriptionz--basezhttp://127.0.0.1:8013)defaultz--assetcara_at1r   )argparseArgumentParser__doc__add_argument
parse_argsr   r   r2   )parserargss     r   mainr   Q  s\    $$9F
*AB
	:6D499djj)r   __main__)returnr   )
   )r,   intr-   r   r   floatr   dict)r_   )r,   r   r-   r   r2   r   r3   r   r   r   r   r   )
r,   r   r-   r   r:   r   r   r   r   r   )rK   r   r   None)r   r   r2   r   r   r   )r   r   )!r   
__future__r   r   rI   r   r   r(   pathlibr   urllib.parser   r   browser_smoke_helpersr   r   r	   r
   r   __file__resolver?   ROOTrF   r   r0   r4   r<   rL   r   r   __name__
SystemExitr   r   r   <module>r      s    R "       +  H~''*
Ul*ZY,	]
cPf z
TV
 r   