3
y1W                 @   s  d Z ddlmZm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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mZ ddlmZ ddlmZmZmZmZ dd	l m!Z! dd
l"m#Z#m$Z$m%Z% ddl"m&Z& ddl"m'Z' ddl(m)Z) e	j* Z+ej,dd Z-dd Z.dd Z/dd Z0edd Z1edd Z2d6ddZ3edd Z4edd  Z5ed!d" Z6ed#d$ Z7d%d& Z8ed'd( Z9ed)d* Z:d7d+d,Z;ed-d. Z<ej=d/ ed0d1 Z>ed2d3 Z?ed4d5 Z@dS )8z
    weasyprint.tests.test_api
    -------------------------

    Test the public API.

    :copyright: Copyright 2011-2014 Simon Sapin and contributors, see AUTHORS.
    :license: BSD, see LICENSE for details.

    )divisionunicode_literalsN   )resource_filenameassert_no_logscapture_logsTestHTMLhttp_servertemp_directory)image_to_pixels   )urljoin	urlencodeurlparse_uses_relative	iteritems)path2url)HTMLCSSdefault_url_fetcher)__main__)	navigator)_TaggedTuplec             c   s>   t 0 tj }ztj|  dV  W dtj| X W dQ R X dS )z2Change the current directory in a context manager.N)
CHDIR_LOCKosgetcwdchdir)pathZold_dir r   Y/var/www/html/enquirykeeper_venv/lib/python3.6/site-packages/weasyprint/tests/test_api.pyr   ,   s    

r   c          	   C   s   t | d
}|j S Q R X dS )zShortcut for reading a file.rbN)openread)filenamefdr   r   r   	read_file8   s    r$   c          	   C   s$   t | d}|j| W dQ R X dS )zShortcut for reading a file.wbN)r    write)r"   contentr#   r   r   r   
write_file>   s    r(   c       
   .   K   s  t |}t|}|| |f| || f d|i| || f d|i| || |f| || f d|i| || f d|i| t|d}|| |f| W dQ R X t|d}|| f d|i| W dQ R X t|d}|| f d|i| W dQ R X t|d}|j }W dQ R X ttjjtj tjj	d|}|| |f| || f ||d| |j
d	pzd
}	|| f |j|	|d| W dQ R X tjt | ddd W dQ R X dS )z1Common code for testing the HTML and CSS classes.Zguessr"   urlr   Nfile_obj	resources)stringbase_urlencodingutf8ZfooZbar)r"   r)   )r   r   r    r!   r   r   r   dirname__file__joingetdecodepytestZraises	TypeError)
class_basenamecheckkwargsZabsolute_filenamer)   r#   r'   Zrelative_filenamer.   r   r   r   _test_resourceD   s2      r;   c              C   s   ddd} t td|  t td| dd ttjjt~ tjjdd}tj	j
|}| t||d	 | t|d
dd |j \}}|jdksttjj|ddd | t|dd	 W dQ R X dS )z(Test the constructor for the HTML class.Tc             S   s   | j jdkstdd | j D ddgks,t| j \}}dd |D ddd	d
gksTt|d }|jdksjt|rt| jd}|jdst|jdstn| jdkstdS )z@Check that a parsed HTML document looks like resources/doc1.htmlhtmlc             S   s   g | ]
}|j qS r   )tag).0childr   r   r   
<listcomp>g   s    z9test_html_parsing.<locals>.check_doc1.<locals>.<listcomp>headbodyc             S   s   g | ]
}|j qS r   )r=   )r>   r?   r   r   r   r@   i   s    h1pZulZdivr   u)   WeasyPrint test document (with Ünicōde)zpattern.pngzfile:z&weasyprint/tests/resources/pattern.pngN)root_elementr=   AssertionErrortextr   r-   
startswithendswith)r<   has_base_urlZ_headrB   rC   r)   r   r   r   
check_doc1d   s    
z%test_html_parsing.<locals>.check_doc1z	doc1.htmlzdoc1_UTF-16BE.htmlzUTF-16BE)r.   r+   )treer-   )rL   F)rJ   rA   basez
resources/)Zhref.N)T)r;   r   r   r   r   r0   r1   r2   lxmlr<   parseZgetrootr=   rF   etreeZ
SubElement)rK   r"   rL   rA   Z_bodyr   r   r   test_html_parsinga   s    
rR   c              C   s(   dd } t td|  t td| dd dS )z'Test the constructor for the CSS class.c             S   s   | j jd
 }|jj dkst|j\}}|jdks6t|j\}|jdksLt|jdksZt|j\}|jdksptt	| j
