U
    e»{j�\  ã                   @   s€  d Z ddlmZ ddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZ dd	lmZmZ er|dd
lmZmZ ejje dd�dd„ ƒZdd„ Zejje dd�dd„ ƒZejje dd�dd„ ƒZejje dd�dd„ ƒZejje dd�dd„ ƒZejje dd�dd„ ƒZejje dd�dd„ ƒZejjedd�dd„ ƒZ ejje dd�d d!„ ƒZ!ejje dd�d"d#„ ƒZ"ejje dd�d$d%„ ƒZ#ejje dd�d&d'„ ƒZ$d(d)„ Z%ejje d*d�d+d,„ ƒZ&d-d.„ Z'ejje dd�d/d0„ ƒZ(ejje d*d�d1d2„ ƒZ)ejje d*d�d3d4„ ƒZ*d5d6„ Z+d7d8„ Z,d9d:„ Z-d;d<„ Z.d=d>„ Z/d?d@„ Z0ejje dd�dAdB„ ƒZ1dS )CzÑ
This module tests some of the methods related to the ``HTML``
reader/writer and aims to document its functionality.

Requires `BeautifulSoup <http://www.crummy.com/software/BeautifulSoup/>`_
to be installed.
é    )ÚStringION)Úascii)ÚcoreÚhtml)ÚTable)Ú
HAS_BLEACHÚHAS_BS4é   )Úsetup_functionÚteardown_function)ÚBeautifulSoupÚFeatureNotFoundzrequires BeautifulSoup4)Úreasonc                  C   sP   t ddƒ} t | ¡}t|tƒs"t‚t|tjƒs2t‚|dks>t‚|j| ksLt‚dS )zB
    Test to make sure the class SoupString behaves properly.
    z1<html><head></head><body><p>foo</p></body></html>úhtml.parserN)r   r   Ú
SoupStringÚ
isinstanceÚstrÚAssertionErrorÚsoup)r   Zsoup_str© r   ú_/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/io/ascii/tests/test_html.pyÚtest_soupstring   s     ÿ
r   c                  C   s^   g } t  | ¡}tdƒD ]}| |¡ qdD ]}| |¡ q*| ddddddd	d
ddg
ksZt‚dS )zB
    Test to make sure the class ListWriter behaves properly.
    é   Zabcder   r	   é   é   é   ÚaÚbÚcÚdÚeN)r   Z
ListWriterÚrangeÚwriter   )ÚlstÚwriterÚiÚchr   r   r   Útest_listwriter+   s    
r'   c                  C   sÚ   t ddƒ} t | i d¡dks t‚t di d¡dks6t‚t ddƒj} t | i d¡dksXt‚t | i d¡d	ksnt‚t | d
did¡dksˆt‚t | d
did¡d	ks¢t‚t | d
did¡dks¼t‚t | d
did¡d	ksÖt‚dS )z‚
    Test to make sure that identify_table() returns whether the
    given BeautifulSoup tag is the correct table to process.
    z<html><body></body></html>r   r   FNz><table id="foo"><tr><th>A</th></tr><tr><td>B</td></tr></table>r   r	   TÚtable_idÚbarÚfoo)r   r   Zidentify_tabler   Útable)r   r   r   r   Útest_identify_table;   s    
þr,   c                  C   s¼   dddddg} t j| dd�}|jdks*t‚t |d	 jd
dgk¡sFt‚|d	 jjdksZt‚dddddg} t j| ddgd�}|jdksˆt‚t |d	 jd
dgk¡s¤t‚|d	 jjdks¸t‚dS )z0
    Test reading a table with missing data
    ú<table>z<tr><th>A</th></tr>z<tr><td></td></tr>ú<tr><td>1</td></tr>ú</table>ú
