xref: /petsc/src/binding/petsc4py/test/test_gc.py (revision 62e5d2d2208a68fdbd23dac44110783534664de8)
15808f684SSatish Balayfrom petsc4py import PETSc
25808f684SSatish Balayimport unittest
35808f684SSatish Balayimport gc, weakref
45808f684SSatish Balayimport warnings
55808f684SSatish Balay
65808f684SSatish Balay# --------------------------------------------------------------------
75808f684SSatish Balay
85808f684SSatish Balay## gc.set_debug((gc.DEBUG_STATS |
95808f684SSatish Balay##               gc.DEBUG_LEAK) &
105808f684SSatish Balay##              ~gc.DEBUG_SAVEALL)
115808f684SSatish Balay
125808f684SSatish Balay# --------------------------------------------------------------------
135808f684SSatish Balay
145808f684SSatish Balayclass BaseTestGC(object):
155808f684SSatish Balay
165808f684SSatish Balay    def setUp(self):
175808f684SSatish Balay        self.obj = self.CLASS().create(comm=PETSc.COMM_SELF)
185808f684SSatish Balay
195808f684SSatish Balay    def tearDown(self):
205808f684SSatish Balay        wref = self.make_weakref()
215808f684SSatish Balay        self.assertTrue(wref() is self.obj)
225808f684SSatish Balay        self.obj = None
235808f684SSatish Balay        gc.collect()
245808f684SSatish Balay        self.assertTrue(wref() is None)
25*62e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
265808f684SSatish Balay
275808f684SSatish Balay    def make_weakref(self):
285808f684SSatish Balay        wref = weakref.ref(self.obj)
295808f684SSatish Balay        return wref
305808f684SSatish Balay
315808f684SSatish Balay    def testCycleInSelf(self):
325808f684SSatish Balay        self.obj.setAttr('myself', self.obj)
335808f684SSatish Balay
345808f684SSatish Balay    def testCycleInMethod(self):
355808f684SSatish Balay        self.obj.setAttr('mymeth', self.obj.view)
365808f684SSatish Balay
375808f684SSatish Balay    def testCycleInInstance(self):
385808f684SSatish Balay        class A: pass
395808f684SSatish Balay        a = A()
405808f684SSatish Balay        a.obj = self.obj
415808f684SSatish Balay        self.obj.setAttr('myinst', a)
425808f684SSatish Balay
435808f684SSatish Balay    def testCycleInAllWays(self):
445808f684SSatish Balay        self.testCycleInSelf()
455808f684SSatish Balay        self.testCycleInMethod()
465808f684SSatish Balay        self.testCycleInInstance()
475808f684SSatish Balay
485808f684SSatish Balay# --------------------------------------------------------------------
495808f684SSatish Balay
505808f684SSatish Balayclass TestGCVec(BaseTestGC, unittest.TestCase):
515808f684SSatish Balay    CLASS = PETSc.Vec
525808f684SSatish Balay
535808f684SSatish Balayclass TestGCVecSubType(TestGCVec):
545808f684SSatish Balay    CLASS = type('_Vec', (PETSc.Vec,), {})
555808f684SSatish Balay
565808f684SSatish Balayclass TestGCMat(BaseTestGC, unittest.TestCase):
575808f684SSatish Balay    CLASS = PETSc.Mat
585808f684SSatish Balay
595808f684SSatish Balayclass TestGCMatSubType(TestGCMat):
605808f684SSatish Balay    CLASS = type('_Mat', (PETSc.Mat,), {})
615808f684SSatish Balay
625808f684SSatish Balayclass TestGCPC(BaseTestGC, unittest.TestCase):
635808f684SSatish Balay    CLASS = PETSc.PC
645808f684SSatish Balay
655808f684SSatish Balayclass TestGCPCSubType(TestGCPC):
665808f684SSatish Balay    CLASS = type('_PC', (PETSc.PC,), {})
675808f684SSatish Balay
685808f684SSatish Balayclass TestGCKSP(BaseTestGC, unittest.TestCase):
695808f684SSatish Balay    CLASS = PETSc.KSP
705808f684SSatish Balay
715808f684SSatish Balayclass TestGCKSPSubType(TestGCKSP):
725808f684SSatish Balay    CLASS = type('_KSP', (PETSc.KSP,), {})
735808f684SSatish Balay
745808f684SSatish Balayclass TestGCSNES(BaseTestGC, unittest.TestCase):
755808f684SSatish Balay    CLASS = PETSc.SNES
765808f684SSatish Balay    def testCycleInAppCtx(self):
775808f684SSatish Balay        self.obj.setAppCtx(self.obj)
785808f684SSatish Balay
795808f684SSatish Balayclass TestGCSNESSubType(TestGCSNES):
805808f684SSatish Balay    CLASS = type('_SNES', (PETSc.SNES,), {})
815808f684SSatish Balay
825808f684SSatish Balayclass TestGCTS(BaseTestGC, unittest.TestCase):
835808f684SSatish Balay    CLASS = PETSc.TS
845808f684SSatish Balay    def testCycleInAppCtx(self):
855808f684SSatish Balay        self.obj.setAppCtx(self.obj)
865808f684SSatish Balay
875808f684SSatish Balayclass TestGCTSSubType(TestGCTS):
885808f684SSatish Balay    CLASS = type('_TS', (PETSc.TS,), {})
895808f684SSatish Balay    def testCycleInAppCtx(self):
905808f684SSatish Balay        self.obj.setAppCtx(self.obj)
915808f684SSatish Balay
925808f684SSatish Balay# --------------------------------------------------------------------
935808f684SSatish Balay
945808f684SSatish Balayif __name__ == '__main__':
955808f684SSatish Balay    unittest.main()
96