|j}|jdst|jdstd	S )z@Check that a parsed stylsheet looks like resources/utf8-test.cssr   z
h1::beforer'   u   I løvë Unicodezbackground-imageURIzfile:z&weasyprint/tests/resources/pattern.pngN)Z
stylesheetZrulesselectorZas_cssrF   Zdeclarationsnamevaluetyper   r-   rH   rI   )cssZruler'   Z
backgroundr,   Z	url_valuer)   r   r   r   	check_css   s    
z#test_css_parsing.<locals>.check_csszutf8-test.csszlatin1-test.csslatin1)r.   N)r;   r   )rZ   r   r   r   test_css_parsing   s    r\   Fc             C   s8  ddl m}m}m}m} |r|| | | | | | | || | | | | | | || | | | | | | || | | | | | | || | | | | | | || | | | | | | || | | | | | | || | | | | | | g}d}	n|r|| | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | || | | | | | | | | | | | | | | g}d}	n|r|| | | | | | | || | | | | | | || | | | | | | || | | | | | | || | | | | | | || | | | | | | || | | | | | | || | | | | | | g}d}	n|| | | | | | | || | | | | | | || | | | | | | || | | | | | | || | | | | | | || | | | | | | || | | | | | | || | | | | | | g}d}	tjjtj	| }
|d|	|	t
|
|	|	dj| d S )Nr   )_rBassert_pixels_equal      Zapi_png    )	test_drawr]   r^   r_   r`   cairoImageSurfacecreate_from_pngioBytesIOr   r2   )	png_bytesx2blankrotatedr]   r^   r_   r`   Zexpected_pixelssizesurfacer   r   r   check_png_pattern   sh    ">>>>>>>>>>>>>>>B""
rp   c              C   sX  t d} d}d}t|| d}t|d}|j|gd}|j|gd}|jdsPt|jds^tt| G d	d
 d
t}| }|j||gd |j	 |kst| }	|j|	|gd |	j	 |kstt
 }
tjj|
d}tjj|
d}|j||gd |j||gd t||kstt||ks*ttjj|
d}tjj|
d}t|d}|j||gd W dQ R X t|d}	|j|	|gd W dQ R X t||kstt||kstW dQ R X |j|gdd}t|dd t|dd}|j|gd}t|dd t|| ddjtj|jdgd|ks0ttd||f | ddj |ksTtdS )z#Test rendering with the Python API.z
dummy.htmlz<body><img src=pattern.png>z
        @page { margin: 2px; size: 8px; background: #fff }
        body { margin: 0; font-size: 0 }
        img { image-rendering: pixelated }

        @media screen { img { transform: rotate(-90deg) } }
    )r,   r-   )r,   )stylesheetss   PNG

s   %PDFc               @   s$   e Zd Zdd Zdd Zdd ZdS )z%test_python_render.<locals>.fake_filec             S   s
   g | _ d S )N)chunks)selfr   r   r   __init__   s    z.test_python_render.<locals>.fake_file.__init__c             S   s   | j jt|d d   d S )N)rr   appendbytes)rs   datar   r   r   r&      s    z+test_python_render.<locals>.fake_file.writec             S   s   dj | jS )Nrc   )r2   rr   )rs   r   r   r   getvalue   s    z.test_python_render.<locals>.fake_file.getvalueN)__name__
