1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
import os
import unittest
class ParametricTestsMetaclass(type):
def __new__(mcl, name, bases, attrs):
try:
tests = attrs['_tests']
testGenerator = attrs['_testGenerator']
except KeyError:
pass
else:
del attrs['_tests']
del attrs['_testGenerator']
for name, params in tests.items():
args, kwargs = params
methodName = 'test' + name
attrs[methodName] = testGenerator(methodName, *args, **kwargs)
return type.__new__(mcl, name, bases, attrs)
class ParametricTests(unittest.TestCase, metaclass=ParametricTestsMetaclass):
pass
class RegressionTest(ParametricTests):
TESTDIR = '.'
def assertSameAsReference(self, reference=None):
try:
self.assertEqual(self.contentOf(reference if reference is not None else self.REFERENCE),
self.contentOf(self.OUTFILE))
except AssertionError:
raise AssertionError("{ref} and {out} differs\ntry:\n$ vimdiff {ref} {out}".format(
ref=self.absPathTo(self.REFERENCE),
out=self.absPathTo(self.OUTFILE)))
def assertSameAsPattern(self, __pattern=None, **kwargs):
try:
self.assertEqual(self.contentOf(__pattern).format(**kwargs),
self.contentOf(self.OUTFILE))
except AssertionError:
raise AssertionError("{ref} and {out} differs\ntry:\n$ vimdiff {ref} {out}".format(
ref=self.absPathTo(self.REFERENCE),
out=self.absPathTo(self.OUTFILE)))
def absPathTo(self, filename):
return os.path.abspath(os.path.join(os.path.dirname(__file__),
self.TESTDIR,
filename))
def contentOf(self, filename):
fh = open(self.absPathTo(filename))
content = fh.read()
fh.close()
return content
def removeFile(self, name):
try:
os.remove(self.absPathTo(name))
except OSError:
pass
def setNewOutfile(self, name):
self.removeFile(name)
self.OUTFILE = name
|