| """Tests for readwrite validation.""" |
|
|
| import warnings |
|
|
| import numpy as np |
| import pytest |
| from anndata import AnnData |
| from scipy.sparse import csr_matrix |
|
|
|
|
| @pytest.fixture |
| def tmp_h5ad_with_layers(tmp_path): |
| """Create a temporary h5ad file with unspliced/spliced layers.""" |
| adata = AnnData( |
| X=csr_matrix(np.ones((10, 5), dtype=np.float32)), |
| layers={ |
| "spliced": csr_matrix(np.ones((10, 5), dtype=np.float32)), |
| "unspliced": csr_matrix(np.ones((10, 5), dtype=np.float32)), |
| }, |
| ) |
| path = tmp_path / "with_layers.h5ad" |
| adata.write_h5ad(path) |
| return path |
|
|
|
|
| @pytest.fixture |
| def tmp_h5ad_without_layers(tmp_path): |
| """Create a temporary h5ad file without unspliced/spliced layers.""" |
| adata = AnnData(X=csr_matrix(np.ones((10, 5), dtype=np.float32))) |
| path = tmp_path / "without_layers.h5ad" |
| adata.write_h5ad(path) |
| return path |
|
|
|
|
| def test_read_h5ad_no_warning_with_layers(tmp_h5ad_with_layers): |
| """read_h5ad does not warn when layers are present.""" |
| from scptr.readwrite import read_h5ad |
|
|
| with warnings.catch_warnings(): |
| warnings.simplefilter("error") |
| adata = read_h5ad(str(tmp_h5ad_with_layers)) |
|
|
| assert "unspliced" in adata.layers |
| assert "spliced" in adata.layers |
|
|
|
|
| def test_read_h5ad_warns_missing_layers(tmp_h5ad_without_layers): |
| """read_h5ad warns when unspliced/spliced layers are missing.""" |
| from scptr.readwrite import read_h5ad |
|
|
| with pytest.warns(UserWarning, match="missing expected layers"): |
| read_h5ad(str(tmp_h5ad_without_layers)) |
|
|
|
|
| def test_validate_layers_warns_partial(tmp_path): |
| """_validate_layers warns when only one layer is missing.""" |
| from scptr.readwrite import _validate_layers |
|
|
| adata = AnnData( |
| X=csr_matrix(np.ones((10, 5), dtype=np.float32)), |
| layers={"spliced": csr_matrix(np.ones((10, 5), dtype=np.float32))}, |
| ) |
|
|
| with pytest.warns(UserWarning, match="unspliced"): |
| _validate_layers(adata) |
|
|