diff --git a/tests/conftest.py b/tests/conftest.py index 0047f5247e1d342b7c88a4a8cabeaef76e86021c..1ab8944d8f3607d25c9f65a910939cc58a843b67 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,6 +7,11 @@ import pytest +import os.path as op +import random +import numpy as np + + def pytest_addoption(parser): parser.addoption('--niters', @@ -19,15 +24,33 @@ def pytest_addoption(parser): action='store', help='FSLeyes test data directory') + parser.addoption('--seed', + type=int, + help='Seed for random number generator') + @pytest.fixture def testdir(request): """FSLeyes test data directory.""" - return request.config.getoption('--testdir') + return op.expanduser(request.config.getoption('--testdir')) @pytest.fixture def niters(request): """Number of test iterations.""" return request.config.getoption('--niters') + + +@pytest.fixture +def seed(request): + + seed = request.config.getoption('--seed') + + if seed is None: + seed = np.random.randint(2 ** 32) + + np.random.seed(seed) + random .seed(seed) + print('Seed for random number generator: {}'.format(seed)) + return seed diff --git a/tests/test_imagewrapper.py b/tests/test_imagewrapper.py index 0692f1da29f31a44300ef070369f857faa7db6ac..bdc950579d3b9219c1c32b0597db577535d0b541 100644 --- a/tests/test_imagewrapper.py +++ b/tests/test_imagewrapper.py @@ -18,6 +18,13 @@ import fsl.data.image as image import fsl.data.imagewrapper as imagewrap + +import logging +logging.basicConfig(level=logging.DEBUG) +logging.getLogger('fsl').setLevel(logging.WARNING) +log = logging.getLogger() + + real_print = print def print(*args, **kwargs): @@ -37,9 +44,6 @@ def random_coverage(shape, vol_limit=None): ndims = len(shape) - 1 nvols = shape[-1] - print('{}D (shape: {}, {} vectors/slices/volumes)'.format( - ndims, shape, nvols)) - # Generate a random coverage. # We use the same coverage for # each vector/slice/volume, so @@ -520,7 +524,7 @@ def test_calcExpansion(niters): _test_expansion(coverage, slices, vols, exps) -def test_ImageWrapper_read(niters): +def test_ImageWrapper_read(niters, seed): for _ in range(niters): @@ -577,9 +581,12 @@ def test_ImageWrapper_read(niters): if j < nvols - 1: assert not wrapper.covered else: assert wrapper.covered - -def test_ImageWrapper_write_out(niters): + +def test_ImageWrapper_write_out(niters, seed): # This is HORRIBLE + + loop = 0 + # Generate a bunch of random coverages for _ in range(niters): @@ -602,13 +609,14 @@ def test_ImageWrapper_write_out(niters): # Generate a random coverage cov = random_coverage(shape, vol_limit=1) - print('This is the coverage: {}'.format(cov)) - img = nib.Nifti1Image(data, np.eye(4)) wrapper = imagewrap.ImageWrapper(img) applyCoverage(wrapper, cov) clo, chi = wrapper.dataRange + log.debug('{:3d} / {:3d}'.format(loop, niters)) + loop += 1 + # Now, we'll simulate some writes # outside of the coverage area. for _ in range(niters): @@ -616,13 +624,13 @@ def test_ImageWrapper_write_out(niters): # Generate some slices outside # of the coverage area, making # sure that the slice covers - # at least two elements + # at least one element while True: slices = random_slices(cov, shape, 'out') slices[-1] = [0, 1] sliceshape = [hi - lo for lo, hi in slices] - if np.prod(sliceshape) == 1: + if np.prod(sliceshape) == 0: continue sliceobjs = imagewrap.sliceTupleToSliceObj(slices) @@ -630,8 +638,8 @@ def test_ImageWrapper_write_out(niters): sliceshape = sliceshape[:-1] break - print('---------------') - print('Slice {}'.format(slices)) + # print('---------------') + # print('Slice {}'.format(slices)) # Expected wrapper coverage after the write expCov = imagewrap.adjustCoverage(cov[..., 0], slices) @@ -669,9 +677,9 @@ def test_ImageWrapper_write_out(niters): wrapper = imagewrap.ImageWrapper(img) applyCoverage(wrapper, cov) - print('ndims', ndims) - print('sliceshape', sliceshape) - print('sliceobjs', sliceobjs) + # print('ndims', ndims) + # print('sliceshape', sliceshape) + # print('sliceobjs', sliceobjs) newData = np.linspace(rlo, rhi, np.prod(sliceshape)) newData = newData.reshape(sliceshape) @@ -679,7 +687,7 @@ def test_ImageWrapper_write_out(niters): # Make sure that the expected low/high values # are present in the data being written - print('Writing data (shape: {})'.format(newData.shape)) + # print('Writing data (shape: {})'.format(newData.shape)) oldCov = wrapper.coverage(0) @@ -688,26 +696,26 @@ def test_ImageWrapper_write_out(niters): expLo, expHi = coverageDataRange(img.get_data(), cov, slices) newLo, newHi = wrapper.dataRange - print('Old range: {} - {}'.format(clo, chi)) - print('Sim range: {} - {}'.format(rlo, rhi)) - print('Exp range: {} - {}'.format(expLo, expHi)) - print('NewDat range: {} - {}'.format(newData.min(), newData.max())) - print('Data range: {} - {}'.format(data.min(), data.max())) - print('Expand range: {} - {}'.format(elo, ehi)) - print('New range: {} - {}'.format(newLo, newHi)) + # print('Old range: {} - {}'.format(clo, chi)) + # print('Sim range: {} - {}'.format(rlo, rhi)) + # print('Exp range: {} - {}'.format(expLo, expHi)) + # print('NewDat range: {} - {}'.format(newData.min(), newData.max())) + # print('Data range: {} - {}'.format(data.min(), data.max())) + # print('Expand range: {} - {}'.format(elo, ehi)) + # print('New range: {} - {}'.format(newLo, newHi)) newCov = wrapper.coverage(0) - print('Old coverage: {}'.format(oldCov)) - print('New coverage: {}'.format(newCov)) - print('Expected coverage: {}'.format(expCov)) - print() - print() + # print('Old coverage: {}'.format(oldCov)) + # print('New coverage: {}'.format(newCov)) + # print('Expected coverage: {}'.format(expCov)) + # print() + # print() assert np.all(newCov == expCov) assert np.isclose(newLo, expLo) assert np.isclose(newHi, expHi) - print('--------------') + # print('--------------') def test_ImageWrapper_write_in_overlap(niters): @@ -741,13 +749,13 @@ def test_ImageWrapper_write_in_overlap(niters): # Generate some slices outside # of the coverage area, making # sure that the slice covers - # at least two elements + # at least one element while True: slices = random_slices(cov, shape, random.choice(('in', 'overlap'))) slices[-1] = [0, 1] sliceshape = [hi - lo for lo, hi in slices] - if np.prod(sliceshape) == 1: + if np.prod(sliceshape) == 0: continue sliceobjs = imagewrap.sliceTupleToSliceObj(slices) @@ -867,7 +875,7 @@ def test_ImageWrapper_write_different_volume(niters): sliceshape = [hi - lo for lo, hi in slices] - if np.prod(sliceshape) == 1: + if np.prod(sliceshape) == 0: continue sliceobjs = imagewrap.sliceTupleToSliceObj(slices)