ascii.html©ÚformatFÚATr%   z<tr><td>...</td></tr>)z...Ú0)r2   Úfill_valuesN)	r   ÚreadÚmaskedr   ÚnpÚallÚmaskÚdtypeÚkind©Útable_inZdatr   r   r   Útest_missing_dataW   s(    ûûr?   c                  C   s”   ddddg} t j| dddgd�}|jddgks2t‚t|ƒd	ksBt‚t j| dddgdgd
�}|jdgksjt‚t|ƒd	kszt‚t |d dk¡s�t‚dS )z0
    Test reading a table and renaming cols
    r-   z<tr><th>A</th> <th>B</th></tr>z<tr><td>1</td><td>2</td></tr>r/   r0   ÚBr3   ©r2   Únamesr	   )r2   rB   Zinclude_namesr   N)r   r6   Úcolnamesr   Úlenr8   r9   r=   r   r   r   Útest_rename_colsw   s"    ü   ÿrE   c                  C   sp   ddddg} t j| dd�}|jdgks*t‚t|ƒdks:t‚t j| dd	gd
�}|jd	gks\t‚t|ƒdkslt‚dS )z4
    Test reading a table with no column header
    r-   r.   z<tr><td>2</td></tr>r/   r0   r1   Úcol1r   r   rA   N)r   r6   rC   r   rD   r=   r   r   r   Útest_no_names‘   s    rG   c               	   C   s„   ddg} t  tj¡�}tj| dddidd� W 5 Q R X | d¡sDt‚t  tj¡�}tj| ddd	idd� W 5 Q R X | d
¡s€t‚dS )z\
    Raise an exception with an informative error message if table_id
    is not found.
    z#<table id="foo"><tr><th>A</th></tr>z<tr><td>B</td></tr></table>r0   r(   Zbad_idF©r2   ÚhtmldictÚguessz(ERROR: HTML table id 'bad_id' not found$r   z%ERROR: HTML table number 3 not found$N)ÚpytestÚraisesr   ÚInconsistentTableErrorr   r6   Úmatchr   )r>   Úerrr   r   r   Útest_identify_table_fail    s       ÿ rP   c               	   C   st   dD ]>} zt jddd| idd� W q tk
r@   | dkr<‚ Y qX qt t¡� t jddddidd� W 5 Q R X d	S )
z
    Make sure the user can specify which back-end parser to use
    and that an error is raised if the parser is invalid.
    )ZlxmlÚxmlr   Zhtml5libúdata/html2.htmlr0   ÚparserFrH   r   r*   N)r   r6   r   rK   rL   )rS   r   r   r   Útest_backend_parsers³   s$    ü

ürT   zrequires no BeautifulSoup4c               	   C   s.   t  ¡ } t tj¡� |  g ¡ W 5 Q R X dS )z_
    This should return an OptionalTableImportError if BeautifulSoup
    is not installed.
    N)r   ÚHTMLInputterrK   rL   r   ZOptionalTableImportErrorZprocess_lines)Úinputterr   r   r   Útest_htmlinputter_no_bs4Ð   s    rW   c               	   C   sê   d} t | ƒ�}| ¡ }W 5 Q R X t ¡ }i |_ddddg}dd„ | |¡D ƒ|ksVt‚dd	i|_t tj	¡� | |¡ W 5 Q R X d
|jd< ddddg}dd„ | |¡D ƒ|ks´t‚d|jd< ddddg}dd„ | |¡D ƒ|ksæt‚dS )z
    Test to ensure that HTMLInputter correctly converts input
    into a list of SoupStrings representing table elements.
    údata/html.htmlú<<tr><th>Column 1</th><th>Column 2</th><th>Column 3</th></tr>ú*<tr><td>1</td><td>a</td><td>1.05</td></tr>z*<tr><td>2</td><td>b</td><td>2.75</td></tr>ú+<tr><td>3</td><td>c</td><td>-1.25</td></tr>c                 S   s   g | ]}t |ƒ‘qS r   ©r   ©Ú.0Úxr   r   r   Ú
