a
    =Ā×_ĻZ  ć                   @   sŌ   d 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mZ ddlm	Z
 G dd deje
ZG dd	 d	eje
Ze ejjd
kd”G dd deje
Zdd ZedkrŠddlZe ej” e ”  ejdd dS )z6Test module for diferent kind of links under PyTables.é    N)Ścommon)Śunittest)ŚPyTablesTestCasec                       sD   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Z  Z	S )ŚHardLinkTestCasec                    s   t t|  ”  |  ”  d S ©N)Śsuperr   ŚsetUpŚ_createFile©Śself©Ś	__class__© ś6lib/python3.9/site-packages/tables/tests/test_links.pyr      s    zHardLinkTestCase.setUpc                 C   s   | j  ddddg” | j  dd”}| j  |dg d¢”}| j  ddd	”}|  |” | j  |d
d”}|  |” | j  dd|”}|  |” d S ©Nś/Śarr1é   é   Śgroup1Śarr2©r   r   é   Ślgroup1ś/group1Ślarr1ś/arr1Ślarr2)Śh5fileŚcreate_arrayŚcreate_groupZcreate_hard_linkŚassertIsNotNone©r   r   r   r   r   r   r   r   r   r	       s    

zHardLinkTestCase._createFilec                 C   s\   | j | jjj| jjjdd | j| jjj| jjjjdd | j| jjjj| jjj	dd dS )zCreating hard links.T©ZhardlinkN©
Ś_checkEqualityGroupr   Śrootr   r   Ś_checkEqualityLeafr   r   r   r   r
   r   r   r   Śtest00_create+   s    ž
žžzHardLinkTestCase.test00_createc                 C   sd   |   ”  | j| jjj| jjjdd | j| jjj| jjjjdd | j| jjjj	| jjj
dd dS )zOpening a file with hard links.Tr#   N©Ś_reopenr%   r   r&   r   r   r'   r   r   r   r   r
   r   r   r   Śtest01_open8   s    ž
žžzHardLinkTestCase.test01_openc                 C   sd   | j jj ”  |  d| j ” tjr4td| j jjj	 |  
d| j ” | j jjj	 ”  |  d| j ” dS )zRemoving a hard link to a Leaf.r   śRemaining link:ś/group1/larr1N©r   r&   r   ŚremoveŚassertNotInr   ŚverboseŚprintr   r   ŚassertInr
   r   r   r   Śtest02_removeLeafF   s    z"HardLinkTestCase.test02_removeLeafc                 C   s   t jrtd| j | jjjjdd |  d| j” t jrTtd| jjj td| j |  	d| j” | jjjj
dd |  d| j” t jrtd	| j d
S )z Removing a hard link to a Group.zOriginal object tree:T)Zforcer   r,   zObject tree:ś/lgroup1)Ś	recursivezFinal object tree:N)r   r1   r2   r   r&   r   Z	_f_remover0   r   r3   Z	_g_remover
   r   r   r   Śtest03_removeGroupT   s    z#HardLinkTestCase.test03_removeGroup)
Ś__name__Ś
__module__Ś__qualname__r   r	   r(   r+   r4   r7   Ś__classcell__r   r   r   r   r      s   r   c                       s¼   e Zd Z f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d%d& Zd'd( Zd)d* Z  ZS )+ŚSoftLinkTestCasec                    s   t t|  ”  |  ”  d S r   )r   r<   r   r	   r
   r   r   r   r   k   s    zSoftLinkTestCase.setUpc                 C   s   | j  ddddg” | j  dd”}| j  |dg d¢”}| j  ddd	”}|  |” | j  |d
d”}|  |” | j  dd|”}|  |” d S r   )r   r   r    Ścreate_soft_linkr!   r"   r   r   r   r	   o   s    

