§
    Û[¿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ddlZ e
e¦  «                             ¦   «         j        j        j        Zedz  dz  Zedz  Z G d„ dej        ¦  «        Zed	k    r ej        ¦   «          dS dS )
zˆ
Unit tests for FreeExile Dedicated PC Desktop Full-Screen Web Client (client/web_pc)
and its development runner tools/serve_web_pc.py.
é    N)ÚPathÚclientÚweb_pcÚtoolsc                   óH   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ ZdS )ÚTestPCWebClientArtifactszEVerifies physical file layout, DOM contracts, and server integration.c           	      ó  — t           dz  t           dz  dz  t           dz  dz  t           dz  dz  t           dz  dz  t           dz  dz  t           dz  d	z  t          d
z  g}|D ]-}|                      |                     ¦   «         d|› �¦  «         Œ.dS )zAAll 7 required PC web client artifacts and dev runner must exist.ú
index.htmlÚcssúpc_main.cssú
pc_hud.cssúpc_modals.cssÚjsúpc_input_controller.jszpc_hud_controller.jsú
pc_main.jszserve_web_pc.pyzRequired file must exist: N)ÚPC_DIRÚ	TOOLS_DIRÚ
assertTrueÚis_file)ÚselfÚrequired_filesÚfs      ú6C:\Projects\FreeExile\tests\unit\test_pc_web_client.pyÚtest_pc_web_client_files_existz7TestPCWebClientArtifacts.test_pc_web_client_files_exist   s­   € õ �\Ñ!Ý�U‰N˜]Ñ*Ý�U‰N˜\Ñ)Ý�U‰N˜_Ñ,Ý�T‰MÐ4Ñ4Ý�T‰MÐ2Ñ2Ý�T‰M˜LÑ(ÝÐ)Ñ)ð	
ˆð  ð 	Kð 	KˆAØ�OŠO˜AŸIšI™KœKÐ)IÀaÐ)IÐ)IÑJÔJÐJÐJð	Kð 	Kó    c                 ó  — ddl m} |                      t          |d¦  «        ¦  «         t	          j        |j        ¦  «        }|                      d|j        ¦  «         |  	                    |j        d         j
        dd¦  «         dS )zHtools/serve_web_pc.py must default to port 8089 and define start_server.r   NÚstart_serverÚporti™  z*Default port for serve_web_pc must be 8089)Útools.serve_web_pcÚserve_web_pcr   ÚhasattrÚinspectÚ	signaturer   ÚassertInÚ
parametersÚassertEqualÚdefault)r   r    Úsigs      r   Útest_serve_web_pc_configurationz8TestPCWebClientArtifacts.test_serve_web_pc_configuration#   s‚   € à1Ð1Ð1Ð1Ð1Ð1à�Š� ¨nÑ=Ô=Ñ>Ô>Ð>ÝÔ Ô 9Ñ:Ô:ˆØ�Š�f˜cœnÑ-Ô-Ð-Ø×Ò˜œ¨Ô/Ô7¸Ð?kÑlÔlÐlÐlÐlr   c                 óÔ  — ddl m} |                     |¦  «        }|                     d¦  «        }|                      |¦  «         |                      |j        d¦  «         |                      |j        t          ¦  «         |                     d¦  «        }|                      |¦  «         |                      |t          dz  dz  ¦  «         |                     d¦  «        }|                      |¦  «         |                      |t          d	z  d
z  ¦  «         |                     d¦  «        }|                      |¦  «         |  	                    | 
                    ¦   «         ¦  «         dS )zPFreeExilePCRequestHandler resolves PC root, PC css/js, and webapp shared assets.r   )ÚFreeExilePCRequestHandlerÚ r
   zcss/pc_main.cssr   r   zjs/pc_main.jsr   r   zjs/data/i18n.jsN)r   r+   Ú__new__Ú_resolve_static_pathÚassertIsNotNoner&   ÚnameÚparentr   r   r   )r   r+   ÚhandlerÚresolved_rootÚresolved_cssÚresolved_jsÚresolved_assets          r   Ú!test_serve_web_pc_path_resolutionz:TestPCWebClientArtifacts.test_serve_web_pc_path_resolution,   sb  € à@Ð@Ð@Ð@Ð@Ð@à+×3Ò3Ð4MÑNÔNˆð  ×4Ò4°RÑ8Ô8ˆØ×Ò˜]Ñ+Ô+Ð+Ø×Ò˜Ô+¨\Ñ:Ô:Ð:Ø×Ò˜Ô-­vÑ6Ô6Ð6ð ×3Ò3Ð4EÑFÔFˆØ×Ò˜\Ñ*Ô*Ð*Ø×Ò˜¥v°¡~¸Ñ'EÑFÔFÐFð ×2Ò2°?ÑCÔCˆØ×Ò˜[Ñ)Ô)Ð)Ø×Ò˜¥f¨t¡m°lÑ&BÑCÔCÐCð !×5Ò5Ð6GÑHÔHˆØ×Ò˜^Ñ,Ô,Ð,Ø�Š˜×.Ò.Ñ0Ô0Ñ1Ô1Ð1Ð1Ð1r   c                 ó€  — t           dz  }|                     d¬¦  «        }|                      d|d¦  «         |                      d|d¦  «         |                      d|d	¦  «         |                      d
