o
    KXh%                    @  s  d dl 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Zd dlZd dlmZmZmZmZmZ d dlmZ ddlmZ ddlmZmZmZ d dlmZ ed	Z e! \Z"Z#z
ej$$d
 dZ%W n ej$j&y   dZ%Y nw da'da(da)e
*e+j,d Z-e-d Z.ed Z/eddZ0dd Z1dd Z2G dd dZ3G dd dZ4G dd de3eZ5G dd de5Z6G dd de4e5Z7G dd de4e6Z8G d d! d!e5Z9G d"d# d#e9Z:G d$d% d%e5Z;G d&d' d'e;Z<e=e% d(G d)d* d*e5Z>e=e% d(G d+d, d,e>Z?G d-d. d.eZ@G d/d0 d0e@ZAG d1d2 d2eZBG d3d4 d4eBZCG d5d6 d6e3eZDG d7d8 d8eDZEG d9d: d:e3eZFG d;d< d<eFZGG d=d> d>eZHG d?d@ d@eHZIG dAdB dBe3eZJG dCdD dDeJZKG dEdF dFeZLG dGdH dHeLZMG dIdJ dJejNZOejPddKG dLdM dMZQejPddKG dNdO dOZRG dPdQ dQZSG dRdS dSZTdS )T    )annotationsN)datedatetimetime	timedeltatimezone)cached_property   )_support)OS_ENV_LOCKTZPATH_TEST_LOCKZoneInfoTestBase)import_modulelzmaZtzdataTFdatazzoneinfo_data.jsonhoursc                   C  s6   t tjddatttd atttd ddad S )NZzoneinfo)prefixZv2v1T)r   )	pathlibPathtempfilemkdtempTEMP_DIRZoneInfoDataZONEINFO_JSONZONEINFO_DATAZONEINFO_DATA_V1 r   r   J/opt/python-3.10.19/usr/lib/python3.10/test/test_zoneinfo/test_zoneinfo.pysetUpModule,   s   r    c                   C  s   t t d S N)shutilrmtreer   r   r   r   r   tearDownModule6   s   r$   c                      s8   e Zd ZdZedd Zedd Z fddZ  ZS )TzPathUserMixinaH  
    Adds a setUp() and tearDown() to make TZPATH manipulations thread-safe.

    Any tests that require manipulation of the TZPATH global are necessarily
    thread unsafe, so we will acquire a lock and reset the TZPATH variable
    to the default state before each test and release the lock after the test
    is through.
    c                 C  s   d S r!   r   selfr   r   r   tzpathD      zTzPathUserMixin.tzpathc                 C     dS )NTr   r&   r   r   r   block_tzdataH   r)   zTzPathUserMixin.block_tzdatac                   s`   t  }|| j| j| jtd | | j	 W d    n1 s$w   Y  t
   d S )N)r+   lock)
contextlib	ExitStackenter_contexttzpath_contextr(   r+   r   
addCleanuppop_allclosesupersetUpr'   stack	__class__r   r   r5   L   s   

zTzPathUserMixin.setUp)	__name__
__module____qualname____doc__propertyr(   r+   r5   __classcell__r   r   r8   r   r%   :   s    	

r%   c                      s0   e Zd ZdZG dd deZ fddZ  ZS )DatetimeSubclassMixinzP
    Replaces all ZoneTransition transition dates with a datetime subclass.
    c                   @  s   e Zd Zedd ZdS )z&DatetimeSubclassMixin.DatetimeSubclassc                 C  s,   | |j |j|j|j|j|j|j|j|jd	S )N)tzinfofold)	yearmonthdayhourminutesecondmicrosecondrA   rB   )clsdtr   r   r   from_datetime`   s   z4DatetimeSubclassMixin.DatetimeSubclass.from_datetimeN)r:   r;   r<   classmethodrL   r   r   r   r   DatetimeSubclass_   s    rN   c                 #  sB    t  |}|D ]}|j}| j|}tj||d}|V  q	d S )N)
