def typeErrors(object, value, skipAttrs=[]):
"""Provoke type errors.
Attempts to set every attribute of object to the given value,
expecting that TypeError will be raised. skipAttrs can be used to
give a list of attribute names to by pass.
"""
for attr in object.klass().allAttrs():
if attr.name() not in skipAttrs:
try:
object.setValueForAttr(attr, value)
except TypeError:
pass
except Exception, e:
raise Exception, 'no type error for %s. instead got: %r, %s' % (attr.name(), e, e)
else:
raise Exception, 'no type error for %s' % attr.name()
def test(store):
from Foo import Foo
from Bar import Bar
from MiscUtils.DataTable import DataTable
import sys
class Blarg:
pass
blarg = Blarg() # a dummy object, incompatible with everything
f = Foo()
typeErrors(f, blarg)
typeErrors(f, sys.stdout)
typeErrors(f, 1.0, ['f'])
typeErrors(f, 1, 'b i l f'.split())
# ValueErrors and others
try:
f.setB(5)
except ValueError:
pass
else:
raise Exception, 'expecting ValueError for bad bool argument'
try:
f.setI(2L**32)
except OverflowError:
pass
else:
raise Exception, 'expecting OverflowError for large int argument'
try:
f.setE('c')
except ValueError:
pass
else:
raise Exception, 'expecting ValueError for invalid enum'
# Numerics that pass
f.setI(1L) # ints can take longs that fit in the int range
f.setL(1) # longs can take ints
f.setF(1) # floats can take ints
f.setF(1L) # floats can take longs
|