From b82b4c409b345f3324c290179515f45d3ab2b87f Mon Sep 17 00:00:00 2001
From: Paul McCarthy <pauld.mccarthy@gmail.com>
Date: Tue, 18 Apr 2017 14:24:11 +0100
Subject: [PATCH] Unit tests for fixlabels module.

---
 tests/test_fixlabels.py    | 366 +++++++++++++++++++++++++++++++++++++
 tests/test_melodicimage.py |   3 -
 2 files changed, 366 insertions(+), 3 deletions(-)
 create mode 100644 tests/test_fixlabels.py

diff --git a/tests/test_fixlabels.py b/tests/test_fixlabels.py
new file mode 100644
index 000000000..8f374fd58
--- /dev/null
+++ b/tests/test_fixlabels.py
@@ -0,0 +1,366 @@
+#!/usr/bin/env python
+#
+# test_fixlabels.py -
+#
+# Author: Paul McCarthy <pauldmccarthy@gmail.com>
+#
+
+import os.path as op
+import            textwrap
+
+import pytest
+
+import tests
+import fsl.data.fixlabels as fixlabels
+
+goodfiles = []
+
+goodfiles.append(("""
+filtered_func_data.ica
+1, Signal, False
+2, Unclassified Noise, True
+3, Unknown, False
+4, Signal, False
+5, Unclassified Noise, True
+6, Unclassified Noise, True
+7, Unclassified Noise, True
+8, Signal, False
+[2, 5, 6, 7]
+""",
+'filtered_func_data.ica',
+[['Signal'],
+ ['Unclassified Noise'],
+ ['Unknown'],
+ ['Signal'],
+ ['Unclassified Noise'],
+ ['Unclassified Noise'],
+ ['Unclassified Noise'],
+ ['Signal']]))
+
+
+goodfiles.append(("""
+REST.ica/filtered_func_data.ica
+1, Signal, Unclassified noise, Cardiac, White matter, False
+2, Non-brain, Movement, MRI, True
+3, Unclassified noise, True
+4, Non-brain, True
+5, Unclassified noise, True
+6, Non-brain, True
+7, Respiratory, True
+8, White matter, True
+9, Movement, True
+10, White matter, True
+11, White matter, True
+12, Movement, True
+13, Unclassified noise, True
+14, Unclassified noise, True
+15, Signal, False
+16, Signal, False
+17, Signal, False
+18, Signal, False
+19, Signal, False
+20, Signal, False
+21, Unclassified noise, True
+22, Unclassified noise, True
+23, Unclassified noise, True
+24, Unclassified noise, True
+25, Unknown, False
+[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 21, 22, 23, 24]
+""",
+'REST.ica/filtered_func_data.ica',
+[['Signal', 'Unclassified noise', 'Cardiac', 'White matter'],
+ ['Non-brain', 'Movement', 'MRI'],
+ ['Unclassified noise'],
+ ['Non-brain'],
+ ['Unclassified noise'],
+ ['Non-brain'],
+ ['Respiratory'],
+ ['White matter'],
+ ['Movement'],
+ ['White matter'],
+ ['White matter'],
+ ['Movement'],
+ ['Unclassified noise'],
+ ['Unclassified noise'],
+ ['Signal'],
+ ['Signal'],
+ ['Signal'],
+ ['Signal'],
+ ['Signal'],
+ ['Signal'],
+ ['Unclassified noise'],
+ ['Unclassified noise'],
+ ['Unclassified noise'],
+ ['Unclassified noise'],
+ ['Unknown']]))
+
+goodfiles.append(("""
+[2, 5, 6, 7]
+""",
+None,
+[['Signal'],
+ ['Unclassified noise'],
+ ['Signal'],
+ ['Signal'],
+ ['Unclassified noise'],
+ ['Unclassified noise'],
+ ['Unclassified noise']]))
+
+goodfiles.append(("""
+2, 5, 6, 7
+""",
+None,
+[['Unknown'],
+ ['Movement'],
+ ['Unknown'],
+ ['Unknown'],
+ ['Movement'],
+ ['Movement'],
+ ['Movement']]))
+
+
+goodfiles.append(("""
+path/to/analysis.ica
+1, Unclassified noise, True
+2, Signal, Blob
+[1]
+""",
+'path/to/analysis.ica',
+[['Unclassified noise'],
+ ['Signal', 'Blob']]))
+
+def test_loadLabelFile_good():
+
+    for filecontents, expMelDir, expLabels in goodfiles:
+
+        with tests.testdir() as testdir:
+
+            if expMelDir is not None:
+                expMelDir = op.join(testdir, expMelDir)
+
+            fname = op.join(testdir, 'labels.txt')
+            with open(fname, 'wt') as f:
+                f.write(filecontents.strip())
+
+            resMelDir, resLabels = fixlabels.loadLabelFile(fname)
+
+            assert resMelDir == expMelDir
+            
+            assert len(resLabels) == len(expLabels)
+            for exp, res in zip(expLabels, resLabels):
+                assert exp == res
+
+
+
+
+# No contents
+badfiles = []
+badfiles.append('')
+
+# Badly formed component line
+badfiles.append("""
+path/to/analysis.ica
+1, Unclassified noise, True
+2 Signal, False
+[1]
+""")
+
+# Badly formed component line (again)
+badfiles.append("""
+path/to/analysis.ica
+1, Unclassified noise, True
+Signal, False
+[1]
+""")
+
+# Badly formed component line (again)
+badfiles.append("""
+path/to/analysis.ica
+1, Unclassified noise, True
+Signal, Movement, False
+[1]
+""")
+
+
+# Badly formed component line (again)
+badfiles.append("""
+path/to/analysis.ica
+1, Unclassified noise, True
+2, Signal
+[1]
+""")
+
+# Missing path
+badfiles.append("""
+1, Signal, False
+2, Unclassified noise, True
+[2]
+""")
+
+# Duplicate component line
+badfiles.append("""
+path/to/analysis.ica
+1, Unclassified noise, True
+1, Unclassified noise, True
+[1]
+""")
+
+# Missing component line
+badfiles.append("""
+path/to/analysis.ica
+2, Unclassified noise, True
+3, Signal, False
+[2]
+""")
+
+
+# Missing component line (again)
+badfiles.append("""
+path/to/analysis.ica
+1, Unclassified noise, True
+2, Unclassified noise, True
+5, Signal, False
+[1, 2]
+""")
+
+
+# Missing noisy list
+badfiles.append("""
+path/to/analysis.ica
+1, Unclassified noise, True
+2, Unclassified noise, True
+3, Signal, False
+""")
+
+# Invalid noisy list
+badfiles.append("""
+path/to/analysis.ica
+1, Unclassified noise, True
+2, Unclassified noise, True
+3, Signal, False
+[1, 3]
+""")
+
+# Invalid noisy list
+badfiles.append("""
+path/to/analysis.ica
+1, Unclassified noise, True
+2, Unclassified noise, True
+3, Signal, False
+[4, 6]
+""")
+
+# Invalid noisy list
+badfiles.append("""
+path/to/analysis.ica
+1, Unclassified noise, True
+2, Unclassified noise, True
+3, Signal, False
+[1, 3]
+""")
+
+
+def test_loadLabelFile_bad():
+
+    with pytest.raises(Exception):
+        fixlabels.loadLabelFile('notafile')
+
+    for bf in badfiles:
+        with tests.testdir() as testdir:
+            fname = op.join(testdir, 'labels.txt')
+            with open(fname, 'wt') as f:
+                f.write(bf.strip())
+
+            with pytest.raises(Exception):
+                fixlabels.loadLabelFile(fname)
+
+
+def test_loadLabelFile_customLabels():
+
+    included = [2, 3, 4, 5]
+    contents = '[{}]\n'.format([i + 1 for i in included])
+
+    defIncLabel = 'Unclassified noise'
+    defExcLabel = 'Signal'
+
+    with tests.testdir() as testdir:
+        fname = op.join(testdir, 'labels.txt')
+
+        with open(fname, 'wt') as f:
+            f.write(contents)
+
+        # Check default labels
+        _, labels = fixlabels.loadLabelFile(fname)
+        for i, ilbls in enumerate(labels):
+            assert len(ilbls) == 1
+            if i in included:
+                assert ilbls[0] == defIncLabel
+            else:
+                assert ilbls[0] == defExcLabel
+
+        # Check custom labels
+        incLabel  = 'Included'
+        excLabel  = 'Excluded label'
+        _, labels = fixlabels.loadLabelFile(fname,
+                                            includeLabel=incLabel,
+                                            excludeLabel=excLabel)
+        for i, ilbls in enumerate(labels):
+            assert len(ilbls) == 1
+            if i in included:
+                assert ilbls[0] == incLabel
+            else:
+                assert ilbls[0] == excLabel 
+
+
+def test_saveLabelFile():
+
+
+    labels = [['Label1', 'Label2', 'Label3'],
+              ['Signal'],
+              ['Noise'],
+              ['Label1'],
+              ['Unknown']]
+
+    expected = textwrap.dedent("""
+    1, Label1, Label2, Label3, True
+    2, Signal, False
+    3, Noise, True
+    4, Label1, True
+    5, Unknown, False
+    """).strip()
+    
+    with tests.testdir() as testdir:
+        fname = op.join(testdir, 'fname.txt')
+
+        # dirname=None, listBad=False
+        fixlabels.saveLabelFile(labels, fname, listBad=False)
+        with open(fname, 'rt') as f:
+            assert f.read().strip() == expected
+
+        # dirname=something, listBad=False
+        dirname = 'Blob/a.ica'
+        fixlabels.saveLabelFile(labels, fname, dirname=dirname, listBad=False)
+        exp = '{}\n{}'.format(op.abspath(dirname), expected)
+        with open(fname, 'rt') as f:
+            assert f.read().strip() == exp
+            
+        # dirname=None, listBad=True
+        fixlabels.saveLabelFile(labels, fname)
+        exp = '{}\n[1, 3, 4]'.format(expected)
+        with open(fname, 'rt') as f: 
+            assert f.read().strip() == exp 
+
+        # Custom signal labels
+        sigLabels = ['Label1']
+        exp = textwrap.dedent("""
+        1, Label1, Label2, Label3, False
+        2, Signal, True
+        3, Noise, True
+        4, Label1, False
+        5, Unknown, True
+        [2, 3, 5]
+        """).strip()
+
+        fixlabels.saveLabelFile(labels, fname, signalLabels=sigLabels)
+        with open(fname, 'rt') as f: 
+            assert f.read().strip() == exp 
diff --git a/tests/test_melodicimage.py b/tests/test_melodicimage.py
index 1f0be6e3a..7122d6f2d 100644
--- a/tests/test_melodicimage.py
+++ b/tests/test_melodicimage.py
@@ -176,6 +176,3 @@ def test_MelodicImage_tr():
 
         assert cbCalled[0]
         assert img.tr == 8
-
-def test_MelodicImage_classification():
-    pass
-- 
GitLab