|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         dS )zUindex.html must include <base href="../webapp/"> and zero mobile simulator artifacts.r
   úutf-8©Úencodingz<base href="../webapp/">z$Must declare base href to ../webapp/ziphone-framez*Must NOT contain mobile iphone-frame classzsimulator-barz-Must NOT contain mobile simulator-bar elementzid="joystick-zone"zid="joystick-stick"zid="joy-key-w"zdisplay: none;N)r   Ú	read_textr$   ÚassertNotIn)r   Ú	html_pathÚcontents      r   Ú3test_index_html_base_href_and_zero_mobile_artifactszLTestPCWebClientArtifacts.test_index_html_base_href_and_zero_mobile_artifactsG   sÌ   € å˜\Ñ)ˆ	Ø×%Ò%¨wÐ%Ñ7Ô7ˆð 	�ŠÐ0°'Ð;aÑbÔbÐbð 	×Ò˜¨Ð2^Ñ_Ô_Ð_Ø×Ò˜¨'Ð3bÑcÔcÐcð 	�ŠÐ*¨GÑ4Ô4Ð4Ø�ŠÐ+¨WÑ5Ô5Ð5Ø�ŠÐ&¨Ñ0Ô0Ð0Ø�ŠÐ&¨Ñ0Ô0Ð0Ð0Ð0r   c                 óÚ  — t           dz                       d¬¦  «        }|                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         t          dd	¦  «        D ]}|                      d
|› d�|¦  «         Œ|                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|d¦  «         dS )zKindex.html must have symmetrical dual fluid orbs and PoE2-style action bar.r
   r9   r:   zid="life-orb-canvas"zid="mana-orb-canvas"zid="txt-life-cur"zid="txt-mana-cur"é   é   zid="skill-flask-ú"zid="skill-q"zid="skill-w"zid="skill-e"zid="skill-r"zid="skill-lmb"zid="skill-rmb"zid="skill-dodge"zid="player-exp-bar"zid="badge-iframe"zPMust contain badge-iframe element to prevent canvas_renderer.js null dereferenceN)r   r<   r$   Úrange)r   r?   Úis      r   Ú(test_index_html_action_hud_and_dual_orbszATestPCWebClientArtifacts.test_index_html_action_hud_and_dual_orbsY   s…  € å˜LÑ(×3Ò3¸WÐ3ÑEÔEˆð 	�ŠÐ,¨gÑ6Ô6Ð6Ø�ŠÐ,¨gÑ6Ô6Ð6Ø�ŠÐ)¨7Ñ3Ô3Ð3Ø�ŠÐ)¨7Ñ3Ô3Ð3õ �q˜!‘”ð 	<ð 	<ˆAØ�MŠMÐ1¨QÐ1Ð1Ð1°7Ñ;Ô;Ð;Ð;ð 	�Š�n gÑ.Ô.Ð.Ø�Š�n gÑ.Ô.Ð.Ø�Š�n gÑ.Ô.Ð.Ø�Š�n gÑ.Ô.Ð.Ø�ŠÐ&¨Ñ0Ô0Ð0Ø�ŠÐ&¨Ñ0Ô0Ð0Ø�ŠÐ(¨'Ñ2Ô2Ð2Ø�ŠÐ+¨WÑ5Ô5Ð5Ø�ŠÐ)¨7ð  5Gñ  	Hô  	Hð  	Hð  	Hð  	Hr   c                 óÎ  — t           dz                       d¬¦  «        }|                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d	|¦  «         |                      d
|¦  «         |                      d|¦  «         |                      d|¦  «         dS )zNindex.html must contain 180x130 minimap, telemetry, and collapsible chat dock.r
   r9   r:   zid="minimap-canvas"zid="minimap-coords"zid="minimap-zone-label"zid="hud-fps"zid="hud-ping"zid="chat-dock"zid="chat-minimized-bar"zid="chat-expanded-panel"zid="chat-input"N©r   r<   r$   )r   r?   s     r   Ú*test_index_html_minimap_chat_and_telemetryzCTestPCWebClientArtifacts.test_index_html_minimap_chat_and_telemetryr   sÞ   € å˜LÑ(×3Ò3¸WÐ3ÑEÔEˆà�ŠÐ+¨WÑ5Ô5Ð5Ø�ŠÐ+¨WÑ5Ô5Ð5Ø�ŠÐ/°Ñ9Ô9Ð9à�Š�n gÑ.Ô.Ð.Ø�Š�o wÑ/Ô/Ð/à�ŠÐ&¨Ñ0Ô0Ð0Ø�ŠÐ/°Ñ9Ô9Ð9Ø�ŠÐ0°'Ñ:Ô:Ð:Ø�ŠÐ'¨Ñ1Ô1Ð1Ð1Ð1r   c                 ó’   — t           dz                       d¬¦  «        }g d¢}|D ]!}|                      d|› d�|d|› d�¦  «         Œ"d	S )
