def test_add_multichannel_tiff(builtins, single_tiff): image_files = single_tiff viewer = ViewerModel() viewer.open(image_files, channel_axis=0, plugin=builtins.name) assert len(viewer.layers) == 2 assert viewer.dims.ndim == 2 assert isinstance(viewer.layers[0].data, np.ndarray) assert viewer.layers[0].data.shape == (15, 10) assert viewer.layers[0].data.dtype == np.uint8
def test_add_vectors(): """Test adding vectors.""" viewer = ViewerModel() np.random.seed(0) data = 20 * np.random.random((10, 2, 2)) viewer.add_vectors(data) assert len(viewer.layers) == 1 assert np.all(viewer.layers[0].data == data) assert viewer.dims.ndim == 2
def test_add_labels(): """Test adding labels image.""" viewer = ViewerModel() np.random.seed(0) data = np.random.randint(20, size=(10, 15)) viewer.add_labels(data) assert len(viewer.layers) == 1 assert np.all(viewer.layers[0].data == data) assert viewer.dims.ndim == 2
def test_add_empty_points_on_top_of_image(): viewer = ViewerModel() image = np.random.random((8, 64, 64)) # add_image always returns the corresponding layer _ = viewer.add_image(image) layer = viewer.add_points(ndim=3) assert layer.ndim == 3 layer.add([5.0, 32.0, 61.0]) assert layer.data.shape == (1, 3)
def test_grid(): "Test grid_view" viewer = ViewerModel() np.random.seed(0) # Add image for i in range(6): data = np.random.random((15, 15)) viewer.add_image(data) assert not viewer.grid.enabled assert viewer.grid.actual_shape(6) == (1, 1) assert viewer.grid.stride == 1 translations = [layer.translate_grid for layer in viewer.layers] expected_translations = np.zeros((6, 2)) np.testing.assert_allclose(translations, expected_translations) # enter grid view viewer.grid.enabled = True assert viewer.grid.enabled assert viewer.grid.actual_shape(6) == (2, 3) assert viewer.grid.stride == 1 translations = [layer.translate_grid for layer in viewer.layers] expected_translations = [ [0, 0], [0, 15], [0, 30], [15, 0], [15, 15], [15, 30], ] np.testing.assert_allclose(translations, expected_translations[::-1]) # return to stack view viewer.grid.enabled = False assert not viewer.grid.enabled assert viewer.grid.actual_shape(6) == (1, 1) assert viewer.grid.stride == 1 translations = [layer.translate_grid for layer in viewer.layers] expected_translations = np.zeros((6, 2)) np.testing.assert_allclose(translations, expected_translations) # reenter grid view with new stride viewer.grid.stride = -2 viewer.grid.enabled = True assert viewer.grid.enabled assert viewer.grid.actual_shape(6) == (2, 2) assert viewer.grid.stride == -2 translations = [layer.translate_grid for layer in viewer.layers] expected_translations = [ [0, 0], [0, 0], [0, 15], [0, 15], [15, 0], [15, 0], ] np.testing.assert_allclose(translations, expected_translations)
def test_add_volume(): """Test adding volume.""" viewer = ViewerModel(ndisplay=3) np.random.seed(0) data = np.random.random((10, 15, 20)) viewer.add_image(data) assert len(viewer.layers) == 1 assert np.all(viewer.layers[0].data == data) assert viewer.dims.ndim == 3
def test_new_labels_empty(): """Test adding new labels layer to empty viewer.""" viewer = ViewerModel() viewer._new_labels() assert len(viewer.layers) == 1 assert np.max(viewer.layers[0].data) == 0 assert viewer.dims.ndim == 2 # Default shape when no data is present is 512x512 np.testing.assert_equal(viewer.layers[0].data.shape, (512, 512))
def test_new_shapes(): """Test adding new shapes layer.""" # Add labels to empty viewer viewer = ViewerModel() viewer.add_shapes() assert len(viewer.layers) == 1 assert len(viewer.layers[0].data) == 0 assert viewer.dims.ndim == 2 # Add points with image already present viewer = ViewerModel() np.random.seed(0) data = np.random.random((10, 15)) viewer.add_image(data) viewer.add_shapes() assert len(viewer.layers) == 2 assert len(viewer.layers[1].data) == 0 assert viewer.dims.ndim == 2
def test_add_pyramid(): """Test adding image pyramid.""" viewer = ViewerModel() shapes = [(40, 20), (20, 10), (10, 5)] np.random.seed(0) data = [np.random.random(s) for s in shapes] viewer.add_pyramid(data) assert len(viewer.layers) == 1 assert np.all(viewer.layers[0].data == data)
def test_add_single_filename(builtins, single_tiff): image_files = single_tiff[0] viewer = ViewerModel() viewer.open(image_files, plugin=builtins.name) assert len(viewer.layers) == 1 assert viewer.dims.ndim == 3 assert isinstance(viewer.layers[0].data, np.ndarray) assert viewer.layers[0].data.shape == (2, 15, 10) assert viewer.layers[0].data.dtype == np.uint8
def test_add_many_tiffs(builtins, single_tiff): image_files = single_tiff * 3 viewer = ViewerModel() viewer.open(image_files, stack=True, plugin=builtins.name) assert len(viewer.layers) == 1 assert viewer.dims.ndim == 4 assert isinstance(viewer.layers[0].data, da.Array) assert viewer.layers[0].data.shape == (3, 2, 15, 10) assert viewer.layers[0].data.dtype == np.uint8
def test_no_warning_non_affine_slicing(): """Test no warning if not slicing into an affine.""" viewer = ViewerModel() np.random.seed(0) data = np.random.random((10, 10, 10)) viewer.add_image(data, scale=[2, 1, 1], translate=[10, 15, 20]) with pytest.warns(None) as recorded_warnings: viewer.layers[0].refresh() assert len(recorded_warnings) == 0
def test_multichannel(shape, kwargs): """Test adding multichannel image.""" viewer = ViewerModel() np.random.seed(0) data = np.random.random(shape or (15, 10, 5)) channel_axis = kwargs.pop('channel_axis', -1) viewer.add_image(data, channel_axis=channel_axis, **kwargs) # make sure the right number of layers got added n_channels = data.shape[channel_axis] assert len(viewer.layers) == n_channels for i in range(n_channels): # make sure that the data has been divided into layers assert np.all(viewer.layers[i].data == data.take(i, axis=channel_axis)) # make sure colors have been assigned properly if 'colormap' not in kwargs: if n_channels == 1: assert viewer.layers[i].colormap.name == 'gray' elif n_channels == 2: assert viewer.layers[i].colormap.name == two_colormaps[i] else: assert viewer.layers[i].colormap.name == base_colormaps[i] if 'blending' not in kwargs: assert (viewer.layers[i].blending == 'translucent_no_depth' if i == 0 else 'additive') for key, expectation in kwargs.items(): # broadcast exceptions if key in { 'scale', 'translate', 'rotate', 'shear', 'contrast_limits', 'metadata', 'experimental_clipping_planes', }: expectation = ensure_sequence_of_iterables(expectation, repeat_empty=True) elif key == 'colormap' and expectation is not None: if isinstance(expectation, list): exp = [ensure_colormap(c).name for c in expectation] else: exp = ensure_colormap(expectation).name expectation = ensure_iterable(exp) else: expectation = ensure_iterable(expectation) expectation = [v for i, v in zip(range(i + 1), expectation)] result = getattr(viewer.layers[i], key) if key == 'colormap': # colormaps are tuples of (name, cmap) result = result.name if isinstance(result, np.ndarray): np.testing.assert_almost_equal(result, expectation[i]) else: assert result == expectation[i]
def test_names(): """Test adding multichannel image with custom names.""" viewer = ViewerModel() np.random.seed(0) data = np.random.random((15, 10, 5)) names = ['multi ' + str(i + 3) for i in range(data.shape[-1])] viewer.add_multichannel(data, name=names) assert len(viewer.layers) == data.shape[-1] for i in range(data.shape[-1]): assert viewer.layers[i].name == names[i] viewer = ViewerModel() name = 'example' names = [name ] + [name + ' ' + str(i + 1) for i in range(data.shape[-1] - 1)] viewer.add_multichannel(data, name=name) assert len(viewer.layers) == data.shape[-1] for i in range(data.shape[-1]): assert viewer.layers[i].name == names[i]
def test_add_multiscale(): """Test adding image multiscale.""" viewer = ViewerModel() shapes = [(40, 20), (20, 10), (10, 5)] np.random.seed(0) data = [np.random.random(s) for s in shapes] viewer.add_image(data, multiscale=True) assert len(viewer.layers) == 1 assert np.all(viewer.layers[0].data == data) assert viewer.dims.ndim == 2
def test_add_layer_from_data(data): # make sure adding valid layer data calls the proper corresponding add_* # method for all layer types viewer = ViewerModel() viewer._add_layer_from_data(*data) # make sure a layer of the correct type got added assert len(viewer.layers) == 1 expected_layer_type = data[2] if len(data) > 2 else 'image' assert viewer.layers[0]._type_string == expected_layer_type
def view(qtbot): """basic viewer with data that we will use a few times""" viewer = ViewerModel() view = QtViewer(viewer) qtbot.addWidget(view) np.random.seed(0) data = np.random.random((10, 10, 15)) viewer.add_image(data) return view
def test_multichannel_dask_array(): """Test adding multichannel dask array.""" viewer = ViewerModel() np.random.seed(0) data = da.random.random((2, 10, 10, 5)) viewer.add_image(data, channel_axis=0) assert len(viewer.layers) == data.shape[0] for i in range(data.shape[0]): assert viewer.layers[i].data.shape == data.shape[1:] assert isinstance(viewer.layers[i].data, da.Array)
def test_open_or_get_error_preferred_fails(tmp_path): viewer = ViewerModel() pth = tmp_path / 'my-file.npy' with restore_settings_on_exit(): get_settings().plugins.extension2reader = {'.npy': 'napari'} with pytest.raises(ReaderPluginError, match='Tried opening with napari, but failed.'): viewer._open_or_raise_error([str(pth)])
def test_open_labels(suffix): viewer = ViewerModel() blobs = binary_blobs(length=128, volume_fraction=0.1, n_dim=2) labeled = ndi.label(blobs)[0].astype(np.uint8) with temporary_file(suffix) as fout: imwrite(fout, labeled, format=suffix) viewer.open(fout, layer_type='labels') assert len(viewer.layers) == 1 assert np.all(labeled == viewer.layers[0].data) assert isinstance(viewer.layers[0], Labels)
def test_open_or_get_error_multiple_readers(mock_npe2_pm, tmp_reader): """Assert error is returned when multiple plugins are available to read.""" viewer = ViewerModel() tmp_reader(mock_npe2_pm, 'p1') tmp_reader(mock_npe2_pm, 'p2') with pytest.raises(MultipleReaderError, match='Multiple plugins found capable'): viewer._open_or_raise_error(['my_file.fake'])
def test_split_rgb_image(): """Test adding multichannel image with custom colormaps.""" viewer = ViewerModel() np.random.seed(0) data = np.random.random((15, 10, 3)) colormaps = ['red', 'green', 'blue'] viewer.add_image(data, colormap=colormaps, channel_axis=-1) assert len(viewer.layers) == data.shape[-1] for i in range(data.shape[-1]): assert viewer.layers[i].colormap[0] == colormaps[i]
def test_multichannel(): """Test adding multichannel image.""" viewer = ViewerModel() np.random.seed(0) data = np.random.random((15, 10, 5)) viewer.add_image(data, channel_axis=-1) assert len(viewer.layers) == data.shape[-1] for i in range(data.shape[-1]): assert np.all(viewer.layers[i].data == data.take(i, axis=-1)) assert viewer.layers[i].colormap[0] == base_colormaps[i]
def test_rgb_images(): """Test adding multiple rgb images.""" viewer = ViewerModel() np.random.seed(0) data = np.random.random((15, 10, 5, 3)) viewer.add_image(data, channel_axis=2, rgb=True) assert len(viewer.layers) == data.shape[2] for i in range(data.shape[-1]): assert viewer.layers[i].rgb is True assert viewer.layers[i]._data_view.ndim == 3
def test_add_multi_png_defaults(two_pngs): image_files = two_pngs viewer = ViewerModel() viewer.open(image_files, stack=True, plugin='builtins') assert len(viewer.layers) == 1 assert viewer.dims.ndim == 3 assert isinstance(viewer.layers[0].data, da.Array) assert viewer.layers[0].data.shape == (2, 512, 512) viewer.open(image_files, stack=False, plugin='builtins') assert len(viewer.layers) == 3
def test_update_scale(): viewer = ViewerModel() np.random.seed(0) shape = (10, 15, 20) data = np.random.random(shape) viewer.add_image(data) assert viewer.dims.range == tuple((0.0, x - 1.0, 1.0) for x in shape) scale = (3.0, 2.0, 1.0) viewer.layers[0].scale = scale assert viewer.dims.range == tuple( (0.0, (x - 1) * s, s) for x, s in zip(shape, scale))
def test_active_layer_status_update(): """Test status updates from active layer on cursor move.""" viewer = ViewerModel() np.random.seed(0) viewer.add_image(np.random.random((5, 5, 10, 15))) viewer.add_image(np.random.random((5, 6, 5, 10, 15))) assert len(viewer.layers) == 2 assert viewer.active_layer == viewer.layers[1] viewer.cursor.position = [1, 1, 1, 1, 1] assert viewer.status == viewer.active_layer.status
def test_add_zarr(): viewer = ViewerModel() image = np.random.random((10, 20, 20)) with TemporaryDirectory(suffix='.zarr') as fout: z = zarr.open(fout, 'a', shape=image.shape) z[:] = image viewer.add_image(path=[fout]) assert len(viewer.layers) == 1 # Note: due to lazy loading, the next line needs to happen within # the context manager. Alternatively, we could convert to NumPy here. np.testing.assert_array_equal(image, viewer.layers[0].data)
def test_multichannel_index_error_hint(): """Test multichannel error when arg length != n_channels.""" viewer = ViewerModel() np.random.seed(0) data = da.random.random((5, 10, 5)) with pytest.raises(IndexError) as e: viewer.add_image(data, channel_axis=0, name=['a', 'b']) assert ( "Requested channel_axis (0) had length 5, but the " "'name' argument only provided 2 values." in str(e) )
def test_add_zarr_1d_array_is_ignored(): # For more details: https://github.com/napari/napari/issues/1471 viewer = ViewerModel() with TemporaryDirectory(suffix='.zarr') as zarr_dir: z = zarr.open(zarr_dir, 'w') z['1d'] = np.zeros(3) image_path = os.path.join(zarr_dir, '1d') viewer.open(image_path, plugin='builtins') assert len(viewer.layers) == 0