TestElement.py 1.79 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
36
37
38
39
40
41
42
43
44
45
46
47
        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
            for symbol, elem in element.Element._elements_by_symbol.items():
                diff = abs(elem.mass._value - mass)
                if diff < min_diff:
                    min_diff = diff
                    closest_element = elem
            return closest_element

        # Check 5000 random numbers between 0 and 300
        for i in range(5000):
            mass = random.random() * 300
            elem = element.Element.getByMass(mass)
            self.assertTrue(elem is exhaustive_search(mass))
48
49
50
51


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