
    BPc)@                     r   d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZmZmZ ddlmZmZ ddlmc mZ ddlmZ ddlmZ ddlmZ dd	lmZ d
dlmZ d
dl m!Z!m"Z" erd
dl#m$Z$  e%d          \  Z&Z'Z(Z) G d de          Z* G d de!e          Z G d d          Z+ G d d          Z,dS )z3
Testing module. See :ref:`unittests` for details.
    N)ListUnionTupleTypeTYPE_CHECKING)BytesIOStringIO)TestCase)InkscapeExtension   )	Transform)to_bytes   )xmldiff)MockCommandMixinCapture)Compare   c                        e Zd ZdZd ZddZdS )NoExtensionz;Test case must specify 'self.effect_class' to assertEffect.c                 *    t          | j                  N)NotImplementedError__doc__)selfargskwargss      7/usr/share/inkscape/extensions/inkex/tester/__init__.py__init__zNoExtension.__init__6   s    !$,///    Nc                     dS )zFake runN )r   r   outputs      r   runzNoExtension.run9   s      r    )NN)__name__
__module____qualname__r   r   r$   r"   r    r   r   r   3   s=        EE0 0 0     r    r   c                   D    e Zd ZdZeZ ed           ZdZdZ	dZ
 fdZ fdZ fdZed             Zed	             Zed
             Zed             Zed             Z	 ddZeddd            Zed             Z	 ddZd Zd Zd dZd!dZed             Z xZS )"r
   zi
    Base class for all effects tests, provides access to data_files and
    test_without_parameters
    c                     | j         j        S r   )effect_classr&   r   s    r   <lambda>zTestCase.<lambda>D   s    (9(D r    FTc                 V     t                      j        |i | d | _        d | _        d S r   )superr   	_temp_dir_effect)r   r   kw	__class__s      r   r   zTestCase.__init__M   s1    $%"%%%r    c                 ~    d| _         t                                                       t          j        d           dS )z+Make sure every test is seeded the same wayNi_  )r0   r.   setUprandomseedr   r2   s    r   r4   zTestCase.setUpR   s1    Er    c                     t                                                       | j        r?t          j                            | j                  rt          j        | j                   d S d S d S r   )r.   tearDownr/   ospathisdirshutilrmtreer7   s    r   r9   zTestCase.tearDownX   sf    > 	*bgmmDN;; 	*M$.)))))	* 	* 	* 	*r    c                 t    t           j                            t          j        | j                 j                  S )zBCreate a __file__ property which acts much like the module version)r:   r;   abspathsysmodulesr&   __file__clss    r   rC   zTestCase.__file__]   s$     ws{3>:CDDDr    c                 d    t           j                            |                                           S )z=Get's the folder where the test exists (so data can be found))r:   r;   dirnamerC   rD   s    r   _testdirzTestCase._testdirb         ws||~~...r    c                 d    t           j                            |                                           S )z0Return the full path to the extensions directory)r:   r;   rG   rH   rD   s    r   rootdirzTestCase.rootdirg   rI   r    c                 f    t           j                            |                                 d          S )z5Get the data directory (can be over-ridden if needed)data)r:   r;   joinrH   rD   s    r   datadirzTestCase.datadirl   s"     w||CLLNNF333r    c                     | j         7t          j                            t	          j        d                    | _         t          j                            | j                   st          d          | j         S )z,Generate a temporary location to store filesNzinkex-tests-)prefixz(The temporary directory has disappeared!)r/   r:   r;   realpathtempfilemkdtempr<   IOErrorr+   s    r   tempdirzTestCase.tempdirq   sa     >!W--h.>n.U.U.UVVDNw}}T^,, 	FDEEE~r    file-{prefix}{name}{suffix}.tmpc                     |                     ||t          j                    j                  }t          j                            | j        |          S )z)Generate the filename of a temporary file)rQ   suffixname)formatuuiduuid4hexr:   r;   rN   rV   )r   rQ   templater[   filenames        r   	temp_filezTestCase.temp_filez   s<     ??&djllFV?WWw||DL(333r    check_existsc                .   t           j                            |          rt          j        j        |g|R  }n*t          j        j        |                                 |g|R  }t           j                            |          s|rt          d|           |S )zProvide a data file from a filename, can accept directories as arguments.

        .. versionchanged:: 1.2
            ``check_exists`` parameter addedzCan't find test data file: )r:   r;   isabsrN   rO   isfilerU   )rE   rb   re   parts	full_paths        r   	data_filezTestCase.data_file   s     7=="" 	FX6666II S[[]]HEuEEEIw~~i(( 	E\ 	EC	CCDDDr    c                 .    |                      dd          S )z!Returns a common minimal svg filesvgzdefault-inkscape-SVG.svg)rk   r+   s    r   	empty_svgzTestCase.empty_svg   s     ~~e%?@@@r        c                     |                      t          |          t          |          |           t          ||          D ]\  }}|                     ||||           dS )z
        Floating point results may vary with computer architecture; use
        assertAlmostEqual to allow a tolerance in the result.
        N)assertEquallenzipassertAlmostEqual)r   foundexpected	precisionmsgfonexps          r   assertAlmostTuplezTestCase.assertAlmostTuple   sl     	US]]C888E8,, 	= 	=HC""3Y<<<<	= 	=r    c                 $     | j         dd|i| dS )z+Assert calling effect without any argumentseffectNr"   )assertEffect)r   r~   r   s      r   assertEffectEmptyzTestCase.assertEffectEmpty   s&    222622222r    c                    |r | j         | }n| j        }|t          j        d<   |gt	          |                    dg                     z   }|d |                                D             z  } |                    d| j                              }| j        rSt          d          5 }|
                    |t                                 ||_        ddd           n# 1 swxY w Y   n t                      }t          d|                    d	| j                            5 }t          d|                    d