__module____qualname__rt   r&   rx   r   r   r   r   	fake_file   s   r|   z1.pngz1.pdfz2.pngz2.pdfr%   N   )rq   
resolutionT)rk   screen)r,   
media_type)rm   )r,   r-   r   r/   z<style>%s</style>%s)r   r   r   	write_png	write_pdfrH   rF   rp   objectrx   r
   r   r   r2   r$   r    rh   ri   encode)r-   Zhtml_stringZ
css_stringr<   rY   rj   	pdf_bytesr|   Zpng_fileZpdf_filetempZpng_filenameZpdf_filenamex2_png_bytesZ
screen_cssrotated_png_bytesr   r   r   test_python_render   sZ    
	
r   c               C   s  d} d}d|  d | }d| }t tdV t|dd}|j }|j }|jd	d
}t|dddj }td|  d dj }	W dQ R X t| t|dd t|	dd dIdd}
t V}t |@ ttd}td| td| td| td|j	dj
d td| td|  |
d |
d td|ks>ttd |ksPt|
d! td"|ksjttjj|d}|
|d#  td$|kstttjj|d}|
|d%  td&|kst|
d' td(|kst|
d) |
d* td+|ksttd,|kst|
d- |
d. td/|ks6ttd0|ksHt|
d1}||ks^t|
d2|d3 ttd4 td4|kst|
d5|d3}||kst|
d6 |
d7 |
d8 td9|ksttd:|ksttd;|kst|
d<}|jd=d>kst|
d?}|jd=d@ks(t|
dA}|jd=dBksDt|
dC}||ksZt|
dD}|
dE|kstt||ksttjdF tj dF t }|
d5|d3}W dQ R X t|d@kst|d> jdGst||	kst|
dH|d3}||kstW dQ R X W dQ R X dS )Jz)Test rendering with the command-line API.s   
        @page { margin: 2px; size: 8px; background: #fff }
        @media screen { img { transform: rotate(-90deg) } }
        body { margin: 0; font-size: 0 }
    s   <body><img src=pattern.png>s   <style>s   </style>s$   <link rel=stylesheet href=style.css> z
dummy.html)r,   r-   r}   )r~   r   )r,   r-   r   )r,   NT)rm   )rl   rc   c             S   sB   t j|}t j }ztt_tj| j ||d W d tt_X |j S )N)stdinstdout)rh   ri   r   r   r   mainsplitrx   )argsr   r   r   r   r   run?  s    
z%test_command_line_render.<locals>.runzpattern.pngzno_css.htmlzcombined.htmlzcombined-UTF-16BE.htmlasciizUTF-16BEzlinked.htmlz	style.csszcombined.html out1.pngzcombined.html out2.pdfzout1.pngzout2.pdfz3combined-UTF-16BE.html out3.png --encoding UTF-16BEzout3.pngz	 out4.pngzout4.pngz	 out5.pngzout5.pngzlinked.html out6.pngzout6.pngzcombined.html out7 -f pngzcombined.html out8 --format pdfZout7Zout8zno_css.html out9.pngz"no_css.html out10.png -s style.csszout9.pngz	out10.pngz--format png combined.html -z- out11.png)r   z	out11.pngz--format png - -z+combined.html out13.png --media-type screenz!combined.html out12.png -m screenzlinked.html out14.png -m screenz	out12.pngz	out13.pngz	out14.pngz-f pdf combined.html -s
   attachmentr   z%-f pdf -a pattern.png combined.html -r   z2-f pdf -a style.css -a pattern.png combined.html -r   z-f png -r 192 linked.html -z%-f png --resolution 192 linked.html -z%linked.html - -f png --resolution 192ZsubdirectoryzWARNING: Failed to load imagez--format png --base-url .. - -)rc   )r   r   r   r   r   rp   r
   r$   r(   r4   r   rF   r   r   r2   r   countmkdirr   lenrH   )rY   r<   ZcombinedZlinkedZhtml_objr   rj   r   r   Zempty_png_bytesr   r   Zpattern_bytesZcombined_absoluteZcombined_urlr   logsr   r   r   test_command_line_render%  s    









