def test_value(): """Test getting the value of the data at the current coordinates.""" np.random.seed(0) data = np.random.random((10, 15, 20)) layer = Image(data) layer._slice_dims(ndisplay=3) value = layer.get_value((0,) * 3) assert value == data[0, 0, 0]
def test_message(): """Test converting value and coords to message.""" np.random.seed(0) data = np.random.random((10, 15, 20)) layer = Image(data) layer._slice_dims(ndisplay=3) msg = layer.get_status(layer.position) assert type(msg) == str
def test_all_zeros_volume(): """Test instantiating Image layer with all zeros data.""" shape = (10, 15, 20) data = np.zeros(shape, dtype=float) layer = Image(data) layer._slice_dims(ndisplay=3) assert np.all(layer.data == data) assert layer.ndim == len(shape) np.testing.assert_array_equal(layer.extent.data[1] + 1, shape) assert layer._data_view.shape == shape[-3:]
def test_4D_volume(): """Test instantiating multiple Image layers with random 4D data.""" shape = (10, 15, 6, 8) np.random.seed(0) data = np.random.random(shape) layer = Image(data) layer._slice_dims(ndisplay=3) assert np.all(layer.data == data) assert layer.ndim == len(shape) np.testing.assert_array_equal(layer.extent.data[1] + 1, shape) assert layer._data_view.shape == shape[-3:]
def test_integer_volume(): """Test instantiating Image layer with integer data.""" shape = (10, 15, 20) np.random.seed(0) data = np.round(10 * np.random.random(shape)).astype(int) layer = Image(data) layer._slice_dims(ndisplay=3) assert np.all(layer.data == data) assert layer.ndim == len(shape) np.testing.assert_array_equal(layer.extent.data[1] + 1, shape) assert layer._data_view.shape == shape[-3:]
def test_3D_volume(): """Test instantiating Image layer with random 3D data.""" shape = (10, 15, 6) np.random.seed(0) data = np.random.random(shape) layer = Image(data) layer._slice_dims(ndisplay=3) assert np.all(layer.data == data) assert layer.ndim == len(shape) assert layer.shape == shape assert layer._data_view.shape == shape[-3:]
def test_plane_controls_show_hide_on_ndisplay_change(qtbot): """Changing ndisplay should show/hide plane controls if depicting a plane.""" layer = Image(np.random.rand(10, 15, 20)) qtctrl = QtImageControls(layer) qtbot.addWidget(qtctrl) layer._slice_dims(ndisplay=3) layer.depiction = 'plane' assert not qtctrl.planeControls.isHidden() # isVisible() != not isHidden() layer._slice_dims(ndisplay=2) assert qtctrl.planeControls.isHidden()
def test_projected_distance_from_mouse_drag(start_position, end_position, view_direction, vector, expected_value): image = Image(np.ones((32, 32, 32))) image._slice_dims(point=[0, 0, 0], ndisplay=3) result = image.projected_distance_from_mouse_drag( start_position, end_position, view_direction, vector, dims_displayed=[0, 1, 2], ) assert np.allclose(result, expected_value)
def test_value_3d(position, view_direction, dims_displayed, world): """Currently get_value should return None in 3D""" np.random.seed(0) data = np.random.random((10, 15, 15)) layer = Image(data) layer._slice_dims([0, 0, 0], ndisplay=3) value = layer.get_value( position, view_direction=view_direction, dims_displayed=dims_displayed, world=world, ) assert value is None
def test_auto_contrast_buttons(qtbot): layer = Image(np.arange(8**3).reshape(8, 8, 8), contrast_limits=(0, 1)) qtctrl = QtImageControls(layer) qtbot.addWidget(qtctrl) assert layer.contrast_limits == [0, 1] qtctrl.autoScaleBar._once_btn.click() assert layer.contrast_limits == [0, 63] # change slice layer._slice_dims((1, 8, 8)) # hasn't changed yet assert layer.contrast_limits == [0, 63] # with auto_btn, it should always change qtctrl.autoScaleBar._auto_btn.click() assert layer.contrast_limits == [64, 127] layer._slice_dims((2, 8, 8)) assert layer.contrast_limits == [128, 191] layer._slice_dims((3, 8, 8)) assert layer.contrast_limits == [192, 255] # once button turns off continuous qtctrl.autoScaleBar._once_btn.click() layer._slice_dims((4, 8, 8)) assert layer.contrast_limits == [192, 255]
def test_changing_volume(): """Test changing Image data.""" shape_a = (10, 15, 30) shape_b = (20, 12, 6) np.random.seed(0) data_a = np.random.random(shape_a) data_b = np.random.random(shape_b) layer = Image(data_a) layer._slice_dims(ndisplay=3) layer.data = data_b assert np.all(layer.data == data_b) assert layer.ndim == len(shape_b) np.testing.assert_array_equal(layer.extent.data[1] + 1, shape_b) assert layer._data_view.shape == shape_b[-3:]
def test_scale(): """Test instantiating anisotropic 3D volume.""" shape = (10, 15, 20) scale = [3, 1, 1] full_shape = tuple(np.multiply(shape, scale)) np.random.seed(0) data = np.random.random(shape) layer = Image(data, scale=scale) layer._slice_dims(ndisplay=3) assert np.all(layer.data == data) assert layer.ndim == len(shape) assert layer.shape == full_shape # Note that the scale appears as the step size in the range assert layer._data_view.shape == shape[-3:]
def test_depiction_combobox_changes(qtbot): """Changing the model attribute should update the view.""" layer = Image(np.random.rand(10, 15, 20)) layer._slice_dims(ndisplay=3) qtctrl = QtImageControls(layer) qtbot.addWidget(qtctrl) combo_box = qtctrl.depictionComboBox opts = {combo_box.itemText(i) for i in range(combo_box.count())} depiction_options = { 'volume', 'plane', } assert opts == depiction_options layer.depiction = 'plane' assert combo_box.findText('plane') == combo_box.currentIndex() layer.depiction = 'volume' assert combo_box.findText('volume') == combo_box.currentIndex()
def test_scale(): """Test instantiating anisotropic 3D volume.""" shape = (10, 15, 20) scale = [3, 1, 1] full_shape = tuple(np.multiply(shape, scale)) np.random.seed(0) data = np.random.random(shape) layer = Image(data, scale=scale) layer._slice_dims(ndisplay=3) assert np.all(layer.data == data) assert layer.ndim == len(shape) np.testing.assert_array_equal( layer.extent.world[1] - layer.extent.world[0], full_shape) pixel_extent_end = np.asarray(full_shape) - 0.5 * np.asarray(scale) np.testing.assert_array_equal(layer.extent.world[1], pixel_extent_end) # Note that the scale appears as the step size in the range assert layer._data_view.shape == shape[-3:]
def test_plane_controls_show_hide_on_ndisplay_change(qtbot): """Changing ndisplay should show/hide plane controls if depicting a plane.""" layer = Image(np.random.rand(10, 15, 20)) qtctrl = QtImageControls(layer) qtbot.addWidget(qtctrl) layer._slice_dims(ndisplay=3) layer.depiction = 'plane' assert not qtctrl.planeThicknessSlider.isHidden() assert not qtctrl.planeThicknessLabel.isHidden() assert not qtctrl.planeNormalButtons.isHidden() assert not qtctrl.planeNormalLabel.isHidden() layer._slice_dims(ndisplay=2) assert qtctrl.planeThicknessSlider.isHidden() assert qtctrl.planeThicknessLabel.isHidden() assert qtctrl.planeNormalButtons.isHidden() assert qtctrl.planeNormalLabel.isHidden()
def test_switching_displayed_dimensions(): """Test instantiating data then switching to displayed.""" shape = (10, 15, 20) np.random.seed(0) data = np.random.random(shape) layer = Image(data) assert np.all(layer.data == data) assert layer.ndim == len(shape) np.testing.assert_array_equal(layer.extent.data[1] + 1, shape) # check displayed data is initially 2D assert layer._data_view.shape == shape[-2:] layer._slice_dims(ndisplay=3) # check displayed data is now 3D assert layer._data_view.shape == shape[-3:] layer._slice_dims(ndisplay=2) # check displayed data is now 2D assert layer._data_view.shape == shape[-2:] layer = Image(data) layer._slice_dims(ndisplay=3) assert np.all(layer.data == data) assert layer.ndim == len(shape) np.testing.assert_array_equal(layer.extent.data[1] + 1, shape) # check displayed data is initially 3D assert layer._data_view.shape == shape[-3:] layer._slice_dims(ndisplay=2) # check displayed data is now 2D assert layer._data_view.shape == shape[-2:] layer._slice_dims(ndisplay=3) # check displayed data is now 3D assert layer._data_view.shape == shape[-3:]