<listcomp>ñ   s     z%test_htmlinputter.<locals>.<listcomp>r(   r   Úsecondú<<tr><th>Column A</th><th>Column B</th><th>Column C</th></tr>ú*<tr><td>4</td><td>d</td><td>10.5</td></tr>z*<tr><td>5</td><td>e</td><td>27.5</td></tr>ú+<tr><td>6</td><td>f</td><td>-12.5</td></tr>c                 S   s   g | ]}t |ƒ‘qS r   r\   r]   r   r   r   r`      s     r   ú*<tr><th>C1</th><th>C2</th><th>C3</th></tr>ú+<tr><td>7</td><td>g</td><td>105.0</td></tr>z+<tr><td>8</td><td>h</td><td>275.0</td></tr>ú,<tr><td>9</td><td>i</td><td>-125.0</td></tr>c                 S   s   g | ]}t |ƒ‘qS r   r\   r]   r   r   r   r`   
  s     N)
Úopenr6   r   rU   Ú	get_linesr   rK   rL   r   rM   )ÚfÚfdr+   rV   Úexpectedr   r   r   Útest_htmlinputterÜ   s8    
ü

ü
ürm   c               	   C   s¤   t  ¡ } t  tddƒj¡t  tddƒj¡g}ddgddgg}t| |ƒƒ|ksPt‚| d¡ t 	t
¡� t| |ƒƒ W 5 Q R X t 	tj¡� t| g ƒƒ W 5 Q R X d	S )
zž
    Test to make sure that HTMLSplitter correctly inputs lines
    of type SoupString to return a generator that gives all
    header and data elements.
    z4<table><tr><th>Col 1</th><th>Col 2</th></tr></table>r   z6<table><tr><td>Data 1</td><td>Data 2</td></tr></table>zCol 1zCol 2zData 1zData 2z'<tr><td>Data 3</td><td>Data 4</td></tr>N)r   ZHTMLSplitterr   r   ÚtrÚlistr   ÚappendrK   rL   Ú	TypeErrorr   rM   )ZsplitterÚlinesZexpected_datar   r   r   Útest_htmlsplitter  s*     ÿÿ ÿÿú
rs   c               	   C   s  d} t | ƒ�}| ¡ }W 5 Q R X t ¡ }i |_t ¡ }| |¡}t|| |¡ ƒdksZt‚d|jd< | |¡}t|| |¡ ƒdksˆt‚d|jd< | |¡}t|| |¡ ƒdks¶t‚t 	t
dd	ƒj¡t 	t
d
d	ƒj¡g}| |¡dksìt‚| d¡ t t¡� | |¡ W 5 Q R X dS )z“
    Test to ensure that the start_line method of HTMLHeader
    returns the first line of header data. Uses t/html.html
    for sample input.
    rX   rY   ra   r(   rb   r   re   z%<table><tr><td>Data</td></tr></table>r   ú<p>Text</p>Nz<tr><th>Header</th></tr>)rh   r6   r   rU   Z
HTMLHeaderri   r   Ú
start_liner   r   r   rn   Úprp   rK   rL   rq   )rj   rk   r+   rV   Úheaderrr   r   r   r   Útest_htmlheader_start0  s@    

ÿÿ

ÿÿ

ÿÿ
ÿü
rx   c               	   C   sº  d} t | ƒ�}| ¡ }W 5 Q R X t ¡ }i |_t ¡ }| |¡}t|| |¡ ƒdksZt‚t|| 	|¡d  ƒdksxt‚d|jd< | |¡}t|| |¡ ƒdks¦t‚t|| 	|¡d  ƒdksÄt‚d	|jd< | |¡}t|| |¡ ƒd
ksòt‚t|| 	|¡d  ƒdk�st‚t 
tddƒj¡t 
tddƒj¡g}t tj¡� | |¡ W 5 Q R X | 	|¡dk�slt‚| d¡ t t¡� | |¡ W 5 Q R X t t¡� | 	|¡ W 5 Q R X dS )zŸ
    Test to ensure that the start_line and end_lines methods
    of HTMLData returns the first line of table data. Uses
    t/html.html for sample input.
    rX   rZ   r	   r[   ra   r(   rc   rd   r   rf   rg   z<div></div>r   rt   Nz<tr><td>Data</td></tr>)rh   r6   r   rU   ZHTMLDatari   r   ru   r   Úend_liner   r   Údivrv   rK   rL   r   rM   rp   rq   )rj   rk   r+   rV   Údatarr   r   r   r   Útest_htmldataa  s\    

