o
    /htK                     @   sB   d Z ddlZddlZddlmZ ddlZddlZG dd dZ	dS )z:Tests for parsing which does not raise Exceptions normally    N)mockc                   @   s   e Zd Zdd Zdd Zdd Zdd Zejj	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 )"TestCSSParserc                    s    fdd}|S )z'make an URL fetcher with specified datac                    s    fS )N )urlcontentencodingr   M/var/www/html/myenv/lib/python3.10/site-packages/cssutils/tests/test_parse.pyfetcher   s   z,TestCSSParser._make_fetcher.<locals>.fetcherr   )selfr   r   r
   r   r   r	   _make_fetcher   s   zTestCSSParser._make_fetcherc                 C   sJ  t jjsJ dt j_t  }|d}|jdksJ t jdd}|d}|jdks,J ttj	j
 |dd W d   n1 sDw   Y  t jdd}ttj	j |d W d   n1 sfw   Y  t j }ttj	j
 |dd W d   n1 sw   Y  dt j_t j }|dd |jdksJ dS )zCSSParser.__init__()T$    F)raiseExceptionscssTextN)cssutilslogr   	CSSParserparseStringr   pytestraisesxmldomDOMException__setattr__	SyntaxErrcssCSSStyleSheet)r   psr   r   r	   	test_init   s.   



zTestCSSParser.test_initc                 C   sH   d}t jdd}||jdksJ t jdd}||jdks"J dS )z'cssutils.CSSParser(parseComments=False)z/*1*/ a { color: /*2*/ red; }F)parseCommentss   a {
    color: red
    }Ts$   /*1*/
a {
    color: /*2*/ red
    }N)r   r   r   r   )r   r   r   r   r   r	   test_parseComments=   s
   z TestCSSParser.test_parseCommentsc              	   C   s  t  }t }td| d|_|jdddd}W d   n1 s$w   Y  |jdks0J |jdks7J |j	j
d	ks?J |jdksFJ d
d
d
d
ddddd}d}d}d}t| D ]v\\}}	\}
}}|| ||	 ||}|j||d}|
r|j|ksJ |j| ksJ |j|ksJ |jr|dr|j|d| ksJ q]|jr|j|d |  ksJ q]|j||  ksJ q]|du sJ |du sJ q]|d tt |d W d   dS 1 sw   Y  dS )zCSSParser.parseUrl()zcssutils.util._defaultFetcher)N zhttp://example.comztv,printtest)mediatitleNutf-8z	tv, print)FNN)Tr'   r#   )Tr'   za {
    color: red
    })Tasciiz*@charset "ascii";
a {
    color: red
    }))r#   N)1N)zmailto:a@bb.cdN)http://cthedot.de/test.cssN)r*   r#   )r*   a)r*   za {color: red})r*   z@charset "ascii";a {color: red}
iso-8859-1z@charset "iso-8859-1";r   z@charsetr(   
z../not-valid-in-urllib)r   r   r   Mockpatchreturn_valueparseUrlhrefr   r%   	mediaTextr&   listitems
setFetcherr   r   encode
startswithreplacer   r   
ValueError)r   parsermsheettestsoverrideoverrideprefixhttpencodingr   r   isSheetexpencodingr   sheet1sheet2r   r   r	   test_parseUrlF   sZ   


