B
    i\d\                 @   s   d Z ddlmZ ddlm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 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rddlZe	ej e	  ejdd dS )z6Test module for diferent kind of links under PyTables.    )print_function)absolute_importN)common)unittest)PyTablesTestCase)rangec                   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.7/site-packages/tables/tests/test_links.pyr
      s    zHardLinkTestCase.setUpc             C   s   | j ddddg | j dd}| j |ddddg}| j ddd	}| |d k	 | j |d
d}| |d k	 | j dd|}| |d k	 d S )N/arr1      group1arr2   lgroup1z/group1larr1z/arr1larr2)h5filecreate_arraycreate_groupZcreate_hard_link
assertTrue)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)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.T)r   N)_reopenr   r   r    r   r   r!   r   r   r   r   )r   r   r   r   test01_open;   s    
zHardLinkTestCase.test01_openc             C   sj   | j jj  | d| j k tjr6td| j jjj	 | d| j k | j jjj	  | d| j k dS )zRemoving a hard link to a Leaf.z/arr1zRemaining link:z/group1/larr1N)
r   r    r   remover   r   verboseprintr   r   )r   r   r   r   test02_removeLeafI   s    z"HardLinkTestCase.test02_removeLeafc             C   s   t jrtd| j | jjjjdd | d| jk t jrVtd| jjj td| j | d| jk | jjjj	dd | d| jk t jrtd	| j d
S )z Removing a hard link to a Group.zOriginal object tree:T)Zforcez/group1zRemaining link:zObject tree:z/lgroup1)	recursivezFinal object tree:N)
r   r&   r'   r   r    r   Z	_f_remover   r   Z	_g_remove)r   r   r   r   test03_removeGroupW   s    z#HardLinkTestCase.test03_removeGroup)
__name__
__module____qualname__r
   r   r"   r$   r(   r*   __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 )N)r	   r/   r
   r   )r   )r   r   r   r
   n   s    zSoftLinkTestCase.setUpc             C   s   | j ddddg | j dd}| j |ddddg}| j ddd	}| |d k	 | j |d
d}| |d k	 | j dd|}| |d k	 d S )Nr   r   r   r   r   r   r   r   z/group1r   z/arr1r   )r   r   r   create_soft_linkr   )r   r   r   r   r   r   r   r   r   r   r   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.N)
r   r   r    r   r   r!   r   r   r   r   )r   r   r   r   r"   }   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.N)r#   r   r   r    r   r   r!   r   r   r   r   )r   r   r   r   r$      s    zSoftLinkTestCase.test01_openc             C   sj   | j jj  | d| j k tjr6td| j jjj	 | d| j k | j jjj	  | d| j k dS )zRemoving a soft link.z/arr1zDangling link:z/group1/larr1N)
r   r    r   r%   r   r   r&   r'   r   r   )r   r   r   r   test02_remove   s    zSoftLinkTestCase.test02_removec             C   s   | j j}|j}|dd}| d| j k | d| j k | d|jk | d|jk tjrjt	d| |
  | | j jj| j j  dS )zCopying a soft link.r   lgroup2z/lgroup1z/lgroup2zCopied link:N)r   r    r   copyr   _v_children_v_linksr   r&   r'   r%   r   r   r2   )r   r    r   r2   r   r   r   test03_copy   s    
zSoftLinkTestCase.test03_copyc             C   s   | j j}|j}|dd}|jdddd}| d| j k | d| j k | d|jk | d|jk tjrzt	d| |
  | | j jj| j j  dS )	zOverwrite a soft link.r   r2   T)	overwritez/lgroup1z/lgroup2zCopied link:N)r   r    r   r3   r   r4   r5   r   r&   r'   r%   r   r   r2   )r   r    r   r2   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 k | 
d| j k | | j jj| j jj  dS )zMoving a soft link.r   group2r2   zMoved link:z/lgroup1z/group2/lgroup2N)r   r    r   r   mover9   r2   r   r&   r'   r   r   r   )r   r   r9   r2   r   r   r   test04_move   s    

zSoftLinkTestCase.test04_movec             C   sl   | j jj}|d | j jj}tjr.td| | d| j k | d| j k | 	| j jj
| j j  dS )zRenaming a soft link.r2   zMoved link:z/lgroup1z/lgroup2N)r   r    r   renamer2   r   r&   r'   r   r   r   )r   r   r2   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 k | | j jj	j
| j jj	  dS )z%Using soft links with relative paths.z/group1group3lgroup3zRelative path link:z/group1/lgroup3N)r   r   r0   r   r&   r'   r   r   r    r   r>   r?   )r   r?   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 k | | j jj	j
| j jj	  dS )z1Using soft links with relative paths (./ version)z/group1r>   r?   z./group3zRelative path link:z/group1/lgroup3N)r   r   r0   r   r&   r'   r   r   r    r   r>   r?   )r   r?   r   r   r   test06b_relative_path   s    

