§
    G¿j  ã                  óF  — 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
Z
ddlZddlZddlmZ ddlZ ee¦  «                             ¦   «         j        j        j        Zedz  dz  Zedz  Zedz  d	z  Zedz  d
z  Zedz  dz  Zedz  dz  Zedz  dz  dz  Z G d„ d¦  «        ZdS )aZ  
Unit Test Suite for FreeExile PC Desktop Web Client Layout & DOM Architecture.
Verifies:
- 100vw x 100vh Fullscreen layout with zero scrollbars/overflow
- Absolute elimination of mobile simulation artifacts (.iphone-frame, #simulator-bar)
- Hidden dummy joystick DOM elements to prevent canvas_renderer null-dereference
- Base href tag linking shared webapp assets without duplication
- Grimdark Action HUD (Dual Fluid Orbs, Central Action Bar, Minimap, Chat Dock)
- Dedicated dev server configuration (tools/serve_web_pc.py on port 8089)
- Zero regression on mobile webapp (client/webapp/index.html)
é    )ÚannotationsN)ÚPathÚclientÚweb_pcz
index.htmlÚcsszpc_main.cssz
pc_hud.csszpc_modals.cssÚtoolszserve_web_pc.pyÚwebappc                  ób   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd	„Z	dd
„Z
dd„Zdd„Zdd„ZdS )ÚTestPcWebClientLayoutUnitzIVerifies PC web client layout contracts, DOM elements, and server config.ÚreturnÚNonec                óF  — t           t          t          fD �])}|j        } |¦   «         }|s¨t	          j        |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}}|                     d¬¦  «                             ¦   «         }t          |¦  «        }d}||k    }|�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        |j        › dt          |¦  «        › d�¦  «        dz   d|	iz  }
t          t	          j        |
¦  «        ¦  «        ‚dx}x}}�Œ+t                                d¬¦  «        }d}||v }|s—t	          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 }|s—t	          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S )zIVerifies CSS files exist, enforce overflow:hidden, and respect line caps.z must existúC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Úcss_file©Úpy0Úpy2Úpy4Núutf-8©Úencodingi^  )ú<=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py6)sÚlenÚlines)r   Úpy1Úpy3Úpy6z (z lines) exceeds soft capz
>assert %(py8)sÚpy8zoverflow: hidden©Úin©z%(py1)s in %(py3)sÚmain_content©r   r   úassert %(py5)sÚpy5z	margin: 0)ÚCSS_MAINÚCSS_HUDÚ
CSS_MODALSÚexistsÚ
@pytest_arÚ_format_assertmsgÚnameÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚ	read_textÚ
splitlinesr   Ú_call_reprcompare)Úselfr   Ú@py_assert1Ú@py_assert3Ú@py_format5r   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9r"   Ú@py_assert0Ú@py_format4Ú@py_format6s                  ú=C:\Projects\FreeExile\tests\unit\test_pc_web_client_layout.pyÚ0test_css_files_exist_and_enforce_zero_scrollbarszJTestPcWebClientLayoutUnit.test_css_files_exist_and_enforce_zero_scrollbars"   së  € å!¥7­JÐ7ð 	_ñ 	_ˆHØ”?ÐC�?�?Ñ$Ô$ÐCÐ$ÐCÕCÔC¨¬Ð&CÐ&CÐ&CÑCÔCÐCÑCÐCÕCÔCÑCÔCÐCÐCÕCÔC�8ÑCÔCÐCÕCÔC�8ÑCÔCÐCÐCÕCÔC�?ÑCÔCÕCÔCÐ$ÑCÔCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCØ×&Ò&°Ð&Ñ8Ô8×CÒCÑEÔEˆEÝ�u‘:”:Ð^ Ð^�: Ò$Ð^Ð^Ñ^Õ^Ô^Ð^Ð^Ð^Ð^�: Ð^Ñ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^•3Ñ^Ô^Ð^Õ^Ô^•3Ñ^Ô^Ð^Ð^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^�uÑ^Ô^Ð^Õ^Ô^�uÑ^Ô^Ð^Ð^Õ^Ô^�:Ñ^Ô^Õ^Ô^ Ñ^Ô^Ð^Ð^Ñ^Ð^Õ^Ô^¨¬Ð&^Ð&^½#¸e¹*¼*Ð&^Ð&^Ð&^Ñ^Ô^Ð^Ñ^Ð^Ð^Ð^Ñ^Ð^Õ^Õ^Ô^Ð^Ñ^Ô^Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ñ^å×)Ò)°7Ð)Ñ;Ô;ˆØ!Ð1Ð! \Ð1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð! \Ð1Ñ1Ô1Õ1Ô1Ð!Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1 \Ñ1Ô1Ð1Õ1Ô1 \Ñ1Ô1Ð1Ð1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1ØÐ*ˆ{˜lÐ*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*ˆ{˜lÐ*Ñ*Ô*Õ*Ô*ˆ{Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*˜lÑ*Ô*Ð*Õ*Ô*˜lÑ*Ô*Ð*Ð*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ó    c                ó  — t           j        } |¦   «         }|sªt          j        d¦  «        dz   dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}t            
                    d¬¦  «        }d}||v }|s¬t          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}}d}||v }|s¬t          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}}d}||v }|s¬t          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}}dS )zKVerifies tools/serve_web_pc.py exists, uses port 8089, and routes properly.zserve_web_pc.py must existr   ÚSERVE_PC_PYr   Nr   r   Ú8089r   r!   Úcontentr#   z)serve_web_pc.py must default to port 8089ú
