a
    ߙfb:S                     @   sJ  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	 d dl
Z
d dlmZmZ d dlmZ d dlmZ d dlmZ e  e
jjdu sJ ej Ze
je e
jjdusJ dZedZd	d
 ZG dd dZdd Zdd ZG dd dZ ej!j"G dd dZ#G dd dZ$G dd dZ%G dd de%Z&G dd de%Z'dS )    N)assert_array_equal)Time	TimeDelta)iers)get_pkg_data_filename)test_importsz%/usr/share/zoneinfo/leap-seconds.listzdata/leap-seconds.listc                   C   s(   t jjt jksJ t jjt jks$J d S N)r   confiers_leap_second_auto_urlIERS_LEAP_SECOND_URLietf_leap_second_auto_urlIETF_LEAP_SECOND_URL r   r   Hlib/python3.9/site-packages/astropy/utils/iers/tests/test_leap_second.pytest_configuration*   s    r   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zej	
d
edeje fdd Zej	
d
edeje fdd Zej	jeje de ddd ZdS )TestReadingz*Basic tests that leap seconds can be read.c                 C   s   t |d dksJ t |d dk|d dkB |d dk B sDJ t |d dksZJ t|d |d |d dd	d
}t |t|d dd
ksJ d S )Nday   month   year  i  )r   r   r   Zymdhmsformatmjd)npallr   )selflstr   r   r   verify_day_month_year4   s    

z!TestReading.verify_day_month_yearc                 C   s   t jt j}|jtdddks$J |d d dks8J |d d dksLJ |d d	 d
ks`J |d d	 dkstJ | | d S N
2020-06-28taiZscaler   r   ie  tai_utc
   i  %   )r   LeapSecondsfrom_iers_leap_secondsIERS_LEAP_SECOND_FILEexpiresr   r    r   r   r   r   r   test_read_leap_second_dat=   s    z%TestReading.test_read_leap_second_datc              
   C   s   t t j}zz<t dkr,t t jd nt t jd tjtj}W n6 t j	y } zt
d|  W Y d }~n
d }~0 0 W t t j| nt t j| 0 |jtdddksJ d S )NZDarwinZfr_FRz
fr_FR.utf8zLocale error: r"   r#   r$   )locale	setlocaleLC_ALLplatformsystemr   r)   r*   r+   Errorpytestskipr,   r   )r   Zcurrentr   er   r   r    test_read_leap_second_dat_localeH   s    ( z,TestReading.test_read_leap_second_dat_localec                 C   s2   t jt j}t jt j}t||ks.J d S r   )r   r)   r*   r+   openr   r   )r   r   ls2r   r   r   test_open_leap_second_datZ   s
    z%TestReading.test_open_leap_second_datfilefile:c                 C   s   t j|}|jtdddks"J |d d dks6J |d d dksJJ |d d	 d
ks^J |d d	 dksrJ | | d S r!   )r   r)   from_leap_seconds_listr,   r   r    )r   r<   r   r   r   r   test_read_leap_seconds_list`   s    z'TestReading.test_read_leap_seconds_listc                 C   s.   t j|}t j|}t||ks*J d S r   )r   r)   r>   r9   r   r   )r   r<   r   r:   r   r   r   test_open_leap_seconds_listl   s    z'TestReading.test_open_leap_seconds_listsystem does not have reasonc                 C   s4   t jt}|jt k }|r(td |r0J d S )N#System leap second file is expired.)	r   r)   r9   SYSTEM_FILEr,   r   nowr5   r6   )r   r   Zexpiredr   r   r   test_open_system_filet   s
    
z!TestReading.test_open_system_fileN)__name__
__module____qualname____doc__r    r.   r8   r;   r5   markparametrizeLEAP_SECOND_LISTurllibrequestpathname2urlr?   r@   skipifospathisfilerE   rG   r   r   r   r   r   1   s&   	
	
