a
    V$ct3                     @   s  d dl mZmZmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlZd dlmZmZ G dd dejjZe ZG dd deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZ G dd deZ!G dd deZ"G dd deZ#G dd deZ$G dd deZ%G dd deZ&G dd  d eZ'G d!d" d"eZ(G d#d$ d$eZ)G d%d& d&eZ*G d'd( d(eZ+dS ))    )divisionabsolute_importwith_statementprint_functionunicode_literals)PY2
basestringbchrbordchropenpystrrangeroundstrtobytesunicodeN)click_mouse
move_mousec                   @   s   e Zd Zdd ZdS )TestSettingsc                 C   s   d| _ d| _d| _d| _d S )NTg      @F)maximum_frameratetimeoutforcetransition_timeoutself r   renpy/test\testast.py__init__   s    zTestSettings.__init__N)__name__
__module____qualname__r   r   r   r   r   r      s   r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )Nodez(
    An AST node for a test script.
    c                 C   s   |\| _ | _d S N)filename
linenumber)r   locr   r   r   r   5   s    zNode.__init__c                 C   s   dS )z
        Called once when the node starts execution.

        This is expected to return a state, or None to advance to the next
        node.
        Nr   r   r   r   r   start8   s    z
Node.startc                 C   s   |S )z
        Called once each time the screen is drawn.

        `state`
            The last state that was returned from this node.

        `t`
            The time since start was called.
        r   r   statetr   r   r   execute@   s    zNode.executec                 C   s   dS )zT
        Returns True if this node is ready to execute, or False otherwise.
        Tr   r   r   r   r   readyM   s    z
Node.readyc                 C   s   | j | jftjj_dS )z
        Reports the location of this statement. This should only be called
        in the execute method of leaf nodes of the test tree.
        N)r$   r%   renpytesttestexecutionnode_locr   r   r   r   reportT   s    zNode.reportN)	r   r    r!   __doc__r   r'   r+   r,   r1   r   r   r   r   r"   0   s   r"   c                   @   s>   e Zd ZdZdZdddZdd Zdd Zd	d
 Zdd Z	dS )PatternNFc                 C   s   t | | || _d S r#   r"   r   patternr   r&   r5   r   r   r   r   b   s    zPattern.__init__c                 C   s   dS NTr   r   r   r   r   r'   f   s    zPattern.startc                 C   s   |    tjjjr |tjk r |S | jd ur:tj	| j}nd}tj