zSoftLinkTestCase._createFilec                 C   sX   |   | jjj| jj ” ” |  | jjj| jjj ” ” |  | jj ” j| jj 	” ” dS ©zCreating soft links.Nr$   r
   r   r   r   r(   z   s    
’’
’zSoftLinkTestCase.test00_createc                 C   s`   |   ”  |  | jjj| jj ” ” |  | jjj| jjj ” ” |  | jj ” j	| jj 
” ” dS ©zOpening a file with soft links.Nr)   r
   r   r   r   r+      s    
’’
’zSoftLinkTestCase.test01_openc                 C   sd   | j jj ”  |  d| j ” tjr4td| j jjj	 |  
d| j ” | j jjj	 ”  |  d| j ” dS )zRemoving a soft link.r   śDangling link:r-   Nr.   r
   r   r   r   Śtest02_remove   s    zSoftLinkTestCase.test02_removec                 C   s   | j j}|j}| dd”}|  d| j ” |  d| j ” |  d|j” |  d|j” tjrbt	d| | 
”  |  | j jj| j j ” ” dS )zCopying a soft link.r   Ślgroup2r5   ś/lgroup2śCopied link:N©r   r&   r   Ścopyr3   Ś_v_childrenŚ_v_linksr   r1   r2   r/   r%   r   rB   ©r   r&   r   rB   r   r   r   Śtest03_copy   s    

’zSoftLinkTestCase.test03_copyc                 C   s   | j j}|j}| dd”}|jdddd}|  d| j ” |  d| j ” |  d|j” |  d|j” tjrrt	d| | 
”  |  | j jj| j j ” ” dS )	zOverwrite a soft link.r   rB   T©Z	overwriter5   rC   rD   NrE   rI   r   r   r   Śtest03_overwriteÆ   s    

’z!SoftLinkTestCase.test03_overwritec                 C   s|   | j jj}| j  dd”}| |d” | j jjj}tjr@t	d| |  
d| j ” |  d| j ” |  | j jj| j jj ” ” dS )zMoving a soft link.r   Śgroup2rB   śMoved link:r5   ś/group2/lgroup2N)r   r&   r   r    ŚmoverM   rB   r   r1   r2   r0   r3   r%   r   ©r   r   rM   rB   r   r   r   Śtest04_moveĀ   s    

’zSoftLinkTestCase.test04_movec                 C   sh   | j jj}| d” | j jj}tjr.td| |  d| j ” |  	d| j ” |  
| j jj| j j ” ” dS )zRenaming a soft link.rB   rN   r5   rC   N)r   r&   r   ŚrenamerB   r   r1   r2   r0   r3   r%   r   ©r   r   rB   r   r   r   Śtest05_renameŃ   s    




’zSoftLinkTestCase.test05_renamec                 C   s^   | j  dd” | j  ddd”}tjr.td| |  d| j ” |  | j jj	j
| j jj	 ” ” dS )z%Using soft links with relative paths.r   Śgroup3Ślgroup3śRelative path link:ś/group1/lgroup3N©r   r    r=   r   r1   r2   r3   r%   r&   r   rV   rW   ©r   rW   r   r   r   Śtest06a_relative_pathß   s    ’
’z&SoftLinkTestCase.test06a_relative_pathc                 C   s^   | j  dd” | j  ddd”}tjr.td| |  d| j ” |  | j jj	j
| j jj	 ” ” dS )z1Using soft links with relative paths (./ version)r   rV   rW   ś./group3rX   rY   NrZ   r[   r   r   r   Śtest06b_relative_pathķ   s    ’
’z&SoftLinkTestCase.test06b_relative_pathc                 C   sx   dd | j jdddD }tjr*td| |  |g d¢” dd | j jdd	dD }tjrdtd
| |  |g d¢” dS )ś.Checking `walk_nodes` with `classname` option.c                 S   s   g | ]
}|j qS r   ©Z_v_pathname©Ś.0Znoder   r   r   Ś
<listcomp>ž   ó    z5SoftLinkTestCase.test07_walkNodes.<locals>.<listcomp>r   ŚLink©Z	classnameś"detected links (classname='Link'):©ś/larr2r5   r-   c                 S   s   g | ]
}|j qS r   r`   ra   r   r   r   rc     rd   ZSoftLinkz&detected links (classname='SoftLink'):N)r   Ś
walk_nodesr   r1   r2   ŚassertEqual©r   Zlinksr   r   r   Śtest07_walkNodesū   s    ’
’
z!SoftLinkTestCase.test07_walkNodesc                 C   sl   dd | j jjD }tjr$td| |  t|d” dd | j jjjD }tjrZtd| |  |dg” dS )	śChecking `Group._v_links`.c                 S   s   g | ]}|qS r   r   ra   r   r   r   rc     rd   z4SoftLinkTestCase.test08__v_links.<locals>.<listcomp>śdetected links (under root):r   c                 S   s   g | ]}|qS r   r   ra   r   r   r   rc     rd   śdetected links (under /group1):r   N©	r   r&   rH   r   r1   r2   rk   Ślenr   rl   r   r   r   Śtest08__v_links	  s    