z&SoftLinkTestCase.test06b_relative_pathc             C   s|   dd | j jdddD }tjr*td| | |ddd	g d
d | j jdddD }tjrftd| | |ddd	g dS )z.Checking `walk_nodes` with `classname` option.c             S   s   g | ]
}|j qS r   )_v_pathname).0noder   r   r   
<listcomp>  s    z5SoftLinkTestCase.test07_walkNodes.<locals>.<listcomp>r   Link)	classnamez"detected links (classname='Link'):z/larr2z/lgroup1z/group1/larr1c             S   s   g | ]
}|j qS r   )rB   )rC   rD   r   r   r   rE     s    ZSoftLinkz&detected links (classname='SoftLink'):N)r   
walk_nodesr   r&   r'   assertEqual)r   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 )	zChecking `Group._v_links`.c             S   s   g | ]}|qS r   r   )rC   rD   r   r   r   rE     s    z4SoftLinkTestCase.test08__v_links.<locals>.<listcomp>zdetected links (under root):r   c             S   s   g | ]}|qS r   r   )rC   rD   r   r   r   rE     s    zdetected links (under /group1):r   N)	r   r    r5   r   r&   r'   rI   lenr   )r   rJ   r   r   r   test08__v_links  s    

z SoftLinkTestCase.test08__v_linksc             C   sl   | j ddd}| | | j dk tjr:td|  | |  | j dk tjrhtd|   dS )zChecking linked links.r   r2   z/lgroup1zFirst dereference is correct:z/group1zSecond dereference is correct:N)r   r0   r   get_noder   r&   r'   )r   r2   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k | 
d	|k | 
||k tjrtd
|d|jj |  t| dS )z(Checking copying a link to another file.z.h5ar   r   r   r   r   r   z/lgroup1zCopied link:zin:N)tempfilemktemptables	open_filer   r   r   r    r   r3   r   r   r&   r'   _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   sh   | j d}| j d}| |jdk | |dd ddgk d|d< | |dd ddgk dS )	z;Check direct get/set attributes via link-->target.attributez/lgroup1/larr1z/arr1)r   Nr   r   r   )r   rN   r   shape)r   r   r   r   r   r   test11_direct_attribute_access8  s    z/SoftLinkTestCase.test11_direct_attribute_accessc             C   s`   | j d}| j d}| |jdd dddgk d|jd< | |dd dddgk dS )	z:Check get/set attributes via link-->target.child.attributez/lgroup1z/group1/arr2Nr   r   r   r\   r   )r   rN   r   r   )r   r   r   r   r   r   #test12_access_child_node_attributesD  s
    
