14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom .support import LoggingResult, TestEquality
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm### Support code for Test_TestSuite
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm################################################################
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Test(object):
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    class Foo(unittest.TestCase):
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_1(self): pass
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_2(self): pass
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_3(self): pass
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def runTest(self): pass
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef _mk_TestSuite(*names):
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return unittest.TestSuite(Test.Foo(n) for n in names)
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm################################################################
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Test_TestSuite(unittest.TestCase, TestEquality):
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ### Set up attributes needed by inherited tests
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ################################################################
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Used by TestEquality.test_eq
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    eq_pairs = [(unittest.TestSuite(), unittest.TestSuite()),
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (unittest.TestSuite(), unittest.TestSuite([])),
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm               (_mk_TestSuite('test_1'), _mk_TestSuite('test_1'))]
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Used by TestEquality.test_ne
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ne_pairs = [(unittest.TestSuite(), _mk_TestSuite('test_1')),
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (unittest.TestSuite([]), _mk_TestSuite('test_1')),
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (_mk_TestSuite('test_1', 'test_2'), _mk_TestSuite('test_1', 'test_3')),
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                (_mk_TestSuite('test_1'), _mk_TestSuite('test_2'))]
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ################################################################
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ### /Set up attributes needed by inherited tests
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ### Tests for TestSuite.__init__
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ################################################################
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "class TestSuite([tests])"
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # The tests iterable should be optional
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_init__tests_optional(self):
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite()
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite.countTestCases(), 0)
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "class TestSuite([tests])"
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # ...
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "If tests is given, it must be an iterable of individual test cases
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # or other test suites that will be used to build the suite initially"
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # TestSuite should deal with empty tests iterables by allowing the
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # creation of an empty suite
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_init__empty_tests(self):
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite([])
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite.countTestCases(), 0)
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "class TestSuite([tests])"
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # ...
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "If tests is given, it must be an iterable of individual test cases
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # or other test suites that will be used to build the suite initially"
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # TestSuite should allow any iterable to provide tests
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_init__tests_from_any_iterable(self):
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def tests():
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield unittest.FunctionTestCase(lambda: None)
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield unittest.FunctionTestCase(lambda: None)
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite_1 = unittest.TestSuite(tests())
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite_1.countTestCases(), 2)
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite_2 = unittest.TestSuite(suite_1)
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite_2.countTestCases(), 2)
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite_3 = unittest.TestSuite(set(suite_1))
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite_3.countTestCases(), 2)
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "class TestSuite([tests])"
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # ...
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "If tests is given, it must be an iterable of individual test cases
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # or other test suites that will be used to build the suite initially"
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Does TestSuite() also allow other TestSuite() instances to be present
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # in the tests iterable?
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_init__TestSuite_instances_in_tests(self):
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def tests():
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ftc = unittest.FunctionTestCase(lambda: None)
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield unittest.TestSuite([ftc])
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield unittest.FunctionTestCase(lambda: None)
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite(tests())
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite.countTestCases(), 2)
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ################################################################
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ### /Tests for TestSuite.__init__
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Container types should support the iter protocol
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_iter(self):
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test1 = unittest.FunctionTestCase(lambda: None)
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test2 = unittest.FunctionTestCase(lambda: None)
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite((test1, test2))
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(list(suite), [test1, test2])
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "Return the number of tests represented by the this test object.
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # ...this method is also implemented by the TestSuite class, which can
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # return larger [greater than 1] values"
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Presumably an empty TestSuite returns 0?
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_countTestCases_zero_simple(self):
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite()
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite.countTestCases(), 0)
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "Return the number of tests represented by the this test object.
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # ...this method is also implemented by the TestSuite class, which can
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # return larger [greater than 1] values"
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Presumably an empty TestSuite (even if it contains other empty
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # TestSuite instances) returns 0?
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_countTestCases_zero_nested(self):
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Test1(unittest.TestCase):
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test(self):
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite([unittest.TestSuite()])
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite.countTestCases(), 0)
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "Return the number of tests represented by the this test object.
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # ...this method is also implemented by the TestSuite class, which can
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # return larger [greater than 1] values"
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_countTestCases_simple(self):
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test1 = unittest.FunctionTestCase(lambda: None)
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test2 = unittest.FunctionTestCase(lambda: None)
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite((test1, test2))
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite.countTestCases(), 2)
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "Return the number of tests represented by the this test object.
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # ...this method is also implemented by the TestSuite class, which can
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # return larger [greater than 1] values"
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Make sure this holds for nested TestSuite instances, too
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_countTestCases_nested(self):
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Test1(unittest.TestCase):
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test1(self): pass
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test2(self): pass
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test2 = unittest.FunctionTestCase(lambda: None)
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test3 = unittest.FunctionTestCase(lambda: None)
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        child = unittest.TestSuite((Test1('test2'), test2))
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        parent = unittest.TestSuite((test3, child, Test1('test1')))
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(parent.countTestCases(), 4)
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "Run the tests associated with this suite, collecting the result into
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # the test result object passed as result."
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # And if there are no tests? What then?
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_run__empty_suite(self):
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        events = []
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = LoggingResult(events)
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite()
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite.run(result)
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(events, [])
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "Note that unlike TestCase.run(), TestSuite.run() requires the
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "result object to be passed in."
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_run__requires_result(self):
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite()
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            suite.run()
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except TypeError:
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail("Failed to raise TypeError")
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "Run the tests associated with this suite, collecting the result into
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # the test result object passed as result."
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_run(self):
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        events = []
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = LoggingResult(events)
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class LoggingCase(unittest.TestCase):
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def run(self, result):
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                events.append('run %s' % self._testMethodName)
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test1(self): pass
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test2(self): pass
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        tests = [LoggingCase('test1'), LoggingCase('test2')]
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        unittest.TestSuite(tests).run(result)
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(events, ['run test1', 'run test2'])
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "Add a TestCase ... to the suite"
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_addTest__TestCase(self):
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Foo(unittest.TestCase):
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test(self): pass
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test = Foo('test')
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite()
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite.addTest(test)
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite.countTestCases(), 1)
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(list(suite), [test])
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "Add a ... TestSuite to the suite"
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_addTest__TestSuite(self):
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Foo(unittest.TestCase):
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test(self): pass
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite_2 = unittest.TestSuite([Foo('test')])
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite()
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite.addTest(suite_2)
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite.countTestCases(), 1)
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(list(suite), [suite_2])
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "Add all the tests from an iterable of TestCase and TestSuite
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # instances to this test suite."
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "This is equivalent to iterating over tests, calling addTest() for
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # each element"
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_addTests(self):
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Foo(unittest.TestCase):
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test_1(self): pass
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def test_2(self): pass
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_1 = Foo('test_1')
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        test_2 = Foo('test_2')
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        inner_suite = unittest.TestSuite([test_2])
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def gen():
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield test_1
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield test_2
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            yield inner_suite
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite_1 = unittest.TestSuite()
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite_1.addTests(gen())
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(list(suite_1), list(gen()))
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # "This is equivalent to iterating over tests, calling addTest() for
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # each element"
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite_2 = unittest.TestSuite()
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for t in gen():
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            suite_2.addTest(t)
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite_1, suite_2)
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # "Add all the tests from an iterable of TestCase and TestSuite
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # instances to this test suite."
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    #
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # What happens if it doesn't get an iterable?
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_addTest__noniterable(self):
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite()
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            suite.addTests(5)
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        except TypeError:
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        else:
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.fail("Failed to raise TypeError")
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_addTest__noncallable(self):
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite()
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, suite.addTest, 5)
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_addTest__casesuiteclass(self):
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite()
2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, suite.addTest, Test_TestSuite)
2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, suite.addTest, unittest.TestSuite)
2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_addTests__string(self):
2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite()
2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertRaises(TypeError, suite.addTests, "foo")
2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_function_in_suite(self):
2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def f(_):
2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            pass
2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.TestSuite()
2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite.addTest(f)
2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # when the bug is fixed this line will not crash
3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite.run(unittest.TestResult())
3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_basetestsuite(self):
3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Test(unittest.TestCase):
3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            wasSetUp = False
3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            wasTornDown = False
3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            @classmethod
3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def setUpClass(cls):
3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                cls.wasSetUp = True
3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            @classmethod
3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def tearDownClass(cls):
3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                cls.wasTornDown = True
3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def testPass(self):
3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                pass
3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def testFail(self):
3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                fail
3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class Module(object):
3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            wasSetUp = False
3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            wasTornDown = False
3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            @staticmethod
3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def setUpModule():
3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Module.wasSetUp = True
3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            @staticmethod
3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def tearDownModule():
3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                Module.wasTornDown = True
3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        Test.__module__ = 'Module'
3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        sys.modules['Module'] = Module
3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.addCleanup(sys.modules.pop, 'Module')
3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = unittest.BaseTestSuite()
3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite.addTests([Test('testPass'), Test('testFail')])
3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(suite.countTestCases(), 2)
3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = unittest.TestResult()
3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite.run(result)
3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(Module.wasSetUp)
3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(Module.wasTornDown)
3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(Test.wasSetUp)
3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(Test.wasTornDown)
3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(result.errors), 1)
3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(len(result.failures), 0)
3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(result.testsRun, 2)
3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_overriding_call(self):
3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        class MySuite(unittest.TestSuite):
3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            called = False
3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            def __call__(self, *args, **kw):
3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                self.called = True
3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                unittest.TestSuite.__call__(self, *args, **kw)
3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        suite = MySuite()
3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        result = unittest.TestResult()
3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        wrapper = unittest.TestSuite()
3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        wrapper.addTest(suite)
3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        wrapper(result)
3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertTrue(suite.called)
3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # reusing results should be permitted even if abominable
3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertFalse(result._testRunEntered)
3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == '__main__':
3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unittest.main()
368