transition)r4   load_transition_examplesrO   rN   rL   dataclassesreplace)r'   keyZtransition_examplesztrK   Znew_dtZnew_ztr8   r   r   rP   n   s   z.DatetimeSubclassMixin.load_transition_examples)r:   r;   r<   r=   r   rN   rP   r?   r   r   r8   r   r@   Z   s    r@   c                      s   e Zd ZeZdZ fddZedd Ze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d Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Z  ZS )*ZoneInfoTestZoneInfoc                   s   t    | j  d S r!   )r4   r5   klassclear_cacher&   r8   r   r   r5   {   s   
zZoneInfoTest.setUpc                 C     t S r!   r   r&   r   r   r   zoneinfo_data   r)   zZoneInfoTest.zoneinfo_datac                 C  
   | j jgS r!   r[   r(   r&   r   r   r   r(         
zZoneInfoTest.tzpathc                 C  s
   |  |S r!   rW   r'   rS   r   r   r   zone_from_key      
zZoneInfoTest.zone_from_keyc                 C     t  S r!   )ZoneDumpDatatransition_keysr&   r   r   r   zones      zZoneInfoTest.zonesc                 C  rc   r!   )rd   fixed_offset_zonesr&   r   r   r   rh      rg   zZoneInfoTest.fixed_offset_zonesc                 C  s
   t |S r!   )rd   rP   r`   r   r   r   rP      rb   z%ZoneInfoTest.load_transition_examplesc              	   C  s   |   D ]$}| | | |}| t|| W d    n1 s#w   Y  q| jjd }| j|}t|d8}| jd|d | j	
|}| t|t| W d    n1 s]w   Y  W d    d S W d    d S 1 suw   Y  d S )Nr   rbz	Repr test)	test_namepath)rf   subTestra   assertEqualstrr[   keyspath_from_keyopenrW   	from_filerepr)r'   rS   zifile_key	file_pathfzi_ffr   r   r   test_str   s    
"zZoneInfoTest.test_strc           	      C  sb  t t|  }| |}| j}| jdd | t|| W d    n1 s)w   Y  | jj	d }| j
|}t|d}| jj||d}W d    n1 sRw   Y  | jdd | t|| W d    n1 spw   Y  t|d}| j|}W d    n1 sw   Y  | jdd | t|| W d    d S 1 sw   Y  d S )Nzfrom key)namer   ri   rS   zfrom file with keyzfrom file without key)nextiterrf   rW   
class_namerl   ZassertRegexrs   r[   ro   rp   rq   rr   )	r'   rS   rt   r~   ru   rv   rw   rx   Zzi_ff_nkr   r   r   	test_repr   s(   
"zZoneInfoTest.test_reprc              
     s   t t  } fdd}d j|fd jj|fd|d ff}|D ]U\}}}||} |  |j| W d    n1 sAw   Y   | d   t	 d|_W d    n1 sbw   Y  W d    n1 sqw   Y  q!d S )Nc                   sB   t  j| d} j|W  d    S 1 sw   Y  d S )Nri   )rq   r[   rp   rW   rr   )rS   rw   r&   r   r   from_file_nokey   s   
$z8ZoneInfoTest.test_key_attribute.<locals>.from_file_nokeyzPrimary constructorno_cacherr   z
: readonlyz
Some/Value)
r|   r}   rf   rW   r   rl   rm   rS   assertRaisesAttributeError)r'   rS   r   Zconstructorsmsgconstructorexpectedrt   r   r&   r   test_key_attribute   s&   
zZoneInfoTest.test_key_attributec              	   C  sN   g d}|D ]}|  | jj | | W d    n1 sw   Y  qd S )N)zEurasia/BadzoneZBZQzAmerica.Los_Angelesu   🇨🇦u   America/NewYork)r   moduleZZoneInfoNotFoundErrorrW   r'   Zbad_keysZbad_keyr   r   r   test_bad_keys   s   zZoneInfoTest.test_bad_keysc              	   C  sJ   g d}|D ]}|  t | | W d    n1 sw   Y  qd S )N)z/America/Los_AngeleszAmerica/Los_Angeles/z../zoneinfo/America/Los_AngeleszAmerica/../America/Los_AngeleszAmerica/./Los_Angeles)r   
ValueErrorrW   r   r   r   r   test_bad_keys_paths   s   z ZoneInfoTest.test_bad_keys_pathsc              	   C  sV   ddg}|D ]"}t |}| t | j| W d    n1 s#w   Y  qd S )N    s   AAAA3               )ioBytesIOr   r   rW   rr   )r'   Z	bad_zonesZbad_zonefobjr   r   r   test_bad_zones   s   
zZoneInfoTest.test_bad_zonesc              
   C  s   t t|  }| |}tdddtjdtftdddtftdddt	ft
dt	fdt	fdt	fg}|D ]4\}}| j|d" | | || W d    n1 sTw   Y  W d    n1 scw   Y  q4d S )N  r	   rA   r   z
2019-01-01)val)r|   r}   rf   ra   r   r   utcr   r   	TypeErrorr   rl   r   fromutc)r'   rS   zone
bad_valuesr   exc_typer   r   r   test_fromutc_errors   s$   

	z ZoneInfoTest.test_fromutc_errorsc                 C  sN   |  d}tddd|d}| | t | | t | | d d S )NUTC  r	   r   )rW   r   rm   	utcoffsetZEROdsttzname)r'   rt   rK   r   r   r   test_utc  s
   
zZoneInfoTest.test_utcc              	   C  s   g }|   D ](}| |D ] }|||jtdd |jf |||jtdd |jf qq|D ]F\}}}| j|||d1 | |}|j	|d}| 
| |j| | 
| |j| | 
| |j| W d    n1 srw   Y  q1d S )N   )Zdays)rS   rK   offsetr   )rf   rP   appendrO   r   offset_beforeoffset_afterrl   ra   rR   rm   r   r   r   )r'   
test_casesrS   Zzone_transitionrK   r   tzir   r   r   test_unambiguous  s4   
zZoneInfoTest.test_unambiguousc              	   C  sD  g }|   D ]}g g d}| |D ]}|jr|d }n|jr$|d }nd }q|jtdd }||d|jf ||d|jf |j}||d|jf ||d|jf |jtdd }||d|jf ||d|jf |j	tdd }||d|jf ||d|jf |j	}||d|jf ||d|jf |j	tdd }||d|jf ||d|jf q|
 D ]\}}|||f|f qq|D ]P\\}}}| j||d: | |}	|D ]*\}}
}|j|
|	d}| | |j| | | |j| | | |j| qW d    n	1 sw   Y  qd S )	N)foldsgapsr   r   r	   secondsr   )rS   grprB   rA   )rf   rP   rB   gapanomaly_startr   r   r   r   anomaly_enditemsrl   ra   rR   rm   r   r   r   )r'   r   rS   ZtestsrT   Z
test_groupZno_peephole_optrK   r   r   rB   r   r   r   r   test_folds_and_gaps4  sV   



z ZoneInfoTest.test_folds_and_gapsc           	   	   C  s   |   D ]X}| |}| j|dC | |D ]5}|jsq|j}|tdd }|tdd }||}| |jd||f ||}| |jd||f qW d    n1 sWw   Y  qd S )Nr{   r	   r   r   )	rf   ra   rl   rP   rB   transition_utcr   
astimezonerm   )	r'   rS   rt   rT   dt_utcZdt_before_utcZdt_after_utcZ	dt_beforeZdt_afterr   r   r   test_folds_from_utck  s"   


z ZoneInfoTest.test_folds_from_utcc              	   C  s   |   D ]>}| |}tdddd|d}| j|d  | | d  | | d  | | d  W d    n1 s=w   Y  qd S N      r	   i  r   r{   )rf   ra   r   rl   assertIsr   r   r   )r'   rS   rt   tr   r   r   test_time_variable_offset}  s   
z&ZoneInfoTest.test_time_variable_offsetc              	   C  s   |   D ]C\}}| |}tdddd|d}| j|d# | | |j | | |j | | |j W d    n1 sBw   Y  qd S r   )rh   ra   r   rl   rm   r   r   r   )r'   rS   r   rt   r   r   r   r   test_time_fixed_offset  s   
z#ZoneInfoTest.test_time_fixed_offset)r:   r;   r<   py_zoneinfor   r~   r5   r>   r[   r(   ra   rf   rh   rP   ry   r   r   r   r   r   r   r   r   r   r   r   r   r?   r   r   r8   r   rU   w   s2    

7rU   c                   @  s   e Zd ZeZdd ZdS )CZoneInfoTestc           	   	   C  s   dd }ddg}d}|  |}| |D ]}|jr(|jjtkr(|jj|d} nqdD ]4}|r4||}n|}| j|d |	|}| 
|jd	 | 
|jd
 W d   n1 sZw   Y  q+dS )a:  Test that fold isn't mutated when no change is necessary.

        The underlying C API is capable of mutating datetime objects, and
        may rely on the fact that addition of a datetime object returns a
        new datetime; this test ensures that the input datetime to fromutc
        is not mutated.
        c                 S  s@   G dd dt | }|| j| j| j| j| j| j| j| j| j	d	S )Nc                      s   e Zd Z fddZ  ZS )zLCZoneInfoTest.test_fold_mutate.<locals>.to_subclass.<locals>.SameAddSubclassc                   s   |t dkr| S t |S Nr   )r   r4   __add__)r'   otherr8   r   r   r     s   zTCZoneInfoTest.test_fold_mutate.<locals>.to_subclass.<locals>.SameAddSubclass.__add__)r:   r;   r<   r   r?   r   r   r8   r   SameAddSubclass  s    r   r   )
typerC   rD   rE   rF   rG   rH   rI   rB   rA   )rK   r   r   r   r   to_subclass  s   z3CZoneInfoTest.test_fold_mutate.<locals>.to_subclassFTEurope/Londonr   )FT)subclassr	   r   N)ra   rP   rB   r   r   r   r   rR   rl   r   rm   )	r'   r   r   rS   rt   rT   ZexamplerK   Z
dt_fromutcr   r   r   test_fold_mutate  s(   	


zCZoneInfoTest.test_fold_mutateN)r:   r;   r<   
c_zoneinfor   r   r   r   r   r   r     s    r   c                   @     e Zd ZdS )ZoneInfoDatetimeSubclassTestNr:   r;   r<   r   r   r   r   r         r   c                   @  r   )CZoneInfoDatetimeSubclassTestNr   r   r   r   r   r     r   r   c                      s(   e Zd Ze fddZdd Z  ZS )ZoneInfoSubclassTestc                   s4   t    G dd d| j}d| _| j| _|| _d S )Nc                   @  r   )z3ZoneInfoSubclassTest.setUpClass.<locals>.ZISubclassNr   r   r   r   r   
ZISubclass  r   r   )r4   
setUpClassrW   r~   parent_klass)rJ   r   r8   r   r   r     s
   

zZoneInfoSubclassTest.setUpClassc                 C  s@   |  d}| d}| || | || j  | || j d S )Nr   )r   rW   assertIsNotZassertIsInstance)r'   Zbase_objZsub_objr   r   r   test_subclass_own_cache  s
   

z,ZoneInfoSubclassTest.test_subclass_own_cache)r:   r;   r<   rM   r   r   r?   r   r   r8   r   r     s    
r   c                   @     e Zd ZeZdS )CZoneInfoSubclassTestNr:   r;   r<   r   r   r   r   r   r   r         r   c                   @  s    e Zd Zedd Zdd ZdS )ZoneInfoV1Testc                 C  rY   r!   )r   r&   r   r   r   r[     r)   zZoneInfoV1Test.zoneinfo_datac                 c  s\    t ddd}tdd}|| }|| }t|D ]}||j  kr&|kr+n q|V  qd S )N  r	           r   )r   r   rd   rP   rO   )r'   rS   ZepochZmax_offset_32Zmin_dtZmax_dtrT   r   r   r   rP     s   
z'ZoneInfoV1Test.load_transition_examplesN)r:   r;   r<   r>   r[   rP   r   r   r   r   r     s    
r   c                   @  r   )CZoneInfoV1TestNr   r   r   r   r   r     r   r   z4Skipping tzdata-specific tests: tzdata not installedc                   @  s0   e Zd ZdZedd Zedd Zdd ZdS )	TZDataTestsa5  
    Runs all the ZoneInfoTest tests, but against the tzdata package

    NOTE: The ZoneDumpData has frozen test data, but tzdata will update, so
    some of the tests (particularly those related to the far future) may break
    in the event that the time zone policies in the relevant time zones change.
    c                 C  s   g S r!   r   r&   r   r   r   r(     r)   zTZDataTests.tzpathc                 C  r*   )NFr   r&   r   r   r   r+     r)   zTZDataTests.block_tzdatac                 C  s   | j |dS )Nr{   r_   r`   r   r   r   ra     s   zTZDataTests.zone_from_keyN)r:   r;   r<   r=   r>   r(   r+   ra   r   r   r   r   r     s    

r   c                   @  r   )CTZDataTestsNr   r   r   r   r   r     s    r   c                   @  sR   e Zd ZeZdd Zdd Zdd Zdd Zd	d
 Z	dd Z