z4SoftLinkTestCase.test12_access_child_node_attributesc             C   sp   | j d}| j d}| j ddd}| |jdd dddgk d	|jd
< | |dd d	ddgk dS )z?Check get/set access via link2-->link1-->target.child.attributez/lgroup1z/group1/arr2r   	l_lgroup1Nr   r   r   r\   r   )r   rN   r0   r   r   )r   r   r   r`   r   r   r   4test13_direct_attribute_access_via_chained_softlinksO  s    
zESoftLinkTestCase.test13_direct_attribute_access_via_chained_softlinksc             C   s\   | j d}| j d}| j j|ddddgd}| j d}| |d	d	 dddgk d	S )
z;Create an array whose parent is a softlink to another groupz/group1z/lgroup1new_arrr   r   r   )objz/group1/new_arrN)r   rN   r   r   )r   r   r   rb   Znew_arr2r   r   r   !test14_child_of_softlink_to_group\  s
    z2SoftLinkTestCase.test14_child_of_softlink_to_groupc             C   s>   t | j}| ttd|d | ttd|d d S )Nz\(SoftLink\)r   z\(dangling\)r   )strr   rI   rL   refindall)r   sr   r   r   test_stre  s    
zSoftLinkTestCase.test_strc             C   sN   | j jjj  t| j }| tt	d|d | tt	d|d d S )Nz\(SoftLink\)r   z\(dangling\)r   )
r   r    r   r   r%   re   rI   rL   rf   rg   )r   rh   r   r   r   test_str_with_dangling_linkj  s    
z,SoftLinkTestCase.test_str_with_dangling_link)r+   r,   r-   r
   r   r"   r$   r1   r6   r8   r;   r=   r@   rA   rK   rM   rO   r[   r^   r_   ra   rd   ri   rj   r.   r   r   )r   r   r/   l   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 )Nz.h5w)
r	   rl   r
   rQ   rR   extfnamerS   rT   	exth5filer   )r   )r   r   r   r
   v  s    zExternalLinkTestCase.setUpc                s,   | j }| j  tt|   t| dS )zRemove ``extfname``.N)rn   ro   rW   r	   rl   tearDownrX   r%   )r   rn   )r   r   r   rp   }  s    
zExternalLinkTestCase.tearDownc             C   s  | j ddddg | j dd}| j |ddddg | jddddg}| |d k	 | jdd}| j|ddddg}| j ddd	| j }| |d k	 | j |d
d| j }| |d k	 | j dd|}| |d k	 | j  t	| jd| _d S )Nr   r   r   r   r   r   r   r   z
%s:/group1r   z%s:/arr1r   r)
r   r   r   ro   r   Zcreate_external_linkrn   rW   rS   rT   )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 )zCreating soft links.N)r   ro   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 )zOpening a file with soft links.N)r#   r   ro   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 k t	j
rPtd| jjjj | d| jk | jjjj  | d| jk dS )zRemoving an external link.rP   z/arr1zDangling link:z/group1/larr1N)ro   rW   rS   rT   rn   r    r   r%   r   r   r&   r'   r   r   r   )r   r   r   r   r1     s    
z"ExternalLinkTestCase.test02_removec             C   s   | j j}|j}|dd}| d| j k | d| j k | d|jk | d|jk tjrjt	d| |
  | | jjj| j j  dS )zCopying an external link.r   r2   z/lgroup1z/lgroup2zCopied link:N)r   r    r   r3   r   r4   r5   r   r&   r'   r%   r   ro   r   r2   )r   r    r   r2   r   r   r   r6     s    
z ExternalLinkTestCase.test03_copyc             C   s   | j j}|j}|dd}|jdddd}| d| j k | d| j k | d|jk | d|jk tjrzt	d| |
  | | jjj| j j  dS )	zOverwrite an external link.r   r2   T)r7   z/lgroup1z/lgroup2zCopied link:N)r   r    r   r3   r   r4   r5   r   r&   r'   r%   r   ro   r   r2   )r   r    r   r2   r   r   r   r8     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 k | 
d| j k | | jjj| j jj  dS )zMoving an external link.r   r9   r2   zMoved link:z/lgroup1z/group2/lgroup2N)r   r    r   r   r:   r9   r2   r   r&   r'   r   r   ro   r   )r   r   r9   r2   r   r   r   r;     s    

z ExternalLinkTestCase.test04_movec             C   sl   | j jj}|d | j jj}tjr.td| | d| j k | d| j k | 	| j
jj| j j  dS )zRenaming an external link.r2   zMoved link:z/lgroup1z/lgroup2N)r   r    r   r<   r2   r   r&   r'   r   r   ro   r   )r   r   r2   r   r   r   r=     s    



z"ExternalLinkTestCase.test05_renamec             C   s   | j ddd dd | j jdddD }tjr:td	| | |d
dddg dd | j jdddD }tjrxtd| | |d
ddg dS )z.Checking `walk_nodes` with `classname` option.z/group1r?   z./group3c             S   s   g | ]
}|j qS r   )rB   )rC   rD   r   r   r   rE     s    z9ExternalLinkTestCase.test07_walkNodes.<locals>.<listcomp>r   rF   )rG   z"detected links (classname='Link'):z/larr2z/lgroup1z/group1/larr1z/group1/lgroup3c             S   s   g | ]
}|j qS r   )rB   )rC   rD   r   r   r   rE     s    ZExternalLinkz*detected links (classname='ExternalLink'):N)r   r0   rH   r   r&   r'   rI   )r   rJ   r   r   r   rK     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 )	zChecking `Group._v_links`.c             S   s   g | ]}|qS r   r   )rC   rD   r   r   r   rE   &  s    z8ExternalLinkTestCase.test08__v_links.<locals>.<listcomp>zdetected links (under root):r   c             S   s   g | ]}|qS r   r   )rC   rD   r   r   r   rE   *  s    zdetected links (under /group1):r   N)	r   r    r5   r   r&   r'   rI   rL   r   )r   rJ   r   r   r   rM   #  s    

z$ExternalLinkTestCase.test08__v_linksc             C   sZ   | j jj}| |jdk | }| |dk	 | |jdk	 |  | |jdk dS )zChecking `umount()` method.N)r   r    r   r   ZextfileZumount)r   linkZenoder   r   r   test09_umount/  s    
z"ExternalLinkTestCase.test09_umountc          	   C   s   t d}zt|d}|ddddg |dd | jjj}|	|jd}| 
d	| jk | 
d	|k | 
||k tjrtd
|d|jj W dQ R X W dtj|rt| X dS )z(Checking copying a link to another file.z.h5rP   r   r   r   r   r   r   z/lgroup1zCopied link:zin:N)rQ   rR   rS   rT   r   r   r   r    r   r3   r   r   r&   r'   rU   rV   rX   pathexistsr%   )r   Zh5fname2Zh5file2r   rZ   r   r   r   r[   >  s    

z-ExternalLinkTestCase.test10_copy_link_to_file)r+   r,   r-   r
   rp   r   r"   r$   r1   r6   r8   r;   r=   rK   rM   rs   r[   r.   r   r   )r   r   rl   r  s   
rl   c              C   sR   t  } d}x@t|D ]4}| t t | t t | t t qW | S )zCReturn a test suite consisting of all the test cases in the module.r   )r   Z	TestSuiter   ZaddTestZ	makeSuiter   r/   rl   )ZtheSuiteZniterir   r   r   suiteS  s    rw   __main__)ZdefaultTest)__doc__Z
__future__r   r   rX   rf   rQ   rS   Ztables.testsr   Ztables.tests.commonr   r   ZTestCaseZ	six.movesr   ZTempFileMixinr   r/   ZskipIffileZ_FILE_OPEN_POLICYrl   rw   r+   sysZ
parse_argvargvZprint_versionsmainr   r   r   r   <module>   s0   O   `