xref: /petsc/src/binding/petsc4py/test/test_gc.py (revision 5808f68492579297331054bd8ff190489c3b8c20)
1*5808f684SSatish Balayfrom petsc4py import PETSc
2*5808f684SSatish Balayimport unittest
3*5808f684SSatish Balayimport gc, weakref
4*5808f684SSatish Balayimport warnings
5*5808f684SSatish Balay
6*5808f684SSatish Balay# --------------------------------------------------------------------
7*5808f684SSatish Balay
8*5808f684SSatish Balay## gc.set_debug((gc.DEBUG_STATS |
9*5808f684SSatish Balay##               gc.DEBUG_LEAK) &
10*5808f684SSatish Balay##              ~gc.DEBUG_SAVEALL)
11*5808f684SSatish Balay
12*5808f684SSatish Balay# --------------------------------------------------------------------
13*5808f684SSatish Balay
14*5808f684SSatish Balayclass BaseTestGC(object):
15*5808f684SSatish Balay
16*5808f684SSatish Balay    def setUp(self):
17*5808f684SSatish Balay        self.obj = self.CLASS().create(comm=PETSc.COMM_SELF)
18*5808f684SSatish Balay
19*5808f684SSatish Balay    def tearDown(self):
20*5808f684SSatish Balay        wref = self.make_weakref()
21*5808f684SSatish Balay        self.assertTrue(wref() is self.obj)
22*5808f684SSatish Balay        self.obj = None
23*5808f684SSatish Balay        gc.collect()
24*5808f684SSatish Balay        self.assertTrue(wref() is None)
25*5808f684SSatish Balay
26*5808f684SSatish Balay    def make_weakref(self):
27*5808f684SSatish Balay        wref = weakref.ref(self.obj)
28*5808f684SSatish Balay        return wref
29*5808f684SSatish Balay
30*5808f684SSatish Balay    def testCycleInSelf(self):
31*5808f684SSatish Balay        self.obj.setAttr('myself', self.obj)
32*5808f684SSatish Balay
33*5808f684SSatish Balay    def testCycleInMethod(self):
34*5808f684SSatish Balay        self.obj.setAttr('mymeth', self.obj.view)
35*5808f684SSatish Balay
36*5808f684SSatish Balay    def testCycleInInstance(self):
37*5808f684SSatish Balay        class A: pass
38*5808f684SSatish Balay        a = A()
39*5808f684SSatish Balay        a.obj = self.obj
40*5808f684SSatish Balay        self.obj.setAttr('myinst', a)
41*5808f684SSatish Balay
42*5808f684SSatish Balay    def testCycleInAllWays(self):
43*5808f684SSatish Balay        self.testCycleInSelf()
44*5808f684SSatish Balay        self.testCycleInMethod()
45*5808f684SSatish Balay        self.testCycleInInstance()
46*5808f684SSatish Balay
47*5808f684SSatish Balay# --------------------------------------------------------------------
48*5808f684SSatish Balay
49*5808f684SSatish Balayclass TestGCVec(BaseTestGC, unittest.TestCase):
50*5808f684SSatish Balay    CLASS = PETSc.Vec
51*5808f684SSatish Balay
52*5808f684SSatish Balayclass TestGCVecSubType(TestGCVec):
53*5808f684SSatish Balay    CLASS = type('_Vec', (PETSc.Vec,), {})
54*5808f684SSatish Balay
55*5808f684SSatish Balayclass TestGCMat(BaseTestGC, unittest.TestCase):
56*5808f684SSatish Balay    CLASS = PETSc.Mat
57*5808f684SSatish Balay
58*5808f684SSatish Balayclass TestGCMatSubType(TestGCMat):
59*5808f684SSatish Balay    CLASS = type('_Mat', (PETSc.Mat,), {})
60*5808f684SSatish Balay
61*5808f684SSatish Balayclass TestGCPC(BaseTestGC, unittest.TestCase):
62*5808f684SSatish Balay    CLASS = PETSc.PC
63*5808f684SSatish Balay
64*5808f684SSatish Balayclass TestGCPCSubType(TestGCPC):
65*5808f684SSatish Balay    CLASS = type('_PC', (PETSc.PC,), {})
66*5808f684SSatish Balay
67*5808f684SSatish Balayclass TestGCKSP(BaseTestGC, unittest.TestCase):
68*5808f684SSatish Balay    CLASS = PETSc.KSP
69*5808f684SSatish Balay
70*5808f684SSatish Balayclass TestGCKSPSubType(TestGCKSP):
71*5808f684SSatish Balay    CLASS = type('_KSP', (PETSc.KSP,), {})
72*5808f684SSatish Balay
73*5808f684SSatish Balayclass TestGCSNES(BaseTestGC, unittest.TestCase):
74*5808f684SSatish Balay    CLASS = PETSc.SNES
75*5808f684SSatish Balay    def testCycleInAppCtx(self):
76*5808f684SSatish Balay        self.obj.setAppCtx(self.obj)
77*5808f684SSatish Balay
78*5808f684SSatish Balayclass TestGCSNESSubType(TestGCSNES):
79*5808f684SSatish Balay    CLASS = type('_SNES', (PETSc.SNES,), {})
80*5808f684SSatish Balay
81*5808f684SSatish Balayclass TestGCTS(BaseTestGC, unittest.TestCase):
82*5808f684SSatish Balay    CLASS = PETSc.TS
83*5808f684SSatish Balay    def testCycleInAppCtx(self):
84*5808f684SSatish Balay        self.obj.setAppCtx(self.obj)
85*5808f684SSatish Balay
86*5808f684SSatish Balayclass TestGCTSSubType(TestGCTS):
87*5808f684SSatish Balay    CLASS = type('_TS', (PETSc.TS,), {})
88*5808f684SSatish Balay    def testCycleInAppCtx(self):
89*5808f684SSatish Balay        self.obj.setAppCtx(self.obj)
90*5808f684SSatish Balay
91*5808f684SSatish Balay# --------------------------------------------------------------------
92*5808f684SSatish Balay
93*5808f684SSatish Balayif __name__ == '__main__':
94*5808f684SSatish Balay    unittest.main()
95