Completed
Push — master ( 3a9231...6e06ad )
by Jasper
16s
created

FifTests   A

Complexity

Total Complexity 23

Size/Duplication

Total Lines 159
Duplicated Lines 0 %

Importance

Changes 9
Bugs 0 Features 0
Metric Value
c 9
b 0
f 0
dl 0
loc 159
rs 10
wmc 23

20 Methods

Rating   Name   Duplication   Size   Complexity  
A setUp() 0 14 1
A test_Gets_basic_info_from_mne_and_returns_it() 0 6 1
A test_Gets_dimensions() 0 6 1
A test_Determines_modality() 0 3 1
A test_epochs() 0 8 1
A test_Attach_method_doesnt_do_anything_on_non_raw_files() 0 7 4
A test_evokeds() 0 5 1
A test_Preserves_modality_if_inherited() 0 2 1
A test_forward() 0 4 1
A test_Tries_different_mne_access_functions_or_fails_silently() 0 10 1
A test_covariance() 0 5 1
A test_trans() 0 4 1
A test_Attach_method() 0 13 1
A test_mnepy_read_funcs_throw_ioerror() 0 4 1
A setupEvokedsFile() 0 6 1
A setupRawFile() 0 16 1
A setupForwardFile() 0 4 1
A setupEpochsFile() 0 10 1
A setupTransFile() 0 4 1
A setupCovarianceFile() 0 5 1
1
import unittest, numpy
2
from mock import Mock
3
from datetime import datetime
4
from tests.test_basefile import BaseFileTests
5
6
7
class FifTests(BaseFileTests):
8
9
    def setUp(self):
10
        super(FifTests, self).setUp()
11
        self.libs = Mock()
12
        self.libs.hasDependency.return_value = True
13
        self.libs.mne.io.read_raw_fif.side_effect = ValueError
14
        self.libs.mne.read_cov.side_effect = ValueError
15
        self.libs.mne.read_epochs.side_effect = ValueError
16
        self.libs.mne.read_evokeds.side_effect = ValueError
17
        self.libs.mne.read_forward_solution.side_effect = ValueError
18
        self.libs.mne.read_trans.side_effect = ValueError
19
        self.dependencies.getLibraries.return_value = self.libs
20
        from niprov.fif import FifFile
21
        self.constructor = FifFile
22
        self.file = FifFile(self.path, dependencies=self.dependencies)
23
24
    def test_Gets_basic_info_from_mne_and_returns_it(self):
25
        self.setupRawFile()
26
        out = self.file.inspect()
27
        self.assertEqual(out['subject'], 'John Doeish')
28
        self.assertEqual(out['project'], 'worlddom')
29
        self.assertEqual(out['acquired'], self.acquired)
30
31
    def test_Gets_dimensions(self):
32
        self.setupRawFile()
33
        out = self.file.inspect()
34
        self.assertEqual(out['dimensions'], [123, 91])
35
        self.assertEqual(out['sampling-frequency'], 200)
36
        self.assertEqual(out['duration'], 91/200.)
37
38
    def test_Attach_method(self):
39
        self.setupRawFile()
40
        self.file.inspect()
41
        self.file.getProvenance = Mock()
42
        self.file.getProvenance.return_value = 'serial prov'
43
        self.file.attach('json')
44
        self.file.getProvenance.assert_called_with('json')
45
        self.assertIn('existing bla bla ', #original string+added space 
46
            self.img.info['description'])
47
        self.assertIn('NIPROV:'+'serial prov', 
48
            self.img.info['description'])
49
        self.libs.mne.io.write_info.assert_called_with(self.file.path, 
50
            self.img.info)
51
52
    def test_Attach_method_doesnt_do_anything_on_non_raw_files(self):
53
        self.setupEpochsFile()
54
        self.file.getProvenance = Mock()
55
        self.file.attach('json')
56
        assert not self.libs.mne.io.read_info.called
57
        assert not self.file.getProvenance.called
58
        assert not self.libs.mne.io.write_info.called
59
60
    def test_Determines_modality(self):
61
        out = self.file.inspect()
62
        self.assertEqual(out['modality'], 'MEG')
63
64
    def test_Preserves_modality_if_inherited(self):
65
        pass # Doesn't have to preserve
66
67
    def test_Tries_different_mne_access_functions_or_fails_silently(self):