"zTestCSSParser.test_parseUrlc                 C   sF   t  }ttjj |d W d    d S 1 sw   Y  d S )Nz!http://cthedot.de/not-present.css)r   r   r   r   urlliberror	HTTPErrorr2   )r   r<   r   r   r	   test_parseUrl_404   s   "zTestCSSParser.test_parseUrl_404c              	   C   s  i ddddd  dfdd  fd  dfdd  fd	dd
dddddd  fddd dfddd  fddd dfddd  fddd  fddd  fdddddd }|D ]!}|\}}tj||d!}|| \}}||jksJ ||jksJ qed ddfd dd"fd  d"fd#g}|D ]!}tt t|d$ |d%  W d   n1 sw   Y  qdS )&zCSSParser.parseString())/*a*/N)r'   s   /*a*/)rL   r(   )r(   s   @charset "ascii";
/*a*/u   /*ä*/Nr'   u   @charset "utf-8";
/*ä*/)z@charset "ascii";/*a*/N)z@charset "utf-8";/*a*/N)r'   s   @charset "utf-8";
/*a*/)z@charset "iso-8859-1";/*a*/N)r,   s   @charset "iso-8859-1";
/*a*/)   /*€*/NrM   )   @charset "iso-8859-1";/*ä*/Nr,   u   @charset "iso-8859-1";
/*ä*/)   @charset "utf-8";/*€*/Nu   @charset "utf-8";
/*€*/)@charset "utf-16";/**/Nutf-16z@charset "utf-16";
/**/)rM   r'   )rN   r'   )rO   r'   )rP   r'   )r'   s   @charset "utf-8";
/**/)rM   r(   )r(   s   @charset "ascii";
/*\20AC */)rM   r,   )r,   s!   @charset "iso-8859-1";
/*\20AC */r-   r(   )   arQ   r      )r8   r   r   r   r   r   r   UnicodeDecodeError)r   r?   r$   r   r   r>   r   r   r   r	   test_parseString   s   	

 $)*.27;@
zTestCSSParser.test_parseStringc                 C   sP  d}d| }t |}|jsJ t j|dd}|jdu sJ t j|dd}|js*J t |}|js4J t j|dd}|js@J t j|dd}|jdu sNJ t  }||}|js\J |j|dd}|jdu sjJ |j|dd}|jsvJ ||}|jsJ t jdd}||}|jsJ |j|dd}|jdu sJ |j|dd}|jsJ ||}|jsJ t jdd}||}|jdu sJ |j|dd}|jdu sJ |j|dd}|jsJ ||}|jdu sJ t jdd}|| d| d}||}|jdu s
J |j|dd}|jdu sJ |j|dd}|js&J dS )	zCSSParser(validate)z
color: redza { %s }F)validateTr'   r   N)r   r   
validating
parseStyler   r7   r   r2   )r   styletr   dr   ur   r   r	   test_validate   sd   



















zTestCSSParser.test_validatec                 C   s  ddddddddddddd	  fd

}t }|D ]h}|\}}}|| \}}}	}
|| j|  tj| j| d}|j||d}|j||d}|j|ksNJ |j|ksUJ |j| jj|	ks`J |j| jj|	kskJ |j| jj	|
ksvJ |j| jj	|
ksJ qdS )a  CSSParser.fetcher

        order:
           0. explicity given encoding OVERRIDE (cssutils only)

           1. An HTTP "charset" parameter in a "Content-Type" field
              (or similar parameters in other protocols)
           2. BOM and/or @charset (see below)
           3. <link charset=""> or other metadata from the linking mechanism (if any)
           4. charset of referring style sheet or document (if any)
           5. Assume UTF-8
        )r(   rS   r(   s   @charset "ascii";
/*t*/)rQ   rS   r,   s   @charset "iso-8859-1";
/*t*/)r'   r   r'   s   /*t*/)r(   rS   r(      @charset "ascii";
/*\287 */)r(   rS   r,   s    @charset "iso-8859-1";
/*\287 */)r'   r   r(   r^   r'   r      /*ʇ*/)
)@charset "utf-16"; @import "x";ASCII)r,   @charset "latin1";/*t*/)@charset "UTF-16"; @import "x";N)z
ISO-8859-1rb   )rc   N)Nz@charset "ISO-8859-1";/*t*/)z@charset "ASCII"; @import "x";NNz/*t*/)@import "x";Nrd   )r`   ra   )Nu   @charset "latin1";/*ʇ*/)@charset "ascii"; @import "x";N)r,   r_   )rf   NNr_   )re   N)r(   r_   )re   Nrg   )r
   r-   N)