j| j}|d u r`d\}}ntj
j||\}}|d u r| jr|S tj \}}| ||||S )N)NN)r1   r-   display	interfacetrans_pause_testr   positionpythonpy_evalr.   	testfocus
find_focusr5   find_positionexportsget_mouse_posperform)r   r)   r*   r<   fxyr   r   r   r+   i   s    

zPattern.executec                 C   s.   | j r
dS tjj| j}|d ur&dS dS d S NTF)alwaysr-   r.   r?   r@   r5   r   rE   r   r   r   r,      s    zPattern.readyc                 C   s   d S r#   r   r   rF   rG   r)   r*   r   r   r   rD      s    zPattern.perform)N)
r   r    r!   r<   rI   r   r'   r+   r,   rD   r   r   r   r   r3   ]   s   
r3   c                   @   s   e Zd ZdZdd ZdS )Click   c                 C   s   t | j|| d S r#   )r   buttonrK   r   r   r   rD      s    zClick.performN)r   r    r!   rN   rD   r   r   r   r   rL      s   rL   c                   @   s   e Zd Zdd ZdS )Movec                 C   s   t || d S r#   )r   rK   r   r   r   rD      s    
zMove.performN)r   r    r!   rD   r   r   r   r   rO      s   rO   c                   @   s.   e Zd Zd
ddZdd Zdd Zdd	 ZdS )ScrollNc                 C   s   t | | || _d S r#   r4   r6   r   r   r   r      s    zScroll.__init__c                 C   s   dS r7   r   r   r   r   r   r'      s    zScroll.startc                 C   s~   |    tjj| j}|d u r$dS t|jtjj	j
s:dS |jj}|j|jkrTd}n|j|j }||jkrp|j}|| d S )NTr   )r1   r-   r.   r?   r@   r5   
isinstancewidgetr8   behaviorBar
adjustmentvaluer   pagechange)r   r)   r*   rE   adjnewr   r   r   r+      s    

zScroll.executec                 C   s$   t jj| j}|d urdS dS d S rH   )r-   r.   r?   r@   r5   rJ   r   r   r   r,      s    zScroll.ready)Nr   r    r!   r   r'   r+   r,   r   r   r   r   rP      s   
rP   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Dragc                 C   s(   t | | || _d | _d| _d| _d S )NrM   
   )r"   r   pointsr5   rN   steps)r   r&   r^   r   r   r   r      s
    zDrag.__init__c                 C   s   dS r7   r   r   r   r   r   r'      s    z
Drag.startc              
      s~  |    tjjjr|S | jr:tjj| j  d u r>|S nd  |du r:tj	
| j} fdd|D }t|dk r|tdg }|d \}}|||f |dd  D ]b\}}td| jd D ]@}	d|	 | j }
|t||
||   t||
||   f q|}|}q|d\}}tjj|| tjj| j n"|}|d\}}tjj|| |svtjj| j d S |S d S )	NTc                    s   g | ]}t jj |qS r   )r-   r.   r?   rA   ).0irE   r   r   
<listcomp>       z Drag.execute.<locals>.<listcomp>   z$A drag requires at least two points.r   rM   g      ?)r1   r-   r8   r9   r:   r5   r.   r?   r@   r=   r>   r^   len	Exceptionappendr   r_   intpop	testmouser   press_mouserN   release_mouse)r   r)   r*   r^   interpointsxayaxbybra   donerF   rG   r   rb   r   r+      sF    

zDrag.executec                 C   s2   | j d u rdS tjj| j }|d ur*dS dS d S rH   )r5   r-   r.   r?   r@   rJ   r   r   r   r,     s    
z
Drag.readyNr[   r   r   r   r   r\      s   =r\   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Typeg{Gz?c                 C   s   t | | || _d S r#   )r3   r   keys)r   r&   ru   r   r   r   r   ,  s    zType.__init__c                 C   s   dS )Nr   r   r   r   r   r   r'   0  s    z
Type.startc                 C   sN   |t | jkrd S t|| | j| }tjj| | tjj| | |d S NrM   )rf   ru   r   r-   r.   testkeydownup)r   rF   rG   r)   r*   keysymr   r   r   rD   3  s    

zType.performN)r   r    r!   intervalr   r'   rD   r   r   r   r   rt   (  s   rt   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Actionc                 C   s   t | | || _d S r#   r"   r   exprr   r&   r~   r   r   r   r   C  s    zAction.__init__c                 C   s   t j| jt jj_dS r7   )r-   r=   r>   r~   r.   r/   actionr   r   r   r   r'   G  s    zAction.startc                 C   s   |    tjjjrdS d S d S r7   r1   r-   r.   r/   r   r(   r   r   r   r+   K  s    
zAction.executec                 C   s$   |    tj| j}tjj|S r#   )r1   r-   r=   r>   r~   r8   rS   is_sensitive)r   r   r   r   r   r,   T  s    zAction.readyNr[   r   r   r   r   r|   A  s   	r|   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Pausec                 C   s   t | | || _d S r#   r}   r   r   r   r   r   ^  s    zPause.__init__c                 C   s   t tj| jS r#   )floatr-   r=   r>   r~   r   r   r   r   r'   b  s    zPause.startc                 C   s   |    ||k r|S d S d S r#   )r1   r(   r   r   r   r+   e  s    zPause.executeNr   r    r!   r   r'   r+   r   r   r   r   r   \  s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Labelc                 C   s   t | | || _d S r#   )r"   r   name)r   r&   r   r   r   r   r   q  s    zLabel.__init__c                 C   s   dS r7   r   r   r   r   r   r'   u  s    zLabel.startc                 C   s   | j tjjjv rd S |S d S r#   r   r-   r.   r/   labelsr(   r   r   r   r+   x  s    zLabel.executec                 C   s   | j tjjjv S r#   r   r   r   r   r   r,   ~  s    zLabel.readyNr[   r   r   r   r   r   o  s   r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Untilzl
    Executes `left` repeatedly until `right` is ready, then executes `right`
    once before quitting.
    c                 C   s   t | | || _|| _d S r#   )r"   r   leftright)r   r&   r   r   r   r   r   r     s    zUntil.__init__c                 C   s   dS N)NNr   r   r   r   r   r   r'     s    zUntil.startc                 C   s   |\}}}| j  r*|| j ur*| j }d }n|d u r8| j}|d u rL| }|}|d urd|||| }|d u rz|| j u rzd S |||fS r#   )r   r,   r   r'   r+   )r   r)   r*   childchild_stater'   r   r   r   r+     s    
zUntil.executec                 C   s   | j  p| j S r#   )r   r,   r   r   r   r   r   r,     s    zUntil.readyN)r   r    r!   r2   r   r'   r+   r,   r   r   r   r   r     s
   r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	Ifz]
    If `condition` is ready, runs the block. Otherwise, goes to the next
    statement.
    c                 C   s   t | | || _|| _d S r#   )r"   r   	conditionblock)r   r&   r   r   r   r   r   r     s    zIf.__init__c                 C   s   dS r   r   r   r   r   r   r'     s    zIf.startc                 C   sV   |\}}}|d u r&| j  s d S | j}tjj||||\}}}|d u rLd S |||fS r#   )r   r,   r   r-   r.   r/   execute_noder   r)   r*   noder   r'   r   r   r   r+     s    

z
If.executeN)r   r    r!   r2   r   r'   r+   r   r   r   r   r     s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Pythonc                 C   s   t | | || _d S r#   )r"   r   code)r   r&   r   r   r   r   r     s    zPython.__init__c                 C   s   | t jj_dS r7   r-   r.   r/   r   r   r   r   r   r'     s    
zPython.startc                 C   s   |    tjjjrdS d S d S r7   r   r(   r   r   r   r+     s    
zPython.executec                 C   s   t j| jj d S r#   )r-   r=   py_exec_bytecoder   bytecoder   r   r   r   __call__  s    zPython.__call__Nr   r    r!   r   r'   r+   r   r   r   r   r   r     s   	r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Assertc                 C   s   t | | || _d S r#   r}   r   r   r   r   r     s    zAssert.__init__c                 C   s   | t jj_dS r7   r   r   r   r   r   r'     s    
zAssert.startc                 C   s   |    tjjjrdS d S d S r7   r   r(   r   r   r   r+     s    
zAssert.executec                 C   s*   t j| js&td| j| j| jd S )Nz#On line {}:{}, assertion {} failed.)r-   r=   r>   r~   rg   formatr$   r%   r   r   r   r   r     s    zAssert.__call__Nr   r   r   r   r   r     s   	r   c                   @   s   e Zd Zdd Zdd ZdS )Jumpc                 C   s   t | | || _d S r#   r"   r   targetr   r&   r   r   r   r   r     s    zJump.__init__c                 C   s$   t jj| j| }t jj|d S r#   )r-   r.   r/   lookupr   TestJumpr   r   r   r   r   r'     s    z
Jump.startN)r   r    r!   r   r'   r   r   r   r   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Callc                 C   s   t | | || _d S r#   r   r   r   r   r   r   
  s    zCall.__init__c                 C   s(   t d| j tjj| j| }|d dfS )Nz	Call testr   )printr   r-   r.   r/   r   r   r   r   r   r'     s    z
Call.startc                 C   s:   |\}}}t jj||||\}}}|d u r0d S |||fS r#   )r-   r.   r/   r   r   r   r   r   r+     s
    
zCall.executeNr   r   r   r   r   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Blockc                 C   s   t | | || _d S r#   )r"   r   r   )r   r&   r   r   r   r   r   $  s    zBlock.__init__c                 C   s   dS )N)r   NNr   r   r   r   r   r'   (  s    zBlock.startc                 C   sn   |\}}}|t | jkrd S |d u r6| j|  }|}|d urT| j| ||| }|d u rd|d7 }|||fS rv   )rf   r   r'   r+   )r   r)   r*   ra   r'   sr   r   r   r+   +  s    
zBlock.executeNr   r   r   r   r   r   "  s   r   ),
__future__r   r   r   r   r   renpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   r-   renpy.test.testmouser   r   objectObjectr   r;   r"   r3   rL   rO   rP   r\   rt   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s,   8-6
-W( 