68
        out = self.file.inspect()
69
        self.libs.mne.io.read_raw_fif.assert_called_with(self.path, 
70
                                                         allow_maxshield=True)
71
        self.libs.mne.read_cov.assert_called_with(self.path)
72
        self.libs.mne.read_epochs.assert_called_with(self.path)
73
        self.libs.mne.read_evokeds.assert_called_with(self.path)
74
        self.libs.mne.read_forward_solution.assert_called_with(self.path)
75
        self.libs.mne.read_trans.assert_called_with(self.path)
76
        self.assertEqual(out['fif-type'], 'other')
77
78
    def test_epochs(self):
79
        self.setupEpochsFile()
80
        out = self.file.inspect()
81
        self.assertEqual(out['fif-type'], 'epo')
82
        self.assertEqual(out['lowpass'],40.0)
83
        self.assertEqual(out['highpass'],0.10000000149) 
84
        self.assertEqual(out['bad-channels'],['MEG666', 'ECG999'])
85
        self.assertEqual(out['dimensions'], [7, 455])
86
87
    def test_evokeds(self):
88
        self.setupEvokedsFile()
89
        out = self.file.inspect()
90
        self.assertEqual(out['fif-type'], 'ave')
91
        self.assertEqual(out['dimensions'], [3, 306, 455])
92
93
    def test_covariance(self):
94
        self.setupCovarianceFile()
95
        out = self.file.inspect()
96
        self.assertEqual(out['fif-type'], 'cov')
97
        self.assertEqual(out['dimensions'], [365, 365])
98
99
    def test_forward(self):
100
        self.setupForwardFile()
101
        out = self.file.inspect()
102
        self.assertEqual(out['fif-type'], 'fwd')
103
104
    def test_trans(self):
105
        self.setupTransFile()
106
        out = self.file.inspect()
107
        self.assertEqual(out['fif-type'], 'trans')
108
109
110
    def test_mnepy_read_funcs_throw_ioerror(self):
111
        self.libs.mne.read_trans.side_effect = IOError
112
        out = self.file.inspect()
113
        self.libs.mne.read_trans.assert_called_with(self.path)
114
115
116
    def setupRawFile(self):
117
        TS = 1422522595.76096
118
        self.acquired = datetime.fromtimestamp(TS)
119
        self.img = Mock()
120
        self.img.info = {
121
            'meas_date':(TS,),
122
            'proj_name':'worlddom',
123
            'subject_info':{'first_name':'John','last_name':'Doeish'},
124
            'nchan':123,
125
            'sfreq':200,
126
            'description':'existing bla bla'}
127
        self.img.first_samp = 10
128
        self.img.last_samp = 100
129
        self.libs.mne.io.read_raw_fif.side_effect = None
130
        self.libs.mne.io.read_raw_fif.return_value = self.img
131
        self.libs.mne.io.read_info.return_value = self.img.info
132
133
    def setupEpochsFile(self):
134
        self.img = Mock()
135
        self.img.info = {
136
            'lowpass': 40.0,
137
            'highpass': 0.10000000149, 
138
            'bads': ['MEG666', 'ECG999']}
139
        self.img.events = numpy.zeros((7,3))
140
        self.img.times = numpy.zeros((455,1))
141
        self.libs.mne.read_epochs.side_effect = None
142
        self.libs.mne.read_epochs.return_value = self.img
143
144
    def setupEvokedsFile(self):
145
        self.img = Mock()
146
        self.img.info = {}
147
        self.img.data = numpy.zeros((306,455))
148
        self.libs.mne.read_evokeds.side_effect = None
149
        self.libs.mne.read_evokeds.return_value = [self.img, self.img, self.img]
150
151
    def setupCovarianceFile(self):
152
        self.img = Mock()
153
        self.img.data = numpy.zeros((365,365))
154
        self.libs.mne.read_cov.side_effect = None
155
        self.libs.mne.read_cov.return_value = self.img
156
157
    def setupForwardFile(self):
158
        self.img = Mock()
159
        self.libs.mne.read_forward_solution.side_effect = None
160
        self.libs.mne.read_forward_solution.return_value = self.img
161
162
    def setupTransFile(self):
163
        self.img = Mock()
164
        self.libs.mne.read_trans.side_effect = None
165
        self.libs.mne.read_trans.return_value = self.img
166
167