1# -------------------------------------------------------------------- 2 3from petsc4py import PETSc 4import unittest 5 6# -------------------------------------------------------------------- 7 8 9class EmptyViewer: 10 def __init__(self): 11 self.log = {} 12 13 def _log(self, method, *args): 14 self.log.setdefault(method, 0) 15 self.log[method] += 1 16 17 def setUp(self, viewer): 18 self._log('setUp') 19 20 def view(self, viewer, outviewer): 21 self._log('view') 22 23 def setFromOptions(self, viewer): 24 self._log('setFromOptions') 25 26 def flush(self, viewer): 27 self._log('flush') 28 29 30class PythonViewer(EmptyViewer): 31 obj_viewed = [] 32 33 def viewObject(self, viewer, pobj): 34 self.obj_viewed.append(pobj.klass) 35 36 37# -------------------------------------------------------------------- 38 39 40class BaseTestViewPYTHON: 41 ContextClass = None 42 ContextName = None 43 44 def setUp(self): 45 self.viewer = PETSc.Viewer() 46 self.viewer.create(PETSc.COMM_SELF) 47 self.viewer.setType(PETSc.Viewer.Type.PYTHON) 48 if self.ContextClass is not None: 49 ctx = self.ContextClass() 50 self.viewer.setPythonContext(ctx) 51 self.viewer.setFromOptions() 52 self.viewer.setUp() 53 elif self.ContextName is not None: 54 self.viewer.setPythonType(self.ContextName) 55 self.viewer.setFromOptions() 56 self.viewer.setUp() 57 ctx = self.viewer.getPythonContext() 58 if ctx is not None: 59 self.assertTrue(ctx.log['setFromOptions'] == 1) 60 self.assertTrue(ctx.log['setUp'] == 1) 61 62 def tearDown(self): 63 self.viewer.destroy() 64 PETSc.garbage_cleanup() 65 66 def testGetType(self): 67 ctx = self.viewer.getPythonContext() 68 pytype = None 69 if ctx is not None: 70 pytype = f'{ctx.__module__}.{type(ctx).__name__}' 71 self.assertTrue(self.viewer.getPythonType() == pytype) 72 73 def testViewObject(self): 74 v = PETSc.Vec().create(PETSc.COMM_SELF) 75 self.viewer.viewObjectPython(v) 76 v.destroy() 77 v = PETSc.KSP().create(PETSc.COMM_SELF) 78 self.viewer.viewObjectPython(v) 79 v.destroy() 80 v = PETSc.DM().create(PETSc.COMM_SELF) 81 v.setFromOptions() 82 self.viewer.viewObjectPython(v) 83 v.destroy() 84 ctx = self.viewer.getPythonContext() 85 if ctx is not None and hasattr(ctx, 'obj_viewed'): 86 ov = ctx.obj_viewed 87 self.assertTrue(len(ov) == 3) 88 self.assertTrue(ov[0] == 'Vec') 89 self.assertTrue(ov[1] == 'KSP') 90 self.assertTrue(ov[2] == 'DM') 91 92 # def testView(self): 93 # self.viewer.view() 94 95 96class TestNone(BaseTestViewPYTHON, unittest.TestCase): 97 ContextClass = None 98 99 100class TestEmptyViewer(BaseTestViewPYTHON, unittest.TestCase): 101 ContextClass = EmptyViewer 102 103 104class TestPythonView(BaseTestViewPYTHON, unittest.TestCase): 105 ContextClass = PythonViewer 106 107 108# -------------------------------------------------------------------- 109 110if __name__ == '__main__': 111 unittest.main() 112