§
    ôF¿jY  ã                  óê   — 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mZ ddlZ ee¦  «                             ¦   «         j        j        j        Zedz  dz  dz  dz  Z G d	„ d
¦  «        ZdS )u  
Unit Test Suite for FreeExile PC Desktop Input Controller (client/web_pc/js/pc_input_controller.js).
Verifies:
- Kinematics & 2:1 isometric coordinate transformation invariants
- Click-to-Move arrival threshold (<= 0.22) and continuous Hold-to-Move logic
- Decoupling of key 'W' from movement and mapping to Martial Skill 2
- 1-5 Survival Flask properties and cooldowns
- Huyá»…n áº¢nh Bá»™ (Spacebar dodge) 0.25s i-frame window
- Input field typing focus exclusion guard
- Code hygiene & line cap limits (<= 350 lines soft cap)
é    )ÚannotationsN)ÚPathÚclientÚweb_pcÚjszpc_input_controller.jsc                  ój   — 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d„ZdS )ÚTestPcInputControllerUnitzFEmpirical unit tests for PC Input Controller kinematics and contracts.ÚreturnÚNonec                óª  — 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¬¦  «                             ¦   «         }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        dt          |¦  «        › d�¦  «        dz   d|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}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        d¦  «        dz   d|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}dS )zCVerifies pc_input_controller.js exists and complies with line caps.z!pc_input_controller.js must existzC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}ÚPC_INPUT_JS)Úpy0Úpy2Úpy4Núutf-8©Úencodingi^  ©ú<=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py6)sÚlenÚlines)r   Úpy1Úpy3Úpy6zFile length z exceeds 350 lines soft capz
>assert %(py8)sÚpy8éP   )ú>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sz"File should have substantive logic)r   ÚexistsÚ
@pytest_arÚ_format_assertmsgÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚ	read_textÚ
splitlinesr   Ú_call_reprcompare)
ÚselfÚ@py_assert1Ú@py_assert3Ú@py_format5r   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9s
             ú<C:\Projects\FreeExile\tests\unit\test_pc_input_controller.pyÚtest_file_exists_and_hygienez6TestPcInputControllerUnit.test_file_exists_and_hygiene   sS  € åÔ!ÐHÐ!Ð!Ñ#Ô#ÐHÐ#ÐHÕHÔHÐ%HÑHÔHÐHÑHÐHÕHÔHÑHÔHÐHÐHÕHÔH�{ÑHÔHÐHÕHÔH�{ÑHÔHÐHÐHÕHÔHÐ!ÑHÔHÕHÔHÐ#ÑHÔHÐHÐHÑHÐHÕHÕHÔHÐHÑHÔHÑHÔHÐHÐHÐHÐHÐHÝ×%Ò%¨wÐ%Ñ7Ô7×BÒBÑDÔDˆÝ�5‰zŒzÐX˜SÐXˆz˜SÒ ÐXÐXÑXÕXÔXÐXÐXÐXÐXˆz˜SÐXÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔX�sÑXÔXÐXÕXÔX�sÑXÔXÐXÐXÐXÕXÔXÑXÔXÐXÐXÕXÔX�5ÑXÔXÐXÕXÔX�5ÑXÔXÐXÐXÕXÔXˆzÑXÔXÕXÔX˜SÑXÔXÐXÐXÑXÐXÕXÔXÐ"Xµ°U±´Ð"XÐ"XÐ"XÑXÔXÐXÑXÐXÐXÐXÑXÐXÕXÕXÔXÐXÑXÔXÑXÔXÐXÐXÐXÐXÐXÐXÐXÝ�5‰zŒzÐE˜RÐEˆz˜RÒÐEÐEÑEÕEÔEÐEÐEÐEÐEˆz˜RÐEÑEÔEÐEÕEÔEÑEÔEÐEÐEÕEÔE�sÑEÔEÐEÕEÔE�sÑEÔEÐEÐEÐEÕEÔEÑEÔEÐEÐEÕEÔE�5ÑEÔEÐEÕEÔE�5ÑEÔEÐEÐEÕEÔEˆzÑEÔEÕEÔE˜RÑEÔEÐEÐEÑEÐEÕEÔEÐ!EÑEÔEÐEÑEÐEÐEÐEÑEÐEÕEÕEÔEÐEÑEÔEÑEÔEÐEÐEÐEÐEÐEÐEÐEÐEÐEó    c                óT  — 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 )zIVerifies window.enableWasdMovement is set false and W is mapped to skill.r   r   z!window.enableWasdMovement = false©Úin©z%(py1)s in %(py3)sÚcontent©r   r   úassert %(py5)sÚpy5Nzwindow.keys = {}zkey === 'W'Ú	doThunder©