>assert %(py5)sr%   Ú
WEBAPP_DIRz)serve_web_pc.py must reference WEBAPP_DIRÚPC_DIRz%serve_web_pc.py must reference PC_DIR)rF   r)   r*   r+   r-   r.   r/   r0   r1   r2   r3   r5   )	r6   r7   r8   r9   rH   r?   r:   r@   rA   s	            rB   Útest_serve_web_pc_configurationz9TestPcWebClientLayoutUnit.test_serve_web_pc_configuration-   sX  € åÔ!ÐAÐ!Ð!Ñ#Ô#ÐAÐ#ÐAÕAÔAÐ%AÑAÔAÐAÑAÐAÕAÔAÑAÔAÐAÐAÕAÔA�{ÑAÔAÐAÕAÔA�{ÑAÔAÐAÐAÕAÔAÐ!ÑAÔAÕAÔAÐ#ÑAÔAÐAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAÐAÐAÝ×'Ò'°Ð'Ñ9Ô9ˆØÐMˆv˜Ð ÐMÐMÐMÕMÔMÐMÐMÐMÐMˆv˜ÐMÑMÔMÕMÔMˆvÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM˜ÑMÔMÐMÕMÔM˜ÑMÔMÐMÐMÐMÐMÑMÐMÕMÔMÐ"MÑMÔMÐMÑMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMØÐSˆ|˜wÐ&ÐSÐSÐSÕSÔSÐSÐSÐSÐSˆ|˜wÐSÑSÔSÕSÔSˆ|ÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔS˜wÑSÔSÐSÕSÔS˜wÑSÔSÐSÐSÐSÐSÑSÐSÕSÔSÐ(SÑSÔSÐSÑSÐSÐSÐSÑSÐSÕSÕSÔSÐSÑSÔSÑSÔSÐSÐSÐSÐSÐSØÐKˆx˜7Ð"ÐKÐKÐKÕKÔKÐKÐKÐKÐKˆx˜7ÐKÑKÔKÕKÔKˆxÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔK˜7ÑKÔKÐKÕKÔK˜7ÑKÔKÐKÐKÐKÐKÑKÐKÕKÔKÐ$KÑKÔKÐKÑKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKÐKÐKÐKÐKrD   c                óh  — t                                ¦   «         st          j        d¦  «         t                                d¬¦  «        }d}||v }|s—t          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 }|s—t          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 }|s—t          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S )zKVerifies index.html has base href ../webapp/ and full-screen #app-viewport.ú(index.html is being written by worker_m1r   r   z<base href="../webapp/">r   r!   rH   r#   r$   r%   Nzid="app-viewport"zid="game-canvas"©Ú
INDEX_HTMLr)   ÚpytestÚskipr3   r*   r5   r0   r-   r.   r/   r1   r2   ©r6   rH   r?   r:   r@   rA   s         rB   Ú-test_html_base_href_and_viewport_architecturezGTestPcWebClientLayoutUnit.test_html_base_href_and_viewport_architecture5   s“  € å× Ò Ñ"Ô"ð 	DÝŒKÐBÑCÔCÐCÝ×&Ò&°Ð&Ñ8Ô8ˆØ)Ð4Ð)¨WÐ4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð)¨WÐ4Ñ4Ô4Õ4Ô4Ð)Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4¨WÑ4Ô4Ð4Õ4Ô4¨WÑ4Ô4Ð4Ð4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ø"Ð-Ð" gÐ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð" gÐ-Ñ-Ô-Õ-Ô-Ð"Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô- gÑ-Ô-Ð-Õ-Ô- gÑ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ø!Ð,Ð! WÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð! WÐ,Ñ,Ô,Õ,Ô,Ð!Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô, WÑ,Ô,Ð,Õ,Ô, WÑ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,rD   c                óæ  — t                                ¦   «         st          j        d¦  «         t                                d¬¦  «        }d}||v}|s¬t          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}}d}||v}|s¬t          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}}d}||v}|s¬t          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}}dS )z=Verifies zero mobile chassis elements exist in PC index.html.rN   r   r   úiphone-frame)únot in)z%(py1)s not in %(py3)srH   r#   z%No .iphone-frame allowed in PC clientrI   r%   Núid="simulator-bar"z&No #simulator-bar allowed in PC clientzid="mode-iphone"zNo mobile mode buttons allowed)rP   r)   rQ   rR   r3   r*   r5   r0   r-   r.   r/   r+   r1   r2   rS   s         rB   Ú!test_mobile_artifacts_eliminationz;TestPcWebClientLayoutUnit.test_mobile_artifacts_elimination>   sÆ  € å× Ò Ñ"Ô"ð 	DÝŒKÐBÑCÔCÐCÝ×&Ò&°Ð&Ñ8Ô8ˆØÐUˆ~ WÐ,ÐUÐUÐUÕUÔUÐUÐUÐUÐUˆ~ WÐUÑUÔUÕUÔUˆ~ÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔU WÑUÔUÐUÕUÔU WÑ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ÔUÐUÐUÐUÐUÐUØ#Ð\Ð#¨7Ð2Ð\Ð\Ð\Õ\Ô\Ð\Ð\Ð\Ð\Ð#¨7Ð\Ñ\Ô\Õ\Ô\Ð#Ñ\Ô\Ð\Õ\Ô\Ñ\Ô\Ð\Ð\Õ\Ô\¨7Ñ\Ô\Ð\Õ\Ô\¨7Ñ\Ô\Ð\Ð\Ð\Ð\Ñ\Ð\Õ\Ô\Ð4\Ñ\Ô\Ð\Ñ\Ð\Ð\Ð\Ñ\Ð\Õ\Õ\Ô\Ð\Ñ\Ô\Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ø!ÐRÐ!¨Ð0ÐRÐRÐRÕRÔRÐRÐRÐRÐRÐ!¨ÐRÑRÔRÕRÔRÐ!ÑRÔRÐRÕRÔRÑRÔRÐRÐRÕRÔR¨ÑRÔRÐRÕRÔR¨ÑRÔRÐRÐRÐRÐRÑRÐRÕRÔRÐ2RÑRÔRÐRÑRÐRÐRÐRÑRÐRÕRÕRÔRÐRÑRÔRÑRÔRÐRÐRÐRÐRÐRÐRÐRrD   c                óP  — t                                ¦   «         st          j        d¦  «         t                                d¬¦  «        }d}||v }|s—t          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 }|s—t          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}}g }d}||v }|}|sd}||v }	|	}|	sd}
|
|v }|}|�sæt          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  }|                     |¦  «         |�st          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  }|                     |¦  «         |	s‹t          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          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}	x}
}dS )zFVerifies hidden dummy joystick DOM exists to prevent null dereference.rN   r   r   úid="joystick-zone"r   r!   rH   r#   r$   r%   Nzid="joystick-stick"zdisplay:nonezdisplay: noneÚhidden)z%(py3)s in %(py5)s)r   r%   z%(py7)sÚpy7)z%(py10)s in %(py12)s)Úpy10Úpy12z%(py14)sÚpy14)z%(py17)s in %(py19)s)Úpy17Úpy19z%(py21)sÚpy21é   zassert %(py24)sÚpy24)rP   r)   rQ   rR   r3   r*   r5   r0   r-   r.   r/   r1   r2   ÚappendÚ_format_boolop)r6   rH   r?   r:   r@   rA   r7   r<   Ú@py_assert9Ú@py_assert11Ú@py_assert16Ú@py_assert18Ú@py_format8Ú@py_format13Ú@py_format15Ú@py_format20Ú@py_format22Ú@py_format23Ú@py_format25s                      rB   Ú"test_dummy_joystick_guard_presencez<TestPcWebClientLayoutUnit.test_dummy_joystick_guard_presenceG   s{  € å× Ò Ñ"Ô"ð 	DÝŒKÐBÑCÔCÐCÝ×&Ò&°Ð&Ñ8Ô8ˆØ#Ð.Ð# wÐ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð# wÐ.Ñ.Ô.Õ.Ô.Ð#Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô. wÑ.Ô.Ð.Õ.Ô. wÑ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ø$Ð/Ð$¨Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð$¨Ð/Ñ/Ô/Õ/Ô/Ð$Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/¨Ñ/Ô/Ð/Õ/Ô/¨Ñ/Ô/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/à_Ð_�Ð_� 'Ð)Ð_Ð_Ð_Ð_Ð_¨_Ð_¨_ÀÐ-GÐ_Ð_Ð_Ð_Ð_È8Ð_È8ÐW^ÐK^Ð_Ð_Ð_Ð_Ñ_Õ_Ô_Ð_Ð_Ð_Ð_� 'Ð_Ñ_Ô_Õ_Ô_�Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_ 'Ñ_Ô_Ð_Õ_Ô_ 'Ñ_Ô_Ð_Ð_Ð_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Ð_×_Ò_Ð_Ñ_Ô_Ð_Ð_Ñ_Õ_Ô_Ð_Ð_Ð_Ð_¨_ÀÐ_Ñ_Ô_Õ_Ô_¨_Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_ÀÑ_Ô_Ð_Õ_Ô_ÀÑ_Ô_Ð_Ð_Ð_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Ð_×_Ò_Ð_Ñ_Ô_Ð_Ð_Ð_Õ_Ô_Ð_Ð_Ð_Ð_È8ÐW^Ð_Ñ_Ô_Õ_Ô_È8Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_ÐW^Ñ_Ô_Ð_Õ_Ô_ÐW^Ñ_Ô_Ð_Ð_Ð_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Ð_×_Ò_Ð_Ñ_Ô_Ð_Õ_Ô_Ð_Ð_Ñ_Ô_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Õ_Õ_Ô_Ð_Ñ_Ô_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_rD   c                ó  — t                                ¦   «         st          j        d¦  «         t                                d¬¦  «        }d}||v }|s—t          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 }|s—t          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d¦  «        D ]©}d|› d�}||v }|s—t          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D ]©}d|› d�}||v }|s—t          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 }|s—t          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 }|s—t          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 }|s—t          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 }|s—t          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S )z@Verifies dual fluid orbs, central action bar slots, and exp bar.rN   r   r   zid="life-orb-canvas"r   r!   rH   r#   r$   r%   Nzid="mana-orb-canvas"rd   é   zid="skill-flask-ú")ÚqÚwÚeÚrz
id="skill-zid="skill-lmb"zid="skill-rmb"zid="skill-dodge"zid="player-exp-bar")rP   r)   rQ   rR   r3   r*   r5   r0   r-   r.   r/   r1   r2   Úrange)r6   rH   r?   r:   r@   rA   ÚiÚks           rB   Ú"test_grimdark_action_hud_structurez<TestPcWebClientLayoutUnit.test_grimdark_action_hud_structureQ   s®  € å× Ò Ñ"Ô"ð 	DÝŒKÐBÑCÔCÐCÝ×&Ò&°Ð&Ñ8Ô8ˆà%Ð0Ð%¨Ð0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð%¨Ð0Ñ0Ô0Õ0Ô0Ð%Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0¨Ñ0Ô0Ð0Õ0Ô0¨Ñ0Ô0Ð0Ð0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ø%Ð0Ð%¨Ð0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð%¨Ð0Ñ0Ô0Õ0Ô0Ð%Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0¨Ñ0Ô0Ð0Õ0Ô0¨Ñ0Ô0Ð0Ð0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0å�q˜!‘”ð 	6ð 	6ˆAØ* aÐ*Ð*Ð*Ð5Ð*¨gÐ5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð*¨gÐ5Ñ5Ô5Õ5Ô5Ð*Ñ5Ô5Ð5Õ5Ô5Ñ5Ô5Ð5Ð5Õ5Ô5¨gÑ5Ô5Ð5Õ5Ô5¨gÑ5Ô5Ð5Ð5Ð5Ð5Ñ5Ð5Ð5Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5à%ð 	0ð 	0ˆAØ$ Ð$Ð$Ð$Ð/Ð$¨Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð$¨Ð/Ñ/Ô/Õ/Ô/Ð$Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/¨Ñ/Ô/Ð/Õ/Ô/¨Ñ/Ô/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/àÐ*Ð 7Ð*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð 7Ð*Ñ*Ô*Õ*Ô*ÐÑ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô* 7Ñ*Ô*Ð*Õ*Ô* 7Ñ*Ô*Ð*Ð*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*ØÐ*Ð 7Ð*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð 7Ð*Ñ*Ô*Õ*Ô*ÐÑ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô* 7Ñ*Ô*Ð*Õ*Ô* 7Ñ*Ô*Ð*Ð*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*à!Ð,Ð! WÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð! WÐ,Ñ,Ô,Õ,Ô,Ð!Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô, WÑ,Ô,Ð,Õ,Ô, WÑ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ø$Ð/Ð$¨Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð$¨Ð/Ñ/Ô/Õ/Ô/Ð$Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/¨Ñ/Ô/Ð/Õ/Ô/¨Ñ/Ô/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/rD   c                óô  — t                                ¦   «         st          j        d¦  «         t                                d¬¦  «        }d}||v }|s—t          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 }|s—t          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 }|s—t          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 }|s—t          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 }|s—t          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S )z>Verifies top-right minimap and telemetry header in index.html.rN   r   r   zid="minimap-canvas"r   r!   rH   r#   r$   r%   Nzid="minimap-zone-label"zid="minimap-coords"zid="hud-fps"zid="hud-ping"rO   rS   s         rB   Útest_minimap_and_telemetry_hudz8TestPcWebClientLayoutUnit.test_minimap_and_telemetry_hudf   s  € å× Ò Ñ"Ô"ð 	DÝŒKÐBÑCÔCÐCÝ×&Ò&°Ð&Ñ8Ô8ˆØ$Ð/Ð$¨Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð$¨Ð/Ñ/Ô/Õ/Ô/Ð$Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/¨Ñ/Ô/Ð/Õ/Ô/¨Ñ/Ô/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ø(Ð3Ð(¨GÐ3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð(¨GÐ3Ñ3Ô3Õ3Ô3Ð(Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3¨GÑ3Ô3Ð3Õ3Ô3¨GÑ3Ô3Ð3Ð3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ø$Ð/Ð$¨Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð$¨Ð/Ñ/Ô/Õ/Ô/Ð$Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/¨Ñ/Ô/Ð/Õ/Ô/¨Ñ/Ô/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/ØÐ(ˆ~ Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(ˆ~ Ð(Ñ(Ô(Õ(Ô(ˆ~Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô( Ñ(Ô(Ð(Õ(Ô( Ñ(Ô(Ð(Ð(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(ØÐ)ˆ 'Ð)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)ˆ 'Ð)Ñ)Ô)Õ)Ô)ˆÑ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô) 'Ñ)Ô)Ð)Õ)Ô) 'Ñ)Ô)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)rD   c                óô  — t                                ¦   «         st          j        d¦  «         t                                d¬¦  «        }d}||v }|s—t          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 }|s—t          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 }|s—t          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 }|s—t          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 }|s—t          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S )z>Verifies collapsible chat dock with ticker and expanded panel.rN   r   r   zid="chat-dock"r   r!   rH   r#   r$   r%   Nzid="chat-minimized-bar"zid="chat-expanded-panel"zid="chat-input"zid="chat-send-btn"rO   rS   s         rB   Ú$test_collapsible_chat_dock_structurez>TestPcWebClientLayoutUnit.test_collapsible_chat_dock_structureq   s  € å× Ò Ñ"Ô"ð 	DÝŒKÐBÑCÔCÐCÝ×&Ò&°Ð&Ñ8Ô8ˆØÐ*Ð 7Ð*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð 7Ð*Ñ*Ô*Õ*Ô*ÐÑ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô* 7Ñ*Ô*Ð*Õ*Ô* 7Ñ*Ô*Ð*Ð*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ø(Ð3Ð(¨GÐ3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð(¨GÐ3Ñ3Ô3Õ3Ô3Ð(Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3¨GÑ3Ô3Ð3Õ3Ô3¨GÑ3Ô3Ð3Ð3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ø)Ð4Ð)¨WÐ4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð)¨WÐ4Ñ4Ô4Õ4Ô4Ð)Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4¨WÑ4Ô4Ð4Õ4Ô4¨WÑ4Ô4Ð4Ð4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ø Ð+Ð  GÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð  GÐ+Ñ+Ô+Õ+Ô+Ð Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ GÑ+Ô+Ð+Õ+Ô+ GÑ+Ô+Ð+Ð+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ø#Ð.Ð# wÐ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð# wÐ.Ñ.Ô.Õ.Ô.Ð#Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô. wÑ.Ô.Ð.Õ.Ô. wÑ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.rD   c                ó®  — t                                ¦   «         st          j        d¦  «         t                                d¬¦  «        }d}||v }|s—t          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 }|s—t          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 }|s—t          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 }|s—t          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S )z=Verifies #game-tooltip and #overlay-pause are present in DOM.rN   r   r   zid="game-tooltip"r   r!   rH   r#   r$   r%   Nzid="tooltip-title"zid="tooltip-desc"zid="overlay-pause"rO   rS   s         rB   Ú'test_floating_tooltip_and_pause_overlayzATestPcWebClientLayoutUnit.test_floating_tooltip_and_pause_overlay|   sX  € å× Ò Ñ"Ô"ð 	DÝŒKÐBÑCÔCÐCÝ×&Ò&°Ð&Ñ8Ô8ˆØ"Ð-Ð" gÐ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð" gÐ-Ñ-Ô-Õ-Ô-Ð"Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô- gÑ-Ô-Ð-Õ-Ô- gÑ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ø#Ð.Ð# wÐ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð# wÐ.Ñ.Ô.Õ.Ô.Ð#Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô. wÑ.Ô.Ð.Õ.Ô. wÑ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ø"Ð-Ð" gÐ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð" gÐ-Ñ-Ô-Õ-Ô-Ð"Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô- gÑ-Ô-Ð-Õ-Ô- gÑ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ø#Ð.Ð# wÐ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð# wÐ.Ñ.Ô.Õ.Ô.Ð#Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô. wÑ.Ô.Ð.Õ.Ô. wÑ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.rD   c                óî  — t           j        } |¦   «         }|s•ddt          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        ndt	          j        |¦  «        t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}}t            	                    d¬¦  «        }d}||v }|s¬t	          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}}d}||v }|s¬t	          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}}d}||v }|s¬t	          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}}dS )zLVerifies mobile webapp at client/webapp/index.html is completely unmodified.zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}ÚMOBILE_INDEX_HTMLr   Nr   r   rV   r   r!   Úmobile_contentr#   z'Mobile webapp must retain .iphone-framerI   r%   rX   z'Mobile webapp must retain simulator barr[   z(Mobile webapp must retain touch joystick)r†   r)   r-   r.   r*   r/   r0   r1   r2   r3   r5   r+   )	r6   r7   r8   r9   r‡   r?   r:   r@   rA   s	            rB   Ú"test_zero_mobile_webapp_regressionz<TestPcWebClientLayoutUnit.test_zero_mobile_webapp_regression†   sN  € å Ô'Ð)Ð'Ð'Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)Õ Ñ)Ô)Ð)Õ)Ô)Õ Ñ)Ô)Ð)Ð)Õ)Ô)Ð'Ñ)Ô)Õ)Ô)Ð)Ñ)Ô)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ý*×4Ò4¸gÐ4ÑFÔFˆØÐZˆ~ Ð/ÐZÐZÐZÕZÔZÐZÐZÐZÐZˆ~ ÐZÑZÔZÕZÔZˆ~ÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZ ÑZÔZÐZÕZÔZ ÑZÔZÐZÐZÐZÐZÑZÐZÕZÔZÐ1ZÑZÔZÐZÑZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZØ#Ð`Ð# ~Ð5Ð`Ð`Ð`Õ`Ô`Ð`Ð`Ð`Ð`Ð# ~Ð`Ñ`Ô`Õ`Ô`Ð#Ñ`Ô`Ð`Õ`Ô`Ñ`Ô`Ð`Ð`Õ`Ô` ~Ñ`Ô`Ð`Õ`Ô` ~Ñ`Ô`Ð`Ð`Ð`Ð`Ñ`Ð`Õ`Ô`Ð7`Ñ`Ô`Ð`Ñ`Ð`Ð`Ð`Ñ`Ð`Õ`Õ`Ô`Ð`Ñ`Ô`Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ø#ÐaÐ# ~Ð5ÐaÐaÐaÕaÔaÐaÐaÐaÐaÐ# ~ÐaÑaÔaÕaÔaÐ#ÑaÔaÐaÕaÔaÑaÔaÐaÐaÕaÔa ~ÑaÔaÐaÕaÔa ~ÑaÔaÐaÐaÐaÐaÑaÐaÕaÔaÐ7aÑaÔaÐaÑaÐaÐaÐaÑaÐaÕaÕaÔaÐaÑaÔaÑaÔaÐaÐaÐaÐaÐaÐaÐarD   N)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rC   rL   rT   rY   rs   r~   r€   r‚   r„   rˆ   © rD   rB   r   r      sô   € € € € € ØSÐSð	+ð 	+ð 	+ð 	+ðLð Lð Lð Lð-ð -ð -ð -ðSð Sð Sð Sð`ð `ð `ð `ð0ð 0ð 0ð 0ð*	*ð 	*ð 	*ð 	*ð	/ð 	/ð 	/ð 	/ð/ð /ð /ð /ðbð bð bð bð bð brD   r   )rŒ   Ú
__future__r   Úbuiltinsr-   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter*   ÚinspectÚosÚreÚsysÚpathlibr   rQ   Ú__file__ÚresolveÚparentÚPROJECT_ROOTÚ
WEB_PC_DIRrP   r&   r'   r(   rF   r†   r   r�   rD   rB   ú<module>r�      sO  ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "Ø  € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø €€€àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5Ô<€Ø˜HÑ$ xÑ/€
Ø˜,Ñ&€
Ø˜Ñ Ñ-€Ø
�uÑ
˜|Ñ
+€Ø˜%Ñ /Ñ1€
Ø˜WÑ$Ð'8Ñ8€Ø  8Ñ+¨hÑ6¸ÑEÐ ðmbð mbð mbð mbð mbñ mbô mbð mbð mbð mbrD   