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