15808f684SSatish Balayimport unittest 25808f684SSatish Balayfrom petsc4py import PETSc 35808f684SSatish Balayfrom sys import getrefcount 4*6f336411SStefano Zampiniimport numpy as np 55808f684SSatish Balay 65808f684SSatish Balay# -------------------------------------------------------------------- 75808f684SSatish Balay 85808f684SSatish Balay 9*6f336411SStefano Zampiniclass TestOptions(unittest.TestCase): 105808f684SSatish Balay PREFIX = 'myopts-' 11*6f336411SStefano Zampini OPTLIST = [ 12*6f336411SStefano Zampini ('bool', True), 135808f684SSatish Balay ('int', -7), 145808f684SSatish Balay ('real', 5), 155808f684SSatish Balay ('scalar', 3), 165808f684SSatish Balay ('string', 'petsc4py'), 175808f684SSatish Balay ] 185808f684SSatish Balay 195808f684SSatish Balay def _putopts(self, opts=None, OPTLIST=None): 205808f684SSatish Balay if opts is None: 215808f684SSatish Balay opts = self.opts 225808f684SSatish Balay if OPTLIST is None: 235808f684SSatish Balay OPTLIST = self.OPTLIST 245808f684SSatish Balay for k, v in OPTLIST: 255808f684SSatish Balay opts[k] = v 26*6f336411SStefano Zampini 275808f684SSatish Balay def _delopts(self, opts=None, OPTLIST=None): 285808f684SSatish Balay if opts is None: 295808f684SSatish Balay opts = self.opts 305808f684SSatish Balay if OPTLIST is None: 315808f684SSatish Balay OPTLIST = self.OPTLIST 32*6f336411SStefano Zampini for k, _ in OPTLIST: 335808f684SSatish Balay del opts[k] 345808f684SSatish Balay 355808f684SSatish Balay def setUp(self): 365808f684SSatish Balay self.opts = PETSc.Options(self.PREFIX) 375808f684SSatish Balay 385808f684SSatish Balay def tearDown(self): 395808f684SSatish Balay self.opts = None 4062e5d2d2SJDBetteridge PETSc.garbage_cleanup() 415808f684SSatish Balay 425808f684SSatish Balay def testHasOpts(self): 435808f684SSatish Balay self._putopts() 44*6f336411SStefano Zampini for k, _ in self.OPTLIST: 455808f684SSatish Balay self.assertTrue(self.opts.hasName(k)) 465808f684SSatish Balay self.assertTrue(k in self.opts) 475808f684SSatish Balay missing = k + '-missing' 485808f684SSatish Balay self.assertFalse(self.opts.hasName(missing)) 495808f684SSatish Balay self.assertFalse(missing in self.opts) 505808f684SSatish Balay self._delopts() 515808f684SSatish Balay 525808f684SSatish Balay def testGetOpts(self): 535808f684SSatish Balay self._putopts() 545808f684SSatish Balay for k, v in self.OPTLIST: 555808f684SSatish Balay getopt = getattr(self.opts, 'get' + k.title()) 565808f684SSatish Balay self.assertEqual(getopt(k), v) 575808f684SSatish Balay self._delopts() 585808f684SSatish Balay 595808f684SSatish Balay def testGetAll(self): 605808f684SSatish Balay self._putopts() 615808f684SSatish Balay allopts = self.opts.getAll() 62*6f336411SStefano Zampini self.assertTrue(isinstance(allopts, dict)) 63*6f336411SStefano Zampini optlist = [(k, str(v).lower()) for (k, v) in self.OPTLIST] 645808f684SSatish Balay for k, v in allopts.items(): 655808f684SSatish Balay self.assertTrue((k, v) in optlist) 665808f684SSatish Balay self._delopts() 675808f684SSatish Balay 685808f684SSatish Balay def testGetAllQuoted(self): 69*6f336411SStefano Zampini dct = { 70*6f336411SStefano Zampini 'o0': '"0 1 2"', 715808f684SSatish Balay 'o1': '"a b c"', 72*6f336411SStefano Zampini 'o2': '"x y z"', 73*6f336411SStefano Zampini } 745808f684SSatish Balay for k in dct: 755808f684SSatish Balay self.opts[k] = dct[k] 765808f684SSatish Balay allopts = self.opts.getAll() 775808f684SSatish Balay for k in dct: 785808f684SSatish Balay self.assertEqual(allopts[k], dct[k][1:-1]) 795808f684SSatish Balay del self.opts[k] 805808f684SSatish Balay 81*6f336411SStefano Zampini def testType(self): 82*6f336411SStefano Zampini types = [ 83*6f336411SStefano Zampini (bool, bool, self.opts.getBool, self.opts.getBoolArray), 84*6f336411SStefano Zampini (int, PETSc.IntType, self.opts.getInt, self.opts.getIntArray), 85*6f336411SStefano Zampini (float, PETSc.RealType, self.opts.getReal, self.opts.getRealArray), 86*6f336411SStefano Zampini ] 87*6f336411SStefano Zampini if PETSc.ScalarType is PETSc.ComplexType: 88*6f336411SStefano Zampini types.append( 89*6f336411SStefano Zampini ( 90*6f336411SStefano Zampini complex, 91*6f336411SStefano Zampini PETSc.ScalarType, 92*6f336411SStefano Zampini self.opts.getScalar, 93*6f336411SStefano Zampini self.opts.getScalarArray, 94*6f336411SStefano Zampini ) 95*6f336411SStefano Zampini ) 96*6f336411SStefano Zampini else: 97*6f336411SStefano Zampini types.append( 98*6f336411SStefano Zampini ( 99*6f336411SStefano Zampini float, 100*6f336411SStefano Zampini PETSc.ScalarType, 101*6f336411SStefano Zampini self.opts.getScalar, 102*6f336411SStefano Zampini self.opts.getScalarArray, 103*6f336411SStefano Zampini ) 104*6f336411SStefano Zampini ) 105*6f336411SStefano Zampini toval = (lambda x: x, lambda x: np.array(x).tolist(), lambda x: np.array(x)) 106*6f336411SStefano Zampini sv = 1 107*6f336411SStefano Zampini av = (1, 0, 1) 108*6f336411SStefano Zampini defv = 0 109*6f336411SStefano Zampini defarrayv = (0, 0, 1, 0) 110*6f336411SStefano Zampini for pyt, pat, pget, pgetarray in types: 111*6f336411SStefano Zampini for tov in toval: 112*6f336411SStefano Zampini self.opts.setValue('sv', tov(sv)) 113*6f336411SStefano Zampini self.opts.setValue('av', tov(av)) 114*6f336411SStefano Zampini 115*6f336411SStefano Zampini v = pget('sv') 116*6f336411SStefano Zampini self.assertTrue(isinstance(v, pyt)) 117*6f336411SStefano Zampini self.assertEqual(v, pyt(sv)) 118*6f336411SStefano Zampini 119*6f336411SStefano Zampini v = pget('sv', defv) 120*6f336411SStefano Zampini self.assertTrue(isinstance(v, pyt)) 121*6f336411SStefano Zampini self.assertEqual(v, pyt(sv)) 122*6f336411SStefano Zampini 123*6f336411SStefano Zampini v = pget('missing', defv) 124*6f336411SStefano Zampini self.assertTrue(isinstance(v, pyt)) 125*6f336411SStefano Zampini self.assertEqual(v, pyt(defv)) 126*6f336411SStefano Zampini 127*6f336411SStefano Zampini if pgetarray is not None: 128*6f336411SStefano Zampini arrayv = pgetarray('av') 129*6f336411SStefano Zampini self.assertEqual(arrayv.dtype, pat) 130*6f336411SStefano Zampini self.assertEqual(len(arrayv), len(av)) 131*6f336411SStefano Zampini for v1, v2 in zip(arrayv, av): 132*6f336411SStefano Zampini self.assertTrue(isinstance(v1.item(), pyt)) 133*6f336411SStefano Zampini self.assertEqual(v1.item(), pyt(v2)) 134*6f336411SStefano Zampini 135*6f336411SStefano Zampini arrayv = pgetarray('av', defarrayv) 136*6f336411SStefano Zampini self.assertEqual(arrayv.dtype, pat) 137*6f336411SStefano Zampini self.assertEqual(len(arrayv), len(av)) 138*6f336411SStefano Zampini for v1, v2 in zip(arrayv, av): 139*6f336411SStefano Zampini self.assertTrue(isinstance(v1.item(), pyt)) 140*6f336411SStefano Zampini self.assertEqual(v1.item(), pyt(v2)) 141*6f336411SStefano Zampini 142*6f336411SStefano Zampini arrayv = pgetarray('missing', defarrayv) 143*6f336411SStefano Zampini self.assertEqual(arrayv.dtype, pat) 144*6f336411SStefano Zampini self.assertEqual(len(arrayv), len(defarrayv)) 145*6f336411SStefano Zampini for v1, v2 in zip(arrayv, defarrayv): 146*6f336411SStefano Zampini self.assertTrue(isinstance(v1.item(), pyt)) 147*6f336411SStefano Zampini self.assertEqual(v1.item(), pyt(v2)) 148*6f336411SStefano Zampini 149*6f336411SStefano Zampini self.opts.delValue('sv') 150*6f336411SStefano Zampini self.opts.delValue('av') 151*6f336411SStefano Zampini 1525808f684SSatish Balay def testMonitor(self): 1535808f684SSatish Balay optlist = [] 1545808f684SSatish Balay mon = lambda n, v: optlist.append((n, v)) 1555808f684SSatish Balay self.opts.setMonitor(mon) 1565808f684SSatish Balay self.assertEqual(getrefcount(mon) - 1, 2) 1575808f684SSatish Balay self._putopts() 158*6f336411SStefano Zampini target = [(self.PREFIX + k, str(v).lower()) for k, v in self.OPTLIST] 1595808f684SSatish Balay self.assertEqual(optlist, target) 1605808f684SSatish Balay self.opts.cancelMonitor() 1615808f684SSatish Balay self.assertEqual(getrefcount(mon) - 1, 1) 1625808f684SSatish Balay self._delopts() 1635808f684SSatish Balay 164*6f336411SStefano Zampini 1655808f684SSatish Balay# -------------------------------------------------------------------- 1665808f684SSatish Balay 1675808f684SSatish Balaydel TestOptions.testMonitor # XXX 1685808f684SSatish Balay 1695808f684SSatish Balayif __name__ == '__main__': 1705808f684SSatish Balay unittest.main() 171