r   c              C   s$  d} t | dj }t| d}t }t| t||  tjd|gksNttjd\}t |j |ksntt |j |ksttj	| tjdg kstt | dj| t
||ksttjd dk rtj	| tjdg kstt | dj| t
||kstW dQ R X W dQ R X dS )	z7Test non-ASCII filenames both in Unicode or bytes form.s   
        <style>
            @page { margin: 2px; size: 8px; background: #fff }
            html { background: #00f; }
            body { background: #f00; width: 1px; height: 1px }
        </style>
        <body>
    )r,   u	   UnicödérN      .r      N)r   r   rp   r
   r   r(   r   listdirrF   remover$   sysversion_info)r<   rj   Zunicode_filenamer   Zbytes_filenamer   r   r   test_unicode_filenames  s(    



r   c              C   s  t dd} tdd}| j|gd}|jds0t| j|gj |ksHt| j|gd}| j|gdd}|j\}|jdks|t|j	dkst|j |ddfkst|j
|gj |ddfksttjtjdd}|jtj| tj }|j| t|j  tjtjdd}tj|}|jd	d	 |jtj d
  |jdd |j| tj }|j| t|j dd | j|gdd}|j\}|j|j	fdkst|jdd\}}	}
|	|
fdkstt|dd dd }| j|gdd}|j\}|j|j	fdks t||jdddkstt ddj }|j\}}|j|j	fdksHt|j|j	fd ks^t|j }||d!ksxt|j
||gj |kst||j
|gj d"kst||j
|gj d#kstd S )$Nz<body>)r,   z
        @page { margin: 2px; size: 8px; background: #fff }
        html { background: #00f; }
        body { background: #f00; width: 1px; height: 1px }
    )rq   s   %PDFT)Zenable_hintingra      r   )rm   r}   )r~   rb   )rk   c             S   s@   | \}}}t jjtj|}|j |j f||fks8t||fS )N)re   rf   rg   rh   ri   Z	get_widthZ