dd ZdddZdS )WeirdZoneTestc              
   C  s  t dtdddd }t dtdd }ttddd	d
||g}d}| ||}| j|}tddd	d|d}tdddd|d}||f||ffD ]6\}	}
| jd|	d# | |		 |
j	 | |	
 |
j
 | |	 |
j W d    n1 syw   Y  qHtddd	d|dtddd	dddtjdftdddd|dtddddtjdfg}|D ]2\}}| jd|d ||}| || |tj}| || W d    n1 sw   Y  qd S )NLMT      r   )r   Zminutesr   STDr   [  	      ZSTD6r	   r   
   local)rz   rK                 r   )
ZoneOffsetr   ZoneTransitionr   construct_zonerW   rr   rl   rm   r   r   r   r   r   r   )r'   r   r   transitionsafterzfrt   Zdt0Zdt1rK   r   dtsZdt_localr   Z	dt_actualZdt_utc_actualr   r   r   test_one_transition#  s@   
z!WeirdZoneTest.test_one_transitionc              	   C  s   t dtt}ttddd||g}d}| ||}| j|}tdddtddd	tdddtd
ddtdddg}|D ]9}|j|d}| j|d# | 	|
 |j
 | 	| |j | 	| |j W d    n1 spw   Y  q<d S )NDSTr   r	   zSTD0DST-1,0/0,J365/25l     i  r   r   r   r     r   rK   )r   ONE_Hr   r   r   rW   rr   rR   rl   rm   r   r   r   )r'   r   r   r   r   rt   r   rK   r   r   r   test_one_zone_dstL  s*   




zWeirdZoneTest.test_one_zone_dstc              	   C  s  t dtt}t ddt t}g }tddD ]}|tt|ddd|| |tt|ddd|| qd	}| ||}| j	|}td
dd|ftddd|ftddd|ftddd|fg}|D ];\}	}
|	j
|d}	| j|	d# | |	 |
j | |	 |
j | |	 |
j W d    n1 sw   Y  qbtd|d}| d! | | d  | | d  | | d  W d    d S 1 sw   Y  d S )Nr   r   r       r   r	   r    i  r   i  r   r   r   zTesting datetime.time)r   r   r   ranger   r   r   r   rW   rr   rR   rl   rm   r   r   r   r   r   )r'   r   r   r   rC   r   r   rt   casesrK   r   r   r   r   r   test_no_tz_strf  s@   "zWeirdZoneTest.test_no_tz_strc           	   
   C  s   t dttt dttg}|D ]e}td ||g}d}| ||}| j|}tdddtdddtdddg}|D ]:}|j|d}| j	||d	# | 
| |j | 
| |j | 
| |j W d    n1 smw   Y  q8qd S )
Nr   r   r  r   r	   r   r  r   )r   rK   )r   r   r   r   r   rW   rr   r   rR   rl   rm   r   r   r   )	r'   offsetsr   r   r   r   rt   r   rK   r   r   r   test_tz_before_only  s.   





z!WeirdZoneTest.test_tz_before_onlyc                 C  sH   |  g d}| t | j| W d    d S 1 sw   Y  d S )Nr  )r   r   r   rW   rr   )r'   r   r   r   r   test_empty_zone  s   "zWeirdZoneTest.test_empty_zonec                 C  s  t dtdd}t dt}d||fttddd||d||fg}d	}| ||}| jj|d
d}tj|ftj	|ftddd|ftddd|fg}|D ]=\}}	|j
|d}
| jd|
|	d# | |
 |	j | |
 |	j | |
 |	j W d   n1 sw   Y  qJtjtjtdd ftddddddtdddftdddddddtdddddddftddddddtddddddftd ddtd ddftj	tj	fg}|D ] \}}|j
|d}
|j
tjd}| |||
 | |
| qdS )!a  Test when a transition is in the far past or future.

        Particularly, this is a concern if something:

            1. Attempts to call ``datetime.timestamp`` for a datetime outside
               of ``[datetime.min, datetime.max]``.
            2. Attempts to construct a timedelta outside of
               ``[timedelta.min, timedelta.max]``.

        This actually occurs "in the wild", as some time zones on Ubuntu (at
        least as of 2020) have an initial transition added at ``-2**58``.
        r   8r   GMTl         x  r	   l            ZGMT0Africa/Abidjanr{   iw  r   r   r   r   r   )rz   rK   r   Ni  ij     +   4   ik  ;   ?B r      r      r   )r   r   r   r   r   r   rW   rr   minmaxrR   rl   rm   r   r   r   r   r   r   )r'   r   r
  r   r   r   rt   Zoffset_casesdt_naiver   rK   Z	utc_casesZnaive_dtZnaive_dt_utcr   r   r   r   test_zone_very_large_timestamp  sJ   
"
z,WeirdZoneTest.test_zone_very_large_timestampc                 C  s$  t dtt}ttddd||g}d}| ||}| jj|dd}tddd|d}| d# | |	 |j	 | |
 |j
 | | |j W d    n1 sTw   Y  td	|d}| d
$ | |	 |j	 | |
 |j
 | | |j W d    d S 1 sw   Y  d S )Nr   r   r	   ZUTC0r{   r   r   zdatetime.datetimer   zdatetime.time)r   r   r   r   r   rW   rr   rl   rm   r   r   r   r   )r'   r   r   r   r   rt   rK   r   r   r   r   $test_fixed_offset_phantom_transition  s"   "z2WeirdZoneTest.test_fixed_offset_phantom_transitionNr   c           (      C  s  g }g }g }g g g}g g g}g g g}	d}