r   r'   r   r)   r$   r!   r"   r#   r%   r&   ©r*   r:   Ú@py_assert0r.   Ú@py_format4Ú@py_format6s         r3   Ú(test_wasd_decoupling_and_w_key_isolationzBTestPcInputControllerUnit.test_wasd_decoupling_and_w_key_isolation"   s,  € å×'Ò'°Ð'Ñ9Ô9ˆØ2Ð=Ð2°gÐ=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Ð2°gÐ=Ñ=Ô=Õ=Ô=Ð2Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=°gÑ=Ô=Ð=Õ=Ô=°gÑ=Ô=Ð=Ð=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ø!Ð,Ð! WÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð! WÐ,Ñ,Ô,Õ,Ô,Ð!Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô, WÑ,Ô,Ð,Õ,Ô, WÑ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,àÐ'ˆ} Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ} Ð'Ñ'Ô'Õ'Ô'ˆ}Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô' Ñ'Ô'Ð'Õ'Ô' Ñ'Ô'Ð'Ð'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'ØÐ%ˆ{˜gÐ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ{˜gÐ%Ñ%Ô%Õ%Ô%ˆ{Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%˜gÑ%Ô%Ð%Õ%Ô%˜gÑ%Ô%Ð%Ð%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%r5   c                ó  — 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 all required PC ARPG hotkeys are handled in onKeyDown.r   r   )Ú1Ú2Ú3Ú4Ú5ú'r7   r9   r:   r;   r<   r=   N)ÚQÚWÚEÚRÚSpacez'I'z'C'z'ESCAPE'r?   )r*   r:   ÚnumrA   r.   rB   rC   Úkeys           r3   Útest_keybinding_registrationz6TestPcInputControllerUnit.test_keybinding_registration+   sÞ  € å×'Ò'°Ð'Ñ9Ô9ˆà,ð 	)ð 	)ˆCØ�s�:�:�:Ð(�: Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(�: Ð(Ñ(Ô(Õ(Ô(�:Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô( Ñ(Ô(Ð(Õ(Ô( Ñ(Ô(Ð(Ð(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(à'ð 	)ð 	)ˆCØ�s�:�:�:Ð(�: Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(�: Ð(Ñ(Ô(Õ(Ô(�:Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô( Ñ(Ô(Ð(Õ(Ô( Ñ(Ô(Ð(Ð(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(àÐ!ˆw˜'Ð!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆw˜'Ð!Ñ!Ô!Õ!Ô!ˆwÑ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!˜'Ñ!Ô!Ð!Õ!Ô!˜'Ñ!Ô!Ð!Ð!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!àÐˆu˜ÐÐÐÐÕÔÐÐÐÐˆu˜ÐÑÔÕÔˆuÑÔÐÕÔÑÔÐÐÕÔ˜ÑÔÐÕÔ˜ÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐˆu˜ÐÐÐÐÕÔÐÐÐÐˆu˜ÐÑÔÕÔˆuÑÔÐÕÔÑÔÐÐÕÔ˜ÑÔÐÕÔ˜ÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐ$ˆz˜WÐ$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆz˜WÐ$Ñ$Ô$Õ$Ô$ˆzÑ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$˜WÑ$Ô$Ð$Õ$Ô$˜WÑ$Ô$Ð$Ð$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$r5   c                ól  — d\  }}d\  }}t          j        ||z
  ||z
  ¦  «        }d}||k    }|s¬t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          j        d¦  «        d	z   d
|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}}||z
  |z  }
||z
  |z  }t           j        }t           j        } ||
|¦  «        }d}d} ||||¬¦  «        }|�s¥ddt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        dt	          j        ¦   «         v st          j        |
¦  «        rt          j        |
¦  «        nddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœ
z  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}x}}d\  }}t          j        ||z
  ||z
  ¦  «        }d}||k    }|s¬t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          j        d¦  «        d	z   d