get_heightrF   )resultrj   widthheightro   r   r   r   png_size  s    
z$test_low_level_api.<locals>.png_sizegfffff&b@   z
        <style>
            @page:first { size: 5px 10px } @page { size: 6px 4px }
            p { page-break-before: always }
        </style>
        <p></p>
        <p></p>
       
         r   )ra   ra   )rb   rb   )ra   ra   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   )r   r   r   rH   rF   renderr   pagesr   r   copyre   rf   ZFORMAT_ARGB32ZpaintZContextrh   ri   Zwrite_to_pngrp   rx   	translaterotatemathpi)r<   rY   r   rj   documentpagero   r*   contextr   r   r   Zpage_1Zpage_2r   r   r   r   test_low_level_api  s`    





r   c             C   s   x| D ]}|j }x0t|D ]$\}\}}t|dt|df||< qW |j}xht|D ]\\}}|j}	|\}
}\}}}}t|
|t|dt|dt|dt|dff}|	|_|||< qRW |j}x<t|D ]0\}\}}\}}||t|dt|dff||< qW qW dS )zkEliminate errors of floating point arithmetic for metadata.
    (eg. 49.99999999999994 instead of 50)

    r   N)anchorsr   roundlinks	enumerate
sourceliner   	bookmarks)r   r   r   Zanchor_nameZpos_xZpos_yr   ilinkr   Z	link_typetargetr   r   r   levellabelr   r   r   
round_meta  s     
r   c              C   s  d@dd} | ddBdDgdFdHdJggddKd	dLg fddMg fddNg fgfddOg fg | ddQdSdUdWdYgd[d]d_dadcdeggddfg fddgddhg fddiddjg fgfddkg fgfddlddmddng fgfgfddod!dpg fgfg | d#drdtdvdxdzggd$d{d%d|g fgfd&d}d(d~d*dg fgfgfg | d,dddddddddg	gd$dd%dg fd&dd(dg fgfgfd*dd/dg fd1dd3dg fgfgfd5dg fg | d7dggd8dg fg | d9dggd:dg fg | d<dggd:dg fgd=d> | d?dggd:dg fgd=d> d S )NFc             S   sH   t | dj }|rt|j dd |jD |ks4t|j |ksDtd S )N)r,   c             S   s   g | ]
}|j qS r   )r   )r>   rD   r   r   r   r@   .  s    z<test_bookmarks.<locals>.assert_bookmarks.<locals>.<listcomp>)r   r   r   r   rF   Zmake_bookmark_tree)r<   Zexpected_by_pageZexpected_treer   r   r   r   r   assert_bookmarks*  s
    
z(test_bookmarks.<locals>.assert_bookmarksz
        <style>* { height: 10px }</style>
        <h1>a</h1>
        <h4 style="page-break-after: always">b</h4>
        <h3 style="position: relative; top: 2px; left: 3px">c</h3>
        <h2>d</h2>
        <h1>e</h1>
    r   ar   r   br   r   cr   de   a  
        <style>
            * { height: 90px; margin: 0 0 10px 0 }
        </style>
        <h1>Title 1</h1>
        <h1>Title 2</h1>
        <h2 style="position: relative; left: 20px">Title 3</h2>
        <h2>Title 4</h2>
        <h3>Title 5</h3>
        <span style="display: block; page-break-before: always"></span>
        <h2>Title 6</h2>
        <h1>Title 7</h1>
        <h2>Title 8</h2>
        <h3>Title 9</h3>
        <h1>Title 10</h1>
        <h2>Title 11</h2>
    Title 1Title 2d   Title 3   Title 4,  Title 5  Title 6Title 7Title 8Title 9Title 10  Title 11X  z
        <style>* { height: 10px }</style>
        <h2>A</h2> <p>depth 1</p>
        <h4>B</h4> <p>depth 2</p>
        <h2>C</h2> <p>depth 1</p>
        <h3>D</h3> <p>depth 2</p>
        <h4>E</h4> <p>depth 3</p>
    Ar_   C(   D<   EP   a  
        <style>* { height: 10px; font-size: 0 }</style>
        <h2>A</h2> <p>h2 depth 1</p>
        <h4>B</h4> <p>h4 depth 2</p>
        <h3>C</h3> <p>h3 depth 2</p>
        <h5>D</h5> <p>h5 depth 3</p>
        <h1>E</h1> <p>h1 depth 1</p>
        <h2>F</h2> <p>h2 depth 2</p>
        <h2>G</h2> <p>h2 depth 2</p>
        <h4>H</h4> <p>h4 depth 3</p>
        <h1>I</h1> <p>h1 depth 1</p>
    r   F   FZ   Gn   H   I   u   <h1>é   éz7
        <h1 style="transform: translateX(50px)">!
    !2   zo
        <h1 style="transform-origin: 0 0;
                   transform: rotate(90deg) translateX(50px)">!
    T)r   z~
        <body style="transform-origin: 0 0; transform: rotate(90deg)">
        <h1 style="transform: translateX(50px)">!
    )F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   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   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   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   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   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   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   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   r   r   )r   r   r  )r   r   r   r   r   )r   r   r  )r   r   r   r   )r   r   r   r   test_bookmarks(  s    

r  c              C   sH  t df dfdd} | dd,d.d0d2gd4ggdd5idd6igd8d:d=d@gdCgg | ddEggi gdGggdd | ddIggi gdKggdd | dg gi gg gd dgd | dg gi gg gd dgd | ddMdOggddPigdSdUggd d | d!dWggddXigd[ggd d | d"d]d_ggdd`igdcggd d%gd | d&deggddfigdiggd)d* d S )jNz<inline HTML>Fc             S   s   t  0}t| |dj }|r&t|j t|j }	W d Q R X t|t|ksPtx"t	||D ]\}
}||
ks\tq\W dd |jD |kstdd |jD |kst|	|kstd S )N)r,   r-   c             S   s   g | ]
}|j qS r   )r   )r>   rD   r   r   r   r@     s    z4test_links.<locals>.assert_links.<locals>.<listcomp>c             S   s   g | ]
}|j qS r   )r   )r>   rD   r   r   r   r@     s    )
r   r   r   r   r   listZresolve_linksr   rF   zip)r<   Zexpected_links_by_pageZexpected_anchors_by_pageZexpected_resolved_linksr-   warningsr   r   r   Zresolved_linksmessageZexpectedr   r   r   assert_links  s    
z test_links.<locals>.assert_linksan  
        <style>
            body { font-size: 10px; line-height: 2; width: 200px }
            p { height: 90px; margin: 0 0 10px 0 }
            img { width: 30px; vertical-align: top }
        </style>
        <p><a href="http://weasyprint.org"><img src=pattern.png></a></p>
        <p style="padding: 0 10px"><a
            href="#lipsum"><img style="border: solid 1px"
                                src=pattern.png></a></p>
        <p id=hello>Hello, World</p>
        <p id=lipsum>
            <a style="display: block; page-break-before: always; height: 30px"
               href="#hel%6Co"></a>
        </p>
    externalhttp://weasyprint.orgr      r   internallipsumr   r       hellor   r   u   
            <body style="width: 200px">
            <a href="../lipsum/é_%E9" style="display: block; margin: 10px 5px">
        +http://weasyprint.org/foo/lipsum/%C3%A9_%E9r      zhttp://weasyprint.org/foo/bar/)r-   u   
            <body style="width: 200px">
            <div style="display: block; margin: 10px 5px;
                        -weasy-link: url(../lipsum/é_%E9)">
        z<a href="../lipsum">z2WARNING: Relative URI reference without a base URI)r-   r  z)<div style="-weasy-link: url(../lipsum)">znWARNING: Ignored `-weasy-link: url(../lipsum)` at 1:1, Relative URI reference without a base URI: '../lipsum'.z
            <body style="width: 200px">
            <a href="#lipsum" id="lipsum"
                style="display: block; margin: 10px 5px"></a>
            <a href="http://weasyprint.org/" style="display: block"></a>
        http://weasyprint.org/z
            <body style="width: 200px">
            <div style="-weasy-link: url(#lipsum);
                        margin: 10px 5px" id="lipsum">
        z
            <style> a { display: block; height: 15px } </style>
            <body style="width: 200px">
                <a href="#lipsum"></a>
                <a href="#missing" id="lipsum"></a>
           missingz6WARNING: No anchor #missing for internal URI referencez
            <body style="width: 100px; transform: translateY(100px)">
            <a href="#lipsum" id="lipsum" style="display: block; height: 20px;
                transform: rotate(90deg) scale(2)">
        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   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'  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  r  r-  r   r   r  r   )r  r  r.  r   r   r  r   )r  r  r/  r   r   r  r   )r  r  r0  r   r   r   r   )r  r  r1  )r   r   r   r   r   r   r   r  r   )r  r2  r3  r   r   r   r   )r  r  r4  r   r   r  r   )r  r  r5  )r   r   r   r   r   r   r   r  r   )r  r6  r7  r   r   r   r  )r  r  r8  r   r  r   r  )r  r  r9  )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   )r  r   r   r   