d}|
|g}dd }t t||dd d}|D ]Q}|\}}}t|D ]E\}\}}|| }|| }|	| }|d urX||  krV|ksXn q6||vra|| ||vrj|| |d ur{|| ||| q6q+t|}t|}t|}t }d}tt	|d	fD ]}|| }|| }|	| }|| }t
 }g }|D ]$} t| j }!t| j}"t|}#||!|"|#f || jd
d 7 }qt|}t|}$t|}%t|}&|d |d|  |d |td||||%|$|& |tjd|% | g|R   |tjd|% dg|R   |D ]}'|tjdg|'R   q'|t| |tj| dg|R   |tj| dg|R   |tjd| dg|R   |dkr|d ||d
 |d q|d |S )N)i   r   )l         l            c                 S  s6   t | tr| S | jrt| j }nd }|| j| jfS r!   )
isinstancetuplerO   intr   Z	timestampr   r   )rT   
trans_timer   r   r   zt_as_tuple  s   
z1WeirdZoneTest.construct_zone.<locals>.zt_as_tuplec                 S  s   | d S r   r   )xr   r   r   <lambda>+  s    z.WeirdZoneTest.construct_zone.<locals>.<lambda>r{   )lqr   ascii       TZifs   %d                  >6l>Bz>lbbbr   r      
)sortedmap	enumerater   indexlenr   r   r  r  	bytearrayr  r   Ztotal_secondsboolr   r   encodebyteswritestructpackseek)(r'   r   r   versionZisutcZisstdZleap_secondsZoffset_listsZtrans_times_listsZtrans_idx_listsZv1_rangeZv2_rangeZrangesr  rT   r  r   r   vZdt_minZdt_maxr  Ztrans_timesZ	trans_idxisutcntisstdcntleapcntzonefileZ
time_typesZ	time_typeZabbrstrZttinfosr   ZutcoffZisdstZabbrindtypecnttimecntcharcntZttinfor   r   r   r     s   






"  



zWeirdZoneTest.construct_zone)Nr   )r:   r;   r<   r   r   r   r   r  r  r  r  r  r   r   r   r   r   r      s    )+$=r   c                   @  r   )CWeirdZoneTestNr   r   r   r   r   rA    r   rA  c                      sh   e Zd ZeZdZdZdZe fddZ	edd Z
dd	 Zd
d Zdd Zdd Zedd Z  ZS )	TZStrTestr   r	   r   c                   s   t    |   |   d S r!   )r4   r   _populate_test_casespopulate_tzstr_headerrJ   r8   r   r   r     s   
zTZStrTest.setUpClassc                 C  sT   t  }tdD ]}|d7 }|d7 }|d7 }|tddddddd7 }qt|| _d S )Nr   r$     3r%  r&  r   )r0  r  r5  r6  r3  _tzif_header)rJ   out_r   r   r   rD    s   zTZStrTest.populate_tzstr_headerc                 C  sV   t | j}|dd |d ||d |d |d | jj||dS )z/Creates a zoneinfo file following a POSIX rule.r   r   r*  r"  r{   )r   r   rG  r7  r4  r2  rW   rr   )r'   tzstrr=  r   r   r   zone_from_tzstr  s   


zTZStrTest.zone_from_tzstrc              
   C  s   | j  D ]`\}}| j|d | |}W d    n1 sw   Y  |D ]>\}}}|j|d}| j|||d# | | |j | | |j | | |j W d    n1 s_w   Y  q&qd S )NrJ  r   )rJ  rK   r   )	r   r   rl   rK  rR   rm   r   r   r   )r'   rJ  r  rt   r  r   rI  rK   r   r   r   test_tzstr_localized  s   zTZStrTest.test_tzstr_localizedc           
   	   C  s   | j  D ]j\}}| j|d | |}W d    n1 sw   Y  |D ]H\}}}|| jkr1q&||j jtjd}|	|}|j|d}	| 
||	 || jkr[| 
|j|j| n| 
|jd |		tj}| 
|| q&qd S )NrL  r   r   )r   r   rl   rK  GAPr   rR   r   r   r   rm   FOLDrB   )
r'   rJ  r  rt   r  r   Zdt_typer   Zdt_actZdt_expr   r   r   test_tzstr_from_utc  s(   



zTZStrTest.test_tzstr_from_utcc              
   C  s   g d}|D ]8}| j |d( t|}| t| | | W d    n1 s*w   Y  W d    n1 s9w   Y  qd S )N)ZPST8PDT+11zGMT,M3.2.0/2,M11.1.0/3zGMT0+11,M3.2.0/2,M11.1.0/3zPST8PDT,M3.2.0/2zSTD+25zSTD-25zSTD+374zSTD+374DST,M3.2.0/2,M11.1.0/3zSTD+23DST+25,M3.2.0/2,M11.1.0/3zSTD-23DST-25,M3.2.0/2,M11.1.0/3zAAA4BBB,M1443339,M11.1.0/3zAAA4BBB,M3.2.0/2,0349309483959czAAA4BBB,M13.1.1/2,M1.1.1/2zAAA4BBB,M1.1.1/2,M13.1.1/2zAAA4BBB,M0.1.1/2,M1.1.1/2zAAA4BBB,M1.1.1/2,M0.1.1/2zAAA4BBB,M1.6.1/2,M1.1.1/2zAAA4BBB,M1.1.1/2,M1.6.1/2zAAA4BBB,M1.1.7/2,M2.1.1/2zAAA4BBB,M1.1.1/2,M2.1.7/2zAAA4BBB,-1/2,20/2zAAA4BBB,1/2,-1/2zAAA4BBB,367,20/2zAAA4BBB,1/2,367/2zAAA4BBB,J0/2,J20/2zAAA4BBB,J20/2,J366/2rL  )rl   reescapeZassertRaisesRegexr   rK  )r'   Zinvalid_tzstrsZinvalid_tzstrZtzstr_regexr   r   r   test_invalid_tzstr  s   %
zTZStrTest.test_invalid_tzstrc                   s   fdd}| j | j | ji | fdd}| fdd}| fdd}| fdd}|fdd}|fd	d}|fd
d}| fdd}| fdd}| fdd}| _d S )Nc                   s   t  }|   dS )zDecorator to call the addition methods.

            This will call a function which adds at least one new entry into
            the `cases` dictionary. The decorator will also assert that
            something was added to the dictionary.
            N)r/  )rw   Zprev_len)r  r   r   call  s   
z,TZStrTest._populate_test_cases.<locals>.callc                    s  d} t dtddt}t dtddt}tddd	|ftddd
dd|ftddd
dddd|ftddd
dddd|ftddd
dddd|ftddd
dddd|ftddd|ftddddddd|ftddddddd| ftddddddd| ftddddd|ftddddddd|ftddddddd|ftddddddd|ftddddddd| ftddddddd| ff| < d S )Nz EST5EDT,M3.2.0/4:00,M11.1.0/3:00ESTr   EDTr   r   r   r   r  r   r   rB   r	   r   r   r   r  r   r   r   r   r   )rJ  rV  rX  rO  rN  NORMALr  r   r   _add+  s(   z,TZStrTest._populate_test_cases.<locals>._addc                    s(  d} t dtt}t dtt}tddd|ftddddd	|ftdddd
d|ftddd|ftddddd	dd|ftddddddd|ftdddd
ddd|ftddddd	|ftdddd
d|ftddddd	dd|ftddddddd| ftdddd
ddd|ff| < d S )Nz"GMT0BST-1,M3.5.0/1:00,M10.5.0/2:00r
  BSTr   r      r   r   r  r   r         r	   rZ  r         r   r   r   r   )rJ  r
  r_  r\  r   r   r^  G  s    c                    sj  d} t dtddt}t dtddt}tddd	|ftddd
dd|ftddd
dddd|ftddd
dddd| ftddd
dddd| ftddd
dddd| ftddd
dddd| ftddd
dddd|ftddd
dddd|ftdddd|ftddd	dd|ftddd	dddd|ftddd	dddd|ftddd	dd|ff| < d S )NzAEST-10AEDT,M10.1.0/2,M4.1.0/3AESTr   r   AEDTr   r   r   r   r   r	   r  rZ  r   r   r      r[  )rJ  rf  rg  r\  r   r   r^  _  s$   c                    sB  d} t dtt }t dtt}tddd|ftddddd	|ftdddd
d|ftddd|ftddddd	dd|ftddddddd| ftddddddd| ftdddd
ddd|ftddddd	|ftdddd
d|ftddddd	dd|ftddddddd| ftdddd
ddd|ff| < d S )NzIST-1GMT0,M10.5.0,M3.5.0/1r
  ISTr   r   r`  r   r   r  r   r   ra  rb  r	   rZ  r   rc  rd  re  )rJ  r
  ri  )rO  r]  r  r   r   r^  x  s"   c                    s,   d} t dddtdtdd ff| < d S )Nz<+11>-11r   r	   rQ  r   r   )r   r   r   rL  r]  r  r   r   r^    s   