r   c              	   C   sx   t j }t|d}t|dB}|dd|  gt|ddd   |W  d   S 1 sj0    Y  dS )z@copy the built-in IERS file but set a different expiration date.zfake_leap_seconds.datw
z#  File expires on    r'   N)r   r)   r*   strjoinr9   writesplit)Z
expirationtmpdirr   	fake_fileZfhr   r   r   make_fake_file~   s    
r_   c                 C   s0   t d| }tj|}|jtdddks,J d S )N28 June 2345
2345-06-28r#   r$   )r_   r   r)   r*   r,   r   )r]   r^   Zfaker   r   r   test_fake_file   s    
rb   c                   @   sV   e Zd Zejejdd Zejejdd Z	ejejdd Z
dd Zd	S )
TestAutoOpenExplicitListsc                 C   s(   t jt jg}|jd t jks$J d S )Ndata_urlr   r)   	auto_openr+   metar-   r   r   r   test_auto_open_simple   s    z/TestAutoOpenExplicitLists.test_auto_open_simplec                 C   s.   t jdt jg}|jd dt jfv s*J d S )Nerfard   re   r-   r   r   r   test_auto_open_erfa   s    z-TestAutoOpenExplicitLists.test_auto_open_erfac                 C   s   t d|}tjdd tjdtj|g}|jtdddksDJ |j	d t
|ksZJ d	tj| }tjdtj|g}|jtdddksJ |j	d t
|ksJ W d    n1 s0    Y  d S )
Nr`   auto_max_age`yri   ra   r#   r$   rd   r=   )r_   r   r	   set_tempr)   rf   r+   r,   r   rg   rY   rO   rP   rQ   r   r]   r^   r   Zfake_urlr:   r   r   r   test_fake_future_file   s    
z/TestAutoOpenExplicitLists.test_fake_future_filec                 C   sL  t d|}t d|}tj||tjg}|jd tjks<J ttj  tj||g}W d    n1 sn0    Y  |jd |ksJ |j	t
dddksJ tjdd " tj|tjg}W d    n1 s0    Y  |jd tjksJ tjdd   tj||g}W d    n1 s*0    Y  |jd |ksHJ d S )N28 June 2010z27 June 2012rd   z
2012-06-27r#   r$   rk   )r_   r   r)   rf   r+   rg   r5   warnsIERSStaleWarningr,   r   r	   rm   )r   r]   Z
fake_file1Z
fake_file2r   r:   Zls3Zls4r   r   r   test_fake_expired_file   s$    


.$0z0TestAutoOpenExplicitLists.test_fake_expired_fileN)rH   rI   rJ   r5   rL   filterwarningsr   rr   rh   rj   ro   rs   r   r   r   r   rc      s   


