"vscode:/vscode.git/clone" did not exist on "9ed2c870058ff6c5b7a008afb419967f51ce53fc"
TestElement.py 1.83 KB
Newer Older
1
import pickle
Jason Swails's avatar
Jason Swails committed
2
3
import random
from simtk.unit import dalton, is_quantity
4
from simtk.openmm.app import element
Jason Swails's avatar
Jason Swails committed
5
import unittest
6
7
8
9
10
11
12
13
14
15
16
17

class TestElement(unittest.TestCase):
    def test_immutable(self):
        def modifyElement():
            # this should not be allowed
            element.sulfur.mass = 100*dalton
        self.assertRaises(AttributeError, modifyElement)
    
    def test_pickleable(self):
        newsulfur = pickle.loads(pickle.dumps(element.sulfur))
        # make sure that a new object is not created during the pickle/unpickle
        # cycle
Jason Swails's avatar
Jason Swails committed
18
19
        self.assertEqual(element.sulfur, newsulfur)
        self.assertTrue(element.sulfur is newsulfur)
20
21
    
    def test_attributes(self):
Jason Swails's avatar
Jason Swails committed
22
23
24
25
26
27
28
29
30
31
32
33
34
35
        self.assertEqual(element.hydrogen.atomic_number, 1)
        self.assertEqual(element.hydrogen.symbol, 'H')
        self.assertEqual(element.hydrogen.name, 'hydrogen')
        self.assertEqual(element.hydrogen.mass, 1.007947 * dalton)

    def test_getByMass(self):
        """ Tests the getByMass method """
        def exhaustive_search(mass):
            """
            Searches through all element symbols and finds the one with the
            smallest mass difference
            """
            min_diff = mass
            closest_element = None
36
37
            for elem in sorted(element.Element._elements_by_symbol.values(),
                               key=lambda x:x.mass):
Jason Swails's avatar
Jason Swails committed
38
39
40
41
42
43
                diff = abs(elem.mass._value - mass)
                if diff < min_diff:
                    min_diff = diff
                    closest_element = elem
            return closest_element

44
45
46
        # Check 500 random numbers between 0 and 200
        for i in range(500):
            mass = random.random() * 200
Jason Swails's avatar
Jason Swails committed
47
48
            elem = element.Element.getByMass(mass)
            self.assertTrue(elem is exhaustive_search(mass))
49
50
51
52


if __name__ == '__main__':
    unittest.main()