c                    sR   d} t dtdd}t dtddt}tddd	| ftdd
d	| ff| < d S )Nz<-04>4<-03>,M9.1.6/24,M4.1.6/24-04rY  r   -03r   rh  r	   r   r   r   r   r   )rJ  ZM04ZM03rj  r   r   r^    s   c                    s   d} t dtddt}tddd| ftddd| ftddd	d
ddd| ftddd| ftddd| ftddd| ftddd	d
ddd| ftddd| ftddd| ftddd	d
ddd| ff
| < d S )NzEST5EDT,0/0,J365/25rX  rY  r   r   r	   r   r   r   r  r  r  r   r   i`	  rn  )rJ  rX  rj  r   r   r^    s   c                    s  d} t dtdd}t dtddt}tddd|ftdd	d
|ftddddd|ftdddddd|ftdddddd|ftdddd|ftddddd|ftdddddd| ftdddddd| ftdddd|ftddddddd|ftddd|ftdd	d|ftddddd|ftdddddd|ftdddddd|ftdddd|ftddddd|ftdddddd| ftdddddd| ftdddd|ftddddddd|ff| < d S )NzAAA3BBB,J60/12,J305/12AAArm  r   BBBr   r	   r      r   r   r  r   r   rZ     r   r   r  r  r   rc  rn  rJ  ro  rp  r\  r   r   r^    s4   c                    s   d} t dtdd}t dtddt}tddd	|ftddd
ddd|ftddd
ddd|ftddd
ddd|ftddd
d|ftdddd|ftdddddd| ftdddddd| ftdddd|ff	| < d S )Nz <-03>3<-02>,M3.5.0/-2,M10.5.0/-1rl  rm  r   z-02rq  r   r   rb  rr     r     r   rZ  r	   r  r      rn  )rJ  N03ZN02r\  r   r   r^    s   c                    s   d} t dtdd}t dtddt}tddd	d
d|ftddd	d
ddd|ftddd	d
dd
d|ftddd	dd|ftdd	dd
ddd|ftdd	dd
dddd| ftdd	dd
ddd
d| ftdd	dddd|ff| < d S )Nz%AAA3BBB,M3.2.0/01:30,M11.1.0/02:15:45ro  rm  r   rp  rq    r   r   r	   r   r`  rZ  r   r   r   ,   r  -   rn  rt  r\  r   r   r^    s   )r]  rO  rN  r   )rJ   rU  r^  r   r\  r   rC    s4    
zTZStrTest._populate_test_cases)r:   r;   r<   r   r   r]  rO  rN  rM   r   rD  rK  rM  rP  rT  rC  r?   r   r   r8   r   rB    s    
.rB  c                   @  r   )
CTZStrTestNr   r   r   r   r   r|    r   r|  c                      sp   e Zd ZeZ fddZedd Zedd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Z  ZS )ZoneInfoCacheTestc                   s   | j   t   d S r!   )rW   rX   r4   r5   r&   r8   r   r   r5     s   
zZoneInfoCacheTest.setUpc                 C  rY   r!   rZ   r&   r   r   r   r[     r)   zZoneInfoCacheTest.zoneinfo_datac                 C  r\   r!   r]   r&   r   r   r   r(     r^   zZoneInfoCacheTest.tzpathc                 C  s   |  | d| d d S )NAmerica/Los_Angeles)r   rW   r&   r   r   r   test_ephemeral_zones   s   z&ZoneInfoCacheTest.test_ephemeral_zonesc                 C  s$   |  d}|  d}| || d S )NAustralia/Sydney)rW   r   r'   Ztz0Ztz1r   r   r   test_strong_refs%  s   

z"ZoneInfoCacheTest.test_strong_refsc                 C  s&   |  d}| j d}| || d S )NEurope/Lisbon)rW   r   r   r  r   r   r   test_no_cache+  s   
zZoneInfoCacheTest.test_no_cachec                 C  sN   |  d}| g  |  d}W d   n1 sw   Y  | || dS )zTest that the cache persists when tzpath has been changed.

        The PEP specifies that as long as a reference exists to one zone
        with a given key, the primary constructor must continue to return
        the same object.
        r~  N)rW   r0   r   )r'   Zzi0Zzi1r   r   r   test_cache_reset_tzpath2  s
   
z)ZoneInfoCacheTest.test_cache_reset_tzpathc                 C  s2   |  d}| j jd d |  d}| || d S )Nr~  Z	only_keys)rW   rX   r   )r'   la0la1r   r   r   test_clear_cache_explicit_none?  s   

z0ZoneInfoCacheTest.test_clear_cache_explicit_nonec                 C  sT   |  d}|  d}| j jdgd |  d}|  d}| || | || dS )z5Tests that you can clear a single key from the cache.r~  Europe/Dublinr  NrW   rX   r   r   )r'   r  dub0r  dub1r   r   r   test_clear_cache_one_keyF  s   



z*ZoneInfoCacheTest.test_clear_cache_one_keyc                 C  sv   |  d}|  d}|  d}| j jddgd |  d}|  d}|  d}| || | || | || d S )Nr~  r  
Asia/Tokyor  r  )r'   r  r  Ztok0r  r  Ztok1r   r   r   test_clear_cache_two_keysS  s   