ÿÿÿÿ

ÿÿÿÿ

ÿÿÿÿþ
r|   c                  C   s^   dddg} dddg}ddd	g}t | ||gd
d�}d}t ¡  |¡d  ¡ }|| ¡ ksZt‚dS )úœ
    Test to make sure that the HTML writer writes multidimensional
    columns (those with iterable elements) using the colspan
    attribute of <th>.
    r	   r   r   ©ç      ð?r   ©ç       @r�   ©ç      @rƒ   ©r   r   r   ©r   r   r   ©r   r   r   ©ÚC1ÚC2ÚC3©rB   al  <html>
 <head>
  <meta charset="utf-8"/>
  <meta content="text/html;charset=UTF-8" http-equiv="Content-type"/>
 </head>
 <body>
  <table>
   <thead>
    <tr>
     <th>C1</th>
     <th colspan="2">C2</th>
     <th colspan="3">C3</th>
    </tr>
   </thead>
   <tr>
    <td>1</td>
    <td>1.0</td>
    <td>1.0</td>
    <td>a</td>
    <td>a</td>
    <td>a</td>
   </tr>
   <tr>
    <td>2</td>
    <td>2.0</td>
    <td>2.0</td>
    <td>b</td>
    <td>b</td>
    <td>b</td>
   </tr>
   <tr>
    <td>3</td>
    <td>3.0</td>
    <td>3.0</td>
    <td>c</td>
    <td>c</td>
    <td>c</td>
   </tr>
  </table>
 </body>
</html>
    r   N©r   r   ÚHTMLr"   Ústripr   ©rF   Úcol2Úcol3r+   rl   Úoutr   r   r   Útest_multicolumn_write¥  s    


+r“   zrequires bleachc                  C   sf   dddg} dddg}ddd	g}t | ||gd
d�}d}tjddid� |¡d  ¡ }|| ¡ ksbt‚dS )r}   r	   r   r   r~   r€   r‚   )ú<a></a>r”   r   )z<b></b>r   r   r†   r‡   r‹   a~  <html>
 <head>
  <meta charset="utf-8"/>
  <meta content="text/html;charset=UTF-8" http-equiv="Content-type"/>
 </head>
 <body>
  <table>
   <thead>
    <tr>
     <th>C1</th>
     <th colspan="2">C2</th>
     <th colspan="3">C3</th>
    </tr>
   </thead>
   <tr>
    <td>1</td>
    <td>1.0</td>
    <td>1.0</td>
    <td><a></a></td>
    <td><a></a></td>
    <td>a</td>
   </tr>
   <tr>
    <td>2</td>
    <td>2.0</td>
    <td>2.0</td>
    <td><b></b></td>
    <td>b</td>
    <td>b</td>
   </tr>
   <tr>
    <td>3</td>
    <td>3.0</td>
    <td>3.0</td>
    <td>c</td>
    <td>c</td>
    <td>c</td>
   </tr>
  </table>
 </body>
</html>
    Úraw_html_colsrŠ   )rI   r   NrŒ   r�   r   r   r   Útest_multicolumn_write_escapeß  s    


