Source code for sfepy.base.testing
import inspect
import numpy as nm
import numpy.linalg as nla
from sfepy.base.base import Struct
[docs]class TestCommon(Struct):
@staticmethod
[docs] def xfail(test_method):
"""
Decorator that allows a test to fail.
"""
def wrapper(self):
try:
ret = test_method(self)
except:
if self.debug:
raise
ret = False
if not ret:
print '--- test expected to fail.'
ret = True
return ret
return wrapper
[docs] def get_number(self):
methods = inspect.getmembers(self, inspect.ismethod)
tests = [ii for ii in methods
if (len(ii[0]) > 5) and ii[0][:5] == 'test_']
return len(tests)
[docs] def run(self, debug=False):
self.debug = debug
ok = True
n_fail = 0
methods = inspect.getmembers(self, inspect.ismethod)
if hasattr(self, 'tests'):
dmethods = {}
for key, method in methods:
dmethods[key] = method
tests = [(ii, dmethods[ii]) for ii in self.tests]
print tests
else:
tests = [ii for ii in methods
if (len(ii[0]) > 5) and ii[0][:5] == 'test_']
for test_name, test_method in tests:
aux = ' %s: ' % test_name
try:
ret = test_method()
except:
if debug:
raise
ret = False
if not ret:
aux = '---' + aux + 'failed!'
n_fail += 1
ok = False
else:
aux = '+++' + aux + 'ok'
print aux
return ok, n_fail, len(tests)
@staticmethod
[docs] def report(*argc):
"""All tests should print via this function."""
format = '...' + ' %s' * len(argc)
msg = format % argc
print msg
@staticmethod
[docs] def eval_coor_expression(expression, coor):
x = coor[:, 0]
y = coor[:, 1]
if coor.shape[1] == 3:
z = coor[:, 2]
else:
z = None
env = {'x' : x, 'y' : y, 'z' : z}
out = eval(expression, nm.__dict__, env)
if isinstance(out, float):
aux = nm.empty(coor.shape[0], dtype=nm.float64)
aux.fill(out)
out = aux
return out
@staticmethod
[docs] def compare_vectors(vec1, vec2, allowed_error=1e-8,
label1='vec1', label2='vec2', norm=None):
diff_norm = nla.norm(vec1 - vec2, ord=norm)
TestCommon.report('||%s - %s||: %e' % (label1, label2, diff_norm))
if diff_norm > allowed_error:
return False
else:
return True