z+ZoneInfoCacheTest.test_clear_cache_two_keys)r:   r;   r<   r   r   r5   r>   r[   r(   r  r  r  r  r  r  r  r?   r   r   r8   r   r}    s    

r}  c                   @  r   )CZoneInfoCacheTestNr   r   r   r   r   r  e  r   r  c                      s`   e Zd ZeZ fddZedd Zedd Zdd Z	d	d
 Z
dd Zdd Zdd Z  ZS )ZoneInfoPickleTestc                   sb   | j   t }|t| j | |	 j
 W d    n1 s%w   Y  t   d S r!   )rW   rX   r-   r.   r/   test_supportZset_zoneinfo_moduler   r1   r2   r3   r4   r5   r6   r8   r   r   r5   l  s   

zZoneInfoPickleTest.setUpc                 C  rY   r!   rZ   r&   r   r   r   r[   u  r)   z ZoneInfoPickleTest.zoneinfo_datac                 C  r\   r!   r]   r&   r   r   r   r(   y  r^   zZoneInfoPickleTest.tzpathc              
   C  s   t tjd D ]f}| j|dV | d}tj||d}t|}| jdd | || W d    n1 s8w   Y  t|}| jdd | || W d    n1 sYw   Y  W d    n1 shw   Y  qd S )Nr	   protor  protocolzIs non-pickled ZoneInfotestzIs unpickled ZoneInfo)r  pickleHIGHEST_PROTOCOLrl   rW   dumpsloadsr   r'   r  Zzi_inpklzi_rtzi_rt2r   r   r   test_cache_hit}  s    


z!ZoneInfoPickleTest.test_cache_hitc              	   C  s   t tjd D ]:}| j|d* | d}tj||d}~| j  t|}t|}| || W d    n1 s<w   Y  qd S )Nr	   r  r  r  )	r  r  r  rl   rW   r  rX   r  r   r  r   r   r   test_cache_miss  s   



z"ZoneInfoPickleTest.test_cache_missc              
   C  s$  t tjd D ]}| j|dx | jd}tj||d}t|}| jdd | || W d    n1 s9w   Y  t|}| jdd | || W d    n1 sZw   Y  | d}| jdd | || W d    n1 s{w   Y  W d    n1 sw   Y  qd S )	Nr	   r  r  r  zNot the pickled objectr  zNot a second unpickled objectzNot a cached object)	r  r  r  rl   rW   r   r  r  r   )r'   r  Zzi_no_cacher  r  r  Zzi_cacher   r   r   r    s(   


z ZoneInfoPickleTest.test_no_cachec           	      C  s   d}t | j|d}| j|}|d | jj||d}W d    n1 s)w   Y  |df|dfg}|D ]B\}}ttjd D ]6}| j	||d% | 
tj tj||d	 W d    n1 sew   Y  W d    n1 stw   Y  qCq8d S )
Nr  ri   r   r{   zZoneInfo with keyzZoneInfo without keyr	   )rj   r  r  )rq   r[   rp   rW   rr   r7  r  r  r  rl   r   PicklingErrorr  )	r'   rS   rw   Zzi_nokeyZzi_keyr   rt   rj   r  r   r   r   test_from_file  s(   
z!ZoneInfoPickleTest.test_from_filec              
   C  s:  t tjd D ]}| j|d d}| |}tj||d}t|}| || t| j	
|d}| jj||d}W d    n1 sEw   Y  tj||d}t|}	| ||	 | tj tj||d W d    n1 stw   Y  tj||d}
t|
}| || W d    n1 sw   Y  qd S )Nr	   r  r  r  ri   r{   )r  r  r  rl   rW   r  r  r   rq   r[   rp   rr   r   r  )r'   r  rS   rt   Zpkl_0Zzi_rt_0rw   rx   Zpkl_1Zzi_rt_1Zpkl_2Zzi_rt_2r   r   r   test_pickle_after_from_file  s,   



z.ZoneInfoPickleTest.test_pickle_after_from_file)r:   r;   r<   r   r   r5   r>   r[   r(   r  r  r  r  r  r?   r   r   r8   r   r  i  s    	

r  c                   @  r   )CZoneInfoPickleTestNr   r   r   r   r   r    r   r  c                   @  s0   e Zd ZdZeZedd Zdd Zdd Z	dS )	CallingConventionTestz8Tests for functions with restricted calling conventions.c                 C  rY   r!   rZ   r&   r   r   r   r[     r)   z#CallingConventionTest.zoneinfo_datac              	   C  s   t | jdd-}| t | jj|d W d    n1 s!w   Y  W d    d S W d    d S 1 s9w   Y  d S )Nr   ri   )r   )rq   r[   rp   r   r   rW   rr   )r'   rw   r   r   r   r    s   "z$CallingConventionTest.test_from_filec                 C  s>   |  t | jdg W d    d S 1 sw   Y  d S Nr   )r   r   rW   rX   r&   r   r   r   test_clear_cache  s   "z&CallingConventionTest.test_clear_cacheN)
r:   r;   r<   r=   r   r   r>   r[   r  r  r   r   r   r   r    s    
r  c                   @  r   )CCallingConventionTestNr   r   r   r   r   r    r   r  c                   @  sR   e Zd ZeZeejdd Zdd Z	dd Z
dd Zd	d
 Zdd Zdd ZdS )
TzPathTestc              	   c  s    d}t  }|}z9t tj|d }| tj|< d V  W d    n1 s%w   Y  W ||u r1d S |d u r;tj|= d S |tj|< d S ||u rH	 w |d u rQtj|= w |tj|< w )NZPYTHONTZPATH)objectr   osenvironget)valuepath_varZunset_env_sentinelZold_envr   r   r   python_tzpath_context  s,   
z TzPathTest.python_tzpath_contextc              
   C  s   dg fddgfdt j dddgfg}|D ]>\}}| |- | j|d | j  | jj}| || W d   n1 s?w   Y  W d   n1 sNw   Y  qdS )z<Tests that the environment variable works with reset_tzpath.r  z/etc/zoneinfo/a/b/cz/d/e/fr(   N)r  pathsepr  rl   r   reset_tzpathTZPATHassertSequenceEqual)r'   Z	new_pathsZnew_path_varZexpected_resultr(   r   r   r   test_env_variable  s   
zTzPathTest.test_env_variablec                 C  s  ddgddgddgddgddgddgg}|D ]s\}}t j|}| |\ | jd	|d
$ | | jj | j  W d    n1 sEw   Y  W d    n1 sTw   Y  | jj	}| jd|d
 | 
|| W d    n1 suw   Y  W d    n1 sw   Y  qd S )Npath/to/somewherer   /usr/share/zoneinfor  )r  ../relative/pathr  r  r  r  r  r  r  warning)r  Zfiltered)r  r  joinr  rl   ZassertWarnsr   ZInvalidTZPathWarningr  r  r  )r'   r   input_pathsZexpected_pathsr  r(   r   r   r    test_env_variable_relative_paths  s<   z+TzPathTest.test_env_variable_relative_pathsc                 C  s$   | j jdgd | | j jd d S )Nr  to)r  )r   r  r  r  r&   r   r   r   test_reset_tzpath_kwargB  s   z"TzPathTest.test_reset_tzpath_kwargc              
   C  sz   g d}|D ]4}| j |d$ | t | jj|d W d    n1 s&w   Y  W d    n1 s5w   Y  qd S )N)r  r  r  r  r  r  )r  r  )rl   r   r   r   r  )r'   r   r  r   r   r    test_reset_tzpath_relative_pathsG  s   z+TzPathTest.test_reset_tzpath_relative_pathsc              
   C  sx   g d}|D ]3}| j |d# | t | j| W d    n1 s%w   Y  W d    n1 s4w   Y  qd S )N)z!/etc/zoneinfo:/usr/share/zoneinfos!   /etc/zoneinfo:/usr/share/zoneinfor   )r  )rl   r   r   r   r  )r'   r   Z	bad_valuer   r   r   test_tzpath_type_errorU  s   z!TzPathTest.test_tzpath_type_errorc                 C  s   ddg}dg}|  | | jj}W d    n1 sw   Y  |  | | jj}W d    n1 s4w   Y  | || | || d S )Nz/onez/twoz/three)r0   r   r  r  )r'   Ztzpath_0Ztzpath_1Zquery_0Zquery_1r   r   r   test_tzpath_attributea  s   

z TzPathTest.test_tzpath_attributeN)r:   r;   r<   r   r   staticmethodr-   contextmanagerr  r  r  r  r  r  r  r   r   r   r   r    s    $r  c                   @  r   )CTzPathTestNr   r   r   r   r   r  o  r   r  c                   @  sh   e Zd ZeZedd Ze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 )
TestModulec                 C  rY   r!   rZ   r&   r   r   r   r[   v  r)   zTestModule.zoneinfo_datac                 C  sB   | j d}t|d}| W  d    S 1 sw   Y  d S )Nr   ri   )r[   rp   rq   read)r'   Z	zone_filerw   r   r   r   
_UTC_bytesz  s   $zTestModule._UTC_bytesc                 C  s   t j|st| d|dd^}}|r#t jt j||dd t j||}t|d}|| j	 W d   dS 1 sAw   Y  dS )zCreates a valid TZif file at key under the zoneinfo root tz_root.

        tz_root must exist, but all folders below that will be created.
        z does not exist./r	   T)exist_okwbN)
r  rk   existsFileNotFoundErrorrsplitmakedirsr  rq   r4  r  )r'   rS   tz_rootroot_dirtailZzonefile_pathrw   r   r   r   
touch_zone  s   "zTestModule.touch_zonec                 C  s8   |  t | jj W d    d S 1 sw   Y  d S r!   )r   r   r   ZNOATTRIBUTEr&   r   r   r   test_getattr_error  s   
"zTestModule.test_getattr_errorc                 C  s0   t | jj}t t| j}|| }| | dS )z?dir(self.module) should at least contain everything in __all__.N)setr   __all__dirassertFalse)r'   Zmodule_all_setZmodule_dir_set
differencer   r   r   test_dir_contains_all  s   z TestModule.test_dir_contains_allc                 C  s"   t | j}t|}| || dS )z5Test that there are no duplicates in dir(self.module)N)r  r   r  ZassertCountEqual)r'   Z
module_dirZmodule_uniquer   r   r   test_dir_unique  s   
zTestModule.test_dir_uniquec                 C  sn   |  | jjg% | | jj | j }t| jj}||@ }| || W d    d S 1 s0w   Y  d S r!   )	r0   r[   r(   
assertTruero   r   available_timezonesr  rm   )r'   available_keysZzoneinfo_keysunionr   r   r   test_available_timezones  s   
"z#TestModule.test_available_timezonesc              	   C  s   t  8}| d| | |g | j }| d| W d    n1 s'w   Y  W d    d S W d    d S 1 s?w   Y  d S )NzMars/Olympus_Mons)r   TemporaryDirectoryr  r0   r   r  ZassertIn)r'   tdr  r   r   r   "test_available_timezones_weirdzone  s   

"z-TestModule.test_available_timezones_weirdzonec                 C  s.  h d}t |}dd |D }dd |D }d|fd|| fd|| fd|| | fg}t ]}|D ]Q\}}tj||}	t|	 |D ]}
| |
|	 qE| |	g( | 	| | j
 }| || W d    n1 spw   Y  W d    n1 sw   Y  q3W d    d S 1 sw   Y  d S )	N>   r  r  zEurope/Parisr   America/Santiagor   r~  zAmerica/Indiana/Indianapolisc                 S     g | ]}d | qS )zposix/r   .0r  r   r   r   
<listcomp>      z5TestModule.test_folder_exclusions.<locals>.<listcomp>c                 S  r  )zright/r   r  r   r   r   r    r  	base_treeZbase_and_posixZbase_and_rightZ	all_trees)listr   r  r  rk   r  mkdirr  r0   rl   r   r  rm   )r'   r   r  Z
posix_treeZ
right_treer  r  Z	case_nametreer  rS   actualr   r   r   test_folder_exclusions  s2   




"z!TestModule.test_folder_exclusionsc              	   C  s   ddh}t |dg }t =}|D ]}| || q| |g | j }| || W d    n1 s7w   Y  W d    d S W d    d S 1 sOw   Y  d S )NzAmerica/New_Yorkr   Z
posixrules)r  r   r  r  r0   r   r  rm   )r'   r   r  r  rS   r  r   r   r   test_exclude_posixrules  s   

"z"TestModule.test_exclude_posixrulesN)r:   r;   r<   r   r   r>   r[   r   r  r  r  r  r  r  r  r  r  r   r   r   r   r  s  s    

		$r  c                   @  r   )CTestModuleNr   r   r   r   r   r    r   r  c                   @  s    e Zd ZdZdd Zdd ZdS )ExtensionBuiltTesta  Smoke test to ensure that the C and Python extensions are both tested.

    Because the intention is for the Python and C versions of ZoneInfo to
    behave identically, these tests necessarily rely on implementation details,
    so the tests may need to be adjusted if the implementations change. Do not
    rely on these tests as an indication of stable properties of these classes.
    c                 C  s(   |  ttjd | ttjd d S )NZ_weak_cache)r  hasattrr   rV   r  r   r&   r   r   r   test_cache_location  s   z&ExtensionBuiltTest.test_cache_locationc                 C  s0   dd l }| |tj | |tj d S r   )gcr  Z
is_trackedr   rV   r  r   )r'   r   r   r   r   test_gc_tracked  s   z"ExtensionBuiltTest.test_gc_trackedN)r:   r;   r<   r=   r  r  r   r   r   r   r    s    r  )frozenc                   @  s*   e Zd ZU ded< ded< eZded< dS )r   rn   r   r   r   r   N)r:   r;   r<   __annotations__r   r   r   r   r   r   r   
  s   
 r   c                   @  sn   e Zd ZU ded< ded< ded< edd Zedd	 Zed
d Zedd Zedd Z	edd Z
dS )r   r   rO   r   r   r   c                 C  s   | j | jj jtjdS )Nr   )rO   r   r   rR   r   r   r&   r   r   r   r     s   zZoneTransition.transition_utcc                 C  s   | j j| jjkS )zWhether this introduces a foldr   r   r   r&   r   r   r   rB        zZoneTransition.foldc                 C  s   | j j| jjk S )zWhether this introduces a gapr  r&   r   r   r   r   "  r  zZoneTransition.gapc                 C  s   | j j| jj S r!   )r   r   r   r&   r   r   r   delta'  s   zZoneTransition.deltac                 C  s   | j r	| j| j S | jS r!   rB   rO   r  r&   r   r   r   r   +     zZoneTransition.anomaly_startc                 C  s   | j s	| j| j S | jS r!   r  r&   r   r   r   r   2  r  zZoneTransition.anomaly_endN)r:   r;   r<   r  r>   r   rB   r   r  r   r   r   r   r   r   r     s    
 




r   c                   @  s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )r   Fc                 C  s&   t || _g | _|| _| | d S r!   )r   r   r(   ro   r   _populate_tzpath)r'   source_jsonr(   r   r   r   r   __init__;  s   zZoneInfoData.__init__c                 C  s
   | j | S r!   r  r`   r   r   r   rp   A  rb   zZoneInfoData.path_from_keyc           
   	   C  s   t |d}t|}W d    n1 sw   Y  |d }| D ]A\}}| j| | |}| jr:| |}n|}| 	|}	|	j
