Skip to content

Commit 7822a12

Browse files
committed
TST: added unit test for TCK files written in big-endian
1 parent 6f3ab59 commit 7822a12

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

nibabel/streamlines/tck.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from .array_sequence import ArraySequence
1616
from .tractogram_file import TractogramFile
17-
from .tractogram_file import HeaderError, DataWarning
17+
from .tractogram_file import HeaderError, DataWarning, DataError
1818
from .tractogram import TractogramItem, Tractogram, LazyTractogram
1919
from .header import Field
2020

@@ -206,8 +206,8 @@ def save(self, fileobj):
206206

207207
for t in tractogram:
208208
s = t.streamline.astype(dtype)
209-
f.write(asbytes(np.r_[s.astype('<f4'),
210-
self.FIBER_DELIMITER].tostring()))
209+
data = np.r_[s, self.FIBER_DELIMITER]
210+
f.write(asbytes(data.tostring()))
211211
nb_streamlines += 1
212212

213213
header[Field.NB_STREAMLINES] = nb_streamlines
@@ -281,7 +281,7 @@ def _read_header(fileobj):
281281

282282
with Opener(fileobj) as f:
283283
# Read magic number
284-
buf = asstr(f.fobj.readline())
284+
magic_number = asstr(f.fobj.readline())
285285

286286
# Read all key-value pairs contained in the header.
287287
buf = asstr(f.fobj.readline())
@@ -290,6 +290,7 @@ def _read_header(fileobj):
290290

291291
# Build header dictionary from the buffer.
292292
hdr = dict(item.split(': ') for item in buf.rstrip().split('\n')[:-1])
293+
hdr[Field.MAGIC_NUMBER] = magic_number
293294

294295
# Check integrity of TCK header.
295296
if 'datatype' not in hdr:
@@ -379,7 +380,15 @@ def _read(fileobj, header, buffer_size=4):
379380
pts = pts.reshape([-1, 3])
380381
idx_nan = np.arange(len(pts))[np.isnan(pts[:, 0])]
381382

383+
# Make sure we've read enough to find a streamline delimiter.
382384
if len(idx_nan) == 0:
385+
# If we've read the whole file, then fail.
386+
if eof and not np.all(np.isinf(pts)):
387+
msg = ("Cannot find a streamline delimiter. This file"
388+
" might be corrupted.")
389+
raise DataError(msg)
390+
391+
# Otherwise read a bit more.
383392
continue
384393

385394
nb_pts_total = 0

nibabel/streamlines/tests/test_tck.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55

66
from nibabel.externals.six import BytesIO
77

8-
from nose.tools import assert_equal
8+
from nose.tools import assert_equal, assert_raises
99

1010
from nibabel.testing import data_path
1111
from .test_tractogram import assert_tractogram_equal
1212
from ..tractogram import Tractogram
13+
from ..tractogram_file import DataError
1314

1415
from ..tck import TckFile
1516

@@ -86,6 +87,20 @@ def test_load_simple_file(self):
8687
trk = TckFile.load(DATA['simple_tck_fname'], lazy_load=lazy_load)
8788
assert_tractogram_equal(trk.tractogram, DATA['simple_tractogram'])
8889

90+
def test_load_simple_file_in_big_endian(self):
91+
for lazy_load in [False, True]:
92+
tck = TckFile.load(DATA['simple_tck_big_endian_fname'],
93+
lazy_load=lazy_load)
94+
assert_tractogram_equal(tck.tractogram, DATA['simple_tractogram'])
95+
assert_equal(tck.header['datatype'], 'Float32BE')
96+
97+
def test_load_file_with_wrong_information(self):
98+
tck_file = open(DATA['simple_tck_fname'], 'rb').read()
99+
100+
# Simulate a TCK file where `datatype` was incorrectly provided.
101+
new_tck_file = tck_file.replace("Float32LE", "Float32BE")
102+
assert_raises(DataError, TckFile.load, BytesIO(new_tck_file))
103+
89104
def test_write_empty_file(self):
90105
tractogram = Tractogram(affine_to_rasmm=np.eye(4))
91106

@@ -149,3 +164,7 @@ def test_load_write_file(self):
149164
loaded_tck = TckFile.load(tck_file, lazy_load=False)
150165
assert_tractogram_equal(loaded_tck.tractogram,
151166
tractogram.to_world(lazy=True))
167+
168+
def test_str(self):
169+
tck = TckFile.load(DATA['simple_tck_fname'])
170+
str(tck) # Simply test it's not failing when called.
211 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)