• Facebook
  • Twitter
  • Reddit
  • StumbleUpon
  • Digg
  • email

from write import write, writebr
 
class UnitTest:
	def __init__(self):
		self.tests_completed=0
		self.tests_failed=0
		self.tests_passed=0
		self.test_methods=[]
 
		# define alternate names for methods
		self.assertEqual = self.failUnlessEqual
		self.assertEquals = self.failUnlessEqual
 
		self.assertNotEqual = self.failIfEqual
		self.assertFalse = self.failIf
		self.assertTrue = self.failUnless
 
	def run(self):
		self.getTestMethods()
		for test_method_name in self.test_methods:
			test_method=getattr(self, test_method_name)
			self.setUp()
			test_method()
			self.tearDown()
 
		self.displayStats()
 
	def setUp(self):
		pass
 
	def tearDown(self):
		pass
 
	def getName(self):
		return ""
 
	def getNameFmt(self, msg=""):
		if self.getName():
			if msg:
				msg=" " + msg
			return self.getName() + msg + ": "
		return ""
 
	def getTestMethods(self):
		self.test_methods=filter(self, self.isTestMethod, dir(self))
 
	def isTestMethod(self, method):
		if callable(getattr(self, method)):
			if method.find("test")==0:
				return True
		return False
 
	def fail(self, msg=None):
		self.tests_failed+=1
 
		if not msg:
			msg="assertion failed"
 
		title="<b>" + self.getNameFmt("Test failed") + "</b>"
		writebr(title + msg)
		if console:
			console.error(msg)
			console.trace()
		return False
 
	def startTest(self):
		self.tests_completed+=1
 
	def failIf(self, expr, msg=None):
		self.startTest()
		if expr:
			return self.fail(msg)
 
	def failUnless(self, expr, msg=None):
		self.startTest()
		if not expr:
			return self.fail(msg)
 
	def failUnlessEqual(self, first, second, msg=None):
		self.startTest()
		if not first == second:
			if not msg:
				msg=str(first) + " != " + str(second)
			return self.fail(msg)
 
	def failIfEqual(self, first, second, msg=None):
		self.startTest()
		if first == second:
			if not msg:
				msg=str(first) + " == " + str(second)
			return self.fail(msg)
 
	def failUnlessAlmostEqual(self, first, second, places=7, msg=None):
		self.startTest()
		if round(second-first, places) != 0:
			if not msg:
				msg=str(first) + " != " + str(second) + " within " + str(places) + " places"
			return self.fail(msg)
 
	def failIfAlmostEqual(self, first, second, places=7, msg=None):
		self.startTest()
		if round(second-first, places) == 0:
			if not msg:
				msg=str(first) + " == " + str(second) + " within " + str(places) + " places"
			return self.fail(msg)
 
	def displayStats(self):
		if self.tests_failed:
			bg_colour="#ff0000"
			fg_colour="#ffffff"
		else:
			bg_colour="#00ff00"
			fg_colour="#000000"
 
		tests_passed=self.tests_completed - self.tests_failed
 
		output="<table cellpadding=4 width=100%><tr><td bgcolor='" + bg_colour + "'><font face='arial' size=4 color='" + fg_colour + "'><b>"
		output+=self.getNameFmt() + "Passed " + tests_passed + "/" + self.tests_completed + " tests"
 
		if self.tests_failed:
			output+=" (" + self.tests_failed + " failed)"
 
		output+="</b></font></td></tr></table>"
 
		write(output)