From ce2d5b521327002af629bbd1c0b002a50bcc4a90 Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauld.mccarthy@gmail.com>
Date: Mon, 14 Nov 2016 18:27:23 +0000
Subject: [PATCH] fsl.utils.path test suite updated.

---
 tests/test_fsl_utils_path.py | 365 +++++++++++++++++++++++++++++++++--
 1 file changed, 344 insertions(+), 21 deletions(-)

diff --git a/tests/test_fsl_utils_path.py b/tests/test_fsl_utils_path.py
index 25f945620..e733fd8fb 100644
--- a/tests/test_fsl_utils_path.py
+++ b/tests/test_fsl_utils_path.py
@@ -5,7 +5,12 @@
 # Author: Paul McCarthy <pauldmccarthy@gmail.com>
 #
 
+from __future__ import print_function
+
+import            os
 import os.path as op
+import            shutil
+import            tempfile
 
 import pytest
 
@@ -18,7 +23,7 @@ def test_addExt_exists_shouldPass(testdir):
     are valid.
     """
 
-    replacements = fslimage.REPLACEMENTS
+    groups       = fslimage.FILE_GROUPS
     allowedExts  = fslimage.ALLOWED_EXTENSIONS
 
     tests = [
@@ -41,7 +46,7 @@ def test_addExt_exists_shouldPass(testdir):
         assert fslpath.addExt(prefix,
                               allowedExts,
                               mustExist=True,
-                              replace=replacements) == output
+                              fileGroups=groups) == output
 
 
 def test_addExt_exists_shouldFail(testdir):
@@ -49,8 +54,8 @@ def test_addExt_exists_shouldFail(testdir):
     error.
     """
     
-    replacements = fslimage.REPLACEMENTS
-    allowedExts  = fslimage.ALLOWED_EXTENSIONS
+    groups      = fslimage.FILE_GROUPS
+    allowedExts = fslimage.ALLOWED_EXTENSIONS
 
     shouldFail = [
 
@@ -83,7 +88,7 @@ def test_addExt_exists_shouldFail(testdir):
     for test in shouldFail:
         prefix  = op.join(testdir, 'nifti_formats', test[0])
         allowed = allowedExts
-        replace = replacements 
+        group   = groups
 
         if len(test) >= 2:
             if not (test[1] == False):
@@ -91,14 +96,14 @@ def test_addExt_exists_shouldFail(testdir):
 
         if len(test) == 3:
             if not (test[2] == False):
-                replace = test[2]
+                group = test[2]
 
         with pytest.raises(fslpath.PathError):
             
             fslpath.addExt(prefix,
                            allowed,
                            mustExist=True,
-                           replace=replace)
+                           fileGroups=group)
 
 
 def test_addExt_noExist(testdir):
@@ -136,7 +141,7 @@ def test_addExt_noExist(testdir):
             
 
 
-def test_removeExt(testdir):
+def test_removeExt():
 
     allowedExts = fslimage.ALLOWED_EXTENSIONS
     
@@ -170,13 +175,13 @@ def test_removeExt(testdir):
         assert fslpath.removeExt(path, allowed) == output
 
 
-def test_getExt(testdir):
+def test_getExt():
 
     allowedExts = fslimage.ALLOWED_EXTENSIONS
 
     # len(test) == 2 -> allowedExts set from above
     # Otherwise, allowedExts set from test tuple