|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}}dS )zCVerifies arrival threshold mathematical formula (0.22 world units).)ç      $@rU   )ç      %@rV   g)\�Âõ(Ì?)ú>)z%(py0)s > %(py3)sÚdist)r   r   z/Destination must be active when distance > 0.22z
>assert %(py5)sr=   Nç      ð?gñhãˆµøä>)Úrel_tolz©assert %(py15)s
{%(py15)s = %(py2)s
{%(py2)s = %(py0)s.isclose
}(%(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.hypot
}(%(py6)s, %(py7)s)
}, %(py11)s, rel_tol=%(py13)s)
}ÚmathÚmxÚmy)
r   r   r   r=   r   Úpy7Úpy9Úpy11Úpy13Úpy15)ç333333$@rc   r   )z%(py0)s <= %(py3)sÚ
close_distz-Destination should snap inactive when <= 0.22)r[   Úhypotr   r)   r!   r"   r#   r$   r    r%   r&   Úisclose)r*   Ú	player_wxÚ	player_wyÚdest_wxÚdest_wyrX   r.   r+   rB   rC   r\   r]   r0   Ú@py_assert8Ú@py_assert10Ú@py_assert12Ú@py_assert14Ú@py_format16Úclose_wxÚclose_wyrd   s                        r3   Ú%test_click_to_move_arrival_kinematicsz?TestPcInputControllerUnit.test_click_to_move_arrival_kinematics;   sø  € ð  *Ñˆ	�9à%Ñˆ�ÝŒz˜' IÑ-¨w¸Ñ/BÑCÔCˆØÐMˆt�dŠ{ÐMÐMÐMÕMÔMÐMÐMÐMÐMˆt�dÐMÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔMˆtÑMÔMÐMÕMÔMˆtÑMÔMÐMÐMÕMÔM�dÑ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Ø˜	Ñ! TÑ)ˆØ˜	Ñ! TÑ)ˆÝŒ|ÐB�DœJÐB˜J˜J r¨2Ñ.Ô.ÐB°ÐB¸TÐBˆ|ˆ|Ð.°¸TÐBÑBÔBÐBÐBÑBÐBÐBÕBÔBÑBÔBÐBÐBÕBÔB�tÑBÔBÐBÕBÔB�tÑBÔBÐBÐBÕBÔBˆ|ÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔB�DÑBÔBÐBÕBÔB�DÑBÔBÐBÐBÕBÔB˜JÑBÔBÐBÕBÔBÑBÔBÐBÐBÕBÔB rÑBÔBÐBÕBÔB rÑBÔBÐBÐBÐBÕBÔBÑBÔBÐBÐBÕBÔB¨2ÑBÔBÐBÕBÔB¨2ÑBÔBÐBÐBÕBÔBÐ.ÑBÔBÕBÔB°ÑBÔBÕBÔB¸TÑBÔBÕBÔBÐBÑBÔBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBÐBð (Ñˆ�(Ý”Z ¨9Ñ 4°hÀÑ6JÑKÔKˆ
Ø!ÐRˆz˜TÒ!ÐRÐRÐRÕRÔRÐRÐRÐRÐRˆz˜TÐRÑRÔRÐRÕRÔRÑRÔRÐRÐRÕRÔRˆzÑRÔRÐRÕRÔRˆzÑRÔRÐRÐRÕRÔR˜TÑ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ÐRr5   c                óT  — 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 isLmbHeld state and pointermove continuous update.r   r   zisLmbHeld: falser7   r9   r:   r;   r<   r=   Nzthis.isLmbHeld = truezthis.isLmbHeld = falsez;this.executeMoveTo(this.cursorWorld.wx, this.cursorWorld.wyr?   r@   s         r3   Ú"test_continuous_hold_to_move_logicz<TestPcInputControllerUnit.test_continuous_hold_to_move_logicL   s6  € å×'Ò'°Ð'Ñ9Ô9ˆØ!Ð,Ð! WÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð! WÐ,Ñ,Ô,Õ,Ô,Ð!Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô, WÑ,Ô,Ð,Õ,Ô, WÑ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ø&Ð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Ø'Ð2Ð'¨7Ð2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð'¨7Ð2Ñ2Ô2Õ2Ô2Ð'Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2¨7Ñ2Ô2Ð2Õ2Ô2¨7Ñ2Ô2Ð2Ð2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2ØLÐWÐLÐPWÐWÐWÐWÐWÕWÔWÐWÐWÐWÐWÐLÐPWÐWÑWÔWÕWÔWÐLÑWÔWÐWÕWÔWÑWÔWÐWÐWÕWÔWÐPWÑWÔWÐWÕWÔWÐPWÑWÔWÐWÐWÐWÐWÑWÐWÐWÐWÐWÐWÑWÐWÕWÕWÔWÐWÑWÔWÑWÔWÐWÐWÐWÐWÐWÐWÐWr5   c                óT  — 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 )zGVerifies right-click suppresses contextmenu and triggers primary skill.r   r   ze.preventDefault()r7   r9   r:   r;   r<   r=   NÚcontextmenuze.button === 2ÚexecutePrimarySkillr?   r@   s         r3   Ú"test_contextmenu_prevention_on_rmbz<TestPcInputControllerUnit.test_contextmenu_prevention_on_rmbT   s/  € å×'Ò'°Ð'Ñ9Ô9ˆØ#Ð.Ð# wÐ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð# wÐ.Ñ.Ô.Õ.Ô.Ð#Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô. wÑ.Ô.Ð.Õ.Ô. wÑ.Ô.Ð.Ð.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.ØÐ'ˆ} Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ} Ð'Ñ'Ô'Õ'Ô'ˆ}Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô' Ñ'Ô'Ð'Õ'Ô' Ñ'Ô'Ð'Ð'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'ØÐ*Ð 7Ð*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð 7Ð*Ñ*Ô*Õ*Ô*ÐÑ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô* 7Ñ*Ô*Ð*Õ*Ô* 7Ñ*Ô*Ð*Ð*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ø$Ð/Ð$¨Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð$¨Ð/Ñ/Ô/Õ/Ô/Ð$Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/¨Ñ/Ô/Ð/Õ/Ô/¨Ñ/Ô/Ð/Ð/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/r5   c                óª  — d\  }}t           j        }t           j        }d}d} |||¦  «        }d} |||¦  «        }	|	�s<ddt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        dœ	z  }
t          t          j	        |
¦  «        ¦  «        ‚dx}x}x}x}x}x}}	t           j        }t           j        }d}d} |||¦  «        }t           j
        }d}||z  } |||¦  «        }|�s—d	dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}x}}t           j        }t           j        }d}d}| } |||¦  «        }t           j
        }	 |||	¦  «        }|�s„ddt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        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}x}x}x}x}x}x}	}t           j        }t           j        }d}| }d} |||¦  «        }t           j
        }	|	 }d}||z  } |||¦  «        }|�s—ddt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |	¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}	x}x}x}}dS )zDVerifies Math.atan2 correctly calculates 8-directional facing angle.©ç        r{   r{   rY   z™assert %(py15)s
{%(py15)s = %(py2)s
{%(py2)s = %(py0)s.isclose
}(%(py11)s
{%(py11)s = %(py5)s
{%(py5)s = %(py3)s.atan2
}(%(py7)s, %(py9)s)
}, %(py13)s)
}r[   )	r   r   r   r=   r^   r_   r`   ra   rb   Né   zÀassert %(py19)s
{%(py19)s = %(py2)s
{%(py2)s = %(py0)s.isclose
}(%(py11)s
{%(py11)s = %(py5)s
{%(py5)s = %(py3)s.atan2
}(%(py7)s, %(py9)s)
}, (%(py14)s
{%(py14)s = %(py12)s.pi
} / %(py16)s))
})r   r   r   r=   r^   r_   r`   Úpy12Úpy14Úpy16Úpy19z´assert %(py17)s
{%(py17)s = %(py2)s
{%(py2)s = %(py0)s.isclose
}(%(py12)s
{%(py12)s = %(py5)s
{%(py5)s = %(py3)s.atan2
}(%(py7)s, -%(py9)s)
}, %(py15)s
{%(py15)s = %(py13)s.pi
})
})
r   r   r   r=   r^   r_   r}   ra   rb   Úpy17zÃassert %(py21)s
{%(py21)s = %(py2)s
{%(py2)s = %(py0)s.isclose
}(%(py12)s
{%(py12)s = %(py5)s
{%(py5)s = %(py3)s.atan2
}(-%(py7)s, %(py10)s)
}, (-%(py15)s
{%(py15)s = %(py13)s.pi
} / %(py18)s))
})r   r   r   r=   r^   Úpy10r}   ra   rb   Úpy18Úpy21)r[   rf   Úatan2r!   r"   r   r#   r$   r%   r&   Úpi)r*   Úplayer_xÚplayer_yr+   r0   Ú@py_assert6rk   rl   rm   rn   ro   Ú@py_assert13Ú@py_assert15Ú@py_assert17Ú@py_assert18Ú@py_format20Ú@py_assert11Ú@py_assert16Ú@py_format18Ú@py_assert9Ú@py_assert19Ú@py_assert20Ú@py_format22s                          r3   Útest_facing_angle_trigonometryz8TestPcInputControllerUnit.test_facing_angle_trigonometry\   s	  € à%Ñˆ�(åŒ|Ð6�DœJÐ6 sÐ6¨CÐ6˜J˜J s¨CÑ0Ô0Ð6°#Ð6ˆ|ˆ|Ð0°#Ñ6Ô6Ð6Ð6Ñ6Ð6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6�tÑ6Ô6Ð6Õ6Ô6�tÑ6Ô6Ð6Ð6Õ6Ô6ˆ|Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6�DÑ6Ô6Ð6Õ6Ô6�DÑ6Ô6Ð6Ð6Õ6Ô6˜JÑ6Ô6Õ6Ô6 sÑ6Ô6Õ6Ô6¨CÑ6Ô6Õ6Ô6Ð0Ñ6Ô6Õ6Ô6°#Ñ6Ô6Õ6Ô6Ð6Ñ6Ô6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6åŒ|Ð>�DœJÐ> sÐ>¨CÐ>˜J˜J s¨CÑ0Ô0Ð>µ$´'Ð>¸AÐ>°'¸A±+Ð>ˆ|ˆ|Ð0°+Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>�tÑ>Ô>Ð>Õ>Ô>�tÑ>Ô>Ð>Ð>Õ>Ô>ˆ|Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>�DÑ>Ô>Ð>Õ>Ô>�DÑ>Ô>Ð>Ð>Õ>Ô>˜JÑ>Ô>Õ>Ô> sÑ>Ô>Õ>Ô>¨CÑ>Ô>Õ>Ô>Ð0Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>µ$Ñ>Ô>Ð>Õ>Ô>µ$Ñ>Ô>Ð>Ð>Õ>Ô>°'Ñ>Ô>Õ>Ô>¸AÑ>Ô>Õ>Ô>Ð>Ñ>Ô>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>åŒ|Ð;�DœJÐ; sÐ;¨SÐ;¨S¨DÐ;˜J˜J s¨DÑ1Ô1Ð;µ4´7Ð;ˆ|ˆ|Ð1°7Ñ;Ô;Ð;Ð;Ñ;Ð;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;�tÑ;Ô;Ð;Õ;Ô;�tÑ;Ô;Ð;Ð;Õ;Ô;ˆ|Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;�DÑ;Ô;Ð;Õ;Ô;�DÑ;Ô;Ð;Ð;Õ;Ô;˜JÑ;Ô;Õ;Ô; sÑ;Ô;Õ;Ô;¨SÑ;Ô;Õ;Ô;Ð1Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;µ4Ñ;Ô;Ð;Õ;Ô;µ4Ñ;Ô;Ð;Ð;Õ;Ô;°7Ñ;Ô;Õ;Ô;Ð;Ñ;Ô;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;åŒ|Ð@�DœJÐ@¨Ð@¨ tÐ@¨SÐ@˜J˜J t¨SÑ1Ô1Ð@µD´GÐ@°G°8Ð@¸aÐ@°8¸a±<Ð@ˆ|ˆ|Ð1°<Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@�tÑ@Ô@Ð@Õ@Ô@�tÑ@Ô@Ð@Ð@Õ@Ô@ˆ|Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@�DÑ@Ô@Ð@Õ@Ô@�DÑ@Ô@Ð@Ð@Õ@Ô@˜JÑ@Ô@Õ@Ô@¨Ñ@Ô@Õ@Ô@¨SÑ@Ô@Õ@Ô@Ð1Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@µDÑ@Ô@Ð@Õ@Ô@µDÑ@Ô@Ð@Ð@Õ@Ô@°GÑ@Ô@Õ@Ô@¸aÑ@Ô@Õ@Ô@Ð@Ñ@Ô@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@r5   c                óš  — 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 )zJVerifies Space triggers 0.25s i-frame, dodge animState, and 3.0s cooldown.r   r   ÚdoDodger7   r9   r:   r;   r<   r=   Nzplayer.isIFrame = truezplayer.iFrameTimer = 0.25zplayer.animState = 'dodge'ztriggerUiCooldown('dodge', 3.0)r?   r@   s         r3   Ú!test_spacebar_dodge_iframe_windowz;TestPcInputControllerUnit.test_spacebar_dodge_iframe_windowh   sô  € å×'Ò'°Ð'Ñ9Ô9ˆØÐ#ˆy˜GÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆy˜GÐ#Ñ#Ô#Õ#Ô#ˆyÑ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#˜GÑ#Ô#Ð#Õ#Ô#˜GÑ#Ô#Ð#Ð#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ø'Ð2Ð'¨7Ð2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð'¨7Ð2Ñ2Ô2Õ2Ô2Ð'Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2¨7Ñ2Ô2Ð2Õ2Ô2¨7Ñ2Ô2Ð2Ð2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ø*Ð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Ø+Ð6Ð+¨wÐ6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð+¨wÐ6Ñ6Ô6Õ6Ô6Ð+Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6¨wÑ6Ô6Ð6Õ6Ô6¨wÑ6Ô6Ð6Ð6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ø0Ð;Ð0°GÐ;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð0°GÐ;Ñ;Ô;Õ;Ô;Ð0Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;°GÑ;Ô;Ð;Õ;Ô;°GÑ;Ô;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;r5   c                óš  — 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 )zHVerifies all 5 flasks are specified with accurate durations and effects.r   r   Ú450r7   r9   r:   r;   r<   r=   NÚ50z1.35zdefenseBuff = 0.5zdamageMultiplier = 1.5r?   r@   s         r3   Ú"test_survival_flask_specificationsz<TestPcInputControllerUnit.test_survival_flask_specificationsq   sí  € å×'Ò'°Ð'Ñ9Ô9ˆàÐˆu˜ÐÐÐÐÕÔÐÐÐÐˆu˜ÐÑÔÕÔˆuÑÔÐÕÔÑÔÐÐÕÔ˜ÑÔÐÕÔ˜ÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐàÐˆt�wˆÐÐÐÕÔÐÐÐÐˆt�wÐÑÔÕÔˆtÑÔÐÕÔÑÔÐÐÕÔ�wÑÔÐÕÔ�wÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐàÐ ˆv˜Ð Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆv˜Ð Ñ Ô Õ Ô ˆvÑ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˜Ñ Ô Ð Õ Ô ˜Ñ Ô Ð Ð Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð à"Ð-Ð" gÐ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð" gÐ-Ñ-Ô-Õ-Ô-Ð"Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô- gÑ-Ô-Ð-Õ-Ô- gÑ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-à'Ð2Ð'¨7Ð2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð'¨7Ð2Ñ2Ô2Õ2Ô2Ð'Ñ2Ô2Ð2Õ2Ô2Ñ2Ô2Ð2Ð2Õ2Ô2¨7Ñ2Ô2Ð2Õ2Ô2¨7Ñ2Ô2Ð2Ð2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2r5   c                óT  — 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 )zKVerifies isTypingFocus inspects activeElement tag to avoid hotkey misfires.r   r   ÚisTypingFocusr7   r9   r:   r;   r<   r=   Nz'INPUT'z
'TEXTAREA'ÚisContentEditabler?   r@   s         r3   Útest_input_typing_focus_guardz7TestPcInputControllerUnit.test_input_typing_focus_guard   s)  € å×'Ò'°Ð'Ñ9Ô9ˆØÐ)ˆ 'Ð)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)ˆ 'Ð)Ñ)Ô)Õ)Ô)ˆÑ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô) 'Ñ)Ô)Ð)Õ)Ô) 'Ñ)Ô)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)ØÐ#ˆy˜GÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆy˜GÐ#Ñ#Ô#Õ#Ô#ˆyÑ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#˜GÑ#Ô#Ð#Õ#Ô#˜GÑ#Ô#Ð#Ð#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#ØÐ&ˆ|˜wÐ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ|˜wÐ&Ñ&Ô&Õ&Ô&ˆ|Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&˜wÑ&Ô&Ð&Õ&Ô&˜wÑ&Ô&Ð&Ð&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ø"Ð-Ð" gÐ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð" gÐ-Ñ-Ô-Õ-Ô-Ð"Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô- gÑ-Ô-Ð-Õ-Ô- gÑ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-r5   c           
     ó   — d\  }}d\  }}d\  }}dD �]ú\  }}||z
  }	||z
  }
