U
    Pe.                     @   s   d Z ddlZddlZddlmZ ddlmZ ddlm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jZedkre  dS )z
Language tests
==============
    N)proxy)partial)dedentc                       s\   e Zd ZdZ fddZdd Zdd Zdd
dZdd Zdd Z	de
 dfddZ  ZS )	BaseClassr   c                    s\   t t|   t| | _g | _d | _i | _d | _i | _	g | _
i | _	tj| _t jd7  _d S )N   )superr   __init__r   Z	proxy_refchildrenparentbinded_funcididsclsuid)selfkwargs	__class__ 8/tmp/pip-unpacked-wheel-xzebddm3/kivy/tests/test_lang.pyr      s    
zBaseClass.__init__c                 C   s   | j | | |_d S N)r	   appendr
   )r   Zwidgetr   r   r   
add_widget   s    zBaseClass.add_widgetc                 O   s   d S r   r   )r   Z
event_typelargsr   r   r   r   dispatch"   s    zBaseClass.dispatchNTc                 C   s   d S r   r   )r   namevaluedefault_valuer   r   r   create_property%   s    zBaseClass.create_propertyc                 C   s
   | dS )NZon_)
startswith)r   keyr   r   r   is_event_type(   s    zBaseClass.is_event_typec                 G   s   t |f| | j|< dS )NT)r   r   )r   r   funcr   r   r   r   fbind+   s    zBaseClass.fbindc                 C   s   d S r   r   )r   rootZignored_constsZrule_childrenr   r   r   apply_class_lang_rules/   s    z BaseClass.apply_class_lang_rules)NT)__name__
__module____qualname__r   r   r   r   r   r!   r#   setr%   __classcell__r   r   r   r   r      s   
  r   c                   @   s   e Zd ZdZdS )
TLangClassNr&   r'   r(   objr   r   r   r   r+   4   s   r+   c                   @   s   e Zd ZdZdS )TLangClass2Nr,   r   r   r   r   r.   8   s   r.   c                   @   s   e Zd ZdZdS )TLangClass3Nr,   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	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!d" Zd#d$ Zd%d& Zd'd( Zd)S )*LangTestCasec                 C   sL   ddl m} ddlm} | }|jdtd |jdtd |jdtd |S )Nr   Factory)BuilderBaser+   )r   r.   r/   )kivy.factoryr2   	kivy.langr3   registerr+   r.   r/   )r   r2   r3   Builderr   r   r   import_builderB   s    zLangTestCase.import_builderc                 C   sJ   |   }ddlm} z|td | d W n |k
rD   Y nX d S )Nr   )ParserExceptionz1#:kivy 1.0
            <TLangClass>:
            zInvalid indentation.)r8   r5   r9   load_stringr   Zfail)r   r7   r9   r   r   r   test_loading_failed_1K   s    z"LangTestCase.test_loading_failed_1c                 C   s4   |   }|d t }|| | |jd d S )Nz <TLangClass>:
	obj: (.5, .5, .5)      ?r=   r=   r8   r:   r+   applyassertEqualr-   r   r7   Zwidr   r   r   test_parser_numeric_1W   s
    

z"LangTestCase.test_parser_numeric_1c                 C   s4   |   }|d t }|| | |jd d S )Nz#<TLangClass>:
	obj: (0.5, 0.5, 0.5)r<   r>   rA   r   r   r   test_parser_numeric_2^   s
    

z"LangTestCase.test_parser_numeric_2c                 C   sN   |   }|td t }|| | t|d | t|dd k	 d S )Nzw
        <TLangClass>:
            textinput: textinput
            TLangClass2:
                id: textinput
        	textinputr8   r:   r   r+   r?   
assertTruehasattrgetattrrA   r   r   r   test_referencese   s    
zLangTestCase.test_referencesc                 C   sN   |   }|td t }|| | t|d | t|dd k	 d S )Nz
        [Item@TLangClass3]:
            title: ctx.title
        <TLangClass>:
            textinput: textinput
            Item:
                title: 'bleh'
            TLangClass2:
                id: textinput
        rD   rE   rA   r   r   r   test_references_with_templates   s    