test_links  s~    



r?  c                s^   g   fdd}| t |pi d}djtj||}t dksDt d \}}|t||fS )Nc                s    j | |f d S )N)ru   )statusheaders)start_response_callsr   r   start_response;  s    z#wsgi_client.<locals>.start_response)Z	PATH_INFOZQUERY_STRINGrc   r   r   )r   r2   r   Zappr   rF   dict)Z	path_infoZqs_argsrC  environresponser@  rA  r   )rB  r   wsgi_client8  s    rG  c              C   s  t  } td\}}}|dks$t|d dks4t|ttjksFttd\}}}|dks`ttd\}}}|jd}|dkst|d jd	std
|kstd|kstd|ksttj	j
| d}t|d t|}xtd| tdd|igD ]z\}}}|jd}|dkst|d jd	s,td
|ks:td|ksHtd|ksVtd|ksdtd|kstqW td| \}}}|dkst|d dkst|jdstd|kstdjd}d| d |kstW d Q R X d S )Nz/favicon.icoz200 OKzContent-Typezimage/x-iconz/lipsumz404 Not Found/r/   z
text/html;z#<title>WeasyPrint Navigator</title>z<imgz></a>z	test.htmls   
            <h1 id=foo><a href="http://weasyprint.org">Lorem ipsum</a></h1>
            <h2><a href="#foo">bar</a></h2>
        z/view/r)   z <img src="data:image/png;base64,z name="foo"></a>z href="#foo"></a>z( href="/view/http://weasyprint.org"></a>z/pdf/zapplication/pdfs   %PDFs;   /A << /Type /Action /S /URI /URI (http://weasyprint.org) >>u   ﻿Lorem ipsumz	utf-16-bes   << /Title (s   )