jddd t |	d}|| W d    n1 s^w   Y  q"d S )Nri   r   T)r  parentsr  )rq   jsonloadr   ro   r   _decode_textr   _convert_to_v1rp   parentr  r4  )
r'   r
  rw   Zzoneinfo_dictr[   rS   r  raw_datar   Zdestinationr   r   r   r	  D  s"   

zZoneInfoData._populate_tzpathc                 C  s&   d ttj|}t|}t|S )Nr   )r  r,  rn   r2  base64Z	b85decoder   
decompress)r'   contentsr  Zdecodedr   r   r   r  X  s   

zZoneInfoData._decode_textc                 C  s|   t |dd }d}|d }td||| \}}}}}	}
|d |	d  |
 |d  | | }||7 }d|d|  }|S )	Nr   rh     rw  r&  r   r  s   TZif )r  r5  unpack)r'   r  r8  Zheader_startZ
header_endr:  r;  r<  r?  r>  r@  	file_sizerH  r   r   r   r  ^  s*   zZoneInfoData._convert_to_v1N)F)r:   r;   r<   r  rp   r	  r  r  r   r   r   r   r   :  s    
r   c                   @  s\   e Zd Zedd Zedd Zedd Zedd Zed	d
 Zedd Z	dZ
dZdS )rd   c                 C  s   |    S r!   )_get_zonedumpro   rE  r   r   r   re   |     zZoneDumpData.transition_keysc                 C  s   |   | S r!   )r  )rJ   rS   r   r   r   rP     r  z%ZoneDumpData.load_transition_examplesc                 C  s   | j s|   | j  S r!   )_FIXED_OFFSET_ZONES_populate_fixed_offsetsr   rE  r   r   r   rh     s   
zZoneDumpData.fixed_offset_zonesc                 C  s   | j s|   | j S r!   )_ZONEDUMP_DATA_populate_zonedump_datarE  r   r   r   r    s   zZoneDumpData._get_zonedumpc                 C  s   dt dtti| _d S r  )r   r   r  rE  r   r   r   r    s   
z$ZoneDumpData._populate_fixed_offsetsc                 C  s   dd }dd }dd }dd }d	d
 }dd }dd }dd }dd }	dd }
