import unittest

class TestUnittestAssertions(unittest.TestCase):

    def testFail(self):
        with self.assertRaises(AssertionError):
            self.fail('failure')

    def testEqual(self):
        self.assertEqual(0,0)
        self.assertEqual([0,1,2], [0,1,2])
        with self.assertRaises(AssertionError):
            self.assertEqual(0,None)
        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):
            self.assertNotEqual(0,0)
        with self.assertRaises(AssertionError):
            self.assertNotEqual([0,1,2], [0,1,2])

    def testIs(self):
        self.assertIs(None, None)
        with self.assertRaises(AssertionError):
            self.assertIs([1,2,3], [1,2,3])

    def testIsNot(self):
        self.assertIsNot([1,2,3], [1,2,3])
        with self.assertRaises(AssertionError):
            self.assertIsNot(None, None)

    def testIsNone(self):
        self.assertIsNone(None)
        with self.assertRaises(AssertionError):
            self.assertIsNone(0)

    def testIsNotNone(self):
        self.assertIsNotNone(0)
        with self.assertRaises(AssertionError):
            self.assertIsNotNone(None)

    def testTrue(self):
        self.assertTrue(True)
        with self.assertRaises(AssertionError):
            self.assertTrue(False)

    def testFalse(self):
        self.assertFalse(False)
        with self.assertRaises(AssertionError):
            self.assertFalse(True)

    def testIn(self):
        self.assertIn('t', 'cat')
        with self.assertRaises(AssertionError):
            self.assertIn('x', 'cat')

    def testIsInstance(self):
        self.assertIsInstance('cat', str)
        with self.assertRaises(AssertionError):
            self.assertIsInstance(7, str)

    def testRaises(self):
        with self.assertRaises(ZeroDivisionError):
            1/0
            pass

    @unittest.skip('test of skipping')
    def testSkip(self):
        self.assertFail('this should be skipped')

if __name__ == '__main__':
    unittest.main()