/A << /Type /Action /S /GoTo)r
   rG  rF   r$   r   ZFAVICONr4   rH   r   r   r2   r(   r   r   )r   r@  rA  rB   r"   r)   r  r   r   r   test_navigatorE  sL    




rI  zweasyprint-customc                 s   t tdfddtd td dd fdd		} | d
 | d | d | d | d | d t }| ddd W d Q R X t|dkst|d jdstdd }td|dj  d S )Nzpattern.pngc                s4   | dkrt  ddS | dkr(t dddS t| S d S )Nz(weasyprint-custom:foo/%C3%A9_%e9_patternz	image/png)r,   	mime_typezweasyprint-custom:foo/bar.cssu&   body { background: url(é_%e9_pattern)ztext/css)rD  r   )r)   )pattern_pngr   r   fetcher  s    z!test_url_fetcher.<locals>.fetcherz
dummy.htmlzi
        @page { size: 8px; margin: 2px; background: #fff }
        body { margin: 0; font-size: 0 }
    )r,   r-   Fc                s(   t |  d} t| jgd|d d S )N)r,   url_fetcherr-   )rq   )rl   )r   rp   r   )r<   rl   )r-   rY   rL  r   r   test  s    ztest_url_fetcher.<locals>.testz<body><img src="pattern.png">u6   <body><img src="weasyprint-custom:foo/é_%e9_pattern">uD   <body style="background: url(weasyprint-custom:foo/é_%e9_pattern)">uO   <body><li style="list-style: inside url(weasyprint-custom:foo/é_%e9_pattern)">z@<link rel=stylesheet href="weasyprint-custom:foo/bar.css"><body>z=<style>@import "weasyprint-custom:foo/bar.css";</style><body>z <body><img src="custom:foo/bar">T)rl   r   r   z1WARNING: Failed to load image at "custom:foo/bar"c             S   s   | dkst tdddS )Nz weasyprint-custom:%C3%A9_%e9.cssr   ztext/css)r,   rJ  )rF   rD  )r)   r   r   r   	fetcher_2  s    z#test_url_fetcher.<locals>.fetcher_2u?   <link rel=stylesheet href="weasyprint-custom:é_%e9.css"><body>)r,   rM  )F)	r$   r   r   r   r   rF   rH   r   r   )rN  r   rO  r   )r-   rY   rL  rK  r   test_url_fetcher{  s(    	