z SoftLinkTestCase.test08__v_linksc                 C   sh   | j  ddd”}|  | | j  d”” tjr8td|  |  |  | j  d”” tjrdtd|   dS )zChecking linked links.r   rB   r5   zFirst dereference is correct:r   zSecond dereference is correct:N)r   r=   ZassertIsŚget_noder   r1   r2   )r   rB   r   r   r   Śtest09_link_to_link  s    ’z$SoftLinkTestCase.test09_link_to_linkc                 C   s    t  d”}t |d”}| ddddg” | dd” | jjj}| 	|jd”}|  
d	| j” |  
d	|” |  
||” tjrtd
|d|jj | ”  t |” dS ©z(Checking copying a link to another file.ś.h5Śar   r   r   r   r   r   r5   rD   zin:N)ŚtempfileŚmktempŚtablesŚ	open_filer   r    r   r&   r   rF   r3   r   r1   r2   Ś_v_fileŚfilenameŚcloseŚosr/   )r   ŚfnameZh5fr   Ślgroup1_r   r   r   Śtest10_copy_link_to_file$  s    

z)SoftLinkTestCase.test10_copy_link_to_filec                 C   sb   | j  d”}| j  d”}|  |jd” |  |dd ddg” d|d< |  |dd ddg” dS )	z;Check direct get/set attributes via link-->target.attributez/lgroup1/larr1r   )r   Nr   r   é’’’’r   )r   rt   rk   Śshape)r   r   r   r   r   r   Śtest11_direct_attribute_access5  s    z/SoftLinkTestCase.test11_direct_attribute_accessc                 C   sX   | j  d”}| j  d”}|  |jdd g d¢” d|jd< |  |dd g d¢” dS )z:Check get/set attributes via link-->target.child.attributer5   ś/group1/arr2Nr   r   r   ©r   r   r   )r   rt   rk   r   )r   r   r   r   r   r   Ś#test12_access_child_node_attributesA  s
    
z4SoftLinkTestCase.test12_access_child_node_attributesc                 C   sh   | j  d”}| j  d”}| j  ddd”}|  |jdd g d¢” d|jd< |  |dd g d	¢” dS )
z?Check get/set access via link2-->link1-->target.child.attributer5   r   r   Ś	l_lgroup1Nr   r   r   r   )r   rt   r=   rk   r   )r   r   r   r   r   r   r   Ś4test13_direct_attribute_access_via_chained_softlinksL  s    
zESoftLinkTestCase.test13_direct_attribute_access_via_chained_softlinksc                 C   sV   | j  d”}| j  d”}| j j|dg d¢d}| j  d”}|  |dd g d¢” dS )z;Create an array whose parent is a softlink to another groupr   r5   Śnew_arrr   )Śobjz/group1/new_arrN)r   rt   r   rk   )r   r   r   r   Znew_arr2r   r   r   Ś!test14_child_of_softlink_to_groupY  s
    z2SoftLinkTestCase.test14_child_of_softlink_to_groupc                 C   s>   t | j}|  tt d|”d” |  tt d|”d” d S )Nś\(SoftLink\)r   ś\(dangling\)r   )Śstrr   rk   rr   ŚreŚfindall©r   Śsr   r   r   Śtest_strb  s    
