@@ -60,37 +60,31 @@ def test_select_levels(self):
6060
6161 def test_get_matrices (self ):
6262 """
63- Test `get_matrices` with mocked internal methods and a simple trajectory .
64- Ensures that the method returns correctly shaped matrices after filtering .
63+ Test `get_matrices` with mocked internal methods and a simple setup .
64+ Ensures that the method returns correctly shaped force and torque matrices .
6565 """
66-
67- # Create a mock UniverseOperations and LevelManager
6866 universe_operations = UniverseOperations ()
69-
7067 level_manager = LevelManager (universe_operations )
7168
72- # Mock internal methods
73- level_manager .get_beads = MagicMock (return_value = ["bead1" , "bead2" ])
69+ bead1 = MagicMock ()
70+ bead1 .principal_axes .return_value = np .ones (3 )
71+
72+ bead2 = MagicMock ()
73+ bead2 .principal_axes .return_value = np .ones (3 )
74+
75+ level_manager .get_beads = MagicMock (return_value = [bead1 , bead2 ])
7476 level_manager .get_weighted_forces = MagicMock (
7577 return_value = np .array ([1.0 , 2.0 , 3.0 ])
7678 )
7779 level_manager .get_weighted_torques = MagicMock (
7880 return_value = np .array ([0.5 , 1.5 , 2.5 ])
7981 )
8082 level_manager .create_submatrix = MagicMock (return_value = np .identity (3 ))
81- level_manager .filter_zero_rows_columns = MagicMock (side_effect = lambda x : x )
8283
83- # Mock data_container and trajectory
8484 data_container = MagicMock ()
85- timestep1 = MagicMock ()
86- timestep1 .frame = 0
87- timestep2 = MagicMock ()
88- timestep2 .frame = 1
89- data_container .trajectory .__getitem__ .return_value = [timestep1 , timestep2 ]
90- bead = MagicMock ()
91- bead .principal_axes = MagicMock (return_value = np .ones (3 ))
85+ data_container .atoms = MagicMock ()
86+ data_container .atoms .principal_axes .return_value = np .ones (3 )
9287
93- # Call the method
9488 force_matrix , torque_matrix = level_manager .get_matrices (
9589 data_container = data_container ,
9690 level = "residue" ,
@@ -100,30 +94,35 @@ def test_get_matrices(self):
10094 force_partitioning = 0.5 ,
10195 )
10296
103- # Assertions
104- self .assertTrue ( isinstance ( force_matrix , np .ndarray ) )
105- self . assertTrue ( isinstance ( torque_matrix , np . ndarray ))
106- self .assertEqual (force_matrix .shape , (6 , 6 )) # 2 beads × 3D
97+ self . assertIsInstance ( force_matrix , np . ndarray )
98+ self .assertIsInstance ( torque_matrix , np .ndarray )
99+
100+ self .assertEqual (force_matrix .shape , (6 , 6 ))
107101 self .assertEqual (torque_matrix .shape , (6 , 6 ))
108102
109- # Check that internal methods were called
110- self . assertEqual ( level_manager . get_beads . call_count , 1 )
111- self .assertEqual (level_manager .get_axes .call_count , 2 ) # 2 beads
112- self .assertEqual (
113- level_manager . create_submatrix . call_count , 6
114- ) # 3 force + 3 torque
103+ level_manager . get_beads . assert_called_once_with ( data_container , "residue" )
104+
105+ self .assertEqual (level_manager .get_weighted_forces .call_count , 2 )
106+ self .assertEqual (level_manager . get_weighted_torques . call_count , 2 )
107+
108+ self . assertEqual ( level_manager . create_submatrix . call_count , 6 )
115109
116110 def test_get_matrices_force_shape_mismatch (self ):
117111 """
118112 Test that get_matrices raises a ValueError when the provided force_matrix
119113 has a shape mismatch with the computed force block matrix.
120114 """
121115 universe_operations = UniverseOperations ()
122-
123116 level_manager = LevelManager (universe_operations )
124117
125- # Mock internal methods
126- level_manager .get_beads = MagicMock (return_value = ["bead1" , "bead2" ])
118+ bead1 = MagicMock ()
119+ bead1 .principal_axes .return_value = np .ones (3 )
120+
121+ bead2 = MagicMock ()
122+ bead2 .principal_axes .return_value = np .ones (3 )
123+
124+ level_manager .get_beads = MagicMock (return_value = [bead1 , bead2 ])
125+
127126 level_manager .get_weighted_forces = MagicMock (
128127 return_value = np .array ([1.0 , 2.0 , 3.0 ])
129128 )
@@ -133,11 +132,9 @@ def test_get_matrices_force_shape_mismatch(self):
133132 level_manager .create_submatrix = MagicMock (return_value = np .identity (3 ))
134133
135134 data_container = MagicMock ()
136- bead = MagicMock ()
137- bead .principal_axes = MagicMock (return_value = np .ones (3 ))
138- data_container .principal_axes = MagicMock (return_value = np .ones (3 ))
135+ data_container .atoms = MagicMock ()
136+ data_container .atoms .principal_axes .return_value = np .ones (3 )
139137
140- # Incorrect shape for force matrix (should be 6x6 for 2 beads)
141138 bad_force_matrix = np .zeros ((3 , 3 ))
142139 correct_torque_matrix = np .zeros ((6 , 6 ))
143140
@@ -159,11 +156,16 @@ def test_get_matrices_torque_shape_mismatch(self):
159156 has a shape mismatch with the computed torque block matrix.
160157 """
161158 universe_operations = UniverseOperations ()
162-
163159 level_manager = LevelManager (universe_operations )
164160
165- # Mock internal methods
166- level_manager .get_beads = MagicMock (return_value = ["bead1" , "bead2" ])
161+ bead1 = MagicMock ()
162+ bead1 .principal_axes .return_value = np .ones (3 )
163+
164+ bead2 = MagicMock ()
165+ bead2 .principal_axes .return_value = np .ones (3 )
166+
167+ level_manager .get_beads = MagicMock (return_value = [bead1 , bead2 ])
168+
167169 level_manager .get_weighted_forces = MagicMock (
168170 return_value = np .array ([1.0 , 2.0 , 3.0 ])
169171 )
@@ -173,9 +175,8 @@ def test_get_matrices_torque_shape_mismatch(self):
173175 level_manager .create_submatrix = MagicMock (return_value = np .identity (3 ))
174176
175177 data_container = MagicMock ()
176- bead = MagicMock ()
177- bead .principal_axes = MagicMock (return_value = np .ones (3 ))
178- data_container .principal_axes = MagicMock (return_value = np .ones (3 ))
178+ data_container .atoms = MagicMock ()
179+ data_container .atoms .principal_axes .return_value = np .ones (3 )
179180
180181 correct_force_matrix = np .zeros ((6 , 6 ))
181182 bad_torque_matrix = np .zeros ((3 , 3 )) # Incorrect shape
@@ -194,14 +195,20 @@ def test_get_matrices_torque_shape_mismatch(self):
194195
195196 def test_get_matrices_torque_consistency (self ):
196197 """
197- Test that get_matrices returns consistent torque and force matrices
198+ Test that get_matrices returns consistent force and torque matrices
198199 when called multiple times with the same inputs.
199200 """
200201 universe_operations = UniverseOperations ()
201-
202202 level_manager = LevelManager (universe_operations )
203203
204- level_manager .get_beads = MagicMock (return_value = ["bead1" , "bead2" ])
204+ bead1 = MagicMock ()
205+ bead1 .principal_axes .return_value = np .ones (3 )
206+
207+ bead2 = MagicMock ()
208+ bead2 .principal_axes .return_value = np .ones (3 )
209+
210+ level_manager .get_beads = MagicMock (return_value = [bead1 , bead2 ])
211+
205212 level_manager .get_weighted_forces = MagicMock (
206213 return_value = np .array ([1.0 , 2.0 , 3.0 ])
207214 )
@@ -211,9 +218,8 @@ def test_get_matrices_torque_consistency(self):
211218 level_manager .create_submatrix = MagicMock (return_value = np .identity (3 ))
212219
213220 data_container = MagicMock ()
214- bead = MagicMock ()
215- bead .principal_axes = MagicMock (return_value = np .ones (3 ))
216- data_container .principal_axes = MagicMock (return_value = np .ones (3 ))
221+ data_container .atoms = MagicMock ()
222+ data_container .atoms .principal_axes .return_value = np .ones (3 )
217223
218224 initial_force_matrix = np .zeros ((6 , 6 ))
219225 initial_torque_matrix = np .zeros ((6 , 6 ))
@@ -236,9 +242,8 @@ def test_get_matrices_torque_consistency(self):
236242 force_partitioning = 0.5 ,
237243 )
238244
239- # Check that repeated calls produce the same output
240- self .assertTrue (np .allclose (torque_matrix_1 , torque_matrix_2 , atol = 1e-8 ))
241- self .assertTrue (np .allclose (force_matrix_1 , force_matrix_2 , atol = 1e-8 ))
245+ np .testing .assert_array_equal (force_matrix_1 , force_matrix_2 )
246+ np .testing .assert_array_equal (torque_matrix_1 , torque_matrix_2 )
242247
243248 def test_get_beads_polymer_level (self ):
244249 """
0 commit comments