rc   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestRemoteURLsc                 C   s   dt j_d S )NTr   r	   auto_downloadclsr   r   r   setup_class   s    zTestRemoteURLs.setup_classc                 C   s   dt j_d S )NFrv   rx   r   r   r   teardown_class   s    zTestRemoteURLs.teardown_classc                 C   s&   t jt jg}|jt ks"J d S r   )r   r)   rf   r   r,   r   rF   r-   r   r   r   test_iers_url   s    zTestRemoteURLs.test_iers_urlc                 C   s&   t jt jg}|jt ks"J d S r   )r   r)   rf   r   r,   r   rF   r-   r   r   r   test_ietf_url   s    zTestRemoteURLs.test_ietf_urlN)rH   rI   rJ   rz   r{   r|   r}   r   r   r   r   ru      s   ru   c                   @   s   e Zd ZdZd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e	j
jeje de ddd Ze	j
jdd ZdS )TestDefaultAutoOpenz/Test auto_open with different _auto_open_files.c                 C   s8   t j tdt t jj dd | _t jj	 | _d S )N   Zjdr   )
r   r)   Z_todayr   Z_none_to_floatr	   rk   good_enough_auto_open_filescopyr   r   r   r   setup   s    zTestDefaultAutoOpen.setupc                 C   s   | j tj_ d S r   )r   r   r)   r   r   r   r   teardown   s    zTestDefaultAutoOpen.teardownc                 G   s   |D ]}t jj| qdS )zbRemove some files from the auto-opener.

        The default set is restored in teardown.
        N)r   r)   r   remove)r   filesfr   r   r   remove_auto_open_files   s    z*TestDefaultAutoOpen.remove_auto_open_filesc                 C   sN   t jdd t j }W d    n1 s.0    Y  |jd dksJJ d S )Nrk   順 rd   ri   )r   r	   rm   r)   r9   rg   r-   r   r   r   test_erfa_found   s    (z#TestDefaultAutoOpen.test_erfa_foundc                 C   sZ   |  d tjdd tj }W d    n1 s80    Y  |jd tjksVJ d S )Nri   rk   r   rd   )r   r   r	   rm   r)   r9   rg   r+   r-   r   r   r   test_builtin_found   s    
(z&TestDefaultAutoOpen.test_builtin_foundc                 C   s&   t jt j}|j| jks"J dd S )NzThe leap second file built in to astropy is expired. Fix with:
cd astropy/utils/iers/data/; . update_builtin_iers.sh
and commit as a PR (for details, see release procedure).)r   r)   r9   r+   r,   r   r-   r   r   r   test_builtin_not_expired  s    z,TestDefaultAutoOpen.test_builtin_not_expiredc              	   C   sH  t d|}tjddH tjd| tj }W d    n1 sH0    Y  W d    n1 sf0    Y  |jtdddksJ |jd t	|ksJ d	t
j| }tjddH tjd
| tj }W d    n1 s0    Y  W d    n1 s
0    Y  |jtdddks,J |jd t	|ksDJ d S )Nr`   rk   rl   system_leap_second_filera   r#   r$   rd   r=   r
   )r_   r   r	   rm   r)   r9   r,   r   rg   rY   rO   rP   rQ   rn   r   r   r   ro     s    
FHz)TestDefaultAutoOpen.test_fake_future_filec              	   C   s   |  ddd td|}tjd| tj }|jd tjksFJ |  tj t	
tj tj }W d    n1 s~0    Y  |jd |ksJ |jtddd	ksJ W d    n1 s0    Y  d S )
Nri   r
   r   rp   r   rd   z
2010-06-28r#   r$   )r   r_   r   r	   rm   r)   r9   rg   r+   r5   rq   rr   r,   r   )r   r]   r^   r   r:   r   r   r   rs     s    

(z*TestDefaultAutoOpen.test_fake_expired_filerA   rB   c                 C   s   t jtj| jkrtd | d t j	
dt t j }|j| jksRJ |jd t jtfv sjJ td|}|t jjd< t j }|jt ksJ |jd tksJ W d    n1 s0    Y  d S )NrD   ri   r   rd   z28 June 2017r   )r   r)   r9   rE   r,   r   r5   r6   r   r	   rm   rg   r+   r_   r   r   rF   )r   r]   r   r^   r:   r   r   r   $test_system_file_used_if_not_expired.  s    





z8TestDefaultAutoOpen.test_system_file_used_if_not_expiredc                 C   sb   zRdt j_| dt jd t j }|j| jks4J |j	d 
dsHJ W dt j_n
dt j_0 d S )NTri   r   rd   ZhttpF)r   r	   rw   r   r+   r)   r9   r,   r   rg   
startswithr-   r   r   r   &test_auto_open_urls_always_good_enoughE  s    

z:TestDefaultAutoOpen.test_auto_open_urls_always_good_enoughN)rH   rI   rJ   rK   r   r   r   r   r   r5   rL   remote_datar   ro   rs   rR   rS   rT   rU   rE   r   r   r   r   r   r   r~      s    

r~   c                   @   s    e Zd ZdZdd Zdd ZdS )ERFALeapSecondsSafezrBase class for tests that change the ERFA leap-second tables.

    It ensures the original state is restored.
    c                 C   s&   t j  | _| _t jj | _| _d S r   )ri   leap_secondsgeterfa_lsZ_erfa_ls_expireserfa_expiresr   r   r   r   r   ]  s    zERFALeapSecondsSafe.setupc                 C   s   t j| j | jt j_d S r   )ri   r   setr   r   r   r   r   r   r   b  s    zERFALeapSecondsSafe.teardownN)rH   rI   rJ   rK   r   r   r   r   r   r   r   X  s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestFromERFAc                 C   sb   t j }|jg dksJ t|jts,J |j| jks<J t	|d }t
|| jks^J d S )Nr   r   r%   )r   r)   	from_erfacolnames
isinstancer,   r   r   r   arrayr   r   r   r   ls_arrayr   r   r   test_get_erfa_lsi  s    
zTestFromERFA.test_get_erfa_lsc                 C   sb   t jjdd}|jg dks J t|jts0J t|d }t	|| j
d t| ks^J d S )NTZbuilt_inr   )r   r)   r   r   r   r,   r   r   r   r   r   lenr   r   r   r   test_get_built_in_erfa_lsq  s
    z&TestFromERFA.test_get_built_in_erfa_lsc                 C   s   t j| jd d  tj }t|t| jd ks:J t	|d }t
|| jd d ksdJ tjjdd}t|t|ksJ t jd  t j }t|t|ksJ t	|d }t
||ksJ d S )Nir&   r   Tr   )ri   r   r   r   r   r)   r   r   r   r   r   r   )r   r   r   r:   Zerfa_built_inZ	ls2_arrayr   r   r   test_get_modified_erfa_lsx  s    

z&TestFromERFA.test_get_modified_erfa_lsc                 C   sR   t jd}t|jtsJ |j| jks,J t|d }t	|| j
ksNJ d S )Nri   r   )r   r)   r9   r   r,   r   r   r   r   r   r   r   r   r   r   	test_open  s
    zTestFromERFA.test_openN)rH   rI   rJ   r   r   r   r   r   r   r   r   r   h  s   r   c                       sj   e Zd Z fddZdd Zdd Zejddd	d
 Z	dd Z
dd Zdd Zdd Zdd Z  ZS )TestUpdateLeapSecondsc                    s0   t    tj | _tj  tj	 | _
d S r   )superr   r   r)   r*   r   ri   r   r   r   r   r   	__class__r   r   r     s    

zTestUpdateLeapSeconds.setupc                 C   sv   | j | j d dk }t| jt|ks.J dt| jt|ksHJ dt| jd }t|||jksrJ dS )z3Leap second should match between built-in and ERFA.r   r   z!built-in leap seconds out of datezERFA leap seconds out of dater   N)r   r   r   r   r   r   ZastypeZdtype)r   Zerfa_since_1970Zoverlapr   r   r   test_built_in_up_to_date  s    z.TestUpdateLeapSeconds.test_built_in_up_to_datec                 C   s8   | j  }|dksJ tj }t|| jks4J dS )z/An update with built-in should not do anything.r   N)r   update_erfa_leap_secondsri   r   r   r   r   r   r   n_updatenew_erfa_lsr   r   r   test_update_with_built_in  s    

z/TestUpdateLeapSeconds.test_update_with_built_inn_short)r      c                 C   st   t j| jd|   | j }||ks.J t j }t|| j | j }|dksZJ t j }t|| j dS )z2Check whether we can recover removed leap seconds.Nr   ri   r   r   r   r   r   r   r   )r   r   r   r   	n_update2new_erfa_ls2r   r   r   test_update  s    



z!TestUpdateLeapSeconds.test_updatec                 C   sJ   t j| jd d  | jjdd}|dks0J t j }t|| j d S )NTZinitialize_erfar   r   r   r   r   r   test_update_initialize_erfa  s
    
z1TestUpdateLeapSeconds.test_update_initialize_erfac                 C   s   | j jdd}|t| j ks J tj }|d  dks>J | j  }|dksTJ tj }t|| | j jdd}|dksJ tj }t|| j d S )Nemptyr   r   r   r   T)	r   r   r   ri   r   r   minr   r   )r   r   r   r   r   Z	n_update3Znew_erfa_ls3r   r   r   test_update_overwrite  s    




z+TestUpdateLeapSeconds.test_update_overwritec                 C   s  t j| jd d  | j }d|d d< tjtdd |	  W d    n1 sX0    Y  t
t j | jd d  tjtdd |j	dd W d    n1 s0    Y  t
t j | j t j| jd d  |j	d	d}|d
ksJ t j }t
|| j d S )Nr      r%   r'   ZjumpmatchTr   Zonlyr   ri   r   r   r   r   r   r5   raises
ValueErrorr   r   r   )r   badr   r   r   r   r   test_bad_jump  s    
&*
z#TestUpdateLeapSeconds.test_bad_jumpc                 C   sf   t j| jd d  | j }d|d d< tjtdd |	  W d    n1 sX0    Y  d S )Nr   r   r   r'   z
not on 1str   )
ri   r   r   r   r   r   r5   r   r   r   r   r   r   r   r   test_bad_day  s
    
z"TestUpdateLeapSeconds.test_bad_dayc                 C   s   t j| jd d  | j }d|d d< tjtdd |	  W d    n1 sX0    Y  t
t j | jd d  d S )Nr   r   r   r'   ZJanuaryr   r   r   r   r   r   test_bad_month  s    
&z$TestUpdateLeapSeconds.test_bad_month)rH   rI   rJ   r   r   r   r5   rL   rM   r   r   r   r   r   r   __classcell__r   r   r   r   r     s   

r   )(Zurllib.requestrO   rS   r/   r2   r5   Znumpyr   Znumpy.testingr   ri   Zastropy.timer   r   Zastropy.utils.iersr   Zastropy.utils.datar   Z astropy.tests.tests.test_importsr   r   r   r)   rf   Z
iers_tableupdaterE   rN   r   r   r_   rb   rc   rL   r   ru   r~   r   r   r   r   r   r   r   <module>   s:   
M
9{&