| j                            5 }|
                    ||           |                     d|                                d           |                     d|                                d           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ||_        t          j                            dd          rFt%          |dt'                                }	t'                      |_        |                     |	d           |S )zAssert an effect, capturing the output to stdout.

        filename should point to a starting svg document, default is empty_svg
        DOCUMENT_PATHr   c                 6    g | ]}d |d          d|d          S )z--r   =r   r"   ).0r1   s     r   
<listcomp>z)TestCase.assertEffect.<locals>.<listcomp>   s1    ???"%be%%be%%???r    r~   stderr)r#   Nstdoutstdout_protectstderr_protectrp   zExtra print statements detectedz Extra error or warnings detectedFAIL_ON_DEPRECATIONFwarned_aboutz#Deprecated API is still being used!)rk   rn   r:   environlistpopitemsr*   stderr_outputr   r$   r   test_outputgetr   r   rr   getvaluegetattrsetr   assertFalse)
r   rb   r   rk   r   r~   r   r#   r   warningss
             r   r   zTestCase.assertEffect   s   
  	'&1III&/
?#{T&**VR"8"8999??????8Hd&788::  	("" ,f

4		
222%+", , , , , , , , , , , , , , , YYF&**%5t7JKK  fjj)94;NOO  	JJtFJ333$$FOO--/P   $$FOO--/Q  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	               "(F:>>/77 	Nv~suu==H"%%%FX'LMMMsI   %+CC #C  *G
A*G 4G G	GG	GGGNc                 "   ||d}t          |t          t          f          rSt          |          t          |          k    sJ t	          ||          D ]\  }}|                     |||||           dS |                     |||||           dS )zBAsserts that two objects, possible nested lists, are almost equal.N   )
isinstancer   tuplers   rt   assertDeepAlmostEqualru   )r   firstsecondplacesry   deltafss           r   r   zTestCase.assertDeepAlmostEqual   s    =V^FedE]++ 	Fu::V,,,,eV,, E EA**1aeDDDDE E ""5&&#uEEEEEr    r   c                     |                      t          t          |                                                    t          t          |                                                    |           dS )zAssert that two transform expressions evaluate to the same
        transformation matrix.

        .. versionadded:: 1.1
        N)r|   r   r   to_hexad)r   lhsrhsr   s       r   assertTransformEqualzTestCase.assertTransformEqual   sb     	)C..))++,,eIcNN4K4K4M4M.N.NPV	
 	
 	
 	
 	