| | | | | | | | |	 |
 d
| _ d S )Nc                  S  s0   t dtdd} t dt}ttddd| |gS )Nr   r	  r   r
  r  r	   r   r   r   r   r   )r   r
  r   r   r   _Africa_Abidjan  s   
z=ZoneDumpData._populate_zonedump_data.<locals>._Africa_Abidjanc                  S  s   t dtt} t dtt}t dtt }t dtt}ttdddd| |ttdddd|| ttdd	d
d| |ttdddd||ttdddd||ttdd	dd||gS )Nz+00z+01i  r   rd  r   rh  rs  r      r   rr  r   r   )r   r   r   r   r   )ZP00_sZP01_dZP00_dZP01_sr   r   r   _Africa_Casablanca  s   z@ZoneDumpData._populate_zonedump_data.<locals>._Africa_Casablancac                  S  s>  t dtddt} t dtddt}t dtddt}t d	tddt}t d
tddt}ttdddddd| |ttdddd||ttdddd||ttdddd||ttdddd||ttdddd||ttdddd||ttdddd||ttdddd||ttddd d||ttddd!d||gS )"Nr   i&r   PSTir   PDTiPWTPPTr   r   r   r   r   r   i~  r   r   r   rb  i  r   i  r  r   r  r`  i  r	   i	  rs  r   r   r   r   r   r   r   )r   r#  r$  r%  r&  r   r   r   _America_Los_Angeles  s"   zBZoneDumpData._populate_zonedump_data.<locals>._America_Los_Angelesc                  S  s   t dtddt} t dtddt}t dtddt}t dtddt}t d	td
dt}ttddd| |ttddd||ttddd||ttddd||ttddd||ttddd||ttddd||gS )Nr   ir   SMTz-05irk  irl  iib  r	   iv  r   |  r   i  r   r`  r   r   r   r  r   r   r'  )r   r)  ZN05ZN04rx  r   r   r   _America_Santiago  s   z?ZoneDumpData._populate_zonedump_data.<locals>._America_Santiagoc                  S  sb   t dtddt} t dtddt}ttddd| |ttdd	d
d|| ttdd	d	d|| gS )NJSTi~  r   JDT頌  i  rh  r   r   r   r	   i  r'  )r,  r-  r   r   r   _Asia_Tokyo  s   z9ZoneDumpData._populate_zonedump_data.<locals>._Asia_Tokyoc                  S  s   t dtddt} t dtddt}t dtddt}ttdd	d
| |ttdd
d
dd
||ttdddd	||ttddd
d||ttdddd	||ttddd
d||ttdddd	||gS )Nr   ič  r   rf  r.  rg  i  ig  r   r	   }  r   r   rd  ry  r   r   r   r   r'  )r   rf  rg  r   r   r   _Australia_Sydney  s   z?ZoneDumpData._populate_zonedump_data.<locals>._Australia_Sydneyc                  S  s  t dtddt} t dtddt}t dtddt}t dtt}t d	tt}t dtt }t dtt}ttd
ddd| |ttdddd||ttdddd||ttdddd||ttdddd||ttdddd||ttdddd||ttdddd||gS )Nr   i$r   DMTiri  i  r
  r_  iX  r  r   r   r*  rh  ru  r   r	   r   r0  r   i  rb  r`  i	  ra  r'  )r   r2  ZIST_0ZGMT_0r_  ZGMT_1ZIST_1r   r   r   _Europe_Dublin  s    z<ZoneDumpData._populate_zonedump_data.<locals>._Europe_Dublinc                  S  s   t dtt} t dtt}t dtt}t dtddt}ttddd	d
| |ttdddd||ttdddd||ttdddd||ttdddd||ttdddd|| gS )NWETWESTCETCESTi   r   i  r   rc  r	   r   rb  r   i  rr  ra  r   r   r   )r   r   r   r   r   r   )r4  r5  r6  r7  r   r   r   _Europe_Lisbon  s   z<ZoneDumpData._populate_zonedump_data.<locals>._Europe_Lisbonc               
   S  s   t dtddt} t dtt}t dtt}ttddd| |ttd	d
dd||ttd	ddd||ttdd
dd||ttdddd||gS )Nr   ir   r
  r_  i7  r   r	   i  r   rb  r   r`  r   i  rc  rd  r'  )r   r
  r_  r   r   r   _Europe_London  s   z<ZoneDumpData._populate_zonedump_data.<locals>._Europe_Londonc                  S  s   t dtddt} t dtddt}t dtddt}t dtd	dt}ttd
dd| |ttddd||ttddd||gS )Nr   ilr   z-1040i jz-10i`sz+14i  im  r	   i  r   i  r   r   r  )r   ZN1040ZN10ZP14r   r   r   _Pacific_Kiritimati(  s   zAZoneDumpData._populate_zonedump_data.<locals>._Pacific_Kiritimati)
r  zAfrica/Casablancar~  r  r  r  r  r  r   zPacific/Kiritimati)r  )rJ   r   r"  r(  r+  r/  r1  r3  r8  r9  r:  r   r   r   r    s*   z$ZoneDumpData._populate_zonedump_dataN)r:   r;   r<   rM   re   rP   rh   r  r  r  r  r  r   r   r   r   rd   {  s     





 ,rd   )UZ
__future__r   r  r-   rQ   importlib.metadata	importlibr   r  r  r   r  rR  r"   r5  r   Zunittestr   r   r   r   r   	functoolsr   r  r
   r  r   r   r   Ztest.support.import_helperr   r   Zget_modulesr   r   ZmetadataZHAS_TZDATA_PKGZPackageNotFoundErrorr   r   r   r   __file__r  ZDATA_DIRr   r   r   r    r$   r%   r@   rU   r   r   r   r   r   r   r   ZskipIfr   r   r   rA  rB  r|  r}  r  r  r  r  r  r  r  r  r  ZTestCaser  Z	dataclassr   r   r   rd   r   r   r   r   <module>   s    

   6  f   Try{

(A