@@ -357,3 +357,133 @@ def test_get_symmetry_propagates_error_from_get_rdkit_mol():
357357
358358 neighbors ._get_symmetry_number .assert_not_called ()
359359 neighbors ._get_linear .assert_not_called ()
360+
361+
362+ def test_get_rdkit_mol_guesses_elements_when_missing ():
363+ neighbors = Neighbors ()
364+
365+ universe = MagicMock ()
366+ molecule = MagicMock ()
367+ dummy = MagicMock ()
368+
369+ del universe .atoms .elements
370+ universe .atoms .fragments = [molecule ]
371+
372+ molecule .select_atoms .side_effect = [dummy ]
373+ dummy .__len__ .return_value = 0
374+
375+ rdkit_mol = MagicMock ()
376+ rdkit_mol .GetNumHeavyAtoms .return_value = 3
377+ rdkit_mol .GetNumAtoms .return_value = 8
378+ molecule .convert_to .return_value = rdkit_mol
379+
380+ result = neighbors ._get_rdkit_mol (universe , 0 )
381+
382+ universe .guess_TopologyAttrs .assert_called_once_with (to_guess = ["elements" ])
383+ molecule .convert_to .assert_called_once_with ("RDKIT" , force = True )
384+ assert result == (rdkit_mol , 3 , 5 )
385+
386+
387+ def test_get_rdkit_mol_does_not_guess_elements_when_present ():
388+ neighbors = Neighbors ()
389+
390+ universe = MagicMock ()
391+ molecule = MagicMock ()
392+ dummy = MagicMock ()
393+
394+ universe .atoms .elements = ["C" , "H" ]
395+ universe .atoms .fragments = [molecule ]
396+
397+ molecule .select_atoms .side_effect = [dummy ]
398+ dummy .__len__ .return_value = 0
399+
400+ rdkit_mol = MagicMock ()
401+ rdkit_mol .GetNumHeavyAtoms .return_value = 2
402+ rdkit_mol .GetNumAtoms .return_value = 6
403+ molecule .convert_to .return_value = rdkit_mol
404+
405+ result = neighbors ._get_rdkit_mol (universe , 0 )
406+
407+ universe .guess_TopologyAttrs .assert_not_called ()
408+ molecule .convert_to .assert_called_once_with ("RDKIT" , force = True )
409+ assert result == (rdkit_mol , 2 , 4 )
410+
411+
412+ def test_get_rdkit_mol_uses_full_molecule_when_no_dummy_atoms ():
413+ neighbors = Neighbors ()
414+
415+ universe = MagicMock ()
416+ molecule = MagicMock ()
417+ dummy = MagicMock ()
418+
419+ universe .atoms .elements = ["C" ]
420+ universe .atoms .fragments = [molecule ]
421+
422+ molecule .select_atoms .side_effect = [dummy ]
423+ dummy .__len__ .return_value = 0
424+
425+ rdkit_mol = MagicMock ()
426+ rdkit_mol .GetNumHeavyAtoms .return_value = 4
427+ rdkit_mol .GetNumAtoms .return_value = 10
428+ molecule .convert_to .return_value = rdkit_mol
429+
430+ result = neighbors ._get_rdkit_mol (universe , 0 )
431+
432+ molecule .select_atoms .assert_called_once_with ("prop mass < 0.1" )
433+ molecule .convert_to .assert_called_once_with ("RDKIT" , force = True )
434+ assert result == (rdkit_mol , 4 , 6 )
435+
436+
437+ def test_get_rdkit_mol_removes_dummy_atoms_and_uses_inferrer_none ():
438+ neighbors = Neighbors ()
439+
440+ universe = MagicMock ()
441+ molecule = MagicMock ()
442+ dummy = MagicMock ()
443+ frag = MagicMock ()
444+
445+ universe .atoms .elements = ["C" ]
446+ universe .atoms .fragments = [molecule ]
447+
448+ molecule .select_atoms .side_effect = [dummy , frag ]
449+ dummy .__len__ .return_value = 2
450+
451+ rdkit_mol = MagicMock ()
452+ rdkit_mol .GetNumHeavyAtoms .return_value = 5
453+ rdkit_mol .GetNumAtoms .return_value = 12
454+ frag .convert_to .return_value = rdkit_mol
455+
456+ result = neighbors ._get_rdkit_mol (universe , 0 )
457+
458+ assert molecule .select_atoms .call_args_list == [
459+ (("prop mass < 0.1" ,),),
460+ (("prop mass > 0.1" ,),),
461+ ]
462+ frag .convert_to .assert_called_once_with ("RDKIT" , force = True , inferrer = None )
463+ molecule .convert_to .assert_not_called ()
464+ assert result == (rdkit_mol , 5 , 7 )
465+
466+
467+ def test_get_rdkit_mol_returns_correct_heavy_and_hydrogen_counts ():
468+ neighbors = Neighbors ()
469+
470+ universe = MagicMock ()
471+ molecule = MagicMock ()
472+ dummy = MagicMock ()
473+
474+ universe .atoms .elements = ["O" , "H" , "H" ]
475+ universe .atoms .fragments = [molecule ]
476+
477+ molecule .select_atoms .side_effect = [dummy ]
478+ dummy .__len__ .return_value = 0
479+
480+ rdkit_mol = MagicMock ()
481+ rdkit_mol .GetNumHeavyAtoms .return_value = 1
482+ rdkit_mol .GetNumAtoms .return_value = 3
483+ molecule .convert_to .return_value = rdkit_mol
484+
485+ rdkit_out , number_heavy , number_hydrogen = neighbors ._get_rdkit_mol (universe , 0 )
486+
487+ assert rdkit_out is rdkit_mol
488+ assert number_heavy == 1
489+ assert number_hydrogen == 2
0 commit comments