z*LangTestCase.test_references_with_templatec                 C   sN   |   }|td t }|| | t|d | t|dd k	 d S )Nz
        [Item@TLangClass3]:
            title: ctx.title
        <TLangClass>:
            textinput: textinput
            TLangClass2:
                id: textinput
                Item:
                    title: 'bleh'
        rD   rE   rA   r   r   r   $test_references_with_template_case_2   s    

z1LangTestCase.test_references_with_template_case_2c                 C   sN   |   }|td t }|| | t|d | t|dd k	 d S )Na.  
        [Item@TLangClass3]:
            title: ctx.title
        <TLangClass>:
            textinput: textinput
            TLangClass2:
                Item:
                    title: 'bleh'
                TLangClass2:
                    TLangClass2:
                        id: textinput
        rD   rE   rA   r   r   r   $test_references_with_template_case_3   s    
z1LangTestCase.test_references_with_template_case_3c                 C   sZ   |   }|td t }|| d|_| d|jk |jd   | |jd d S )Nz
        <TLangClass>:
            on_press:
                print('hello world')
                print('this is working !')
                self.a = 1
        r   on_pressr   	r8   r:   r   r+   r?   arF   r   r@   rA   r   r   r   test_with_multiline   s    
z LangTestCase.test_with_multilinec                 C   sZ   |   }|td t }|| d|_| d|jk |jd   | |jd d S )Nz
        <TLangClass>:
                on_press:
                        print('hello world')
                        print('this is working !')
                        self.a = 1
        r   rM   r   rN   rA   r   r   r   test_with_eight_spaces   s    
z#LangTestCase.test_with_eight_spacesc                 C   sZ   |   }|td t }|| d|_| d|jk |jd   | |jd d S )Nz
        <TLangClass>:
         on_press:
          print('hello world')
          print('this is working !')
          self.a = 1
        r   rM   r   rN   rA   r   r   r   test_with_one_space   s    
z LangTestCase.test_with_one_spacec                 C   sZ   |   }|td t }|| d|_| d|jk |jd   | |jd d S )Nz
        <TLangClass>:
          on_press:
            print('hello world')
            print('this is working !')
            self.a = 1
        r   rM   r   rN   rA   r   r   r   test_with_two_spaces   s    
z!LangTestCase.test_with_two_spacesc                 C   sb   |   }|td t }|| | d|jk | |jd |jd   | |jd d S )Nzj
        <TLangClass>:
            text : 'original'
            on_press : self.text = 'changed'
        rM   originalchanged)	r8   r:   r   r+   r?   rF   r   r@   textrA   r   r   r   test_property_trailingspace   s    
z(LangTestCase.test_property_trailingspacec                    s   ddl m} ddlm} ddlm} G dd dt G  fddd|}|td	 |d
ddd}| 	|j
d
 | 	|jd | 	|jd | 	|jd |jdd}| 	|j
d | 	|jd j
d d S )Nr   r1   r7   )Widgetc                   @   s   e Zd ZdZdS )z2LangTestCase.test_kv_python_init.<locals>.MyObject7   N)r&   r'   r(   r   r   r   r   r   MyObject  s   r[   c                       s   e Zd Z  ZdS )z2LangTestCase.test_kv_python_init.<locals>.MyWidgetN)r&   r'   r(   Zcheeser   r[   r   r   MyWidget  s   r]   z
        <MyWidget>:
            x: 55
            y: self.width + 10
            height: self.cheese.value
            width: 44

        <MySecondWidget@Widget>:
            x: 55
            Widget:
                x: 23
              i  )xheighty,   6   )r`      )r4   r2   r5   r7   Zkivy.uix.widgetrY   objectr:   r   r@   r`   widthrb   ra   ZMySecondWidgetr	   )r   r2   r7   rY   r]   wZw2r   r\   r   test_kv_python_init   s    z LangTestCase.test_kv_python_initc                 C   sL   |   }|d t }|| | |j ||d | |jd d S )Nz<TLangClassCustom>:
	obj: 42ZTLangClassCustom*   )r8   r:   r+   r?   ZassertIsNoner-   Zapply_rulesr@   rA   r   r   r   test_apply_rules"  s    