-    shouldPass = [
+    tests = [
         ('blah.blah',   '.blah',    None),
         ('blah.blah',   '.blah', ['.blah']),
         ('blah.blah',    'blah',  ['blah']),
@@ -189,36 +194,74 @@ def test_getExt(testdir):
         ('blah.hdr',    '.hdr'),
         ('blah.img',    '.img'),
         ('blah.img.gz', '.img.gz'),
-    ]
 
-    shouldRaise = [
         ('blah',        ''),
         ('blah.blah',   ''),
         ('blah.blah',   '', ['bla']),
         ('blah.nii.gz', '', ['.nii']),
     ]
 
-    for test in shouldPass:
+    for test in tests:
         filename = test[0]
         output   = test[1]
 
         if len(test) == 2: allowed = allowedExts
         else:              allowed = test[2]
 
-        print filename, '==', output
+        print(filename, '==', output)
         assert fslpath.getExt(filename, allowed) == output
 
+        
+def test_splitExt():
+
+    allowedExts = fslimage.ALLOWED_EXTENSIONS
 
-    for test in shouldRaise:
-        filename = test[0]
-        output   = test[1]
+    # len(test) == 2 -> allowedExts set from above
+    # Otherwise, allowedExts set from test tuple 
+    tests = [
+        ('blah',         ('blah',        '')),
+        ('blah.blah',    ('blah.blah',   '')),
+        ('blah.blah',    ('blah',        '.blah'),   ['.blah']),
+        ('blah.blah',    ('blah.',       'blah'),    ['blah']),
+        ('blah.nii',     ('blah',        '.nii')),
+        ('blah.nii.gz',  ('blah',        '.nii.gz')),
+        ('blah.img',     ('blah',        '.img')),
+        ('blah.hdr',     ('blah',        '.hdr')),
+        ('blah.img.gz',  ('blah',        '.img.gz')),
+        ('blah.nii.gz',  ('blah.nii.gz', ''),        []),
+        ('blah.nii.gz',  ('blah.nii',    '.gz'),     ['.gz']),
+        ('blah.nii.gz',  ('blah.nii.gz', ''),        ['.nii']),
+        ('blah.nii.gz',  ('blah',        '.nii.gz'), ['.nii.gz']),
+        ('blah.nii.gz',  ('blah.',       'nii.gz'),  ['nii.gz']),
+        ('blah.blah',    ('blah',        '.blah'),   None),
+        ('blah.blah',    ('blah',        '.blah'),   ['.blah']),
+        ('blah.blah',    ('blah.',       'blah'),    ['blah']),
+        ('blah',         ('blah',        ''),        None),
+        ('blah.nii',     ('blah',        '.nii'),    None),
+        ('blah.nii.gz',  ('blah.nii',    '.gz'),     None),
+
+        ('blah.nii',    ('blah', '.nii')),
+        ('blah.nii.gz', ('blah', '.nii.gz')),
+        ('blah.hdr',    ('blah', '.hdr')),
+        ('blah.img',    ('blah', '.img')),
+        ('blah.img.gz', ('blah', '.img.gz')),
+
+        ('blah',        ('blah',        '')),
+        ('blah.blah',   ('blah.blah',   '')),
+        ('blah.blah',   ('blah.blah',   ''), ['bla']),
+        ('blah.nii.gz', ('blah.nii.gz', ''), ['.nii']), 
+    ]
+
+    for test in tests:
+        filename          = test[0]
+        outbase, outext   = test[1]
 
         if len(test) == 2: allowed = allowedExts
         else:              allowed = test[2]
- 
-        with pytest.raises(fslpath.PathError):
-            fslpath.getExt(filename, allowed)
 
+        print(filename, '==', (outbase, outext))
+        assert fslpath.splitExt(filename, allowed) == (outbase, outext)
+        
 
 def test_deepest():
 
@@ -281,4 +324,284 @@ def test_shallowest():
     ]
     
     for path, suffixes, output in tests:
-        assert fslpath.shallowest(path, suffixes) == output 
+        assert fslpath.shallowest(path, suffixes) == output
+
+
+def test_getFileGroup():
+
+    allowedExts = fslimage.ALLOWED_EXTENSIONS
+    groups      = fslimage.FILE_GROUPS
+
+    # (files_to_create,
+    #   [(path, expected),
+    #    ...
+    #   ]
+    # )
+    #
+    # expected == 'all' is equivalent to expected == files_to_create
+    allTests = [
+        (['file.hdr', 'file.img'], [
+            ('file.hdr', 'all'),
+            ('file.img', 'all')]),
+
+        (['file.hdr.gz', 'file.img.gz'], [
+            ('file.hdr.gz', 'all'),
+            ('file.img.gz', 'all')]), 
+
+        (['file.hdr', 'file.img', 'file.nii'], [
+            ('file.hdr', ['file.hdr', 'file.img']),
+            ('file.img', ['file.hdr', 'file.img'])]), 
+        
+        (['file.hdr', 'file.img', 'file.blob'], [
+            ('file.hdr', ['file.hdr', 'file.img']),
+            ('file.img', ['file.hdr', 'file.img'])]),
+
+
+        (['file.hdr'], [
+            ('file.hdr', ['file.hdr']),
+            ('file.img', ['file.img'])]),
+
+        (['file.img'], [
+            ('file.hdr', ['file.hdr']),
+            ('file.img', ['file.img'])]), 
+    ]
+
+    workdir = tempfile.mkdtemp()
+
+    try: 
+
+        for files_to_create, tests in allTests:
+
+            for fn in files_to_create:
+                with open(op.join(workdir, fn), 'wt') as f:
+                    f.write('{}\n'.format(fn))
+
+            for path, expected in tests:
+                if expected == 'all':
+                    expected = list(files_to_create)
+
+
+                fullPaths = fslpath.getFileGroup(
+                    op.join(workdir, path),
+                    allowedExts=allowedExts,
+                    fileGroups=groups,
+                    fullPaths=True)
+                exts = fslpath.getFileGroup(
+                    op.join(workdir, path),
+                    allowedExts=allowedExts,
+                    fileGroups=groups,
+                    fullPaths=False)
+
+                assert sorted(fullPaths) == sorted([op.join(workdir, e)            for e in expected])
+                assert sorted(exts)      == sorted([fslpath.getExt(e, allowedExts) for e in expected])
+
+            for f in files_to_create:
+                try:    os.remove(op.join(workdir,  f))
+                except: pass 
+
+    finally:
+        shutil.rmtree(workdir)
+
+
+def test_imcp_shouldPass(move=False):
+
+    allowedExts = fslimage.ALLOWED_EXTENSIONS
+    groups      = fslimage.FILE_GROUPS
+    # 
+    # (files_to_create,
+    #    [( imcp_src,   imcp_dest,  files_which_should_exist),
+    #     ( imcp_src,   imcp_dest, [files_which_should_exist]),
+    #     ([imcp_srcs], imcp_dest,  files_which_should_exist),
+    #     ([imcp_srcs], imcp_dest, [files_which_should_exist]),
+    #     ...
+    #    ]
+    # )
+    #
+    # if icmp_dest == '', it means to copy to the directory
+    # files_which_should_exist == 'all' is equivalent to files_which_should_exist == files_to_create
+    shouldPass = [
+        (['file.hdr', 'file.img'], [
+            ('file',     'file',     'all'),
+            ('file',     'file.img', 'all'),
+            ('file',     'file.hdr', 'all'),
+            ('file',     '',         'all'),
+            ('file.img', 'file',     'all'),
+            ('file.img', 'file.img', 'all'),
+            ('file.img', 'file.hdr', 'all'),
+            ('file.img', '',         'all'),
+            ('file.hdr', 'file',     'all'),
+            ('file.hdr', 'file.img', 'all'),
+            ('file.hdr', 'file.hdr', 'all'),
+            ('file.hdr', '',         'all'),
+        ]),
+
+        (['file.hdr', 'file.img', 'file.blob'], [
+            ('file',     'file',     ['file.hdr', 'file.img']),
+            ('file',     'file.img', ['file.hdr', 'file.img']),
+            ('file',     'file.hdr', ['file.hdr', 'file.img']),
+            ('file',     '',         ['file.hdr', 'file.img']),
+            ('file.img', 'file',     ['file.hdr', 'file.img']),
+            ('file.img', 'file.img', ['file.hdr', 'file.img']),
+            ('file.img', 'file.hdr', ['file.hdr', 'file.img']),
+            ('file.img', '',         ['file.hdr', 'file.img']),
+            ('file.hdr', 'file',     ['file.hdr', 'file.img']),
+            ('file.hdr', 'file.img', ['file.hdr', 'file.img']),
+            ('file.hdr', 'file.hdr', ['file.hdr', 'file.img']),
+            ('file.hdr', '',         ['file.hdr', 'file.img']),
+        ]),
+
+
+        (['file.hdr', 'file.img', 'file.nii'], [
+            ('file.img', 'file',     ['file.hdr', 'file.img']),
+            ('file.img', 'file.img', ['file.hdr', 'file.img']),
+            ('file.img', 'file.hdr', ['file.hdr', 'file.img']),
+            ('file.img', '',         ['file.hdr', 'file.img']),
+            ('file.hdr', 'file',     ['file.hdr', 'file.img']),
+            ('file.hdr', 'file.img', ['file.hdr', 'file.img']),
+            ('file.hdr', 'file.hdr', ['file.hdr', 'file.img']),
+            ('file.hdr', '',         ['file.hdr', 'file.img']),
+            ('file.nii', 'file',     'file.nii'),
+            ('file.nii', 'file.nii', 'file.nii'),
+            ('file.nii', '',         'file.nii'),
+        ]),        
+                
+        
+        (['file.nii'], [
+            ('file',     'file',     'all'),
+            ('file',     'file.nii', 'all'),
+            ('file',     '',         'all'),
+            ('file.nii', 'file',     'all'),
+            ('file.nii', 'file.nii', 'all'),
+            ('file.nii', '',         'all'),
+        ]),
+
+        (['file.nii.gz'], [
+            ('file',        'file',        'all'),
+            ('file',        'file.nii.gz', 'all'),
+            ('file',        '',            'all'),
+            ('file.nii.gz', 'file',        'all'),
+            ('file.nii.gz', 'file.nii.gz', 'all'),
+            ('file.nii.gz', '',            'all'),
+        ]),
+
+        
+        (['file.nii', 'file.blob'], [
+            ('file',     'file',     'file.nii'),
+            ('file',     'file.nii', 'file.nii'),
+            ('file',     '',         'file.nii'),
+            ('file.nii', 'file',     'file.nii'),
+            ('file.nii', 'file.nii', 'file.nii'),
+            ('file.nii', '',         'file.nii'),
+        ]), 
+        
+
+        (['file.nii', 'file.nii.gz'], [
+            ('file.nii',    'file',        'file.nii'),
+            ('file.nii',    'file.nii',    'file.nii'),
+            ('file.nii',    '',            'file.nii'),
+            ('file.nii.gz', 'file',        'file.nii.gz'),
+            ('file.nii.gz', 'file.nii.gz', 'file.nii.gz'),
+            ('file.nii.gz', '',            'file.nii.gz'),
+        ]),
+
+        (['file.hdr', 'file.img', 'file.nii', 'file.nii.gz'], [
+            (['file.img', 'file.nii', 'file.nii.gz'], '', 'all'),
+            ('file.img',                              '', ['file.hdr', 'file.img']),
+            (['file.hdr', 'file.img'],                '', ['file.hdr', 'file.img']),
+
+            ('file.nii',                              '', 'file.nii'),
+            (['file.nii', 'file.nii.gz'],             '', ['file.nii', 'file.nii.gz']),
+        ]),
+
+
+        (['001.hdr', '001.img', '002.hdr', '002.img', '003.hdr', '003.img'], [
+            
+            (['001',     '002',     '003'],                                      '', 'all'),
+            (['001.img', '002.img', '003.img'],                                  '', 'all'),
+            (['001.hdr', '002.hdr', '003.hdr'],                                  '', 'all'),
+                                                                                    
+            (['001.img', '002',     '003'],                                      '', 'all'),
+            (['001.hdr', '002',     '003'],                                      '', 'all'),
+
+            (['001.img', '002.hdr', '003.img'],                                  '', 'all'),
+            (['001.hdr', '002.img', '003.hdr'],                                  '', 'all'),
+
+            (['001',     '003'],                                                 '', ['001.hdr', '001.img', '003.hdr', '003.img']),
+            (['001.img', '003.img'],                                             '', ['001.hdr', '001.img', '003.hdr', '003.img']),
+            (['001.hdr', '003.hdr'],                                             '', ['001.hdr', '001.img', '003.hdr', '003.img']),
+                                                                         
+            (['001.img', '003'],                                                 '', ['001.hdr', '001.img', '003.hdr', '003.img']),
+            (['001.hdr', '003'],                                                 '', ['001.hdr', '001.img', '003.hdr', '003.img']),
+
+            (['001.img', '003.img'],                                             '', ['001.hdr', '001.img', '003.hdr', '003.img']),
+            (['001.hdr', '003.hdr'],                                             '', ['001.hdr', '001.img', '003.hdr', '003.img']), 
+
+            (['001.img', '001.hdr', '002.img', '002.hdr', '003.img', '003.hdr'], '', 'all'),
+        ]),  
+    ]
+
+
+    indir  = tempfile.mkdtemp()
+    outdir = tempfile.mkdtemp()
+
+    try:
+
+        for files_to_create, tests in shouldPass:
+            
+            if not isinstance(files_to_create, list):
+                files_to_create = [files_to_create]
+                
+            for imcp_src, imcp_dest, should_exist in tests:
+
+                if   not isinstance(imcp_src, list):     imcp_src     = [imcp_src]
+                if   should_exist == 'all':              should_exist = list(files_to_create)
+                elif not isinstance(should_exist, list): should_exist = [should_exist]
+
+                imcp_dest = op.join(outdir, imcp_dest)
+
+                # Each input file contains
+                # its name in plain text,
+                # so we can verify that the
+                # files were correctly copied
+                for fn in files_to_create:
+                    with open(op.join(indir, fn), 'wt') as f:
+                        f.write('{}\n'.format(fn))
+
+                for src in imcp_src:
+
+                    src = op.join(indir, src)
+                    
+                    if move: fslpath.immv(src, imcp_dest, allowedExts=allowedExts, fileGroups=groups)
+                    else:    fslpath.imcp(src, imcp_dest, allowedExts=allowedExts, fileGroups=groups)
+
+                copied = os.listdir(outdir)
+                copied = [f for f in copied if op.isfile(op.join(outdir, f))]
+
+                assert sorted(copied) == sorted(should_exist)
+
+                # check file contents 
+                for fn in should_exist:
+                    with open(op.join(outdir, fn), 'rt') as f:
+                        assert f.read() == '{}\n'.format(fn)
+
+                # If move, check that
+                # input files are gone
+                if move:
+                    for f in should_exist:
+                         assert not op.exists(op.join(indir, f))
+                         
+                for f in files_to_create:
+                    try:    os.remove(op.join(indir,  f))
+                    except: pass
+                        
+                for f in should_exist:
+                    os.remove(op.join(outdir, f))
+        
+        
+    finally:
+        shutil.rmtree(indir)
+        shutil.rmtree(outdir)
+
+
+def test_immv_shouldPass():
+    test_imcp_shouldPass(move=True)
-- 
GitLab