r8   r   r   r7   r   r   r   cssRules
styleSheetr   )r   r?   r<   r$   r   r   	fetchdatasheetencodingimportIndeximportEncoding
importTextparser2r>   rF   r   r   r	   test_fetcher$  s<   Q
zTestCSSParser.test_fetcherc                 C   sX   d}t |}t|jd}||ksJ t |}d|jd _d}|t|jdks*J dS )zcssutils encodingsu   @charset "utf-8";
/* ä */r'   r(   r   z@charset "ascii";
/* \E4  */N)r   r   strr   rh   r   )r   css1r   css2css3r   r   r	   test_roundtrip  s   

zTestCSSParser.test_roundtripc                 C   s<   d}t |}|jdksJ d}t |}|jdksJ dS )zcssutils escapesz#\43\x { \43\x: \43\x !import\41nt }s#   C\x {
    c\x: C\x !important
    }z\ x{\ x :\ x ;y:1} s"   \ x {
    \ x: \ x;
    y: 1
    }N)r   r   r   )r   r   r>   r   r   r	   test_escapes  s   

zTestCSSParser.test_escapesc                 C   sx   d}d| d| d| d| d| d| f}|D ]}t |}| |jks(J qd}|D ]}d	t |jks9J q-d
S )z$cssutils.parseString(INVALID_STRING)z@namespace "x";z!@charset "ascii
                ;z!@charset 'ascii
                ;z@namespace "y
                ;z@import "y
                ;z!@import url('a
                );z@unknown "y
                ;)z-a { font-family: "Courier
                ; }z$a { content: "\"; }
                z&a { content: "\\\"; }
                r   Nr   r   r8   r   )r   validfromherecsssr   r   r   r   r	   test_invalidstring  s6   
z TestCSSParser.test_invalidstringc                 C   sH   ddd}|D ]}|| }|du r|}t |}| |jks!J qdS )z!cssutils.parseString(INVALID_CSS)z4a {
    color: blue
    }
a {
    color: green
    }zp {
    color: green
    })z.a {color: blue}} a{color: red} a{color: green}z%p @here {color: red} p {color: green}Nrw   r   r?   r   expr   r   r   r	   test_invalid  s   

zTestCSSParser.test_invalidc                 C   sD   ddddddd}t | D ]\}}| t|jksJ qdS )zcssutils.parseString nestingzdiv {
    color: green
    }r#   )z@1; div{color:green}z@1 []; div{color:green}z@1 [{}]; div { color:green; }z!@media all { @ } div{color:green}z@1 { [ } div{color:green}z)@1 { [ } ] div{color:red}div{color:green}N)r5   r6   r8   r   r   r   )r   r?   r   r|   r   r   r	   test_nesting  s   
zTestCSSParser.test_nestingc                 C   sF   ddi}|D ]}|| }|du r|}t |}| |jks J qdS )z"cssutils.parseString(special_case)z2
    a[title="a not so very long title"] {/*...*/}z7a[title="a not so very long title"] {
    /*...*/
    }Nrw   r{   r   r   r	   test_specialcases  s   
zTestCSSParser.test_specialcasesc                 C   s   d}t |}|jd jd}d|jksJ d|jksJ d|jd jdks+J |jd jd}|du s:J d|jd jdksGJ d|jd jjksRJ dS )z%IEhack: $property (not since 0.9.5b3)z a { color: green; $color: red; }r   colorr#   z$colorNgreen)	r   r   rh   rY   getPropertynameliteralnamegetPropertyValuer   )r   r   r   p1p2r   r   r	   test_iehack  s   
zTestCSSParser.test_iehackc                 C   sV   t jdddd}|jdksJ |jjdksJ t jddg dd}|jjdks)J dS )z!cssutils.parseString(href, media)za{}zfile:foo.csszscreen, projection, tv)r3   r%   )screen
projectiontvN)r   r   r3   r%   r4   )r   r   r   r   r	   test_attributes%  s   
zTestCSSParser.test_attributesN)__name__
__module____qualname__r   r    r"   rG   r   marknetworkrK   rU   r]   rp   ru   rv   rz   r}   r~   r   r   r   r   r   r   r	   r      s$    (	A
U@t&r   )
__doc__urllib.errorrH   xml.domr   unittestr   r   r   r   r   r   r   r	   <module>   s    