zLangTestCase.test_apply_rulesc                 C   s^   ddl m} ddlm} | \}}t|tdd ||}|j	dksPt
t| d S )Nr   )mkstemprX   u4   
        Label:
            text: 'é 😊'
        utf8u   é 😊)tempfilerl   r5   r7   oswriter   encodeZ	load_filerV   AssertionErrorclose)r   rl   r7   fdr   r$   r   r   r   test_load_utf8+  s    

zLangTestCase.test_load_utf8c                 C   s@   ddl m} |td}|jdks(td|_|jdks<td S )Nr   rX   zc
        <TestLabel@Label>:
            text: f'{self.pos}|{self.size}'
        TestLabel:
        z[0, 0]|[100, 100])      z[150, 200]|[100, 100])r5   r7   r:   r   rV   rr   pos)r   r7   labelr   r   r   test_bind_fstring7  s
    zLangTestCase.test_bind_fstringc                 C   sL   ddl m} |td}|jjjdks,td|jj_|jjjdksHtd S )Nr   rX   z
        FloatLayout:
            Label:
                id: original
                text: 'perfect'
            Label:
                id: duplicate
                text: f'{original.text}'
        Zperfectnew text)	r5   r7   r:   r   r   Z	duplicaterV   rr   rT   r   r7   r$   r   r   r   test_bind_fstring_referenceB  s
    	
z(LangTestCase.test_bind_fstring_referencec                 C   s   ddl m} |td}|jjjdks,t|jjjdks>t|jj	jdksPt|jj
jdksbt|jjjdkstt|jjjd	kstd
|jj_|jjjdkst|jjjdkst|jj	jdkst|jj
jdkst|jjjdkst|jjjdkstd S )Nr   rX   a  
        FloatLayout:
            Label:
                id: original
                text: 'perfect'
            Label:
                id: target1
                text: f"{' '.join(p.upper() for p in original.text)}"
            Label:
                id: target2
                text: f"{''.join(sorted({p.upper() for p in original.text}))}"
            Label:
                id: target3
                text: f"{'odd' if len(original.text) % 2 else 'even'}"
            Label:
                id: target4
                text: f"{original.text[len(original.text) // 2:]}"
            Label:
                id: target5
                text: f"{not len(original.text) % 2}"
            Label:
                id: target6
                text: f"{original.text}" + " some text"
        zP E R F E C TZCEFPRTZoddZfectFalsezperfect some textr{   zN E W   T E X Tz ENTWXZevenrV   Trueznew text some text)r5   r7   r:   r   r   target1rV   rr   target2target3Ztarget4Ztarget5Ztarget6rT   r|   r   r   r   test_bind_fstring_expressionsQ  s    
z*LangTestCase.test_bind_fstring_expressionsc                 C   s   ddl m} |td}|jjjdks,t|jjjdks>t|jj	jdksPtd|jj
_d|jj
_|jjjdksvt|jjjdkst|jj	jdkstd S )Nr   rX   a  
        FloatLayout:
            Label:
                id: original
                text: 'perfect'
            Label:
                id: target1
                text: f"{' '.join([original.text for _ in range(2)])}"
            Label:
                id: target2
                text: f"{original.text.upper()}"
            Label:
                id: target3
                text: f"{sum(obj.width for obj in root.children)}"
          Z400r{   )r5   r7   r:   r   r   r   rV   rr   r   r   rT   rg   r|   r   r   r   -test_bind_fstring_expressions_should_not_bindy  s    

z:LangTestCase.test_bind_fstring_expressions_should_not_bindN)r&   r'   r(   r8   r;   rB   rC   rI   rJ   rK   rL   rP   rQ   rR   rS   rW   ri   rk   ru   rz   r}   r   r   r   r   r   r   r0   @   s(   	"	(r0   __main__)__doc__Zunittestro   weakrefr   	functoolsr   textwrapr   rf   r   r+   r.   r/   ZTestCaser0   r&   mainr   r   r   r   <module>   s   '  V