diff --git a/unittest/test_unittest.py b/unittest/test_unittest.py index ae1e7df8..01eabe57 100644 --- a/unittest/test_unittest.py +++ b/unittest/test_unittest.py @@ -14,6 +14,47 @@ class TestUnittestAssertions(unittest.TestCase): with self.assertRaises(AssertionError): self.assertEqual([0,1,2], [1,2,3]) + def test_AlmostEqual(self): + self.assertAlmostEqual( 1.00000001, 1.0) + self.assertNotAlmostEqual( 1.0000001, 1.0) + with self.assertRaises(AssertionError): + self.assertAlmostEqual(1.0000001, 1.0) + with self.assertRaises(AssertionError): + self.assertNotAlmostEqual(1.00000001, 1.0) + + self.assertAlmostEqual(1.1, 1.0, places=0) + with self.assertRaises(AssertionError): + self.assertAlmostEqual(1.1, 1.0, places=1) + + self.assertAlmostEqual(0, .1+.1j, places=0) + self.assertNotAlmostEqual(0, .1+.1j, places=1) + with self.assertRaises(AssertionError): + self.assertAlmostEqual(0, .1+.1j, places=1) + with self.assertRaises(AssertionError): + self.assertNotAlmostEqual(0, .1+.1j, places=0) + + self.assertAlmostEqual(float('inf'), float('inf')) + with self.assertRaises(AssertionError): + self.assertNotAlmostEqual(float('inf'), float('inf')) + + def test_AmostEqualWithDelta(self): + self.assertAlmostEqual(1.1, 1.0, delta=0.5) + self.assertAlmostEqual(1.0, 1.1, delta=0.5) + self.assertNotAlmostEqual(1.1, 1.0, delta=0.05) + self.assertNotAlmostEqual(1.0, 1.1, delta=0.05) + + self.assertAlmostEqual(1.0, 1.0, delta=0.5) + with self.assertRaises(AssertionError): + self.assertNotAlmostEqual(1.0, 1.0, delta=0.5) + with self.assertRaises(AssertionError): + self.assertAlmostEqual(1.1, 1.0, delta=0.05) + with self.assertRaises(AssertionError): + self.assertNotAlmostEqual(1.1, 1.0, delta=0.5) + with self.assertRaises(TypeError): + self.assertAlmostEqual(1.1, 1.0, places=2, delta=2) + with self.assertRaises(TypeError): + self.assertNotAlmostEqual(1.1, 1.0, places=2, delta=2) + def testNotEqual(self): self.assertNotEqual([0,1,2], [0,2,1]) with self.assertRaises(AssertionError): diff --git a/unittest/unittest.py b/unittest/unittest.py index 1fd6a2c0..ab7121b6 100644 --- a/unittest/unittest.py +++ b/unittest/unittest.py @@ -33,6 +33,46 @@ class TestCase: msg = "%r not expected to be equal %r" % (x, y) assert x != y, msg + def assertAlmostEqual(self, x, y, places=None, msg='', delta=None): + if x == y: + return + if delta is not None and places is not None: + raise TypeError("specify delta or places not both") + + if delta is not None: + if abs(x - y) <= delta: + return + if not msg: + msg = '%r != %r within %r delta' % (x, y, delta) + else: + if places is None: + places = 7 + if round(abs(y-x), places) == 0: + return + if not msg: + msg = '%r != %r within %r places' % (x, y, places) + + assert False, msg + + def assertNotAlmostEqual(self, x, y, places=None, msg='', delta=None): + if delta is not None and places is not None: + raise TypeError("specify delta or places not both") + + if delta is not None: + if not (x == y) and abs(x - y) > delta: + return + if not msg: + msg = '%r == %r within %r delta' % (x, y, delta) + else: + if places is None: + places = 7 + if not (x == y) and round(abs(y-x), places) != 0: + return + if not msg: + msg = '%r == %r within %r places' % (x, y, places) + + assert False, msg + def assertIs(self, x, y, msg=''): if not msg: msg = "%r is not %r" % (x, y) @@ -74,6 +114,7 @@ class TestCase: raise + def skip(msg): def _decor(fun): # We just replace original fun with _inner