1from mpi4py import MPI
2import mpiunittest as unittest
3import sys
4import weakref
5
6
7class TestObjModel(unittest.TestCase):
8
9    objects = [
10        MPI.Status(),
11        MPI.DATATYPE_NULL,
12        MPI.REQUEST_NULL,
13        MPI.INFO_NULL,
14        MPI.ERRHANDLER_NULL,
15        MPI.GROUP_NULL,
16        MPI.WIN_NULL,
17        MPI.OP_NULL,
18        MPI.FILE_NULL,
19        MPI.MESSAGE_NULL,
20        MPI.COMM_NULL,
21    ]
22
23    def testEq(self):
24        for i, obj1 in enumerate(self.objects):
25            objects = self.objects[:]
26            obj2 = objects[i]
27            self.assertTrue(obj1 == obj2)
28            self.assertFalse(obj1 != obj2)
29            del objects[i]
30            for obj2 in objects:
31                self.assertTrue(obj1 != obj2)
32                self.assertTrue(obj2 != obj1)
33                self.assertFalse(obj1 == obj2)
34                self.assertFalse(obj2 == obj1)
35            self.assertFalse(None == obj1 )
36            self.assertFalse(obj1 == None )
37            self.assertFalse(obj1 == True )
38            self.assertFalse(obj1 == False)
39            self.assertFalse(obj1 == 12345)
40            self.assertFalse(obj1 == "abc")
41            self.assertFalse(obj1 == [123])
42            self.assertFalse(obj1 == (1,2))
43            self.assertFalse(obj1 == {0:0})
44            self.assertFalse(obj1 == set())
45
46    def testNe(self):
47        for i, obj1 in enumerate(self.objects):
48            objects = self.objects[:]
49            obj2 = objects[i]
50            self.assertFalse(obj1 != obj2)
51            del objects[i]
52            for obj2 in objects:
53                self.assertTrue (obj1 != obj2)
54            self.assertTrue(None != obj1 )
55            self.assertTrue(obj1 != None )
56            self.assertTrue(obj1 != True )
57            self.assertTrue(obj1 != False)
58            self.assertTrue(obj1 != 12345)
59            self.assertTrue(obj1 != "abc")
60            self.assertTrue(obj1 != [123])
61            self.assertTrue(obj1 != (1,2))
62            self.assertTrue(obj1 != {0:0})
63            self.assertTrue(obj1 != set())
64
65    def testBool(self):
66        for obj in self.objects[1:]:
67            self.assertFalse(not not obj)
68            self.assertTrue(not obj)
69            self.assertFalse(obj)
70
71    def testHash(self):
72        try:
73            hash(MPI.COMM_NULL)
74        except TypeError:
75            pass
76        else:
77            if hasattr(sys, 'pypy_version_info'):
78                self.skipTest('pypy')
79        for obj in self.objects:
80            ob_hash = lambda: hash(obj)
81            self.assertRaises(TypeError, ob_hash)
82
83    def testInit(self):
84        for i, obj in enumerate(self.objects):
85            klass = type(obj)
86            new = klass()
87            self.assertEqual(new, obj)
88            new = klass(obj)
89            self.assertEqual(new, obj)
90            objects = self.objects[:]
91            del objects[i]
92            for other in objects:
93                ob_init = lambda: klass(other)
94                self.assertRaises(TypeError, ob_init)
95            ob_init = lambda: klass(1234)
96            self.assertRaises(TypeError, ob_init)
97            ob_init = lambda: klass("abc")
98            self.assertRaises(TypeError, ob_init)
99
100    def testWeakRef(self):
101        for obj in self.objects:
102            wr = weakref.ref(obj)
103            self.assertTrue(wr() is obj)
104            self.assertTrue(wr in weakref.getweakrefs(obj))
105            wr = weakref.proxy(obj)
106            self.assertTrue(wr in weakref.getweakrefs(obj))
107
108    def testSizeOf(self):
109        for obj in self.objects:
110            n1 = MPI._sizeof(obj)
111            n2 = MPI._sizeof(type(obj))
112            self.assertEqual(n1, n2)
113
114    def testAddressOf(self):
115        for obj in self.objects:
116            addr = MPI._addressof(obj)
117
118    def testAHandleOf(self):
119        for obj in self.objects:
120            if isinstance(obj, MPI.Status):
121                hdl = lambda: MPI._handleof(obj)
122                self.assertRaises(NotImplementedError, hdl)
123                continue
124            hdl = MPI._handleof(obj)
125
126
127if __name__ == '__main__':
128    unittest.main()
129