z>index.html lang-select must contain all 9 canonical languages.r
   r9   r:   )	ÚviÚenÚzhÚjaÚkoÚthÚdeÚruÚeszvalue="rD   zLocale z must exist in lang-selectNrI   )r   r?   ÚlocalesÚlocs       r   Ú"test_index_html_9_languages_parityz;TestPCWebClientArtifacts.test_index_html_9_languages_parity‚   sv   € å˜LÑ(×3Ò3¸WÐ3ÑEÔEˆØHÐHÐHˆØð 	`ð 	`ˆCØ�MŠMÐ* CÐ*Ð*Ð*¨GÐ5^¸sÐ5^Ð5^Ð5^Ñ_Ô_Ð_Ð_ð	`ð 	`r   c                 óØ  — t           dz  dz  }|                     d¬¦  «        }|                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d	|¦  «         |                      d
|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         dS )zYpc_input_controller.js must disable WASD movement and implement click-to-move and skills.r   r   r9   r:   z!window.enableWasdMovement = falsezwindow.keys = {}Ú
isoToWorldzplayer.destinationÚ	isLmbHeldÚcontextmenuÚpreventDefaultÚdoDodgeÚuseFlaskNrI   )r   Újs_pathr?   s      r   Útest_pc_input_controller_logicz7TestPCWebClientArtifacts.test_pc_input_controller_logic‰   sï   € å˜4‘-Ð":Ñ:ˆØ×#Ò#¨WÐ#Ñ5Ô5ˆð 	�ŠÐ9¸7ÑCÔCÐCØ�ŠÐ(¨'Ñ2Ô2Ð2ð 	�Š�l GÑ,Ô,Ð,Ø�ŠÐ*¨GÑ4Ô4Ð4Ø�Š�k 7Ñ+Ô+Ð+ð 	�Š�m WÑ-Ô-Ð-Ø�ŠÐ&¨Ñ0Ô0Ð0ð 	�Š�i Ñ)Ô)Ð)ð 	�Š�j 'Ñ*Ô*Ð*Ð*Ð*r   c                 óÜ  — t           dz  dz                       d¬¦  «        }t           dz  dz                       d¬¦  «        }t           dz  dz                       d¬¦  «        }|                      d|¦  «         |                      d|¦  «         |                      d	|¦  «         |                      d
|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         |                      d|¦  «         dS )zJCSS files must implement full-screen, orbs, action bar, and modal docking.r   r   r9   r:   r   r   z#app-viewportÚ100vwÚ100vhzoverflow: hiddenz
.orb-globez.flask-slotz.skill-slotz.hud-skill-bar-pcz#modal-characterz
#modal-bagz
left: 24pxzright: 24pxNrI   )r   Úmain_cssÚhud_cssÚ
modals_csss       r   Útest_pc_stylesheets_structurez6TestPCWebClientArtifacts.test_pc_stylesheets_structure¡   s^  € å˜U‘N ]Ñ2×=Ò=ÀwÐ=ÑOÔOˆÝ˜E‘> LÑ0×;Ò;ÀWÐ;ÑMÔMˆÝ˜u‘n Ñ6×AÒAÈ7ÐAÑSÔSˆ
ð 	�Š�o xÑ0Ô0Ð0Ø�Š�g˜xÑ(Ô(Ð(Ø�Š�g˜xÑ(Ô(Ð(Ø�ŠÐ(¨(Ñ3Ô3Ð3ð 	�Š�l GÑ,Ô,Ð,Ø�Š�m WÑ-Ô-Ð-Ø�Š�m WÑ-Ô-Ð-Ø�ŠÐ)¨7Ñ3Ô3Ð3ð 	�ŠÐ(¨*Ñ5Ô5Ð5Ø�Š�l JÑ/Ô/Ð/Ø�Š�l JÑ/Ô/Ð/Ø�Š�m ZÑ0Ô0Ð0Ð0Ð0r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r)   r7   r@   rG   rJ   rW   r`   rg   © r   r   r   r      s­   € € € € € ØOÐOðKð Kð Kðmð mð mð2ð 2ð 2ð61ð 1ð 1ð$Hð Hð Hð22ð 2ð 2ð `ð `ð `ð+ð +ð +ð01ð 1ð 1ð 1ð 1r   r   Ú__main__)rk   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr"   ÚosÚpathlibr   ÚreÚunittestÚ__file__Úresolver1   ÚPROJECT_ROOTr   r   ÚTestCaser   rh   Úmainrl   r   r   ú<module>r}      sø   ððð ð
 € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø 	€	€	€	Ø €€€àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5Ô<€Ø	˜Ñ	  8Ñ	+€Ø˜7Ñ"€	ðf1ð f1ð f1ð f1ð f1˜xÔ0ñ f1ô f1ð f1ðR ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr   