|
9 | 9 |
|
10 | 10 | @pytest.fixture |
11 | 11 | def mock_mudata(): |
12 | | - """创建测试用的MuData对象.""" |
| 12 | + """Create a MuData object for testing.""" |
13 | 13 | adata1 = anndata.AnnData(X=np.array([[1, 2], [3, 4]])) |
14 | 14 | adata2 = anndata.AnnData(X=np.array([[5, 6], [7, 8]])) |
15 | 15 | return Data(data=mudata.MuData({'mod1': adata1, 'mod2': adata2})) |
16 | 16 |
|
17 | 17 |
|
18 | | -# 创建一个示例类来测试装饰器 |
19 | 18 | @add_mod_and_transform |
20 | 19 | class SampleClass: |
21 | | - """示例类,用于测试装饰器.""" |
| 20 | + """Example class for testing the decorator.""" |
22 | 21 |
|
23 | 22 | def __init__(self, x=10, **kwargs): |
24 | 23 | self.x = x |
25 | 24 |
|
26 | 25 | def __call__(self, data, *args, **kwargs): |
| 26 | + # Multiply the data by self.x |
| 27 | + if isinstance(data.data, anndata.AnnData): |
| 28 | + data.data.X = data.data.X * self.x |
27 | 29 | return data |
28 | 30 |
|
29 | 31 |
|
30 | 32 | def test_class_init_with_mod(): |
31 | | - """测试类初始化时带mod参数.""" |
| 33 | + """Test class initialization with mod parameter.""" |
32 | 34 | obj = SampleClass(x=10, mod="mod1") |
33 | 35 | assert obj.x == 10 |
34 | 36 | assert obj.mod == "mod1" |
35 | 37 |
|
36 | 38 |
|
37 | 39 | def test_class_init_without_mod(): |
38 | | - """测试类初始化时不带mod参数.""" |
| 40 | + """Test class initialization without mod parameter.""" |
39 | 41 | obj = SampleClass(x=10) |
40 | 42 | assert obj.x == 10 |
41 | 43 | assert obj.mod is None |
42 | 44 |
|
43 | 45 |
|
44 | 46 | def test_class_call_with_anndata(): |
45 | | - """测试使用AnnData对象调用.""" |
46 | | - obj = SampleClass(x=10) |
47 | | - adata = Data(data=anndata.AnnData(X=np.array([[1, 2], [3, 4]]))) |
| 47 | + """Test calling with AnnData object.""" |
| 48 | + obj = SampleClass(x=3) |
| 49 | + original_data = np.array([[1, 2], [3, 4]]) |
| 50 | + adata = Data(data=anndata.AnnData(X=original_data.copy())) |
48 | 51 | result = obj(adata) |
49 | | - assert result is adata |
| 52 | + # Verify data is multiplied by x=3 |
| 53 | + assert np.array_equal(result.data.X, original_data * 3) |
50 | 54 |
|
51 | 55 |
|
52 | 56 | def test_class_call_with_mudata_and_mod(mock_mudata): |
53 | | - """测试使用MuData对象和mod参数调用.""" |
54 | | - obj = SampleClass(x=10, mod="mod1") |
55 | | - original_data = mock_mudata.data.mod["mod1"].copy() |
| 57 | + """Test calling with MuData object and mod parameter to verify that only the |
| 58 | + specified modality is modified.""" |
| 59 | + obj = SampleClass(x=2, mod="mod1") |
| 60 | + # Store original data for both modalities |
| 61 | + original_mod1 = mock_mudata.data.mod["mod1"].X.copy() |
| 62 | + original_mod2 = mock_mudata.data.mod["mod2"].X.copy() |
| 63 | + |
56 | 64 | obj(mock_mudata) |
57 | | - # 验证原始数据被正确修改 |
58 | | - assert np.array_equal(mock_mudata.data.mod["mod1"].X, original_data.X) |
| 65 | + |
| 66 | + # Verify mod1 data is multiplied by x=2 |
| 67 | + assert np.array_equal(mock_mudata.data.mod["mod1"].X, original_mod1 * 2) |
| 68 | + # Verify mod2 data remains unchanged |
| 69 | + assert np.array_equal(mock_mudata.data.mod["mod2"].X, original_mod2) |
59 | 70 |
|
60 | 71 |
|
61 | 72 | def test_class_call_with_mudata_without_mod(mock_mudata): |
62 | | - """测试使用MuData对象但不带mod参数调用.""" |
| 73 | + """Test calling with MuData object but without mod parameter.""" |
63 | 74 | obj = SampleClass(x=10) |
64 | 75 | result = obj(mock_mudata) |
65 | 76 | assert result is mock_mudata |
66 | 77 |
|
67 | 78 |
|
68 | 79 | def test_class_call_with_mudata_invalid_mod(mock_mudata): |
69 | | - """测试使用无效的mod参数.""" |
| 80 | + """Test using invalid mod parameter.""" |
70 | 81 | obj = SampleClass(x=10, mod="invalid_mod") |
71 | 82 | with pytest.raises(KeyError): |
72 | 83 | obj(mock_mudata) |
73 | 84 |
|
74 | 85 |
|
75 | 86 | def test_decorator_preserves_metadata(): |
76 | | - """测试装饰器是否保留了原始类的元数据.""" |
| 87 | + """Test if the decorator preserves the original class metadata.""" |
77 | 88 | assert hasattr(SampleClass, 'add_mod_and_transform') |
78 | 89 | assert SampleClass.__init__.__doc__ == SampleClass.__init__.__wrapped__.__doc__ |
79 | 90 | assert SampleClass.__call__.__doc__ == SampleClass.__call__.__wrapped__.__doc__ |
80 | 91 |
|
81 | 92 |
|
82 | 93 | def test_class_call_with_additional_args(mock_mudata): |
83 | | - """测试带额外参数调用.""" |
| 94 | + """Test calling with additional arguments.""" |
84 | 95 | obj = SampleClass(x=10, mod="mod1") |
85 | 96 | original_data = mock_mudata.data.mod["mod1"].copy() |
86 | 97 | obj(mock_mudata, extra_arg="test") |
87 | | - # 验证原始数据被正确修改 |
88 | | - assert np.array_equal(mock_mudata.data.mod["mod1"].X, original_data.X) |
| 98 | + # Verify original data is modified correctly |
| 99 | + assert np.array_equal(mock_mudata.data.mod["mod1"].X, original_data.X * 10) |
0 commit comments