zSoftLinkTestCase.test_strc                 C   sN   | j jjj ”  t| j }|  tt 	d|”d” |  tt 	d|”d” d S )Nr   r   r   r   )
r   r&   r   r   r/   r   rk   rr   r   r   r   r   r   r   Śtest_str_with_dangling_linkg  s    
z,SoftLinkTestCase.test_str_with_dangling_link)r8   r9   r:   r   r	   r(   r+   rA   rJ   rL   rR   rU   r\   r^   rm   rs   ru   r   r   r   r   r   r   r   r;   r   r   r   r   r<   i   s*   
	r<   ŚstrictzFILE_OPEN_POLICY = "strict"c                       s   e Zd Z fddZ f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 )ŚExternalLinkTestCasec                    s6   t t|  ”  t d”| _t | jd”| _|  	”  d S )Nrw   Św)
r   r   r   ry   rz   Śextfnamer{   r|   Ś	exth5filer	   r
   r   r   r   r   s  s    zExternalLinkTestCase.setUpc                    s,   | j }| j ”  tt|  ”  t |” dS )zRemove ``extfname``.N)r   r   r   r   r   ŚtearDownr   r/   )r   r   r   r   r   r   z  s    
zExternalLinkTestCase.tearDownc                 C   sī   | j  ddddg” | j  dd”}| j  |dg d¢” | j ddddg”}|  |” | j dd”}| j |dg d¢”}| j  ddd	| j ”}|  |” | j  |d
d| j ”}|  |” | j  dd|”}|  |” | j ”  t 	| jd”| _d S )Nr   r   r   r   r   r   r   r   z
%s:/group1r   z%s:/arr1r   Śr)
r   r   r    r   r!   Zcreate_external_linkr   r   r{   r|   )r   r   Zextarr1Z	extgroup1Zextarr2r   r   r   r   r   r   r	     s&    
’
’


z ExternalLinkTestCase._createFilec                 C   sX   |   | jjj| jj ” ” |  | jjj| jjj ” ” |  | jj ” j	| jj 
” ” dS r>   )r%   r   r&   r   r   r   r'   r   r   r   r   r
   r   r   r   r(   ¢  s    
’’
’z"ExternalLinkTestCase.test00_createc                 C   s`   |   ”  |  | jjj| jj ” ” |  | jjj| jjj 	” ” |  | jj ” j
| jj ” ” dS r?   )r*   r%   r   r&   r   r   r   r'   r   r   r   r   r
   r   r   r   r+   ¬  s    
’’
’z ExternalLinkTestCase.test01_openc                 C   s~   | j  ”  t | jd”| _ | j jj ”  |  d| j ” t	j
rNtd| jjjj |  d| j” | jjjj ”  |  d| j” dS )zRemoving an external link.rx   r   r@   r-   N)r   r   r{   r|   r   r&   r   r/   r0   r   r1   r2   r   r   r   r3   r
   r   r   r   rA   ·  s    
z"ExternalLinkTestCase.test02_removec                 C   s   | j j}|j}| dd”}|  d| j ” |  d| j ” |  d|j” |  d|j” tjrbt	d| | 
”  |  | jjj| j j ” ” dS )zCopying an external link.r   rB   r5   rC   rD   N©r   r&   r   rF   r3   rG   rH   r   r1   r2   r/   r%   r   r   rB   rI   r   r   r   rJ   Ė  s    

’z ExternalLinkTestCase.test03_copyc                 C   s   | j j}|j}| dd”}|jdddd}|  d| j ” |  d| j ” |  d|j” |  d|j” tjrrt	d| | 
”  |  | jjj| j j ” ” dS )	zOverwrite an external link.r   rB   TrK   r5   rC   rD   Nr   rI   r   r   r   rL   Ž  s    

