diff -r 703d9066c459 Lib/unittest/test/test_runner.py --- a/Lib/unittest/test/test_runner.py Mon Jun 20 21:42:05 2016 +0300 +++ b/Lib/unittest/test/test_runner.py Sun Jun 26 21:02:59 2016 -0400 @@ -6,6 +6,7 @@ import unittest from unittest.case import _Outcome +from unittest.runner import _WritelnDecorator from unittest.test.support import (LoggingResult, ResultWithNoStartTestRunStopTestRun) @@ -349,5 +350,94 @@ self.assertTrue(runner.stream.stream is f) +class Test_TextTestResult(unittest.TestCase): + def _test_one(self, descriptions, verbosity, action_name, action_arg): + # -- TextTestResult expects a writeln decorated stream + f = _WritelnDecorator(io.StringIO()) + + # -- Test case only used as a place-holder + class Foo(unittest.TestCase): + def test_1(self): + pass + + test = Foo('test_1') + + result = unittest.TextTestResult(stream=f, + descriptions=descriptions, + verbosity=verbosity) + result.startTest(test) + if action_name: + action = getattr(result, action_name) + if action_arg: + action(test, action_arg) + else: + action(test) + return f.getvalue() + + def tests(self): + # -- exc_info_tuple is action_arg for certain actions + try: + raise TypeError() + except: + exc_info_tuple = sys.exc_info() + + # (action_name, action_arg, expected_char, expected_end) + # action_name is the name of the "add" method to call on the result + # action_arg is the arg to use for that action method + # expected_char is the expected output when verbosity=1 + # expected_end is the expected output.endswith when verbosity=2 + TESTS = [ + (None, None, "", " ... "), + ("addSuccess", None, ".", " ... ok\n"), + ("addError", exc_info_tuple, "E", " ... ERROR\n"), + ("addFailure", exc_info_tuple, "F", " ... FAIL\n"), + ("addSkip", "Just Because", "s", " ... skipped 'Just Because'\n"), + ("addExpectedFailure", exc_info_tuple, "x", + " ... expected failure\n"), + ("addUnexpectedSuccess", None, "u", " ... unexpected success\n"), + ] + for action_name, action_arg, expected_char, expected_end in TESTS: + # -- Test with verbosity=0 for branch coverage where: + # TextTestResult.dots is False + # TextTestResult.showAll is False + with self.subTest(action_name=action_name, + action_arg=action_arg, + verbosity=0): + output = self._test_one(descriptions=True, + verbosity=0, + action_name=action_name, + action_arg=action_arg, + ) + self.assertEqual(output, "") + + # -- Test with verbosity=1 for branch coverage where: + # TextTestResult.dots is True + # TextTestResult.showAll is False + with self.subTest(action_name=action_name, + action_arg=action_arg, + expected_char=expected_char, + verbosity=1): + output = self._test_one(descriptions=True, + verbosity=1, + action_name=action_name, + action_arg=action_arg, + ) + self.assertEqual(output, expected_char) + + # -- Test with verbosity=1 for branch coverage where: + # TextTestResult.dots is (ignored) + # TextTestResult.showAll is True + with self.subTest(action_name=action_name, + action_arg=action_arg, + expected_end=expected_end, + verbosity=2): + output = self._test_one(descriptions=True, + verbosity=2, + action_name=action_name, + action_arg=action_arg, + ) + self.assertTrue(output.endswith(expected_end), repr(output)) + + if __name__ == "__main__": unittest.main()