r    c                 P    | j         |                                 | _         | j         S )zGenerate an effect object)r0   r*   r+   s    r   r~   zTestCase.effect   s'     <,,..DL|r    )rW   rX   rY   )ro   rp   )NNN)r   )r%   r&   r'   r   r   r*   propertyeffect_namer   r   r   r   r4   r9   classmethodrC   rH   rK   rO   rV   rc   rk   rn   r|   r   r   r   r   r~   __classcell__r2   s   @r   r
   r
   =   s	        
 L(DDEEK
 MNN    
    * * * * *
 E E [E / / [/ / / [/ 4 4 [4   X IO4 4 4 4 6:     [  A A XA
 13	= 	= 	= 	=3 3 3+ + +\	F 	F 	F 	F
 
 
 
   X    r    r
   c                   (     e Zd ZdZ fdZd Z xZS )InkscapeExtensionTestMixinzHAutomatically setup self.effect for each test and test with an empty svgc                     t                                                       | j        |                     d           dS dS )zECheck if there is an effect_class set and create self.effect if it isNz3self.effect_class is not defined for this this test)r.   r4   r*   skipTestr7   s    r   r4   z InkscapeExtensionTestMixin.setUp   s>    $MMOPPPPP %$r    c                 F    | j                             | j        g           dS )z#Extension works with empty svg fileN)r~   r$   rn   r+   s    r   test_default_settingsz0InkscapeExtensionTestMixin.test_default_settings   s!    ()))))r    )r%   r&   r'   r   r4   r   r   r   s   @r   r   r      sR        RRQ Q Q Q Q* * * * * * *r    r   c                       e Zd ZU dZdZeee         ee         ef         e	d<   	 g Z
	 dZ	 ddgZ	 dZed             Zd	 ZddZ	 ddZd ZddZddZd
S )ComparisonMixinz:
    Add comparison tests to any existing test suite.
    zsvg/shapes.svgcompare_fileFr"   )z--id=p1z--id=r3rm   c                 "    | j         rdS | j        S )zWThe default extension to use when outputting check files in COMPARE_CHECK
        mode.txt)r   compare_file_extensionr+   s    r   _compare_file_extensionz'ComparisonMixin._compare_file_extension  s      	5**r    c                     t          | j        t          t          f          s|                     | j                   dS | j        D ]6}|                     |t
          j                            |                     7dS )zTesting all comparisons)addoutN)r   r   r   r   _test_comparisonsr:   r;   basename)r   r   s     r   test_all_comparisonsz$ComparisonMixin.test_all_comparisons   s    $+dE];; 	""4#455555 $ 1  && )9)9,)G)G '     r    Nc                 p    | j         D ]-}|                     ||                     ||          |           .d S r   )comparisonsassertCompareget_compare_cmpfile)r   r   r   r   s       r   r   z!ComparisonMixin._test_comparisons*  sT    $ 	 	D((v66   	 	r    c                    t          t          j                            dt                              }|                     ||          }||                     |          }t          j                            |          s|t          k    rt          d| d          |rt          j        
                    |          s%t          j                            | j        |          }|                     t          j                            |          d|            t          |d          5 }|                                }ddd           n# 1 swxY w Y   n|j                                        }d}	|t$          k    r.|                    d          r
|dd	         n|}
|
 d
| j         }	n7|t*          k    rt          j                            |          r|t,          k    r|}		 |	r1t          j                            |          st/          d|	           t          |d          5 }|                     |                                d          }ddd           n# 1 swxY w Y   |                     |||           dS # t.          $ r |	rt5          |t6                    r|                    d          }t          |	d          5 }|                    |                     |d                     t=          d|	            ddd           n# 1 swxY w Y   |	|k    r3|                     ||          }|                     ||t$                     |	|k    s Y dS w xY w)a  
        Compare the output of a previous run against this one.

        Args:
            infile: The filename of the pre-processed svg (or other type of file)
            cmpfile: The filename of the data we expect to get, if not set
                the filename will be generated from the effect name and kwargs.
            args: All the arguments to be passed to the effect run
            outfile: Optional, instead of returning a regular output, this extension
                dumps it's output to this filename instead.

        EXPORT_COMPARE)r   NzComparison file z. not found, set EXPORT_COMPARE=1 to create it.zNo output file created! rb.out.zCheck the output: Fzutf-8wbTzWritten output: )intr:   r   r   COMPARE_DELETEr   r   r;   rh   rU   rg   rN   rV   