|	|
z
  |dz  z  |z   }|	|
z   |dz  z  |z   }||z
  }||z
  }||dz  z  ||dz  z  z   dz  }||dz  z  ||dz  z  z
  dz  }||z   }||z   }t           j        }d} ||||¬¦  «        }|�s$dd	t          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        nd	t	          j        |¦  «        d
t          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nd
dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}t           j        }d} ||||¬¦  «        }|�s$dd	t          j        ¦   «         v st	          j        t           ¦  «        rt	          j        t           ¦  «        nd	t	          j        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        nddt          j        ¦   «         v st	          j        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        t	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}�ŒüdS )z>Verifies 2:1 isometric coordinate math round-trip consistency.)g      P@g      @@)g      Ž@g     à€@)g      @rU   )rz   )g      )@gš™™™™™ À)g      Y@g     @o@g       @g�íµ ÷Æ°>)Úabs_tolzcassert %(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.isclose
}(%(py3)s, %(py4)s, abs_tol=%(py6)s)
}r[   Útest_wxÚcalc_wx)r   r   r   r   r   r   NÚtest_wyÚcalc_wy)	r[   rf   r!   r"   r   r#   r$   r%   r&   )r*   Útile_wÚtile_hÚcxÚcyÚcam_xÚcam_yr¤   r¦   Úrel_wxÚrel_wyÚsxÚsyÚdiff_sxÚdiff_syÚcalc_rel_wxÚcalc_rel_wyr¥   r§   r+   r/   Ú@py_assert7r2   s                          r3   Ú(test_isometric_math_roundtrip_invariancezBTestPcInputControllerUnit.test_isometric_math_roundtrip_invariance‡   sj  € à#‰ˆ�Ø‰ˆˆBØ ‰ˆˆuà Jð 	@ñ 	@ÑˆG�Wà˜u‘_ˆFØ˜u‘_ˆFØ˜6‘/ f¨s¡lÑ3°bÑ8ˆBØ˜6‘/ f¨s¡lÑ3°bÑ8ˆBð ˜2‘gˆGØ˜2‘gˆGØ" f¨s¡lÑ3°gÀÈ#ÁÑ6NÑNÐRUÑUˆKØ" f¨s¡lÑ3°gÀÈ#ÁÑ6NÑNÐRUÑUˆKØ! EÑ)ˆGØ! EÑ)ˆGå”<Ð?¸$Ð?�<�< ¨¸$Ð?Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?•4Ñ?Ô?Ð?Õ?Ô?•4Ñ?Ô?Ð?Ð?Õ?Ô?�<Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô? Ñ?Ô?Ð?Õ?Ô? Ñ?Ô?Ð?Ð?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?¨Ñ?Ô?Ð?Õ?Ô?¨Ñ?Ô?Ð?Ð?Õ?Ô?¸$Ñ?Ô?Õ?Ô?Ð?Ñ?Ô?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ý”<Ð?¸$Ð?�<�< ¨¸$Ð?Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?•4Ñ?Ô?Ð?Õ?Ô?•4Ñ?Ô?Ð?Ð?Õ?Ô?�<Ñ?Ô?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô? Ñ?Ô?Ð?Õ?Ô? Ñ?Ô?Ð?Ð?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?¨Ñ?Ô?Ð?Õ?Ô?¨Ñ?Ô?Ð?Ð?Õ?Ô?¸$Ñ?Ô?Õ?Ô?Ð?Ñ?Ô?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?Ñ?ð!	@ð 	@r5   N)r
   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r4   rD   rS   rr   rt   rx   r–   r™   r�   r¡   r·   © r5   r3   r	   r	      s  € € € € € ØPÐPðFð Fð Fð Fð&ð &ð &ð &ð%ð %ð %ð %ð Sð Sð Sð Sð"Xð Xð Xð Xð0ð 0ð 0ð 0ð
Að 
Að 
Að 
Að<ð <ð <ð <ð3ð 3ð 3ð 3ð.ð .ð .ð .ð@ð @ð @ð @ð @ð @r5   r	   )r»   Ú
__future__r   Úbuiltinsr!   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter   r[   ÚreÚsysÚpathlibr   ÚpytestÚ__file__ÚresolveÚparentÚPROJECT_ROOTr   r	   r¼   r5   r3   ú<module>rÊ      sõ   ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "Ø  € € € € € € € € € € € € €€€€Ø 	€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ð Ð Ø €€€àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5Ô<€Ø˜XÑ%¨Ñ0°4Ñ7Ð:RÑR€ðE@ð E@ð E@ð E@ð E@ñ E@ô E@ð E@ð E@ð E@r5   