rP  c           
   C   sJ   dd } | d | dddgddd	d
ddgdddd | ddddgd d S )Nc             [   s   |j dd  |j dg  |j dg  |j dd  |j dd  |j dd  |j dd  |j dg  tt| d	j j|ks|td S )
Ntitleauthorskeywords	generatordescriptioncreatedmodifiedattachments)r,   )
setdefaultvarsr   r   metadatarF   )r<   metar   r   r   assert_meta  s    z#test_html_meta.<locals>.assert_metaz<body>u  
            <meta name=author content="I Me &amp; Myself">
            <meta name=author content="Smith, John">
            <title>Test document</title>
            <h1>Another title</h1>
            <meta name=generator content="Human after all">
            <meta name=dummy content=ignored>
            <meta name=dummy>
            <meta content=ignored>
            <meta>
            <meta name=keywords content="html ,	css,
                                         pdf,css">
            <meta name=dcterms.created content=2011-04>
            <meta name=dcterms.created content=2011-05>
            <meta name=dcterms.modified content=2013>
            <meta name=keywords content="Python; cairo">
            <meta name=description content="Blah… ">
        zI Me & MyselfzSmith, JohnzTest documentu   Human after allr<   rY   ZpdfzPython; cairou   Blah… z2011-04Z2013)rR  rQ  rT  rS  rU  rV  rW  z
            <title>One</title>
            <meta name=Author>
            <title>Two</title>
            <title>Three</title>
            <meta name=author content=Me>
        ZOner   ZMe)rQ  rR  r   )r]  r   r   r   test_html_meta  s    
r^  c           
      s   dd  t  fdddd dd dZ} t| d jjd	d
ksFtt| d jjd	d
ksbtt| d jjd	d
ks~tW d Q R X d S )Nc             S   s0   t j }tj|dd}|j|  |j  |j S )Nr%   )fileobjmode)rh   ri   gzipZGzipFiler&   closerx   )rw   r*   Z	gzip_filer   r   r   gzip_compress  s
    
z test_http.<locals>.gzip_compressc                s&   d| j ddkr ddgfS dg fS )Nra  HTTP_ACCEPT_ENCODINGr   s   <html test=ok>Content-Encodings'   <html test=accept-encoding-header-fail>)re  ra  )r3   )env)rc  r   r   <lambda>  s    ztest_http.<locals>.<lambda>c             S   s(   d| j ddkr tjddgfS dg fS )Ndeflaterd  r   s   <html test=ok>Content-Encodings'   <html test=accept-encoding-header-fail>)ri  rh  )r3   zlibcompress)rf  r   r   r   rg    s     c             S   s0   d| j ddkr(tjddd	 d
gfS dg fS )Nrh  rd  r   s   <html test=ok>r   r   Content-Encodings'   <html test=accept-encoding-header-fail>r   )rl  rh  )r3   rj  rk  )rf  r   r   r   rg    s    ()z/gzipz/deflatez/raw-deflatez/gziprN  okz/deflatez/raw-deflate)r	   r   rE   r3   rF   )Zroot_urlr   )rc  r   	test_http  s    
rn  )FFF)N)A__doc__
__future__r   r   r   rh   r   r   
contextlib	threadingra  rj  Z	lxml.htmlrO   Z
lxml.etreeZ	cairocffire   r5   Ztesting_utilsr   r   r   r   r	   r
   rd   r   compatr   r   r   r   Zurlsr   r   r   r   r   r   r   r   r   Lockr   contextmanagerr   r$   r(   r;   rR   r\   rp   r   r   r   r   r   r  r?  rG  rI  ru   rP  r^  rn  r   r   r   r   <module>   sX    !
@Jv*L  

3
,4