
    Q?hw4                         S SK r S\ l        C SrSrS SKrS SKrS SKrS SKrS SKrS SK	J
r
  S SKrS SKJrJrJrJr  S rSrS	 rS
 rSqSqSqS r\R2                  R5                  SS5      S:w  a  SOS4rS rS rS)S jrSS.S jrS*S jr  " S S\
5      r! " S S5      r" " S S\"5      r# " S S\"5      r$ " S S\RJ                  5      r& " S S \RJ                  5      r' " S! S"\RJ                  5      r(S+S# jr)S$ r*S% r+S,S& jr,S,S' jr-S,S( jr.g)-    NTz4.0.1a  Provides support for the test suite.

The test suite as a whole, and individual tests, need to share
certain support functions.  We have to put these in here so they
can always be imported, and so that individual tests need to import
nothing more than "reportlab.whatever..."
)ConfigParser)isCompactDistro__rl_loader__rl_isdir	asUnicodec                  :    SSK Jn Jn   U " 5       $ ! U a     gf = f)Nr   _getPMBackendRenderPMErrorF)reportlab.graphics.renderPMr
   r   r	   s     I/var/www/html/env/lib/python3.13/site-packages/reportlab/lib/testutils.pyhaveRenderPMr      s$    H s    )
DejaVuSanszDejaVuSans-BoldzDejaVuSans-ObliquezDejaVuSans-BoldObliquec                  R    SSK Jn   [         H  n U " XS-   5        M     g!      g= f)Nr   )TTFontz.ttfFT)reportlab.pdfbase.ttfontsr   
DEJAVUSANS)r   xs     r   
haveDejaVur      s/    0	1vX 
 	s   !&c                      Sn[        US5      nUR                  S5        UR                  5         [        R                  R                  U5      (       a  [        R                  " U5        gg !    g= f)Nz00DELETE.MEwz$test of writability - can be deleted   r   )openwritecloseospathisfileremove)Dfnfs      r   
isWritabler#   &   s]    	SM	67		77>>"IIbM s   A)A- -A1c                    [         (       a  [         $ [        R                   Vs/ s H  oR                  S5      (       d  M  USS PM!     nnU(       d*  [        R
                  R                  SS5      nU(       a  U/nU(       a_  US   q  [        R                  " [         5        U H8  nU[        R                  ;   d  M  [        R                  R                  U5        M:     O[U S:X  d   S5       e[        R                  R                  [        R                  S	   5      nU(       d  [        R                  " 5       nUq [        [         5      (       d  [        S
5      q S	SKnUR                  S	   q[        R                  R#                  [         5      (       d@  [        R                  R%                  [        R                  R'                  [         5      5      q[        R                  R                  [         5      n[        R                  R)                  US5      q[        R                  R-                  [*        5      (       d=  [        R                  R)                  [        R                  R                  U5      S5      q[        R                  R-                  [*        5      (       dt  U S:X  al  [        R                  R                  [        R                  S	   5      nU(       d  [        R                  " 5       n[        R                  R'                  U5      qOSq[*        (       aA  [        R                  R/                  S	[        R                  R                  [*        5      5        [         $ s  snf !    GN= f)zIs it a writable file system distro being invoked within
test directory?  If so, can write test output here.  If not,
it had better go in a temp directory.  Only do this once per
processz	--outdir=	   NRL_TEST_OUTDIR __main__z2setOutDir should only be called in the main scriptr   reportlab_testtests)_OUTDIRsysargv
startswithr   environgetmakedirsr   r   dirnamegetcwdr#   get_rl_tempdir	reportlab__path__RL_HOMEisabsnormpathabspathjointestsFolderisdirinsert)namedr    	scriptDirr6   topDirs         r   	setOutDirrD   5   s%    ww>1LL$=12A>JJNN+B/aB%	KK  ACHH}"  ZT TT''//#((1+.	BIIK)g !12q!G77==!!277+;+;BGGOOG<T+U7WW__W%F'',,vg.K77==%%ggll277??6#:7C77==%%ggoochhqk2I		i''//)4KK{"''//+67NM 	?	s   M.	M.
M3 3M8OFFLINE_MOCK1z,http://www.reportlab.com/rsrc/encryption.gifc                 :   U [         ;   ae  [        [        R                  R	                  [
        [        R                  R                  U 5      5      S5       nUR                  5       sS S S 5        $ SSKJ	n  U" U 5      R                  5       $ ! , (       d  f       g = f)Nrbr   )urlopen)
	_mockumapr   r   r   r<   r=   basenamereadurllib.requestrI   )r@   r"   rI   s      r   mockUrlReadrN   h   sh    y"'',,{277+;+;D+AB4HA668 IH 	+t}!!##	 IHs   B
Bc                 p    [        [        5      nU (       a  [        R                  R	                  X5      nU$ )zThis works out where to write test output.  If running
code in a locked down file system, this will be a
temp directory; otherwise, the output of 'test_foo.py' will
normally be a file called 'test_foo.pdf', next door.
)rD   __name__r   r   r<   )r!   r    s     r   
outputfilerQ   p   s'     	(A	rww||A!1H    c                     [         R                  " U 5      R                  R                  S5      S:X  a%  [	        S5      nU[
        :w  a  [        SU-  5        g g g )NrP   r)   r'   z,Logs and output files written to folder "%s")r-   	_getframef_localsr1   rQ   r,   print)depthoutDirs     r   printLocationrY   z   sM    
}}U$$((4j@B7?@6IJ  ArR   )testMethodPrefixc                     [         R                  " 5       n[         R                  " 5       nU (       a  Xl        U H#  nUR	                  UR                  U5      5        M%     U$ )z<Return a test suite with tests loaded from provided classes.)unittest	TestSuite
TestLoaderrZ   addTestloadTestsFromTestCase)rZ   classessuiteloaderCs        r   makeSuiteForClassesre      sO      E  "F"2f22156 LrR   c                 h   [         R                  R                  n [        U" U SS5      5      n/ nUR                  5        H[  nU(       a	  US   S:X  d  U(       d  M  US   S:w  d  M'  UR                  S5      S   nU(       d  MD  UR                  U" X5      5        M]     U$ ! [         a    / s $ f = f)a3  Returns a list of filenames as listed in the CVS/Entries file.

'folder' is the folder that should contain the CVS subfolder.
If there is no such subfolder an empty list is returned.
'files' is a boolean; 1 and 0 means to return files or not.
'folders' is a boolean; 1 and 0 means to return folders or not.
CVSEntriesr   r    /r   )r   r   r<   r   IOError	readlinessplitappend)folderfilesfoldersr<   r"   
allEntrieslineentrys           r   getCVSEntriesrt      s     77<<DfeY/0
 JtAw#~eQ3JJsOA&Eu!!$v"56    	s   B" "B10B1c                   B    \ rS rSrSr\R                  " S5      rS rSr	g)ExtConfigParser   z7A slightly extended version to return lists of strings.z\s*\[.*\]\s*c                     [         R                  " XU5      nUR                  SS5      nU R                  R	                  U5      (       a  [        U[        S05      $ U$ )zECoerce option to a list of strings or return unchanged if that fails.
r'   N)r   r1   replacepatmatcheval__builtins__)selfsectionoptionvaluevals        r   getstringlistExtConfigParser.getstringlist   sR       7 mmD"%88>>#\$/00LrR    N)
rP   
__module____qualname____firstlineno____doc__recompiler{   r   __static_attributes__r   rR   r   rv   rv      s    =
**_
%CrR   rv   c                   .    \ rS rSrSrSS jrS rS rSrg)	GlobDirectoryWalker   z<A forward iterator that traverses files in a directory tree.c                    SU l         X l        UR                  S[        R                  5        [        R
                  R                  U5      (       a  U/U l        / U l        g [        5       (       a  [        (       a  [        U5      (       d  [        SU-  5      eU[        [        R                  5      [        [        R                  5      -   S  U l        U R                  [        R                  -   n[        U5      n[!        [#        U4S j[!        [%        U4S j[!        [        R&                  R)                  5       5      5      5      5      5      U l        U R                  R+                  5         / U l        g )Nr   ri   z"%s" is not a directoryc                 
    XS  $ Nr   )r   ns     r   <lambda>.GlobDirectoryWalker.__init__.<locals>.<lambda>   s    2rR   c                 $    U R                  U5      $ r   )r/   )r   pfxs     r   r   r      s    UVUaUabeUfrR   )indexpatternrz   r   sepr   r>   stackro   r   r   r   
ValueErrorlenarchive	directorylistmapfilter_fileskeyssort)r   r   r   r   r   s        r   __init__GlobDirectoryWalker.__init__   s$   
#bff%77==###DJDJ"$$MM)ATAT !:Y!FGG&s=+@+@'A#bff+'M'NODN..'CCAca"6tFPSCfgkly  mA  mA  mF  mF  mH  hI  =J  8K  L  MDJJJOODJrR   c                      U R                   U R                     nU R                  S-   U l        [        R                  R	                  U R
                  U5      n[        R                  R                  U5      (       a?  [        R                  R                  U5      (       d  U R                  R                  U5        [        R                  " X R                  5      (       a  U$  M  ! [         ay    U R                  R                  5       U l        [        R                  " U R
                  5      U l         U R                  U R
                  U R                   5      U l         SU l         Nf = f)Nr   r   )ro   r   r   r   r<   r   r>   islinkr   rm   fnmatchr   
IndexErrorpoplistdirfilterFiles)r   r   filefullnames       r   __getitem__GlobDirectoryWalker.__getitem__   s    $zz$**-!ZZ!^
 77<<=77==**277>>(3K3KJJ%%h/??466#O 7!   !%!1ZZ7
!--dnndjjI

s   -C' 'B E*)E*c                     U$ )z/Filter hook, overwrite in subclasses as needed.r   )r   rn   ro   s      r   r   GlobDirectoryWalker.filterFiles   s	     rR   )r   ro   r   r   r   N)*)	rP   r   r   r   r   r   r   r   r   r   rR   r   r   r      s    B"$(rR   r   c                   (    \ rS rSrSrSS jrS rSrg)RestrictedGlobDirectoryWalker   z&An restricted directory tree iterator.Nc                    [         R                  XU5        US :X  a  / n/ R                  n[        U[        [
        45      (       a  U H  nU" U5        M     O[        U[        5      (       a  U" U5        [        R                  S:w  a@  UR                   Vs/ s H"  ofR                  S[        R                  5      PM$     snU l        g UR                  U l        g s  snf )Nri   )r   r   rm   
isinstancetupler   strr   r   __self__rz   ignorePatterns)r   r   r   ignoreipp_s          r   r   &RestrictedGlobDirectoryWalker.__init__   s    $$Tg>T>FYYfeD\**1 s##vJOQvvY\}r{{K{!		#bff 5{K%'[[ 	Ks   )Cc                 D   [         R                   n/ n[        U5       Hc  u  pVU R                   HN  nU" Xg5      (       d-  U" [        R                  R                  X5      U5      (       d  M=  UR                  U5        MP     Me     UR                  5         U H  nX%	 M     U$ )z9Filters all items from files matching patterns to ignore.)r   	enumerater   r   r   r<   rm   reverse)r   rn   ro   fnmindicesToDeleteir"   r   s           r   r   )RestrictedGlobDirectoryWalker.filterFiles   s     ooU#CA((q99BGGLL$:1 = =#**1- ) $ 	! A ! rR   )r   )r   N)rP   r   r   r   r   r   r   r   r   rR   r   r   r      s    ,2rR   r   c                       \ rS rSrSrS rSrg)CVSGlobDirectoryWalkeri  z4An directory tree iterator that checks for CVS data.c                    [         R                  R                  n[        U5      nU(       a[  / n[	        [        U5      5       H&  nX&   nU" X5      U;  d  M  UR                  U5        M(     UR                  5         U H  nX&	 M     U$ )zFilters files not listed in CVS subfolder.

This will look in the CVS subfolder of 'folder' for
a file named 'Entries' and filter all elements from
the 'files' list that are not listed in 'Entries'.
)r   r   r<   rt   ranger   rm   r   )r   rn   ro   r<   cvsFilesr   r   r"   s           r   r   "CVSGlobDirectoryWalker.filterFiles  s{     ww|| ( O3u:&H?(2#**1- ' ##%$H % rR   r   N)rP   r   r   r   r   r   r   r   rR   r   r   r     s
    :rR   r   c                   $    \ rS rSrSrS rS rSrg)SecureTestCasei+  a  Secure testing base class with additional pre- and postconditions.

We try to ensure that each test leaves the environment it has
found unchanged after the test is performed, successful or not.

Currently we restore sys.path and the working directory, but more
of this could be added easily, like removing temporary files or
similar things.

Use this as a base class replacing unittest.TestCase and call
these methods in subclassed versions before doing your own
business!
c                 h    [         R                  SS U l        [        R                  " 5       U l        g)z0Remember sys.path and current working directory.N)r-   r   _initialPathr   r4   _initialWorkDirr   s    r   setUpSecureTestCase.setUp:  s     HHQK!yy{rR   c                 n    U R                   [        l        [        R                  " U R
                  5        g)z0Restore previous sys.path and working directory.N)r   r-   r   r   chdirr   r   s    r   tearDownSecureTestCase.tearDown?  s!    $$
%%&rR   )r   r   N)rP   r   r   r   r   r   r   r   r   rR   r   r   r   +  s    +
'rR   r   c                   .    \ rS rSrSS jr\" \5      rSrg)NearTestCaseiD  c                     [        U [        [        45      (       a$  [        X-
  5      U:  a  [	        U < SU< 35      eg [        X5       H(  u  p4[        X4-
  5      U:  d  M  [	        U < SU< 35      e   g )Nz
 not near )r   floatintabsAssertionErrorzip)abaccuracyaebes        r   
assertNearNearTestCase.assertNearE  sf    as$$13x $A%>?? ! Qru:h&(Q)BCC "rR   r   N)gh㈵>)rP   r   r   r   r   staticmethodr   r   rR   r   r   r   D  s    D j)JrR   r   c                   4    \ rS rSrSrS	S jrS rS rS rSr	g)
ScriptThatMakesFileTestiO  zuRuns a Python script at OS level, expecting it to produce a file.

It CDs to the working directory to run the script.c                 r    Xl         X l        X0l        X@l        [        R
                  R                  U 5        g r   )rB   
scriptNameoutFileNameverboser\   TestCaser   )r   rB   r   r   r   s        r   r    ScriptThatMakesFileTest.__init__S  s+    "$&""4(rR   c                 .   [         R                  " 5       U l        U R                  n[         R                  R                  U5      (       d$  [         R                  R                  [        U5      n[         R                  " U5        [         R                  R                  U R                  5      (       d   SU R                  -  5       e[         R                  R                  U R                  5      (       a!  [         R                  " U R                  5        g g )NzScript %s not found!)r   r4   cwdrB   r   r9   r<   r=   r   r   r   r   r   )r   rB   s     r   r   ScriptThatMakesFileTest.setUp[  s    99;..	ww}}Y''ggll;y9I
ww~~doo..X0F0XX.77>>$**++IId&&' ,rR   c                 D    [         R                  " U R                  5        g r   )r   r   r   r   s    r   r    ScriptThatMakesFileTest.tearDowng  s    
rR   c                 h   [         R                  S:H  =(       a    S=(       d    SnSS KnUR                  [         R                  U R
                  45      nU R                  (       a  [        U5        [        R                  R                  U R                  5      (       d   SU R                  -  5       eg )Nwin32z"%s" %sz%s %sr   zFile %s not created!)r-   platform
subprocesscheck_output
executabler   r   rV   r   r   r   r   )r   fmtr   outs       r   runTestScriptThatMakesFileTest.runTestj  sz    llG#1	<W%%s~~doo&FG <<#Jww~~d..//Z1G$JZJZ1ZZ/rR   )r   r   rB   r   r   N)r   )
rP   r   r   r   r   r   r   r   r  r   r   rR   r   r   r   O  s    :)
(	[rR   r   c                 h    [        U 5      [        U5      :X  a  X:H  $ [        X5      [        X5      :H  $ r   )typer   )r   r   encs      r   equalStringsr  u  s-    7DG#14K1)99Q;K)KKrR   c                 Z    X:w  a&  [        S[        U5      < S[        U 5      < 35        g g )NzStrings unequal
exp: z
got: )rV   ascii)rr   s     r   eqCheckr  x  s!    tU1XeAhGH rR   c                       SS K n g!    g= f)Nr   FTrlextrar  s    r   rlextraNeededr  |  s    s    c                    ^ ^^ UU U4S jnU$ )Nc                 N   >^  [         R                  " T 5      UUU U4S j5       nU$ )Nc                    > T(       aU  [         R                  R                  SS5      S:X  a1  [        STR                  =(       d    T STR
                   ST 35        [        R                  " TT5      " T5      " U 0 UD6$ )NRL_indicateSkips0rF   z

skipping . )r   r0   r1   rV   r   rP   r\   skipIf)argskwdsr   condfuncreasons     r   wrapper(rlSkipIf.<locals>.inner.<locals>.wrapper  sp    

'9#>C 

//
'Z	($--&E F??4/5tCdCCrR   )	functoolswraps)r  r  r   r  r  s   ` r   innerrlSkipIf.<locals>.inner  s'    			D 
	D
 rR   r   )r  r  r   r"  s   ``` r   rlSkipIfr$    s     LrR   c                      [        U (       + XS9$ )Nr   r$  )r  r  r   s      r   rlSkipUnlessr(    s    HV::rR   c                     [        SXS9$ )NTr&  r'  )r  r   s     r   rlSkipr*    s    D66rR   )r   )r   r   )utf8r   )/r6   _rl_testing__version__r   r-   r   r   r   r   configparserr   r\   reportlab.lib.utilsr   r   r   r   r   r   r   r#   r,   r8   r=   rD   r0   r1   rJ   rN   rQ   rY   re   rt   rv   r   r   r   r   r   r   r   r  r  r  r$  r(  r*  r   rR   r   <module>r0     s5   	 	 ' & & %  S S \

 
-` 

~c2C7>
	$K 37 	<l .+ +\$7 B0 8'X&& '2	*8$$ 	*$[h// $[LLI	;7rR   