assertTrueopenreadr   r   COMPARE_CHECKendswithr   COMPARE_WRITECOMPARE_OVERWRITEAssertionError_apply_compare_filters_base_comparer   strencodewriteprint)r   infilecmpfiler   outfilecompare_moder~   fhldata_awrite_output_filedata_bs               r   r   zComparisonMixin.assertCompare2  s&    2:>>*:NKKLL""6"55?..t44Gw~~g&& 	<>+I+I7     
  		37==)) >',,t|W==OOw'')MG)M)M   gt$$ $$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ '0022F=(($+$4$4V$<$<IGCRCLL'E#DDd&BDDLLM))"'..2I2I)..."L	 JBGNN7$;$; J$%H,%H%HIIIgt$$ H44SXXZZGGH H H H H H H H H H H H H H Hvv|<<<<< 	 	 	 Gfc** 4#]]733F,-- =IId99&$GGHHH;\;;<<<= = = = = = = = = = = = = = =  7**!..vD.AAF&&vwFFF7** +**	so   *EEE#AI? &)II? II? "I#I? ?AM<LML	ML	AMMc           	         |                      |          }t          |t                    rt          |t                    r|                    d          r|                    d          rt	          ||          \  }}|s|t
          k    rt          d           d}t          j        	                    dd          rd|z   }n_t          |          D ]O\  }\  }}		 |                     ||	            # t          $ r#}
|d| dt          |
           d	z  }Y d }
~
Hd }
~
ww xY w|                     ||           d S |                     ||           d S )
N   <zThe XML is different, you can save the output using the EXPORT_COMPARE envionment variable. Set it to 1 to save a file you can check, set it to 3 to overwrite this comparison, setting the new data as the correct one.
zSVG Differences

XML_DIFFFz<-  z. 
)r   r   bytes
startswithr   r   r   r:   r   r   	enumeraterr   r   r   r   )r   r   r   r   diff_xmlr   diffxvalue_avalue_berrs              r   r   zComparisonMixin._base_comparey  s   ,,V44 vu%%	-65))	- !!$''	- !!$''		- &ff55OHe \^;;9   )Dz~~j%00 6x'-6u-=-= 6 6)A)6(('::::) 6 6 6 5A 5 5S 5 5 556OOE4((((( VV,,,,,s   C11
D;DDc                 d    t          |          }|| j        u s|| j        D ]} ||          }|S r   )r   compare_filter_savecompare_filters)r   rM   	is_savingcfilters       r   r   z&ComparisonMixin._apply_compare_filters  sH    ~~ 000I4E/ % %wt}}r    c                    | t          |          t          |          gz   }d                    |                              | j        d                              |                                 d          }t          j        dd|          }|rQt          |          dk    r9t          j
        |                    d                                                    }d|z   }|                     d| j         | d	d
          S )z/Generate an output file for the arguments givenN__TMP_DIRDAT_DIRz[^\w-]   latin1refsr   Frd   )r   r   rN   replacerV   rO   resubrs   hashlibmd5r   	hexdigestrk   r   )r   r   r   opstrs       r   r   z#ComparisonMixin.get_compare_cmpfile  s    ::V-DIIdOOWT\9--WT\\^^Y// 	
 y$.. 	!5zzCELL$:$:;;EEGG5LE~~t'44445  
 
 	
r    r   )r%   r&   r'   r   r   r   r   r   r   __annotations__r   r   r   r   r   r   r   r   r   r   r   r   r"   r    r   r   r     s
          7GL%S	5:s23FFF<OS8 	K T"+ + X+      .2E E E EN- - -B   
 
 
 
 
 
r    r   )-r   r:   r   rA   r=   rS   r  r5   r^   typingr   r   r   r   r   ior   r	   xml.etree.ElementTreeetreeElementTreexmlunittestr
   BaseCase
inkex.baser   rp   r   utilsr   r   mockr   r   filtersr   ranger   r   r   r   r   r   r   r"   r    r   <module>r     s  (  
			 				 



      : : : : : : : : : : : : : :                 # # # # # # # # # ) ) ) ) ) ) ( ( ( ( ( (                   + + + + + + + + !      BG%(( ?}.?    #   s s s s s s s sl* * * * * * * *t
 t
 t
 t
 t
 t
 t
 t
 t
 t
r    