+r–   c                  C   s`   dddg} dddg}ddd	g}t | ||gd
d�}d}t ddi¡ |¡d  ¡ | ¡ ks\t‚dS )zƒ
    Test to make sure that the HTML writer will not use
    multi-dimensional columns if the multicol parameter
    is False.
    r	   r   r   r~   r€   r‚   r„   r…   r†   r‡   r‹   aë  <html>
 <head>
  <meta charset="utf-8"/>
  <meta content="text/html;charset=UTF-8" http-equiv="Content-type"/>
 </head>
 <body>
  <table>
   <thead>
    <tr>
     <th>C1</th>
     <th>C2</th>
     <th>C3</th>
    </tr>
   </thead>
   <tr>
    <td>1</td>
    <td>1.0 .. 1.0</td>
    <td>a .. a</td>
   </tr>
   <tr>
    <td>2</td>
    <td>2.0 .. 2.0</td>
    <td>b .. b</td>
   </tr>
   <tr>
    <td>3</td>
    <td>3.0 .. 3.0</td>
    <td>c .. c</td>
   </tr>
  </table>
 </body>
</html>
    ZmulticolFr   NrŒ   )rF   r�   r‘   r+   rl   r   r   r   Útest_write_no_multicols  s    


"r—   c                  C   sb   t jddd�} t tdf¡}t tjddgdfddgd	fgd
|dfdgd�ƒ}t | |k¡s^t‚dS )a'  
    Test to make sure that the HTML reader inputs multidimensional
    columns (those with iterable elements) using the colspan
    attribute of <th>.

    Ensure that any string element within a multidimensional column
    casts all elements to string prior to type conversion operations.
    rR   r0   r1   é   Ú1z2.5000000000000000001r   Z1ag      @r3   )r   )r@   z<f8)r;   N)r   r6   r8   r;   r   Úarrayr9   r   )r+   Zstr_typerl   r   r   r   Útest_multicolumn_readJ  s    þÿr›   c                  C   s¨   t dgdggddgd�} tƒ }| j|dddid� d	}|| ¡ ksFt‚tƒ }| j|dddgid� || ¡ ksrt‚tƒ }| j|ddddgid� d
}|| ¡ ks¤t‚dS )úF
    Test that columns can contain raw HTML which is not escaped.
    z
<em>x</em>ú
<em>y</em>r   r   r‹   r0   r•   ©r2   rI   zL   <tr>
    <td><em>x</em></td>
    <td>&lt;em&gt;y&lt;/em&gt;</td>
   </tr>z@   <tr>
    <td><em>x</em></td>
    <td><em>y</em></td>
   </tr>N)r   r   r"   Úgetvaluer   )Útr’   rl   r   r   r   Útest_raw_html_write`  s    r¡   c                  C   sœ   ddl } tdgdgdggdddgd	�}tƒ }|j|d
d|jid� d}|| ¡ ksVt‚tƒ }|j|d
|jdt| jƒdg idœd� d}|| ¡ ks˜t‚dS )rœ   r   Nz<script>x</script>z<p>y</p>r�   r   r   r   r‹   r0   r•   rž   zv   <tr>
    <td>&lt;script&gt;x&lt;/script&gt;</td>
    <td>&lt;p&gt;y&lt;/p&gt;</td>
    <td><em>y</em></td>
   </tr>Útagsrv   )r•   Zraw_html_clean_kwargszj   <tr>
    <td>&lt;script&gt;x&lt;/script&gt;</td>
    <td><p>y</p></td>
    <td><em>y</em></td>
   </tr>)	Úbleachr   r   r"   rC   rŸ   r   ro   ZALLOWED_TAGS)r£   r    r’   rl   r   r   r   Útest_raw_html_write_clean�  s&     ÿþýr¤   c                  C   sn   t ƒ } tdgdggdd�}tj|| ddd� tdgdggdd�}t ƒ }tj||dd	� |  ¡ | ¡ ksjt‚d
S )zG
    Test that passing fill_values should replace any matching row
    r	   r   ©r   r   r‹   )r™   úHello worldr   ©r5   r2   r¦   r1   N©r   r   r   r"   rŸ   r   ©Úbuffer_outputr    Ú
t_expectedÚbuffer_expectedr   r   r   Ú!test_write_table_html_fill_valuesª  s    r­   c                  C   sn   t ƒ } tdgdggdd�}tj|| ddd� tdgdggdd�}t ƒ }tj||dd� |  ¡ | ¡ ksjt‚d	S )
zc
    Test that passing optional column in fill_values should only replace
    matching columns
    r	   r¥   r‹   )r™   r¦   r   r   r§   r¦   r1   Nr¨   r©   r   r   r   Ú2test_write_table_html_fill_values_optional_columns¹  s    r®   c                  C   s„   t ƒ } tdgdggdddd�}tjj|d< tj|| tjdfdd	� tdgdggdd