’z%ExternalLinkTestCase.test03_overwritec                 C   s|   | j jj}| j  dd”}| |d” | j jjj}tjr@t	d| |  
d| j ” |  d| j ” |  | jjj| j jj ” ” dS )zMoving an external link.r   rM   rB   rN   r5   rO   N)r   r&   r   r    rP   rM   rB   r   r1   r2   r0   r3   r%   r   r   rQ   r   r   r   rR   ņ  s    

’z ExternalLinkTestCase.test04_movec                 C   sh   | j jj}| d” | j jj}tjr.td| |  d| j ” |  	d| j ” |  
| jjj| j j ” ” dS )zRenaming an external link.rB   rN   r5   rC   N)r   r&   r   rS   rB   r   r1   r2   r0   r3   r%   r   r   rT   r   r   r   rU     s    




’z"ExternalLinkTestCase.test05_renamec                 C   s   | j  ddd” dd | j jdddD }tjr:td	| |  |g d
¢” dd | j jdddD }tjrttd| |  |g d¢” dS )r_   r   rW   r]   c                 S   s   g | ]
}|j qS r   r`   ra   r   r   r   rc     rd   z9ExternalLinkTestCase.test07_walkNodes.<locals>.<listcomp>r   re   rf   rg   )ri   r5   r-   rY   c                 S   s   g | ]
}|j qS r   r`   ra   r   r   r   rc     rd   ZExternalLinkz*detected links (classname='ExternalLink'):rh   N)r   r=   rj   r   r1   r2   rk   rl   r   r   r   rm     s    ’
’
z%ExternalLinkTestCase.test07_walkNodesc                 C   sl   dd | j jjD }tjr$td| |  t|d” dd | j jjjD }tjrZtd| |  |dg” dS )	rn   c                 S   s   g | ]}|qS r   r   ra   r   r   r   rc   #  rd   z8ExternalLinkTestCase.test08__v_links.<locals>.<listcomp>ro   r   c                 S   s   g | ]}|qS r   r   ra   r   r   r   rc   '  rd   rp   r   Nrq   rl   r   r   r   rs      s    

z$ExternalLinkTestCase.test08__v_linksc                 C   sJ   | j jj}|  |j” | }|  |” |  |j” | ”  |  |j” dS )zChecking `umount()` method.N)r   r&   r   ZassertIsNoneZextfiler!   Zumount)r   ŚlinkZenoder   r   r   Śtest09_umount,  s    

z"ExternalLinkTestCase.test09_umountc              	   C   sā   t  d”}zŗt |d”}| ddddg” | dd” | jjj}| 	|jd”}|  
d	| j” |  
d	|” |  
||” tjrtd
|d|jj W d   n1 s¢0    Y  W tj |”rŽt |” ntj |”rÜt |” 0 dS rv   )ry   rz   r{   r|   r   r    r   r&   r   rF   r3   r   r1   r2   r}   r~   r   ŚpathŚexistsr/   )r   Zh5fname2Zh5file2r   r   r   r   r   r   ;  s$    

’$’z-ExternalLinkTestCase.test10_copy_link_to_file)r8   r9   r:   r   r   r	   r(   r+   rA   rJ   rL   rR   rU   rm   rs   r”   r   r;   r   r   r   r   r   o  s   
r   c                  C   sN   t  ” } d}t|D ]4}|  t  t”” |  t  t”” |  t  t”” q| S )zCReturn a test suite consisting of all the test cases in the module.r   )r   Z	TestSuiteŚrangeZaddTestZ	makeSuiter   r<   r   )ZtheSuiteZniterŚir   r   r   ŚsuiteP  s    r¦   Ś__main__)ZdefaultTest)Ś__doc__r   r   ry   r{   Ztables.testsr   Ztables.tests.commonr   r   ZTestCaseZTempFileMixinr   r<   ZskipIfŚfileZ_FILE_OPEN_POLICYr   r¦   r8   ŚsysZ
parse_argvŚargvZprint_versionsŚmainr   r   r   r   Ś<module>   s,   O  ’ `