�}t ƒ }tj||dd� |  ¡ | ¡ ks€t‚dS )zi
    Test that passing masked values in fill_values should only replace
    masked columns or values
    r	   r¥   T)Úi4Úi8)rB   r7   r;   r   ZTESTr   r§   r‹   r1   N)	r   r   r8   Úmar7   r   r"   rŸ   r   r©   r   r   r   Ú(test_write_table_html_fill_values_maskedÉ  s    r²   c                  C   s¦   dddg} dddg}ddd	g}t ƒ }t| ||gd
d�}tj||ddd� dddg} dddg}ddd	g}t ƒ }t| ||gd
d�}tj||dd� | ¡ | ¡ ks¢t‚dS )zy
    Test to make sure that the HTML writer writes multidimensional
    columns with correctly replaced fill_values.
    r	   r   r   r~   r€   r‚   r„   r…   r†   r‡   r‹   )r   Úzr   r§   )r³   r³   r³   r1   Nr¨   )rF   r�   r‘   rª   r    r¬   r«   r   r   r   Ú'test_multicolumn_table_html_fill_valuesÚ  s    





r´   c                  C   sÄ   t ƒ } tddddgddddggdd	d
�}tjj|d dd…< tjj|d dd…< tj|| tjdfgdd� tddddgddddggdd�}t ƒ }tj||dd� t| ¡ ƒ |  ¡ | ¡ ksÀt	‚dS )z…
    Test that passing masked values in fill_values should only replace
    masked columns or values for multidimensional tables
    r	   r   r   r   z--r   r   r¥   T)rB   r7   r   ZMASKEDr   r§   r‹   r1   N)
r   r   r8   r±   r7   r   r"   ÚprintrŸ   r   r©   r   r   r   Ú5test_multi_column_write_table_html_fill_values_maskedò  s    " ÿr¶   c               	   C   st   ddg} ddg}dddœ}t | |g| ¡ d�}d	}tƒ �"}|j|d
|d� | ¡  ¡ }W 5 Q R X || ¡ kspt‚dS )z^
    Test to make sure that the HTML writer writes out using the
    supplied formatting.
    r	   r   gz#Ñ�þ%«=g  ,™¾lÂZ04dz.2e)rˆ   r‰   r‹   ai  <html>
 <head>
  <meta charset="utf-8"/>
  <meta content="text/html;charset=UTF-8" http-equiv="Content-type"/>
 </head>
 <body>
  <table>
   <thead>
    <tr>
     <th>C1</th>
     <th>C2</th>
    </tr>
   </thead>
   <tr>
    <td>0001</td>
    <td>1.23e-11</td>
   </tr>
   <tr>
    <td>0002</td>
    <td>-9.88e+11</td>
   </tr>
  </table>
 </body>
</html>
    r   )r2   ÚformatsN)r   Úkeysr   r"   rŸ   rŽ   r   )rF   r�   r·   r+   rl   Úspr’   r   r   r   Ú"test_write_table_formatted_columns  s    
rº   c                  C   s8   ddddg} t j| dd�}t |d ddgk¡s4t‚d	S )
z8
    Test reading an HTML table with unicode values
    r-   z<tr><td>&#x0394;</td></tr>u   <tr><td>Î”</td></tr>r/   r0   r1   rF   u   Î”N)r   r6   r8   r9   r   r=   r   r   r   Útest_read_html_unicode2  s    ür»   )2Ú__doc__Úior   Únumpyr8   rK   Z
astropy.ior   Zastropy.io.asciir   r   Zastropy.tabler   Z"astropy.utils.compat.optional_depsr   r   Úcommonr
   r   Zbs4r   r   ÚmarkZskipifr   r'   r,   r?   rE   rG   rP   rT   rW   rm   rs   rx   r|   r“   r–   r—   r›   r¡   r¤   r­   r®   r²   r´   r¶   rº   r»   r   r   r   r   Ú<module>   sj   








0
"
0
C:
:0

 
(+