symbian-qemu-0.9.1-12/python-2.6.1/Lib/test/test_unittest.py
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 """Test script for unittest.
       
     2 
       
     3 By Collin Winter <collinw at gmail.com>
       
     4 
       
     5 Still need testing:
       
     6     TestCase.{assert,fail}* methods (some are tested implicitly)
       
     7 """
       
     8 
       
     9 from test import test_support
       
    10 import unittest
       
    11 from unittest import TestCase
       
    12 import types
       
    13 
       
    14 ### Support code
       
    15 ################################################################
       
    16 
       
    17 class LoggingResult(unittest.TestResult):
       
    18     def __init__(self, log):
       
    19         self._events = log
       
    20         super(LoggingResult, self).__init__()
       
    21 
       
    22     def startTest(self, test):
       
    23         self._events.append('startTest')
       
    24         super(LoggingResult, self).startTest(test)
       
    25 
       
    26     def stopTest(self, test):
       
    27         self._events.append('stopTest')
       
    28         super(LoggingResult, self).stopTest(test)
       
    29 
       
    30     def addFailure(self, *args):
       
    31         self._events.append('addFailure')
       
    32         super(LoggingResult, self).addFailure(*args)
       
    33 
       
    34     def addError(self, *args):
       
    35         self._events.append('addError')
       
    36         super(LoggingResult, self).addError(*args)
       
    37 
       
    38 class TestEquality(object):
       
    39     # Check for a valid __eq__ implementation
       
    40     def test_eq(self):
       
    41         for obj_1, obj_2 in self.eq_pairs:
       
    42             self.assertEqual(obj_1, obj_2)
       
    43             self.assertEqual(obj_2, obj_1)
       
    44 
       
    45     # Check for a valid __ne__ implementation
       
    46     def test_ne(self):
       
    47         for obj_1, obj_2 in self.ne_pairs:
       
    48             self.failIfEqual(obj_1, obj_2)
       
    49             self.failIfEqual(obj_2, obj_1)
       
    50 
       
    51 class TestHashing(object):
       
    52     # Check for a valid __hash__ implementation
       
    53     def test_hash(self):
       
    54         for obj_1, obj_2 in self.eq_pairs:
       
    55             try:
       
    56                 assert hash(obj_1) == hash(obj_2)
       
    57             except KeyboardInterrupt:
       
    58                 raise
       
    59             except AssertionError:
       
    60                 self.fail("%s and %s do not hash equal" % (obj_1, obj_2))
       
    61             except Exception, e:
       
    62                 self.fail("Problem hashing %s and %s: %s" % (obj_1, obj_2, e))
       
    63 
       
    64         for obj_1, obj_2 in self.ne_pairs:
       
    65             try:
       
    66                 assert hash(obj_1) != hash(obj_2)
       
    67             except KeyboardInterrupt:
       
    68                 raise
       
    69             except AssertionError:
       
    70                 self.fail("%s and %s hash equal, but shouldn't" % (obj_1, obj_2))
       
    71             except Exception, e:
       
    72                 self.fail("Problem hashing %s and %s: %s" % (obj_1, obj_2, e))
       
    73 
       
    74 
       
    75 ################################################################
       
    76 ### /Support code
       
    77 
       
    78 class Test_TestLoader(TestCase):
       
    79 
       
    80     ### Tests for TestLoader.loadTestsFromTestCase
       
    81     ################################################################
       
    82 
       
    83     # "Return a suite of all tests cases contained in the TestCase-derived
       
    84     # class testCaseClass"
       
    85     def test_loadTestsFromTestCase(self):
       
    86         class Foo(unittest.TestCase):
       
    87             def test_1(self): pass
       
    88             def test_2(self): pass
       
    89             def foo_bar(self): pass
       
    90 
       
    91         tests = unittest.TestSuite([Foo('test_1'), Foo('test_2')])
       
    92 
       
    93         loader = unittest.TestLoader()
       
    94         self.assertEqual(loader.loadTestsFromTestCase(Foo), tests)
       
    95 
       
    96     # "Return a suite of all tests cases contained in the TestCase-derived
       
    97     # class testCaseClass"
       
    98     #
       
    99     # Make sure it does the right thing even if no tests were found
       
   100     def test_loadTestsFromTestCase__no_matches(self):
       
   101         class Foo(unittest.TestCase):
       
   102             def foo_bar(self): pass
       
   103 
       
   104         empty_suite = unittest.TestSuite()
       
   105 
       
   106         loader = unittest.TestLoader()
       
   107         self.assertEqual(loader.loadTestsFromTestCase(Foo), empty_suite)
       
   108 
       
   109     # "Return a suite of all tests cases contained in the TestCase-derived
       
   110     # class testCaseClass"
       
   111     #
       
   112     # What happens if loadTestsFromTestCase() is given an object
       
   113     # that isn't a subclass of TestCase? Specifically, what happens
       
   114     # if testCaseClass is a subclass of TestSuite?
       
   115     #
       
   116     # This is checked for specifically in the code, so we better add a
       
   117     # test for it.
       
   118     def test_loadTestsFromTestCase__TestSuite_subclass(self):
       
   119         class NotATestCase(unittest.TestSuite):
       
   120             pass
       
   121 
       
   122         loader = unittest.TestLoader()
       
   123         try:
       
   124             loader.loadTestsFromTestCase(NotATestCase)
       
   125         except TypeError:
       
   126             pass
       
   127         else:
       
   128             self.fail('Should raise TypeError')
       
   129 
       
   130     # "Return a suite of all tests cases contained in the TestCase-derived
       
   131     # class testCaseClass"
       
   132     #
       
   133     # Make sure loadTestsFromTestCase() picks up the default test method
       
   134     # name (as specified by TestCase), even though the method name does
       
   135     # not match the default TestLoader.testMethodPrefix string
       
   136     def test_loadTestsFromTestCase__default_method_name(self):
       
   137         class Foo(unittest.TestCase):
       
   138             def runTest(self):
       
   139                 pass
       
   140 
       
   141         loader = unittest.TestLoader()
       
   142         # This has to be false for the test to succeed
       
   143         self.failIf('runTest'.startswith(loader.testMethodPrefix))
       
   144 
       
   145         suite = loader.loadTestsFromTestCase(Foo)
       
   146         self.failUnless(isinstance(suite, loader.suiteClass))
       
   147         self.assertEqual(list(suite), [Foo('runTest')])
       
   148 
       
   149     ################################################################
       
   150     ### /Tests for TestLoader.loadTestsFromTestCase
       
   151 
       
   152     ### Tests for TestLoader.loadTestsFromModule
       
   153     ################################################################
       
   154 
       
   155     # "This method searches `module` for classes derived from TestCase"
       
   156     def test_loadTestsFromModule__TestCase_subclass(self):
       
   157         m = types.ModuleType('m')
       
   158         class MyTestCase(unittest.TestCase):
       
   159             def test(self):
       
   160                 pass
       
   161         m.testcase_1 = MyTestCase
       
   162 
       
   163         loader = unittest.TestLoader()
       
   164         suite = loader.loadTestsFromModule(m)
       
   165         self.failUnless(isinstance(suite, loader.suiteClass))
       
   166 
       
   167         expected = [loader.suiteClass([MyTestCase('test')])]
       
   168         self.assertEqual(list(suite), expected)
       
   169 
       
   170     # "This method searches `module` for classes derived from TestCase"
       
   171     #
       
   172     # What happens if no tests are found (no TestCase instances)?
       
   173     def test_loadTestsFromModule__no_TestCase_instances(self):
       
   174         m = types.ModuleType('m')
       
   175 
       
   176         loader = unittest.TestLoader()
       
   177         suite = loader.loadTestsFromModule(m)
       
   178         self.failUnless(isinstance(suite, loader.suiteClass))
       
   179         self.assertEqual(list(suite), [])
       
   180 
       
   181     # "This method searches `module` for classes derived from TestCase"
       
   182     #
       
   183     # What happens if no tests are found (TestCases instances, but no tests)?
       
   184     def test_loadTestsFromModule__no_TestCase_tests(self):
       
   185         m = types.ModuleType('m')
       
   186         class MyTestCase(unittest.TestCase):
       
   187             pass
       
   188         m.testcase_1 = MyTestCase
       
   189 
       
   190         loader = unittest.TestLoader()
       
   191         suite = loader.loadTestsFromModule(m)
       
   192         self.failUnless(isinstance(suite, loader.suiteClass))
       
   193 
       
   194         self.assertEqual(list(suite), [loader.suiteClass()])
       
   195 
       
   196     # "This method searches `module` for classes derived from TestCase"s
       
   197     #
       
   198     # What happens if loadTestsFromModule() is given something other
       
   199     # than a module?
       
   200     #
       
   201     # XXX Currently, it succeeds anyway. This flexibility
       
   202     # should either be documented or loadTestsFromModule() should
       
   203     # raise a TypeError
       
   204     #
       
   205     # XXX Certain people are using this behaviour. We'll add a test for it
       
   206     def test_loadTestsFromModule__not_a_module(self):
       
   207         class MyTestCase(unittest.TestCase):
       
   208             def test(self):
       
   209                 pass
       
   210 
       
   211         class NotAModule(object):
       
   212             test_2 = MyTestCase
       
   213 
       
   214         loader = unittest.TestLoader()
       
   215         suite = loader.loadTestsFromModule(NotAModule)
       
   216 
       
   217         reference = [unittest.TestSuite([MyTestCase('test')])]
       
   218         self.assertEqual(list(suite), reference)
       
   219 
       
   220     ################################################################
       
   221     ### /Tests for TestLoader.loadTestsFromModule()
       
   222 
       
   223     ### Tests for TestLoader.loadTestsFromName()
       
   224     ################################################################
       
   225 
       
   226     # "The specifier name is a ``dotted name'' that may resolve either to
       
   227     # a module, a test case class, a TestSuite instance, a test method
       
   228     # within a test case class, or a callable object which returns a
       
   229     # TestCase or TestSuite instance."
       
   230     #
       
   231     # Is ValueError raised in response to an empty name?
       
   232     def test_loadTestsFromName__empty_name(self):
       
   233         loader = unittest.TestLoader()
       
   234 
       
   235         try:
       
   236             loader.loadTestsFromName('')
       
   237         except ValueError, e:
       
   238             self.assertEqual(str(e), "Empty module name")
       
   239         else:
       
   240             self.fail("TestLoader.loadTestsFromName failed to raise ValueError")
       
   241 
       
   242     # "The specifier name is a ``dotted name'' that may resolve either to
       
   243     # a module, a test case class, a TestSuite instance, a test method
       
   244     # within a test case class, or a callable object which returns a
       
   245     # TestCase or TestSuite instance."
       
   246     #
       
   247     # What happens when the name contains invalid characters?
       
   248     def test_loadTestsFromName__malformed_name(self):
       
   249         loader = unittest.TestLoader()
       
   250 
       
   251         # XXX Should this raise ValueError or ImportError?
       
   252         try:
       
   253             loader.loadTestsFromName('abc () //')
       
   254         except ValueError:
       
   255             pass
       
   256         except ImportError:
       
   257             pass
       
   258         else:
       
   259             self.fail("TestLoader.loadTestsFromName failed to raise ValueError")
       
   260 
       
   261     # "The specifier name is a ``dotted name'' that may resolve ... to a
       
   262     # module"
       
   263     #
       
   264     # What happens when a module by that name can't be found?
       
   265     def test_loadTestsFromName__unknown_module_name(self):
       
   266         loader = unittest.TestLoader()
       
   267 
       
   268         try:
       
   269             loader.loadTestsFromName('sdasfasfasdf')
       
   270         except ImportError, e:
       
   271             self.assertEqual(str(e), "No module named sdasfasfasdf")
       
   272         else:
       
   273             self.fail("TestLoader.loadTestsFromName failed to raise ImportError")
       
   274 
       
   275     # "The specifier name is a ``dotted name'' that may resolve either to
       
   276     # a module, a test case class, a TestSuite instance, a test method
       
   277     # within a test case class, or a callable object which returns a
       
   278     # TestCase or TestSuite instance."
       
   279     #
       
   280     # What happens when the module is found, but the attribute can't?
       
   281     def test_loadTestsFromName__unknown_attr_name(self):
       
   282         loader = unittest.TestLoader()
       
   283 
       
   284         try:
       
   285             loader.loadTestsFromName('unittest.sdasfasfasdf')
       
   286         except AttributeError, e:
       
   287             self.assertEqual(str(e), "'module' object has no attribute 'sdasfasfasdf'")
       
   288         else:
       
   289             self.fail("TestLoader.loadTestsFromName failed to raise AttributeError")
       
   290 
       
   291     # "The specifier name is a ``dotted name'' that may resolve either to
       
   292     # a module, a test case class, a TestSuite instance, a test method
       
   293     # within a test case class, or a callable object which returns a
       
   294     # TestCase or TestSuite instance."
       
   295     #
       
   296     # What happens when we provide the module, but the attribute can't be
       
   297     # found?
       
   298     def test_loadTestsFromName__relative_unknown_name(self):
       
   299         loader = unittest.TestLoader()
       
   300 
       
   301         try:
       
   302             loader.loadTestsFromName('sdasfasfasdf', unittest)
       
   303         except AttributeError, e:
       
   304             self.assertEqual(str(e), "'module' object has no attribute 'sdasfasfasdf'")
       
   305         else:
       
   306             self.fail("TestLoader.loadTestsFromName failed to raise AttributeError")
       
   307 
       
   308     # "The specifier name is a ``dotted name'' that may resolve either to
       
   309     # a module, a test case class, a TestSuite instance, a test method
       
   310     # within a test case class, or a callable object which returns a
       
   311     # TestCase or TestSuite instance."
       
   312     # ...
       
   313     # "The method optionally resolves name relative to the given module"
       
   314     #
       
   315     # Does loadTestsFromName raise ValueError when passed an empty
       
   316     # name relative to a provided module?
       
   317     #
       
   318     # XXX Should probably raise a ValueError instead of an AttributeError
       
   319     def test_loadTestsFromName__relative_empty_name(self):
       
   320         loader = unittest.TestLoader()
       
   321 
       
   322         try:
       
   323             loader.loadTestsFromName('', unittest)
       
   324         except AttributeError, e:
       
   325             pass
       
   326         else:
       
   327             self.fail("Failed to raise AttributeError")
       
   328 
       
   329     # "The specifier name is a ``dotted name'' that may resolve either to
       
   330     # a module, a test case class, a TestSuite instance, a test method
       
   331     # within a test case class, or a callable object which returns a
       
   332     # TestCase or TestSuite instance."
       
   333     # ...
       
   334     # "The method optionally resolves name relative to the given module"
       
   335     #
       
   336     # What happens when an impossible name is given, relative to the provided
       
   337     # `module`?
       
   338     def test_loadTestsFromName__relative_malformed_name(self):
       
   339         loader = unittest.TestLoader()
       
   340 
       
   341         # XXX Should this raise AttributeError or ValueError?
       
   342         try:
       
   343             loader.loadTestsFromName('abc () //', unittest)
       
   344         except ValueError:
       
   345             pass
       
   346         except AttributeError:
       
   347             pass
       
   348         else:
       
   349             self.fail("TestLoader.loadTestsFromName failed to raise ValueError")
       
   350 
       
   351     # "The method optionally resolves name relative to the given module"
       
   352     #
       
   353     # Does loadTestsFromName raise TypeError when the `module` argument
       
   354     # isn't a module object?
       
   355     #
       
   356     # XXX Accepts the not-a-module object, ignorning the object's type
       
   357     # This should raise an exception or the method name should be changed
       
   358     #
       
   359     # XXX Some people are relying on this, so keep it for now
       
   360     def test_loadTestsFromName__relative_not_a_module(self):
       
   361         class MyTestCase(unittest.TestCase):
       
   362             def test(self):
       
   363                 pass
       
   364 
       
   365         class NotAModule(object):
       
   366             test_2 = MyTestCase
       
   367 
       
   368         loader = unittest.TestLoader()
       
   369         suite = loader.loadTestsFromName('test_2', NotAModule)
       
   370 
       
   371         reference = [MyTestCase('test')]
       
   372         self.assertEqual(list(suite), reference)
       
   373 
       
   374     # "The specifier name is a ``dotted name'' that may resolve either to
       
   375     # a module, a test case class, a TestSuite instance, a test method
       
   376     # within a test case class, or a callable object which returns a
       
   377     # TestCase or TestSuite instance."
       
   378     #
       
   379     # Does it raise an exception if the name resolves to an invalid
       
   380     # object?
       
   381     def test_loadTestsFromName__relative_bad_object(self):
       
   382         m = types.ModuleType('m')
       
   383         m.testcase_1 = object()
       
   384 
       
   385         loader = unittest.TestLoader()
       
   386         try:
       
   387             loader.loadTestsFromName('testcase_1', m)
       
   388         except TypeError:
       
   389             pass
       
   390         else:
       
   391             self.fail("Should have raised TypeError")
       
   392 
       
   393     # "The specifier name is a ``dotted name'' that may
       
   394     # resolve either to ... a test case class"
       
   395     def test_loadTestsFromName__relative_TestCase_subclass(self):
       
   396         m = types.ModuleType('m')
       
   397         class MyTestCase(unittest.TestCase):
       
   398             def test(self):
       
   399                 pass
       
   400         m.testcase_1 = MyTestCase
       
   401 
       
   402         loader = unittest.TestLoader()
       
   403         suite = loader.loadTestsFromName('testcase_1', m)
       
   404         self.failUnless(isinstance(suite, loader.suiteClass))
       
   405         self.assertEqual(list(suite), [MyTestCase('test')])
       
   406 
       
   407     # "The specifier name is a ``dotted name'' that may resolve either to
       
   408     # a module, a test case class, a TestSuite instance, a test method
       
   409     # within a test case class, or a callable object which returns a
       
   410     # TestCase or TestSuite instance."
       
   411     def test_loadTestsFromName__relative_TestSuite(self):
       
   412         m = types.ModuleType('m')
       
   413         class MyTestCase(unittest.TestCase):
       
   414             def test(self):
       
   415                 pass
       
   416         m.testsuite = unittest.TestSuite([MyTestCase('test')])
       
   417 
       
   418         loader = unittest.TestLoader()
       
   419         suite = loader.loadTestsFromName('testsuite', m)
       
   420         self.failUnless(isinstance(suite, loader.suiteClass))
       
   421 
       
   422         self.assertEqual(list(suite), [MyTestCase('test')])
       
   423 
       
   424     # "The specifier name is a ``dotted name'' that may resolve ... to
       
   425     # ... a test method within a test case class"
       
   426     def test_loadTestsFromName__relative_testmethod(self):
       
   427         m = types.ModuleType('m')
       
   428         class MyTestCase(unittest.TestCase):
       
   429             def test(self):
       
   430                 pass
       
   431         m.testcase_1 = MyTestCase
       
   432 
       
   433         loader = unittest.TestLoader()
       
   434         suite = loader.loadTestsFromName('testcase_1.test', m)
       
   435         self.failUnless(isinstance(suite, loader.suiteClass))
       
   436 
       
   437         self.assertEqual(list(suite), [MyTestCase('test')])
       
   438 
       
   439     # "The specifier name is a ``dotted name'' that may resolve either to
       
   440     # a module, a test case class, a TestSuite instance, a test method
       
   441     # within a test case class, or a callable object which returns a
       
   442     # TestCase or TestSuite instance."
       
   443     #
       
   444     # Does loadTestsFromName() raise the proper exception when trying to
       
   445     # resolve "a test method within a test case class" that doesn't exist
       
   446     # for the given name (relative to a provided module)?
       
   447     def test_loadTestsFromName__relative_invalid_testmethod(self):
       
   448         m = types.ModuleType('m')
       
   449         class MyTestCase(unittest.TestCase):
       
   450             def test(self):
       
   451                 pass
       
   452         m.testcase_1 = MyTestCase
       
   453 
       
   454         loader = unittest.TestLoader()
       
   455         try:
       
   456             loader.loadTestsFromName('testcase_1.testfoo', m)
       
   457         except AttributeError, e:
       
   458             self.assertEqual(str(e), "type object 'MyTestCase' has no attribute 'testfoo'")
       
   459         else:
       
   460             self.fail("Failed to raise AttributeError")
       
   461 
       
   462     # "The specifier name is a ``dotted name'' that may resolve ... to
       
   463     # ... a callable object which returns a ... TestSuite instance"
       
   464     def test_loadTestsFromName__callable__TestSuite(self):
       
   465         m = types.ModuleType('m')
       
   466         testcase_1 = unittest.FunctionTestCase(lambda: None)
       
   467         testcase_2 = unittest.FunctionTestCase(lambda: None)
       
   468         def return_TestSuite():
       
   469             return unittest.TestSuite([testcase_1, testcase_2])
       
   470         m.return_TestSuite = return_TestSuite
       
   471 
       
   472         loader = unittest.TestLoader()
       
   473         suite = loader.loadTestsFromName('return_TestSuite', m)
       
   474         self.failUnless(isinstance(suite, loader.suiteClass))
       
   475         self.assertEqual(list(suite), [testcase_1, testcase_2])
       
   476 
       
   477     # "The specifier name is a ``dotted name'' that may resolve ... to
       
   478     # ... a callable object which returns a TestCase ... instance"
       
   479     def test_loadTestsFromName__callable__TestCase_instance(self):
       
   480         m = types.ModuleType('m')
       
   481         testcase_1 = unittest.FunctionTestCase(lambda: None)
       
   482         def return_TestCase():
       
   483             return testcase_1
       
   484         m.return_TestCase = return_TestCase
       
   485 
       
   486         loader = unittest.TestLoader()
       
   487         suite = loader.loadTestsFromName('return_TestCase', m)
       
   488         self.failUnless(isinstance(suite, loader.suiteClass))
       
   489         self.assertEqual(list(suite), [testcase_1])
       
   490 
       
   491     # "The specifier name is a ``dotted name'' that may resolve ... to
       
   492     # ... a callable object which returns a TestCase or TestSuite instance"
       
   493     #
       
   494     # What happens if the callable returns something else?
       
   495     def test_loadTestsFromName__callable__wrong_type(self):
       
   496         m = types.ModuleType('m')
       
   497         def return_wrong():
       
   498             return 6
       
   499         m.return_wrong = return_wrong
       
   500 
       
   501         loader = unittest.TestLoader()
       
   502         try:
       
   503             suite = loader.loadTestsFromName('return_wrong', m)
       
   504         except TypeError:
       
   505             pass
       
   506         else:
       
   507             self.fail("TestLoader.loadTestsFromName failed to raise TypeError")
       
   508 
       
   509     # "The specifier can refer to modules and packages which have not been
       
   510     # imported; they will be imported as a side-effect"
       
   511     def test_loadTestsFromName__module_not_loaded(self):
       
   512         # We're going to try to load this module as a side-effect, so it
       
   513         # better not be loaded before we try.
       
   514         #
       
   515         # Why pick audioop? Google shows it isn't used very often, so there's
       
   516         # a good chance that it won't be imported when this test is run
       
   517         module_name = 'audioop'
       
   518 
       
   519         import sys
       
   520         if module_name in sys.modules:
       
   521             del sys.modules[module_name]
       
   522 
       
   523         loader = unittest.TestLoader()
       
   524         try:
       
   525             suite = loader.loadTestsFromName(module_name)
       
   526 
       
   527             self.failUnless(isinstance(suite, loader.suiteClass))
       
   528             self.assertEqual(list(suite), [])
       
   529 
       
   530             # audioop should now be loaded, thanks to loadTestsFromName()
       
   531             self.failUnless(module_name in sys.modules)
       
   532         finally:
       
   533             if module_name in sys.modules:
       
   534                 del sys.modules[module_name]
       
   535 
       
   536     ################################################################
       
   537     ### Tests for TestLoader.loadTestsFromName()
       
   538 
       
   539     ### Tests for TestLoader.loadTestsFromNames()
       
   540     ################################################################
       
   541 
       
   542     # "Similar to loadTestsFromName(), but takes a sequence of names rather
       
   543     # than a single name."
       
   544     #
       
   545     # What happens if that sequence of names is empty?
       
   546     def test_loadTestsFromNames__empty_name_list(self):
       
   547         loader = unittest.TestLoader()
       
   548 
       
   549         suite = loader.loadTestsFromNames([])
       
   550         self.failUnless(isinstance(suite, loader.suiteClass))
       
   551         self.assertEqual(list(suite), [])
       
   552 
       
   553     # "Similar to loadTestsFromName(), but takes a sequence of names rather
       
   554     # than a single name."
       
   555     # ...
       
   556     # "The method optionally resolves name relative to the given module"
       
   557     #
       
   558     # What happens if that sequence of names is empty?
       
   559     #
       
   560     # XXX Should this raise a ValueError or just return an empty TestSuite?
       
   561     def test_loadTestsFromNames__relative_empty_name_list(self):
       
   562         loader = unittest.TestLoader()
       
   563 
       
   564         suite = loader.loadTestsFromNames([], unittest)
       
   565         self.failUnless(isinstance(suite, loader.suiteClass))
       
   566         self.assertEqual(list(suite), [])
       
   567 
       
   568     # "The specifier name is a ``dotted name'' that may resolve either to
       
   569     # a module, a test case class, a TestSuite instance, a test method
       
   570     # within a test case class, or a callable object which returns a
       
   571     # TestCase or TestSuite instance."
       
   572     #
       
   573     # Is ValueError raised in response to an empty name?
       
   574     def test_loadTestsFromNames__empty_name(self):
       
   575         loader = unittest.TestLoader()
       
   576 
       
   577         try:
       
   578             loader.loadTestsFromNames([''])
       
   579         except ValueError, e:
       
   580             self.assertEqual(str(e), "Empty module name")
       
   581         else:
       
   582             self.fail("TestLoader.loadTestsFromNames failed to raise ValueError")
       
   583 
       
   584     # "The specifier name is a ``dotted name'' that may resolve either to
       
   585     # a module, a test case class, a TestSuite instance, a test method
       
   586     # within a test case class, or a callable object which returns a
       
   587     # TestCase or TestSuite instance."
       
   588     #
       
   589     # What happens when presented with an impossible module name?
       
   590     def test_loadTestsFromNames__malformed_name(self):
       
   591         loader = unittest.TestLoader()
       
   592 
       
   593         # XXX Should this raise ValueError or ImportError?
       
   594         try:
       
   595             loader.loadTestsFromNames(['abc () //'])
       
   596         except ValueError:
       
   597             pass
       
   598         except ImportError:
       
   599             pass
       
   600         else:
       
   601             self.fail("TestLoader.loadTestsFromNames failed to raise ValueError")
       
   602 
       
   603     # "The specifier name is a ``dotted name'' that may resolve either to
       
   604     # a module, a test case class, a TestSuite instance, a test method
       
   605     # within a test case class, or a callable object which returns a
       
   606     # TestCase or TestSuite instance."
       
   607     #
       
   608     # What happens when no module can be found for the given name?
       
   609     def test_loadTestsFromNames__unknown_module_name(self):
       
   610         loader = unittest.TestLoader()
       
   611 
       
   612         try:
       
   613             loader.loadTestsFromNames(['sdasfasfasdf'])
       
   614         except ImportError, e:
       
   615             self.assertEqual(str(e), "No module named sdasfasfasdf")
       
   616         else:
       
   617             self.fail("TestLoader.loadTestsFromNames failed to raise ImportError")
       
   618 
       
   619     # "The specifier name is a ``dotted name'' that may resolve either to
       
   620     # a module, a test case class, a TestSuite instance, a test method
       
   621     # within a test case class, or a callable object which returns a
       
   622     # TestCase or TestSuite instance."
       
   623     #
       
   624     # What happens when the module can be found, but not the attribute?
       
   625     def test_loadTestsFromNames__unknown_attr_name(self):
       
   626         loader = unittest.TestLoader()
       
   627 
       
   628         try:
       
   629             loader.loadTestsFromNames(['unittest.sdasfasfasdf', 'unittest'])
       
   630         except AttributeError, e:
       
   631             self.assertEqual(str(e), "'module' object has no attribute 'sdasfasfasdf'")
       
   632         else:
       
   633             self.fail("TestLoader.loadTestsFromNames failed to raise AttributeError")
       
   634 
       
   635     # "The specifier name is a ``dotted name'' that may resolve either to
       
   636     # a module, a test case class, a TestSuite instance, a test method
       
   637     # within a test case class, or a callable object which returns a
       
   638     # TestCase or TestSuite instance."
       
   639     # ...
       
   640     # "The method optionally resolves name relative to the given module"
       
   641     #
       
   642     # What happens when given an unknown attribute on a specified `module`
       
   643     # argument?
       
   644     def test_loadTestsFromNames__unknown_name_relative_1(self):
       
   645         loader = unittest.TestLoader()
       
   646 
       
   647         try:
       
   648             loader.loadTestsFromNames(['sdasfasfasdf'], unittest)
       
   649         except AttributeError, e:
       
   650             self.assertEqual(str(e), "'module' object has no attribute 'sdasfasfasdf'")
       
   651         else:
       
   652             self.fail("TestLoader.loadTestsFromName failed to raise AttributeError")
       
   653 
       
   654     # "The specifier name is a ``dotted name'' that may resolve either to
       
   655     # a module, a test case class, a TestSuite instance, a test method
       
   656     # within a test case class, or a callable object which returns a
       
   657     # TestCase or TestSuite instance."
       
   658     # ...
       
   659     # "The method optionally resolves name relative to the given module"
       
   660     #
       
   661     # Do unknown attributes (relative to a provided module) still raise an
       
   662     # exception even in the presence of valid attribute names?
       
   663     def test_loadTestsFromNames__unknown_name_relative_2(self):
       
   664         loader = unittest.TestLoader()
       
   665 
       
   666         try:
       
   667             loader.loadTestsFromNames(['TestCase', 'sdasfasfasdf'], unittest)
       
   668         except AttributeError, e:
       
   669             self.assertEqual(str(e), "'module' object has no attribute 'sdasfasfasdf'")
       
   670         else:
       
   671             self.fail("TestLoader.loadTestsFromName failed to raise AttributeError")
       
   672 
       
   673     # "The specifier name is a ``dotted name'' that may resolve either to
       
   674     # a module, a test case class, a TestSuite instance, a test method
       
   675     # within a test case class, or a callable object which returns a
       
   676     # TestCase or TestSuite instance."
       
   677     # ...
       
   678     # "The method optionally resolves name relative to the given module"
       
   679     #
       
   680     # What happens when faced with the empty string?
       
   681     #
       
   682     # XXX This currently raises AttributeError, though ValueError is probably
       
   683     # more appropriate
       
   684     def test_loadTestsFromNames__relative_empty_name(self):
       
   685         loader = unittest.TestLoader()
       
   686 
       
   687         try:
       
   688             loader.loadTestsFromNames([''], unittest)
       
   689         except AttributeError:
       
   690             pass
       
   691         else:
       
   692             self.fail("Failed to raise ValueError")
       
   693 
       
   694     # "The specifier name is a ``dotted name'' that may resolve either to
       
   695     # a module, a test case class, a TestSuite instance, a test method
       
   696     # within a test case class, or a callable object which returns a
       
   697     # TestCase or TestSuite instance."
       
   698     # ...
       
   699     # "The method optionally resolves name relative to the given module"
       
   700     #
       
   701     # What happens when presented with an impossible attribute name?
       
   702     def test_loadTestsFromNames__relative_malformed_name(self):
       
   703         loader = unittest.TestLoader()
       
   704 
       
   705         # XXX Should this raise AttributeError or ValueError?
       
   706         try:
       
   707             loader.loadTestsFromNames(['abc () //'], unittest)
       
   708         except AttributeError:
       
   709             pass
       
   710         except ValueError:
       
   711             pass
       
   712         else:
       
   713             self.fail("TestLoader.loadTestsFromNames failed to raise ValueError")
       
   714 
       
   715     # "The method optionally resolves name relative to the given module"
       
   716     #
       
   717     # Does loadTestsFromNames() make sure the provided `module` is in fact
       
   718     # a module?
       
   719     #
       
   720     # XXX This validation is currently not done. This flexibility should
       
   721     # either be documented or a TypeError should be raised.
       
   722     def test_loadTestsFromNames__relative_not_a_module(self):
       
   723         class MyTestCase(unittest.TestCase):
       
   724             def test(self):
       
   725                 pass
       
   726 
       
   727         class NotAModule(object):
       
   728             test_2 = MyTestCase
       
   729 
       
   730         loader = unittest.TestLoader()
       
   731         suite = loader.loadTestsFromNames(['test_2'], NotAModule)
       
   732 
       
   733         reference = [unittest.TestSuite([MyTestCase('test')])]
       
   734         self.assertEqual(list(suite), reference)
       
   735 
       
   736     # "The specifier name is a ``dotted name'' that may resolve either to
       
   737     # a module, a test case class, a TestSuite instance, a test method
       
   738     # within a test case class, or a callable object which returns a
       
   739     # TestCase or TestSuite instance."
       
   740     #
       
   741     # Does it raise an exception if the name resolves to an invalid
       
   742     # object?
       
   743     def test_loadTestsFromNames__relative_bad_object(self):
       
   744         m = types.ModuleType('m')
       
   745         m.testcase_1 = object()
       
   746 
       
   747         loader = unittest.TestLoader()
       
   748         try:
       
   749             loader.loadTestsFromNames(['testcase_1'], m)
       
   750         except TypeError:
       
   751             pass
       
   752         else:
       
   753             self.fail("Should have raised TypeError")
       
   754 
       
   755     # "The specifier name is a ``dotted name'' that may resolve ... to
       
   756     # ... a test case class"
       
   757     def test_loadTestsFromNames__relative_TestCase_subclass(self):
       
   758         m = types.ModuleType('m')
       
   759         class MyTestCase(unittest.TestCase):
       
   760             def test(self):
       
   761                 pass
       
   762         m.testcase_1 = MyTestCase
       
   763 
       
   764         loader = unittest.TestLoader()
       
   765         suite = loader.loadTestsFromNames(['testcase_1'], m)
       
   766         self.failUnless(isinstance(suite, loader.suiteClass))
       
   767 
       
   768         expected = loader.suiteClass([MyTestCase('test')])
       
   769         self.assertEqual(list(suite), [expected])
       
   770 
       
   771     # "The specifier name is a ``dotted name'' that may resolve ... to
       
   772     # ... a TestSuite instance"
       
   773     def test_loadTestsFromNames__relative_TestSuite(self):
       
   774         m = types.ModuleType('m')
       
   775         class MyTestCase(unittest.TestCase):
       
   776             def test(self):
       
   777                 pass
       
   778         m.testsuite = unittest.TestSuite([MyTestCase('test')])
       
   779 
       
   780         loader = unittest.TestLoader()
       
   781         suite = loader.loadTestsFromNames(['testsuite'], m)
       
   782         self.failUnless(isinstance(suite, loader.suiteClass))
       
   783 
       
   784         self.assertEqual(list(suite), [m.testsuite])
       
   785 
       
   786     # "The specifier name is a ``dotted name'' that may resolve ... to ... a
       
   787     # test method within a test case class"
       
   788     def test_loadTestsFromNames__relative_testmethod(self):
       
   789         m = types.ModuleType('m')
       
   790         class MyTestCase(unittest.TestCase):
       
   791             def test(self):
       
   792                 pass
       
   793         m.testcase_1 = MyTestCase
       
   794 
       
   795         loader = unittest.TestLoader()
       
   796         suite = loader.loadTestsFromNames(['testcase_1.test'], m)
       
   797         self.failUnless(isinstance(suite, loader.suiteClass))
       
   798 
       
   799         ref_suite = unittest.TestSuite([MyTestCase('test')])
       
   800         self.assertEqual(list(suite), [ref_suite])
       
   801 
       
   802     # "The specifier name is a ``dotted name'' that may resolve ... to ... a
       
   803     # test method within a test case class"
       
   804     #
       
   805     # Does the method gracefully handle names that initially look like they
       
   806     # resolve to "a test method within a test case class" but don't?
       
   807     def test_loadTestsFromNames__relative_invalid_testmethod(self):
       
   808         m = types.ModuleType('m')
       
   809         class MyTestCase(unittest.TestCase):
       
   810             def test(self):
       
   811                 pass
       
   812         m.testcase_1 = MyTestCase
       
   813 
       
   814         loader = unittest.TestLoader()
       
   815         try:
       
   816             loader.loadTestsFromNames(['testcase_1.testfoo'], m)
       
   817         except AttributeError, e:
       
   818             self.assertEqual(str(e), "type object 'MyTestCase' has no attribute 'testfoo'")
       
   819         else:
       
   820             self.fail("Failed to raise AttributeError")
       
   821 
       
   822     # "The specifier name is a ``dotted name'' that may resolve ... to
       
   823     # ... a callable object which returns a ... TestSuite instance"
       
   824     def test_loadTestsFromNames__callable__TestSuite(self):
       
   825         m = types.ModuleType('m')
       
   826         testcase_1 = unittest.FunctionTestCase(lambda: None)
       
   827         testcase_2 = unittest.FunctionTestCase(lambda: None)
       
   828         def return_TestSuite():
       
   829             return unittest.TestSuite([testcase_1, testcase_2])
       
   830         m.return_TestSuite = return_TestSuite
       
   831 
       
   832         loader = unittest.TestLoader()
       
   833         suite = loader.loadTestsFromNames(['return_TestSuite'], m)
       
   834         self.failUnless(isinstance(suite, loader.suiteClass))
       
   835 
       
   836         expected = unittest.TestSuite([testcase_1, testcase_2])
       
   837         self.assertEqual(list(suite), [expected])
       
   838 
       
   839     # "The specifier name is a ``dotted name'' that may resolve ... to
       
   840     # ... a callable object which returns a TestCase ... instance"
       
   841     def test_loadTestsFromNames__callable__TestCase_instance(self):
       
   842         m = types.ModuleType('m')
       
   843         testcase_1 = unittest.FunctionTestCase(lambda: None)
       
   844         def return_TestCase():
       
   845             return testcase_1
       
   846         m.return_TestCase = return_TestCase
       
   847 
       
   848         loader = unittest.TestLoader()
       
   849         suite = loader.loadTestsFromNames(['return_TestCase'], m)
       
   850         self.failUnless(isinstance(suite, loader.suiteClass))
       
   851 
       
   852         ref_suite = unittest.TestSuite([testcase_1])
       
   853         self.assertEqual(list(suite), [ref_suite])
       
   854 
       
   855     # "The specifier name is a ``dotted name'' that may resolve ... to
       
   856     # ... a callable object which returns a TestCase or TestSuite instance"
       
   857     #
       
   858     # Are staticmethods handled correctly?
       
   859     def test_loadTestsFromNames__callable__call_staticmethod(self):
       
   860         m = types.ModuleType('m')
       
   861         class Test1(unittest.TestCase):
       
   862             def test(self):
       
   863                 pass
       
   864 
       
   865         testcase_1 = Test1('test')
       
   866         class Foo(unittest.TestCase):
       
   867             @staticmethod
       
   868             def foo():
       
   869                 return testcase_1
       
   870         m.Foo = Foo
       
   871 
       
   872         loader = unittest.TestLoader()
       
   873         suite = loader.loadTestsFromNames(['Foo.foo'], m)
       
   874         self.failUnless(isinstance(suite, loader.suiteClass))
       
   875 
       
   876         ref_suite = unittest.TestSuite([testcase_1])
       
   877         self.assertEqual(list(suite), [ref_suite])
       
   878 
       
   879     # "The specifier name is a ``dotted name'' that may resolve ... to
       
   880     # ... a callable object which returns a TestCase or TestSuite instance"
       
   881     #
       
   882     # What happens when the callable returns something else?
       
   883     def test_loadTestsFromNames__callable__wrong_type(self):
       
   884         m = types.ModuleType('m')
       
   885         def return_wrong():
       
   886             return 6
       
   887         m.return_wrong = return_wrong
       
   888 
       
   889         loader = unittest.TestLoader()
       
   890         try:
       
   891             suite = loader.loadTestsFromNames(['return_wrong'], m)
       
   892         except TypeError:
       
   893             pass
       
   894         else:
       
   895             self.fail("TestLoader.loadTestsFromNames failed to raise TypeError")
       
   896 
       
   897     # "The specifier can refer to modules and packages which have not been
       
   898     # imported; they will be imported as a side-effect"
       
   899     def test_loadTestsFromNames__module_not_loaded(self):
       
   900         # We're going to try to load this module as a side-effect, so it
       
   901         # better not be loaded before we try.
       
   902         #
       
   903         # Why pick audioop? Google shows it isn't used very often, so there's
       
   904         # a good chance that it won't be imported when this test is run
       
   905         module_name = 'audioop'
       
   906 
       
   907         import sys
       
   908         if module_name in sys.modules:
       
   909             del sys.modules[module_name]
       
   910 
       
   911         loader = unittest.TestLoader()
       
   912         try:
       
   913             suite = loader.loadTestsFromNames([module_name])
       
   914 
       
   915             self.failUnless(isinstance(suite, loader.suiteClass))
       
   916             self.assertEqual(list(suite), [unittest.TestSuite()])
       
   917 
       
   918             # audioop should now be loaded, thanks to loadTestsFromName()
       
   919             self.failUnless(module_name in sys.modules)
       
   920         finally:
       
   921             if module_name in sys.modules:
       
   922                 del sys.modules[module_name]
       
   923 
       
   924     ################################################################
       
   925     ### /Tests for TestLoader.loadTestsFromNames()
       
   926 
       
   927     ### Tests for TestLoader.getTestCaseNames()
       
   928     ################################################################
       
   929 
       
   930     # "Return a sorted sequence of method names found within testCaseClass"
       
   931     #
       
   932     # Test.foobar is defined to make sure getTestCaseNames() respects
       
   933     # loader.testMethodPrefix
       
   934     def test_getTestCaseNames(self):
       
   935         class Test(unittest.TestCase):
       
   936             def test_1(self): pass
       
   937             def test_2(self): pass
       
   938             def foobar(self): pass
       
   939 
       
   940         loader = unittest.TestLoader()
       
   941 
       
   942         self.assertEqual(loader.getTestCaseNames(Test), ['test_1', 'test_2'])
       
   943 
       
   944     # "Return a sorted sequence of method names found within testCaseClass"
       
   945     #
       
   946     # Does getTestCaseNames() behave appropriately if no tests are found?
       
   947     def test_getTestCaseNames__no_tests(self):
       
   948         class Test(unittest.TestCase):
       
   949             def foobar(self): pass
       
   950 
       
   951         loader = unittest.TestLoader()
       
   952 
       
   953         self.assertEqual(loader.getTestCaseNames(Test), [])
       
   954 
       
   955     # "Return a sorted sequence of method names found within testCaseClass"
       
   956     #
       
   957     # Are not-TestCases handled gracefully?
       
   958     #
       
   959     # XXX This should raise a TypeError, not return a list
       
   960     #
       
   961     # XXX It's too late in the 2.5 release cycle to fix this, but it should
       
   962     # probably be revisited for 2.6
       
   963     def test_getTestCaseNames__not_a_TestCase(self):
       
   964         class BadCase(int):
       
   965             def test_foo(self):
       
   966                 pass
       
   967 
       
   968         loader = unittest.TestLoader()
       
   969         names = loader.getTestCaseNames(BadCase)
       
   970 
       
   971         self.assertEqual(names, ['test_foo'])
       
   972 
       
   973     # "Return a sorted sequence of method names found within testCaseClass"
       
   974     #
       
   975     # Make sure inherited names are handled.
       
   976     #
       
   977     # TestP.foobar is defined to make sure getTestCaseNames() respects
       
   978     # loader.testMethodPrefix
       
   979     def test_getTestCaseNames__inheritance(self):
       
   980         class TestP(unittest.TestCase):
       
   981             def test_1(self): pass
       
   982             def test_2(self): pass
       
   983             def foobar(self): pass
       
   984 
       
   985         class TestC(TestP):
       
   986             def test_1(self): pass
       
   987             def test_3(self): pass
       
   988 
       
   989         loader = unittest.TestLoader()
       
   990 
       
   991         names = ['test_1', 'test_2', 'test_3']
       
   992         self.assertEqual(loader.getTestCaseNames(TestC), names)
       
   993 
       
   994     ################################################################
       
   995     ### /Tests for TestLoader.getTestCaseNames()
       
   996 
       
   997     ### Tests for TestLoader.testMethodPrefix
       
   998     ################################################################
       
   999 
       
  1000     # "String giving the prefix of method names which will be interpreted as
       
  1001     # test methods"
       
  1002     #
       
  1003     # Implicit in the documentation is that testMethodPrefix is respected by
       
  1004     # all loadTestsFrom* methods.
       
  1005     def test_testMethodPrefix__loadTestsFromTestCase(self):
       
  1006         class Foo(unittest.TestCase):
       
  1007             def test_1(self): pass
       
  1008             def test_2(self): pass
       
  1009             def foo_bar(self): pass
       
  1010 
       
  1011         tests_1 = unittest.TestSuite([Foo('foo_bar')])
       
  1012         tests_2 = unittest.TestSuite([Foo('test_1'), Foo('test_2')])
       
  1013 
       
  1014         loader = unittest.TestLoader()
       
  1015         loader.testMethodPrefix = 'foo'
       
  1016         self.assertEqual(loader.loadTestsFromTestCase(Foo), tests_1)
       
  1017 
       
  1018         loader.testMethodPrefix = 'test'
       
  1019         self.assertEqual(loader.loadTestsFromTestCase(Foo), tests_2)
       
  1020 
       
  1021     # "String giving the prefix of method names which will be interpreted as
       
  1022     # test methods"
       
  1023     #
       
  1024     # Implicit in the documentation is that testMethodPrefix is respected by
       
  1025     # all loadTestsFrom* methods.
       
  1026     def test_testMethodPrefix__loadTestsFromModule(self):
       
  1027         m = types.ModuleType('m')
       
  1028         class Foo(unittest.TestCase):
       
  1029             def test_1(self): pass
       
  1030             def test_2(self): pass
       
  1031             def foo_bar(self): pass
       
  1032         m.Foo = Foo
       
  1033 
       
  1034         tests_1 = [unittest.TestSuite([Foo('foo_bar')])]
       
  1035         tests_2 = [unittest.TestSuite([Foo('test_1'), Foo('test_2')])]
       
  1036 
       
  1037         loader = unittest.TestLoader()
       
  1038         loader.testMethodPrefix = 'foo'
       
  1039         self.assertEqual(list(loader.loadTestsFromModule(m)), tests_1)
       
  1040 
       
  1041         loader.testMethodPrefix = 'test'
       
  1042         self.assertEqual(list(loader.loadTestsFromModule(m)), tests_2)
       
  1043 
       
  1044     # "String giving the prefix of method names which will be interpreted as
       
  1045     # test methods"
       
  1046     #
       
  1047     # Implicit in the documentation is that testMethodPrefix is respected by
       
  1048     # all loadTestsFrom* methods.
       
  1049     def test_testMethodPrefix__loadTestsFromName(self):
       
  1050         m = types.ModuleType('m')
       
  1051         class Foo(unittest.TestCase):
       
  1052             def test_1(self): pass
       
  1053             def test_2(self): pass
       
  1054             def foo_bar(self): pass
       
  1055         m.Foo = Foo
       
  1056 
       
  1057         tests_1 = unittest.TestSuite([Foo('foo_bar')])
       
  1058         tests_2 = unittest.TestSuite([Foo('test_1'), Foo('test_2')])
       
  1059 
       
  1060         loader = unittest.TestLoader()
       
  1061         loader.testMethodPrefix = 'foo'
       
  1062         self.assertEqual(loader.loadTestsFromName('Foo', m), tests_1)
       
  1063 
       
  1064         loader.testMethodPrefix = 'test'
       
  1065         self.assertEqual(loader.loadTestsFromName('Foo', m), tests_2)
       
  1066 
       
  1067     # "String giving the prefix of method names which will be interpreted as
       
  1068     # test methods"
       
  1069     #
       
  1070     # Implicit in the documentation is that testMethodPrefix is respected by
       
  1071     # all loadTestsFrom* methods.
       
  1072     def test_testMethodPrefix__loadTestsFromNames(self):
       
  1073         m = types.ModuleType('m')
       
  1074         class Foo(unittest.TestCase):
       
  1075             def test_1(self): pass
       
  1076             def test_2(self): pass
       
  1077             def foo_bar(self): pass
       
  1078         m.Foo = Foo
       
  1079 
       
  1080         tests_1 = unittest.TestSuite([unittest.TestSuite([Foo('foo_bar')])])
       
  1081         tests_2 = unittest.TestSuite([Foo('test_1'), Foo('test_2')])
       
  1082         tests_2 = unittest.TestSuite([tests_2])
       
  1083 
       
  1084         loader = unittest.TestLoader()
       
  1085         loader.testMethodPrefix = 'foo'
       
  1086         self.assertEqual(loader.loadTestsFromNames(['Foo'], m), tests_1)
       
  1087 
       
  1088         loader.testMethodPrefix = 'test'
       
  1089         self.assertEqual(loader.loadTestsFromNames(['Foo'], m), tests_2)
       
  1090 
       
  1091     # "The default value is 'test'"
       
  1092     def test_testMethodPrefix__default_value(self):
       
  1093         loader = unittest.TestLoader()
       
  1094         self.failUnless(loader.testMethodPrefix == 'test')
       
  1095 
       
  1096     ################################################################
       
  1097     ### /Tests for TestLoader.testMethodPrefix
       
  1098 
       
  1099     ### Tests for TestLoader.sortTestMethodsUsing
       
  1100     ################################################################
       
  1101 
       
  1102     # "Function to be used to compare method names when sorting them in
       
  1103     # getTestCaseNames() and all the loadTestsFromX() methods"
       
  1104     def test_sortTestMethodsUsing__loadTestsFromTestCase(self):
       
  1105         def reversed_cmp(x, y):
       
  1106             return -cmp(x, y)
       
  1107 
       
  1108         class Foo(unittest.TestCase):
       
  1109             def test_1(self): pass
       
  1110             def test_2(self): pass
       
  1111 
       
  1112         loader = unittest.TestLoader()
       
  1113         loader.sortTestMethodsUsing = reversed_cmp
       
  1114 
       
  1115         tests = loader.suiteClass([Foo('test_2'), Foo('test_1')])
       
  1116         self.assertEqual(loader.loadTestsFromTestCase(Foo), tests)
       
  1117 
       
  1118     # "Function to be used to compare method names when sorting them in
       
  1119     # getTestCaseNames() and all the loadTestsFromX() methods"
       
  1120     def test_sortTestMethodsUsing__loadTestsFromModule(self):
       
  1121         def reversed_cmp(x, y):
       
  1122             return -cmp(x, y)
       
  1123 
       
  1124         m = types.ModuleType('m')
       
  1125         class Foo(unittest.TestCase):
       
  1126             def test_1(self): pass
       
  1127             def test_2(self): pass
       
  1128         m.Foo = Foo
       
  1129 
       
  1130         loader = unittest.TestLoader()
       
  1131         loader.sortTestMethodsUsing = reversed_cmp
       
  1132 
       
  1133         tests = [loader.suiteClass([Foo('test_2'), Foo('test_1')])]
       
  1134         self.assertEqual(list(loader.loadTestsFromModule(m)), tests)
       
  1135 
       
  1136     # "Function to be used to compare method names when sorting them in
       
  1137     # getTestCaseNames() and all the loadTestsFromX() methods"
       
  1138     def test_sortTestMethodsUsing__loadTestsFromName(self):
       
  1139         def reversed_cmp(x, y):
       
  1140             return -cmp(x, y)
       
  1141 
       
  1142         m = types.ModuleType('m')
       
  1143         class Foo(unittest.TestCase):
       
  1144             def test_1(self): pass
       
  1145             def test_2(self): pass
       
  1146         m.Foo = Foo
       
  1147 
       
  1148         loader = unittest.TestLoader()
       
  1149         loader.sortTestMethodsUsing = reversed_cmp
       
  1150 
       
  1151         tests = loader.suiteClass([Foo('test_2'), Foo('test_1')])
       
  1152         self.assertEqual(loader.loadTestsFromName('Foo', m), tests)
       
  1153 
       
  1154     # "Function to be used to compare method names when sorting them in
       
  1155     # getTestCaseNames() and all the loadTestsFromX() methods"
       
  1156     def test_sortTestMethodsUsing__loadTestsFromNames(self):
       
  1157         def reversed_cmp(x, y):
       
  1158             return -cmp(x, y)
       
  1159 
       
  1160         m = types.ModuleType('m')
       
  1161         class Foo(unittest.TestCase):
       
  1162             def test_1(self): pass
       
  1163             def test_2(self): pass
       
  1164         m.Foo = Foo
       
  1165 
       
  1166         loader = unittest.TestLoader()
       
  1167         loader.sortTestMethodsUsing = reversed_cmp
       
  1168 
       
  1169         tests = [loader.suiteClass([Foo('test_2'), Foo('test_1')])]
       
  1170         self.assertEqual(list(loader.loadTestsFromNames(['Foo'], m)), tests)
       
  1171 
       
  1172     # "Function to be used to compare method names when sorting them in
       
  1173     # getTestCaseNames()"
       
  1174     #
       
  1175     # Does it actually affect getTestCaseNames()?
       
  1176     def test_sortTestMethodsUsing__getTestCaseNames(self):
       
  1177         def reversed_cmp(x, y):
       
  1178             return -cmp(x, y)
       
  1179 
       
  1180         class Foo(unittest.TestCase):
       
  1181             def test_1(self): pass
       
  1182             def test_2(self): pass
       
  1183 
       
  1184         loader = unittest.TestLoader()
       
  1185         loader.sortTestMethodsUsing = reversed_cmp
       
  1186 
       
  1187         test_names = ['test_2', 'test_1']
       
  1188         self.assertEqual(loader.getTestCaseNames(Foo), test_names)
       
  1189 
       
  1190     # "The default value is the built-in cmp() function"
       
  1191     def test_sortTestMethodsUsing__default_value(self):
       
  1192         loader = unittest.TestLoader()
       
  1193         self.failUnless(loader.sortTestMethodsUsing is cmp)
       
  1194 
       
  1195     # "it can be set to None to disable the sort."
       
  1196     #
       
  1197     # XXX How is this different from reassigning cmp? Are the tests returned
       
  1198     # in a random order or something? This behaviour should die
       
  1199     def test_sortTestMethodsUsing__None(self):
       
  1200         class Foo(unittest.TestCase):
       
  1201             def test_1(self): pass
       
  1202             def test_2(self): pass
       
  1203 
       
  1204         loader = unittest.TestLoader()
       
  1205         loader.sortTestMethodsUsing = None
       
  1206 
       
  1207         test_names = ['test_2', 'test_1']
       
  1208         self.assertEqual(set(loader.getTestCaseNames(Foo)), set(test_names))
       
  1209 
       
  1210     ################################################################
       
  1211     ### /Tests for TestLoader.sortTestMethodsUsing
       
  1212 
       
  1213     ### Tests for TestLoader.suiteClass
       
  1214     ################################################################
       
  1215 
       
  1216     # "Callable object that constructs a test suite from a list of tests."
       
  1217     def test_suiteClass__loadTestsFromTestCase(self):
       
  1218         class Foo(unittest.TestCase):
       
  1219             def test_1(self): pass
       
  1220             def test_2(self): pass
       
  1221             def foo_bar(self): pass
       
  1222 
       
  1223         tests = [Foo('test_1'), Foo('test_2')]
       
  1224 
       
  1225         loader = unittest.TestLoader()
       
  1226         loader.suiteClass = list
       
  1227         self.assertEqual(loader.loadTestsFromTestCase(Foo), tests)
       
  1228 
       
  1229     # It is implicit in the documentation for TestLoader.suiteClass that
       
  1230     # all TestLoader.loadTestsFrom* methods respect it. Let's make sure
       
  1231     def test_suiteClass__loadTestsFromModule(self):
       
  1232         m = types.ModuleType('m')
       
  1233         class Foo(unittest.TestCase):
       
  1234             def test_1(self): pass
       
  1235             def test_2(self): pass
       
  1236             def foo_bar(self): pass
       
  1237         m.Foo = Foo
       
  1238 
       
  1239         tests = [[Foo('test_1'), Foo('test_2')]]
       
  1240 
       
  1241         loader = unittest.TestLoader()
       
  1242         loader.suiteClass = list
       
  1243         self.assertEqual(loader.loadTestsFromModule(m), tests)
       
  1244 
       
  1245     # It is implicit in the documentation for TestLoader.suiteClass that
       
  1246     # all TestLoader.loadTestsFrom* methods respect it. Let's make sure
       
  1247     def test_suiteClass__loadTestsFromName(self):
       
  1248         m = types.ModuleType('m')
       
  1249         class Foo(unittest.TestCase):
       
  1250             def test_1(self): pass
       
  1251             def test_2(self): pass
       
  1252             def foo_bar(self): pass
       
  1253         m.Foo = Foo
       
  1254 
       
  1255         tests = [Foo('test_1'), Foo('test_2')]
       
  1256 
       
  1257         loader = unittest.TestLoader()
       
  1258         loader.suiteClass = list
       
  1259         self.assertEqual(loader.loadTestsFromName('Foo', m), tests)
       
  1260 
       
  1261     # It is implicit in the documentation for TestLoader.suiteClass that
       
  1262     # all TestLoader.loadTestsFrom* methods respect it. Let's make sure
       
  1263     def test_suiteClass__loadTestsFromNames(self):
       
  1264         m = types.ModuleType('m')
       
  1265         class Foo(unittest.TestCase):
       
  1266             def test_1(self): pass
       
  1267             def test_2(self): pass
       
  1268             def foo_bar(self): pass
       
  1269         m.Foo = Foo
       
  1270 
       
  1271         tests = [[Foo('test_1'), Foo('test_2')]]
       
  1272 
       
  1273         loader = unittest.TestLoader()
       
  1274         loader.suiteClass = list
       
  1275         self.assertEqual(loader.loadTestsFromNames(['Foo'], m), tests)
       
  1276 
       
  1277     # "The default value is the TestSuite class"
       
  1278     def test_suiteClass__default_value(self):
       
  1279         loader = unittest.TestLoader()
       
  1280         self.failUnless(loader.suiteClass is unittest.TestSuite)
       
  1281 
       
  1282     ################################################################
       
  1283     ### /Tests for TestLoader.suiteClass
       
  1284 
       
  1285 ### Support code for Test_TestSuite
       
  1286 ################################################################
       
  1287 
       
  1288 class Foo(unittest.TestCase):
       
  1289     def test_1(self): pass
       
  1290     def test_2(self): pass
       
  1291     def test_3(self): pass
       
  1292     def runTest(self): pass
       
  1293 
       
  1294 def _mk_TestSuite(*names):
       
  1295     return unittest.TestSuite(Foo(n) for n in names)
       
  1296 
       
  1297 ################################################################
       
  1298 ### /Support code for Test_TestSuite
       
  1299 
       
  1300 class Test_TestSuite(TestCase, TestEquality):
       
  1301 
       
  1302     ### Set up attributes needed by inherited tests
       
  1303     ################################################################
       
  1304 
       
  1305     # Used by TestEquality.test_eq
       
  1306     eq_pairs = [(unittest.TestSuite(), unittest.TestSuite())
       
  1307                ,(unittest.TestSuite(), unittest.TestSuite([]))
       
  1308                ,(_mk_TestSuite('test_1'), _mk_TestSuite('test_1'))]
       
  1309 
       
  1310     # Used by TestEquality.test_ne
       
  1311     ne_pairs = [(unittest.TestSuite(), _mk_TestSuite('test_1'))
       
  1312                ,(unittest.TestSuite([]), _mk_TestSuite('test_1'))
       
  1313                ,(_mk_TestSuite('test_1', 'test_2'), _mk_TestSuite('test_1', 'test_3'))
       
  1314                ,(_mk_TestSuite('test_1'), _mk_TestSuite('test_2'))]
       
  1315 
       
  1316     ################################################################
       
  1317     ### /Set up attributes needed by inherited tests
       
  1318 
       
  1319     ### Tests for TestSuite.__init__
       
  1320     ################################################################
       
  1321 
       
  1322     # "class TestSuite([tests])"
       
  1323     #
       
  1324     # The tests iterable should be optional
       
  1325     def test_init__tests_optional(self):
       
  1326         suite = unittest.TestSuite()
       
  1327 
       
  1328         self.assertEqual(suite.countTestCases(), 0)
       
  1329 
       
  1330     # "class TestSuite([tests])"
       
  1331     # ...
       
  1332     # "If tests is given, it must be an iterable of individual test cases
       
  1333     # or other test suites that will be used to build the suite initially"
       
  1334     #
       
  1335     # TestSuite should deal with empty tests iterables by allowing the
       
  1336     # creation of an empty suite
       
  1337     def test_init__empty_tests(self):
       
  1338         suite = unittest.TestSuite([])
       
  1339 
       
  1340         self.assertEqual(suite.countTestCases(), 0)
       
  1341 
       
  1342     # "class TestSuite([tests])"
       
  1343     # ...
       
  1344     # "If tests is given, it must be an iterable of individual test cases
       
  1345     # or other test suites that will be used to build the suite initially"
       
  1346     #
       
  1347     # TestSuite should allow any iterable to provide tests
       
  1348     def test_init__tests_from_any_iterable(self):
       
  1349         def tests():
       
  1350             yield unittest.FunctionTestCase(lambda: None)
       
  1351             yield unittest.FunctionTestCase(lambda: None)
       
  1352 
       
  1353         suite_1 = unittest.TestSuite(tests())
       
  1354         self.assertEqual(suite_1.countTestCases(), 2)
       
  1355 
       
  1356         suite_2 = unittest.TestSuite(suite_1)
       
  1357         self.assertEqual(suite_2.countTestCases(), 2)
       
  1358 
       
  1359         suite_3 = unittest.TestSuite(set(suite_1))
       
  1360         self.assertEqual(suite_3.countTestCases(), 2)
       
  1361 
       
  1362     # "class TestSuite([tests])"
       
  1363     # ...
       
  1364     # "If tests is given, it must be an iterable of individual test cases
       
  1365     # or other test suites that will be used to build the suite initially"
       
  1366     #
       
  1367     # Does TestSuite() also allow other TestSuite() instances to be present
       
  1368     # in the tests iterable?
       
  1369     def test_init__TestSuite_instances_in_tests(self):
       
  1370         def tests():
       
  1371             ftc = unittest.FunctionTestCase(lambda: None)
       
  1372             yield unittest.TestSuite([ftc])
       
  1373             yield unittest.FunctionTestCase(lambda: None)
       
  1374 
       
  1375         suite = unittest.TestSuite(tests())
       
  1376         self.assertEqual(suite.countTestCases(), 2)
       
  1377 
       
  1378     ################################################################
       
  1379     ### /Tests for TestSuite.__init__
       
  1380 
       
  1381     # Container types should support the iter protocol
       
  1382     def test_iter(self):
       
  1383         test1 = unittest.FunctionTestCase(lambda: None)
       
  1384         test2 = unittest.FunctionTestCase(lambda: None)
       
  1385         suite = unittest.TestSuite((test1, test2))
       
  1386 
       
  1387         self.assertEqual(list(suite), [test1, test2])
       
  1388 
       
  1389     # "Return the number of tests represented by the this test object.
       
  1390     # ...this method is also implemented by the TestSuite class, which can
       
  1391     # return larger [greater than 1] values"
       
  1392     #
       
  1393     # Presumably an empty TestSuite returns 0?
       
  1394     def test_countTestCases_zero_simple(self):
       
  1395         suite = unittest.TestSuite()
       
  1396 
       
  1397         self.assertEqual(suite.countTestCases(), 0)
       
  1398 
       
  1399     # "Return the number of tests represented by the this test object.
       
  1400     # ...this method is also implemented by the TestSuite class, which can
       
  1401     # return larger [greater than 1] values"
       
  1402     #
       
  1403     # Presumably an empty TestSuite (even if it contains other empty
       
  1404     # TestSuite instances) returns 0?
       
  1405     def test_countTestCases_zero_nested(self):
       
  1406         class Test1(unittest.TestCase):
       
  1407             def test(self):
       
  1408                 pass
       
  1409 
       
  1410         suite = unittest.TestSuite([unittest.TestSuite()])
       
  1411 
       
  1412         self.assertEqual(suite.countTestCases(), 0)
       
  1413 
       
  1414     # "Return the number of tests represented by the this test object.
       
  1415     # ...this method is also implemented by the TestSuite class, which can
       
  1416     # return larger [greater than 1] values"
       
  1417     def test_countTestCases_simple(self):
       
  1418         test1 = unittest.FunctionTestCase(lambda: None)
       
  1419         test2 = unittest.FunctionTestCase(lambda: None)
       
  1420         suite = unittest.TestSuite((test1, test2))
       
  1421 
       
  1422         self.assertEqual(suite.countTestCases(), 2)
       
  1423 
       
  1424     # "Return the number of tests represented by the this test object.
       
  1425     # ...this method is also implemented by the TestSuite class, which can
       
  1426     # return larger [greater than 1] values"
       
  1427     #
       
  1428     # Make sure this holds for nested TestSuite instances, too
       
  1429     def test_countTestCases_nested(self):
       
  1430         class Test1(unittest.TestCase):
       
  1431             def test1(self): pass
       
  1432             def test2(self): pass
       
  1433 
       
  1434         test2 = unittest.FunctionTestCase(lambda: None)
       
  1435         test3 = unittest.FunctionTestCase(lambda: None)
       
  1436         child = unittest.TestSuite((Test1('test2'), test2))
       
  1437         parent = unittest.TestSuite((test3, child, Test1('test1')))
       
  1438 
       
  1439         self.assertEqual(parent.countTestCases(), 4)
       
  1440 
       
  1441     # "Run the tests associated with this suite, collecting the result into
       
  1442     # the test result object passed as result."
       
  1443     #
       
  1444     # And if there are no tests? What then?
       
  1445     def test_run__empty_suite(self):
       
  1446         events = []
       
  1447         result = LoggingResult(events)
       
  1448 
       
  1449         suite = unittest.TestSuite()
       
  1450 
       
  1451         suite.run(result)
       
  1452 
       
  1453         self.assertEqual(events, [])
       
  1454 
       
  1455     # "Note that unlike TestCase.run(), TestSuite.run() requires the
       
  1456     # "result object to be passed in."
       
  1457     def test_run__requires_result(self):
       
  1458         suite = unittest.TestSuite()
       
  1459 
       
  1460         try:
       
  1461             suite.run()
       
  1462         except TypeError:
       
  1463             pass
       
  1464         else:
       
  1465             self.fail("Failed to raise TypeError")
       
  1466 
       
  1467     # "Run the tests associated with this suite, collecting the result into
       
  1468     # the test result object passed as result."
       
  1469     def test_run(self):
       
  1470         events = []
       
  1471         result = LoggingResult(events)
       
  1472 
       
  1473         class LoggingCase(unittest.TestCase):
       
  1474             def run(self, result):
       
  1475                 events.append('run %s' % self._testMethodName)
       
  1476 
       
  1477             def test1(self): pass
       
  1478             def test2(self): pass
       
  1479 
       
  1480         tests = [LoggingCase('test1'), LoggingCase('test2')]
       
  1481 
       
  1482         unittest.TestSuite(tests).run(result)
       
  1483 
       
  1484         self.assertEqual(events, ['run test1', 'run test2'])
       
  1485 
       
  1486     # "Add a TestCase ... to the suite"
       
  1487     def test_addTest__TestCase(self):
       
  1488         class Foo(unittest.TestCase):
       
  1489             def test(self): pass
       
  1490 
       
  1491         test = Foo('test')
       
  1492         suite = unittest.TestSuite()
       
  1493 
       
  1494         suite.addTest(test)
       
  1495 
       
  1496         self.assertEqual(suite.countTestCases(), 1)
       
  1497         self.assertEqual(list(suite), [test])
       
  1498 
       
  1499     # "Add a ... TestSuite to the suite"
       
  1500     def test_addTest__TestSuite(self):
       
  1501         class Foo(unittest.TestCase):
       
  1502             def test(self): pass
       
  1503 
       
  1504         suite_2 = unittest.TestSuite([Foo('test')])
       
  1505 
       
  1506         suite = unittest.TestSuite()
       
  1507         suite.addTest(suite_2)
       
  1508 
       
  1509         self.assertEqual(suite.countTestCases(), 1)
       
  1510         self.assertEqual(list(suite), [suite_2])
       
  1511 
       
  1512     # "Add all the tests from an iterable of TestCase and TestSuite
       
  1513     # instances to this test suite."
       
  1514     #
       
  1515     # "This is equivalent to iterating over tests, calling addTest() for
       
  1516     # each element"
       
  1517     def test_addTests(self):
       
  1518         class Foo(unittest.TestCase):
       
  1519             def test_1(self): pass
       
  1520             def test_2(self): pass
       
  1521 
       
  1522         test_1 = Foo('test_1')
       
  1523         test_2 = Foo('test_2')
       
  1524         inner_suite = unittest.TestSuite([test_2])
       
  1525 
       
  1526         def gen():
       
  1527             yield test_1
       
  1528             yield test_2
       
  1529             yield inner_suite
       
  1530 
       
  1531         suite_1 = unittest.TestSuite()
       
  1532         suite_1.addTests(gen())
       
  1533 
       
  1534         self.assertEqual(list(suite_1), list(gen()))
       
  1535 
       
  1536         # "This is equivalent to iterating over tests, calling addTest() for
       
  1537         # each element"
       
  1538         suite_2 = unittest.TestSuite()
       
  1539         for t in gen():
       
  1540             suite_2.addTest(t)
       
  1541 
       
  1542         self.assertEqual(suite_1, suite_2)
       
  1543 
       
  1544     # "Add all the tests from an iterable of TestCase and TestSuite
       
  1545     # instances to this test suite."
       
  1546     #
       
  1547     # What happens if it doesn't get an iterable?
       
  1548     def test_addTest__noniterable(self):
       
  1549         suite = unittest.TestSuite()
       
  1550 
       
  1551         try:
       
  1552             suite.addTests(5)
       
  1553         except TypeError:
       
  1554             pass
       
  1555         else:
       
  1556             self.fail("Failed to raise TypeError")
       
  1557 
       
  1558     def test_addTest__noncallable(self):
       
  1559         suite = unittest.TestSuite()
       
  1560         self.assertRaises(TypeError, suite.addTest, 5)
       
  1561 
       
  1562     def test_addTest__casesuiteclass(self):
       
  1563         suite = unittest.TestSuite()
       
  1564         self.assertRaises(TypeError, suite.addTest, Test_TestSuite)
       
  1565         self.assertRaises(TypeError, suite.addTest, unittest.TestSuite)
       
  1566 
       
  1567     def test_addTests__string(self):
       
  1568         suite = unittest.TestSuite()
       
  1569         self.assertRaises(TypeError, suite.addTests, "foo")
       
  1570 
       
  1571 
       
  1572 class Test_FunctionTestCase(TestCase):
       
  1573 
       
  1574     # "Return the number of tests represented by the this test object. For
       
  1575     # TestCase instances, this will always be 1"
       
  1576     def test_countTestCases(self):
       
  1577         test = unittest.FunctionTestCase(lambda: None)
       
  1578 
       
  1579         self.assertEqual(test.countTestCases(), 1)
       
  1580 
       
  1581     # "When a setUp() method is defined, the test runner will run that method
       
  1582     # prior to each test. Likewise, if a tearDown() method is defined, the
       
  1583     # test runner will invoke that method after each test. In the example,
       
  1584     # setUp() was used to create a fresh sequence for each test."
       
  1585     #
       
  1586     # Make sure the proper call order is maintained, even if setUp() raises
       
  1587     # an exception.
       
  1588     def test_run_call_order__error_in_setUp(self):
       
  1589         events = []
       
  1590         result = LoggingResult(events)
       
  1591 
       
  1592         def setUp():
       
  1593             events.append('setUp')
       
  1594             raise RuntimeError('raised by setUp')
       
  1595 
       
  1596         def test():
       
  1597             events.append('test')
       
  1598 
       
  1599         def tearDown():
       
  1600             events.append('tearDown')
       
  1601 
       
  1602         expected = ['startTest', 'setUp', 'addError', 'stopTest']
       
  1603         unittest.FunctionTestCase(test, setUp, tearDown).run(result)
       
  1604         self.assertEqual(events, expected)
       
  1605 
       
  1606     # "When a setUp() method is defined, the test runner will run that method
       
  1607     # prior to each test. Likewise, if a tearDown() method is defined, the
       
  1608     # test runner will invoke that method after each test. In the example,
       
  1609     # setUp() was used to create a fresh sequence for each test."
       
  1610     #
       
  1611     # Make sure the proper call order is maintained, even if the test raises
       
  1612     # an error (as opposed to a failure).
       
  1613     def test_run_call_order__error_in_test(self):
       
  1614         events = []
       
  1615         result = LoggingResult(events)
       
  1616 
       
  1617         def setUp():
       
  1618             events.append('setUp')
       
  1619 
       
  1620         def test():
       
  1621             events.append('test')
       
  1622             raise RuntimeError('raised by test')
       
  1623 
       
  1624         def tearDown():
       
  1625             events.append('tearDown')
       
  1626 
       
  1627         expected = ['startTest', 'setUp', 'test', 'addError', 'tearDown',
       
  1628                     'stopTest']
       
  1629         unittest.FunctionTestCase(test, setUp, tearDown).run(result)
       
  1630         self.assertEqual(events, expected)
       
  1631 
       
  1632     # "When a setUp() method is defined, the test runner will run that method
       
  1633     # prior to each test. Likewise, if a tearDown() method is defined, the
       
  1634     # test runner will invoke that method after each test. In the example,
       
  1635     # setUp() was used to create a fresh sequence for each test."
       
  1636     #
       
  1637     # Make sure the proper call order is maintained, even if the test signals
       
  1638     # a failure (as opposed to an error).
       
  1639     def test_run_call_order__failure_in_test(self):
       
  1640         events = []
       
  1641         result = LoggingResult(events)
       
  1642 
       
  1643         def setUp():
       
  1644             events.append('setUp')
       
  1645 
       
  1646         def test():
       
  1647             events.append('test')
       
  1648             self.fail('raised by test')
       
  1649 
       
  1650         def tearDown():
       
  1651             events.append('tearDown')
       
  1652 
       
  1653         expected = ['startTest', 'setUp', 'test', 'addFailure', 'tearDown',
       
  1654                     'stopTest']
       
  1655         unittest.FunctionTestCase(test, setUp, tearDown).run(result)
       
  1656         self.assertEqual(events, expected)
       
  1657 
       
  1658     # "When a setUp() method is defined, the test runner will run that method
       
  1659     # prior to each test. Likewise, if a tearDown() method is defined, the
       
  1660     # test runner will invoke that method after each test. In the example,
       
  1661     # setUp() was used to create a fresh sequence for each test."
       
  1662     #
       
  1663     # Make sure the proper call order is maintained, even if tearDown() raises
       
  1664     # an exception.
       
  1665     def test_run_call_order__error_in_tearDown(self):
       
  1666         events = []
       
  1667         result = LoggingResult(events)
       
  1668 
       
  1669         def setUp():
       
  1670             events.append('setUp')
       
  1671 
       
  1672         def test():
       
  1673             events.append('test')
       
  1674 
       
  1675         def tearDown():
       
  1676             events.append('tearDown')
       
  1677             raise RuntimeError('raised by tearDown')
       
  1678 
       
  1679         expected = ['startTest', 'setUp', 'test', 'tearDown', 'addError',
       
  1680                     'stopTest']
       
  1681         unittest.FunctionTestCase(test, setUp, tearDown).run(result)
       
  1682         self.assertEqual(events, expected)
       
  1683 
       
  1684     # "Return a string identifying the specific test case."
       
  1685     #
       
  1686     # Because of the vague nature of the docs, I'm not going to lock this
       
  1687     # test down too much. Really all that can be asserted is that the id()
       
  1688     # will be a string (either 8-byte or unicode -- again, because the docs
       
  1689     # just say "string")
       
  1690     def test_id(self):
       
  1691         test = unittest.FunctionTestCase(lambda: None)
       
  1692 
       
  1693         self.failUnless(isinstance(test.id(), basestring))
       
  1694 
       
  1695     # "Returns a one-line description of the test, or None if no description
       
  1696     # has been provided. The default implementation of this method returns
       
  1697     # the first line of the test method's docstring, if available, or None."
       
  1698     def test_shortDescription__no_docstring(self):
       
  1699         test = unittest.FunctionTestCase(lambda: None)
       
  1700 
       
  1701         self.assertEqual(test.shortDescription(), None)
       
  1702 
       
  1703     # "Returns a one-line description of the test, or None if no description
       
  1704     # has been provided. The default implementation of this method returns
       
  1705     # the first line of the test method's docstring, if available, or None."
       
  1706     def test_shortDescription__singleline_docstring(self):
       
  1707         desc = "this tests foo"
       
  1708         test = unittest.FunctionTestCase(lambda: None, description=desc)
       
  1709 
       
  1710         self.assertEqual(test.shortDescription(), "this tests foo")
       
  1711 
       
  1712 class Test_TestResult(TestCase):
       
  1713     # Note: there are not separate tests for TestResult.wasSuccessful(),
       
  1714     # TestResult.errors, TestResult.failures, TestResult.testsRun or
       
  1715     # TestResult.shouldStop because these only have meaning in terms of
       
  1716     # other TestResult methods.
       
  1717     #
       
  1718     # Accordingly, tests for the aforenamed attributes are incorporated
       
  1719     # in with the tests for the defining methods.
       
  1720     ################################################################
       
  1721 
       
  1722     def test_init(self):
       
  1723         result = unittest.TestResult()
       
  1724 
       
  1725         self.failUnless(result.wasSuccessful())
       
  1726         self.assertEqual(len(result.errors), 0)
       
  1727         self.assertEqual(len(result.failures), 0)
       
  1728         self.assertEqual(result.testsRun, 0)
       
  1729         self.assertEqual(result.shouldStop, False)
       
  1730 
       
  1731     # "This method can be called to signal that the set of tests being
       
  1732     # run should be aborted by setting the TestResult's shouldStop
       
  1733     # attribute to True."
       
  1734     def test_stop(self):
       
  1735         result = unittest.TestResult()
       
  1736 
       
  1737         result.stop()
       
  1738 
       
  1739         self.assertEqual(result.shouldStop, True)
       
  1740 
       
  1741     # "Called when the test case test is about to be run. The default
       
  1742     # implementation simply increments the instance's testsRun counter."
       
  1743     def test_startTest(self):
       
  1744         class Foo(unittest.TestCase):
       
  1745             def test_1(self):
       
  1746                 pass
       
  1747 
       
  1748         test = Foo('test_1')
       
  1749 
       
  1750         result = unittest.TestResult()
       
  1751 
       
  1752         result.startTest(test)
       
  1753 
       
  1754         self.failUnless(result.wasSuccessful())
       
  1755         self.assertEqual(len(result.errors), 0)
       
  1756         self.assertEqual(len(result.failures), 0)
       
  1757         self.assertEqual(result.testsRun, 1)
       
  1758         self.assertEqual(result.shouldStop, False)
       
  1759 
       
  1760         result.stopTest(test)
       
  1761 
       
  1762     # "Called after the test case test has been executed, regardless of
       
  1763     # the outcome. The default implementation does nothing."
       
  1764     def test_stopTest(self):
       
  1765         class Foo(unittest.TestCase):
       
  1766             def test_1(self):
       
  1767                 pass
       
  1768 
       
  1769         test = Foo('test_1')
       
  1770 
       
  1771         result = unittest.TestResult()
       
  1772 
       
  1773         result.startTest(test)
       
  1774 
       
  1775         self.failUnless(result.wasSuccessful())
       
  1776         self.assertEqual(len(result.errors), 0)
       
  1777         self.assertEqual(len(result.failures), 0)
       
  1778         self.assertEqual(result.testsRun, 1)
       
  1779         self.assertEqual(result.shouldStop, False)
       
  1780 
       
  1781         result.stopTest(test)
       
  1782 
       
  1783         # Same tests as above; make sure nothing has changed
       
  1784         self.failUnless(result.wasSuccessful())
       
  1785         self.assertEqual(len(result.errors), 0)
       
  1786         self.assertEqual(len(result.failures), 0)
       
  1787         self.assertEqual(result.testsRun, 1)
       
  1788         self.assertEqual(result.shouldStop, False)
       
  1789 
       
  1790     # "addSuccess(test)"
       
  1791     # ...
       
  1792     # "Called when the test case test succeeds"
       
  1793     # ...
       
  1794     # "wasSuccessful() - Returns True if all tests run so far have passed,
       
  1795     # otherwise returns False"
       
  1796     # ...
       
  1797     # "testsRun - The total number of tests run so far."
       
  1798     # ...
       
  1799     # "errors - A list containing 2-tuples of TestCase instances and
       
  1800     # formatted tracebacks. Each tuple represents a test which raised an
       
  1801     # unexpected exception. Contains formatted
       
  1802     # tracebacks instead of sys.exc_info() results."
       
  1803     # ...
       
  1804     # "failures - A list containing 2-tuples of TestCase instances and
       
  1805     # formatted tracebacks. Each tuple represents a test where a failure was
       
  1806     # explicitly signalled using the TestCase.fail*() or TestCase.assert*()
       
  1807     # methods. Contains formatted tracebacks instead
       
  1808     # of sys.exc_info() results."
       
  1809     def test_addSuccess(self):
       
  1810         class Foo(unittest.TestCase):
       
  1811             def test_1(self):
       
  1812                 pass
       
  1813 
       
  1814         test = Foo('test_1')
       
  1815 
       
  1816         result = unittest.TestResult()
       
  1817 
       
  1818         result.startTest(test)
       
  1819         result.addSuccess(test)
       
  1820         result.stopTest(test)
       
  1821 
       
  1822         self.failUnless(result.wasSuccessful())
       
  1823         self.assertEqual(len(result.errors), 0)
       
  1824         self.assertEqual(len(result.failures), 0)
       
  1825         self.assertEqual(result.testsRun, 1)
       
  1826         self.assertEqual(result.shouldStop, False)
       
  1827 
       
  1828     # "addFailure(test, err)"
       
  1829     # ...
       
  1830     # "Called when the test case test signals a failure. err is a tuple of
       
  1831     # the form returned by sys.exc_info(): (type, value, traceback)"
       
  1832     # ...
       
  1833     # "wasSuccessful() - Returns True if all tests run so far have passed,
       
  1834     # otherwise returns False"
       
  1835     # ...
       
  1836     # "testsRun - The total number of tests run so far."
       
  1837     # ...
       
  1838     # "errors - A list containing 2-tuples of TestCase instances and
       
  1839     # formatted tracebacks. Each tuple represents a test which raised an
       
  1840     # unexpected exception. Contains formatted
       
  1841     # tracebacks instead of sys.exc_info() results."
       
  1842     # ...
       
  1843     # "failures - A list containing 2-tuples of TestCase instances and
       
  1844     # formatted tracebacks. Each tuple represents a test where a failure was
       
  1845     # explicitly signalled using the TestCase.fail*() or TestCase.assert*()
       
  1846     # methods. Contains formatted tracebacks instead
       
  1847     # of sys.exc_info() results."
       
  1848     def test_addFailure(self):
       
  1849         import sys
       
  1850 
       
  1851         class Foo(unittest.TestCase):
       
  1852             def test_1(self):
       
  1853                 pass
       
  1854 
       
  1855         test = Foo('test_1')
       
  1856         try:
       
  1857             test.fail("foo")
       
  1858         except:
       
  1859             exc_info_tuple = sys.exc_info()
       
  1860 
       
  1861         result = unittest.TestResult()
       
  1862 
       
  1863         result.startTest(test)
       
  1864         result.addFailure(test, exc_info_tuple)
       
  1865         result.stopTest(test)
       
  1866 
       
  1867         self.failIf(result.wasSuccessful())
       
  1868         self.assertEqual(len(result.errors), 0)
       
  1869         self.assertEqual(len(result.failures), 1)
       
  1870         self.assertEqual(result.testsRun, 1)
       
  1871         self.assertEqual(result.shouldStop, False)
       
  1872 
       
  1873         test_case, formatted_exc = result.failures[0]
       
  1874         self.failUnless(test_case is test)
       
  1875         self.failUnless(isinstance(formatted_exc, str))
       
  1876 
       
  1877     # "addError(test, err)"
       
  1878     # ...
       
  1879     # "Called when the test case test raises an unexpected exception err
       
  1880     # is a tuple of the form returned by sys.exc_info():
       
  1881     # (type, value, traceback)"
       
  1882     # ...
       
  1883     # "wasSuccessful() - Returns True if all tests run so far have passed,
       
  1884     # otherwise returns False"
       
  1885     # ...
       
  1886     # "testsRun - The total number of tests run so far."
       
  1887     # ...
       
  1888     # "errors - A list containing 2-tuples of TestCase instances and
       
  1889     # formatted tracebacks. Each tuple represents a test which raised an
       
  1890     # unexpected exception. Contains formatted
       
  1891     # tracebacks instead of sys.exc_info() results."
       
  1892     # ...
       
  1893     # "failures - A list containing 2-tuples of TestCase instances and
       
  1894     # formatted tracebacks. Each tuple represents a test where a failure was
       
  1895     # explicitly signalled using the TestCase.fail*() or TestCase.assert*()
       
  1896     # methods. Contains formatted tracebacks instead
       
  1897     # of sys.exc_info() results."
       
  1898     def test_addError(self):
       
  1899         import sys
       
  1900 
       
  1901         class Foo(unittest.TestCase):
       
  1902             def test_1(self):
       
  1903                 pass
       
  1904 
       
  1905         test = Foo('test_1')
       
  1906         try:
       
  1907             raise TypeError()
       
  1908         except:
       
  1909             exc_info_tuple = sys.exc_info()
       
  1910 
       
  1911         result = unittest.TestResult()
       
  1912 
       
  1913         result.startTest(test)
       
  1914         result.addError(test, exc_info_tuple)
       
  1915         result.stopTest(test)
       
  1916 
       
  1917         self.failIf(result.wasSuccessful())
       
  1918         self.assertEqual(len(result.errors), 1)
       
  1919         self.assertEqual(len(result.failures), 0)
       
  1920         self.assertEqual(result.testsRun, 1)
       
  1921         self.assertEqual(result.shouldStop, False)
       
  1922 
       
  1923         test_case, formatted_exc = result.errors[0]
       
  1924         self.failUnless(test_case is test)
       
  1925         self.failUnless(isinstance(formatted_exc, str))
       
  1926 
       
  1927 ### Support code for Test_TestCase
       
  1928 ################################################################
       
  1929 
       
  1930 class Foo(unittest.TestCase):
       
  1931     def runTest(self): pass
       
  1932     def test1(self): pass
       
  1933 
       
  1934 class Bar(Foo):
       
  1935     def test2(self): pass
       
  1936 
       
  1937 ################################################################
       
  1938 ### /Support code for Test_TestCase
       
  1939 
       
  1940 class Test_TestCase(TestCase, TestEquality, TestHashing):
       
  1941 
       
  1942     ### Set up attributes used by inherited tests
       
  1943     ################################################################
       
  1944 
       
  1945     # Used by TestHashing.test_hash and TestEquality.test_eq
       
  1946     eq_pairs = [(Foo('test1'), Foo('test1'))]
       
  1947 
       
  1948     # Used by TestEquality.test_ne
       
  1949     ne_pairs = [(Foo('test1'), Foo('runTest'))
       
  1950                ,(Foo('test1'), Bar('test1'))
       
  1951                ,(Foo('test1'), Bar('test2'))]
       
  1952 
       
  1953     ################################################################
       
  1954     ### /Set up attributes used by inherited tests
       
  1955 
       
  1956 
       
  1957     # "class TestCase([methodName])"
       
  1958     # ...
       
  1959     # "Each instance of TestCase will run a single test method: the
       
  1960     # method named methodName."
       
  1961     # ...
       
  1962     # "methodName defaults to "runTest"."
       
  1963     #
       
  1964     # Make sure it really is optional, and that it defaults to the proper
       
  1965     # thing.
       
  1966     def test_init__no_test_name(self):
       
  1967         class Test(unittest.TestCase):
       
  1968             def runTest(self): raise MyException()
       
  1969             def test(self): pass
       
  1970 
       
  1971         self.assertEqual(Test().id()[-13:], '.Test.runTest')
       
  1972 
       
  1973     # "class TestCase([methodName])"
       
  1974     # ...
       
  1975     # "Each instance of TestCase will run a single test method: the
       
  1976     # method named methodName."
       
  1977     def test_init__test_name__valid(self):
       
  1978         class Test(unittest.TestCase):
       
  1979             def runTest(self): raise MyException()
       
  1980             def test(self): pass
       
  1981 
       
  1982         self.assertEqual(Test('test').id()[-10:], '.Test.test')
       
  1983 
       
  1984     # "class TestCase([methodName])"
       
  1985     # ...
       
  1986     # "Each instance of TestCase will run a single test method: the
       
  1987     # method named methodName."
       
  1988     def test_init__test_name__invalid(self):
       
  1989         class Test(unittest.TestCase):
       
  1990             def runTest(self): raise MyException()
       
  1991             def test(self): pass
       
  1992 
       
  1993         try:
       
  1994             Test('testfoo')
       
  1995         except ValueError:
       
  1996             pass
       
  1997         else:
       
  1998             self.fail("Failed to raise ValueError")
       
  1999 
       
  2000     # "Return the number of tests represented by the this test object. For
       
  2001     # TestCase instances, this will always be 1"
       
  2002     def test_countTestCases(self):
       
  2003         class Foo(unittest.TestCase):
       
  2004             def test(self): pass
       
  2005 
       
  2006         self.assertEqual(Foo('test').countTestCases(), 1)
       
  2007 
       
  2008     # "Return the default type of test result object to be used to run this
       
  2009     # test. For TestCase instances, this will always be
       
  2010     # unittest.TestResult;  subclasses of TestCase should
       
  2011     # override this as necessary."
       
  2012     def test_defaultTestResult(self):
       
  2013         class Foo(unittest.TestCase):
       
  2014             def runTest(self):
       
  2015                 pass
       
  2016 
       
  2017         result = Foo().defaultTestResult()
       
  2018         self.assertEqual(type(result), unittest.TestResult)
       
  2019 
       
  2020     # "When a setUp() method is defined, the test runner will run that method
       
  2021     # prior to each test. Likewise, if a tearDown() method is defined, the
       
  2022     # test runner will invoke that method after each test. In the example,
       
  2023     # setUp() was used to create a fresh sequence for each test."
       
  2024     #
       
  2025     # Make sure the proper call order is maintained, even if setUp() raises
       
  2026     # an exception.
       
  2027     def test_run_call_order__error_in_setUp(self):
       
  2028         events = []
       
  2029         result = LoggingResult(events)
       
  2030 
       
  2031         class Foo(unittest.TestCase):
       
  2032             def setUp(self):
       
  2033                 events.append('setUp')
       
  2034                 raise RuntimeError('raised by Foo.setUp')
       
  2035 
       
  2036             def test(self):
       
  2037                 events.append('test')
       
  2038 
       
  2039             def tearDown(self):
       
  2040                 events.append('tearDown')
       
  2041 
       
  2042         Foo('test').run(result)
       
  2043         expected = ['startTest', 'setUp', 'addError', 'stopTest']
       
  2044         self.assertEqual(events, expected)
       
  2045 
       
  2046     # "When a setUp() method is defined, the test runner will run that method
       
  2047     # prior to each test. Likewise, if a tearDown() method is defined, the
       
  2048     # test runner will invoke that method after each test. In the example,
       
  2049     # setUp() was used to create a fresh sequence for each test."
       
  2050     #
       
  2051     # Make sure the proper call order is maintained, even if the test raises
       
  2052     # an error (as opposed to a failure).
       
  2053     def test_run_call_order__error_in_test(self):
       
  2054         events = []
       
  2055         result = LoggingResult(events)
       
  2056 
       
  2057         class Foo(unittest.TestCase):
       
  2058             def setUp(self):
       
  2059                 events.append('setUp')
       
  2060 
       
  2061             def test(self):
       
  2062                 events.append('test')
       
  2063                 raise RuntimeError('raised by Foo.test')
       
  2064 
       
  2065             def tearDown(self):
       
  2066                 events.append('tearDown')
       
  2067 
       
  2068         expected = ['startTest', 'setUp', 'test', 'addError', 'tearDown',
       
  2069                     'stopTest']
       
  2070         Foo('test').run(result)
       
  2071         self.assertEqual(events, expected)
       
  2072 
       
  2073     # "When a setUp() method is defined, the test runner will run that method
       
  2074     # prior to each test. Likewise, if a tearDown() method is defined, the
       
  2075     # test runner will invoke that method after each test. In the example,
       
  2076     # setUp() was used to create a fresh sequence for each test."
       
  2077     #
       
  2078     # Make sure the proper call order is maintained, even if the test signals
       
  2079     # a failure (as opposed to an error).
       
  2080     def test_run_call_order__failure_in_test(self):
       
  2081         events = []
       
  2082         result = LoggingResult(events)
       
  2083 
       
  2084         class Foo(unittest.TestCase):
       
  2085             def setUp(self):
       
  2086                 events.append('setUp')
       
  2087 
       
  2088             def test(self):
       
  2089                 events.append('test')
       
  2090                 self.fail('raised by Foo.test')
       
  2091 
       
  2092             def tearDown(self):
       
  2093                 events.append('tearDown')
       
  2094 
       
  2095         expected = ['startTest', 'setUp', 'test', 'addFailure', 'tearDown',
       
  2096                     'stopTest']
       
  2097         Foo('test').run(result)
       
  2098         self.assertEqual(events, expected)
       
  2099 
       
  2100     # "When a setUp() method is defined, the test runner will run that method
       
  2101     # prior to each test. Likewise, if a tearDown() method is defined, the
       
  2102     # test runner will invoke that method after each test. In the example,
       
  2103     # setUp() was used to create a fresh sequence for each test."
       
  2104     #
       
  2105     # Make sure the proper call order is maintained, even if tearDown() raises
       
  2106     # an exception.
       
  2107     def test_run_call_order__error_in_tearDown(self):
       
  2108         events = []
       
  2109         result = LoggingResult(events)
       
  2110 
       
  2111         class Foo(unittest.TestCase):
       
  2112             def setUp(self):
       
  2113                 events.append('setUp')
       
  2114 
       
  2115             def test(self):
       
  2116                 events.append('test')
       
  2117 
       
  2118             def tearDown(self):
       
  2119                 events.append('tearDown')
       
  2120                 raise RuntimeError('raised by Foo.tearDown')
       
  2121 
       
  2122         Foo('test').run(result)
       
  2123         expected = ['startTest', 'setUp', 'test', 'tearDown', 'addError',
       
  2124                     'stopTest']
       
  2125         self.assertEqual(events, expected)
       
  2126 
       
  2127     # "This class attribute gives the exception raised by the test() method.
       
  2128     # If a test framework needs to use a specialized exception, possibly to
       
  2129     # carry additional information, it must subclass this exception in
       
  2130     # order to ``play fair'' with the framework.  The initial value of this
       
  2131     # attribute is AssertionError"
       
  2132     def test_failureException__default(self):
       
  2133         class Foo(unittest.TestCase):
       
  2134             def test(self):
       
  2135                 pass
       
  2136 
       
  2137         self.failUnless(Foo('test').failureException is AssertionError)
       
  2138 
       
  2139     # "This class attribute gives the exception raised by the test() method.
       
  2140     # If a test framework needs to use a specialized exception, possibly to
       
  2141     # carry additional information, it must subclass this exception in
       
  2142     # order to ``play fair'' with the framework."
       
  2143     #
       
  2144     # Make sure TestCase.run() respects the designated failureException
       
  2145     def test_failureException__subclassing__explicit_raise(self):
       
  2146         events = []
       
  2147         result = LoggingResult(events)
       
  2148 
       
  2149         class Foo(unittest.TestCase):
       
  2150             def test(self):
       
  2151                 raise RuntimeError()
       
  2152 
       
  2153             failureException = RuntimeError
       
  2154 
       
  2155         self.failUnless(Foo('test').failureException is RuntimeError)
       
  2156 
       
  2157 
       
  2158         Foo('test').run(result)
       
  2159         expected = ['startTest', 'addFailure', 'stopTest']
       
  2160         self.assertEqual(events, expected)
       
  2161 
       
  2162     # "This class attribute gives the exception raised by the test() method.
       
  2163     # If a test framework needs to use a specialized exception, possibly to
       
  2164     # carry additional information, it must subclass this exception in
       
  2165     # order to ``play fair'' with the framework."
       
  2166     #
       
  2167     # Make sure TestCase.run() respects the designated failureException
       
  2168     def test_failureException__subclassing__implicit_raise(self):
       
  2169         events = []
       
  2170         result = LoggingResult(events)
       
  2171 
       
  2172         class Foo(unittest.TestCase):
       
  2173             def test(self):
       
  2174                 self.fail("foo")
       
  2175 
       
  2176             failureException = RuntimeError
       
  2177 
       
  2178         self.failUnless(Foo('test').failureException is RuntimeError)
       
  2179 
       
  2180 
       
  2181         Foo('test').run(result)
       
  2182         expected = ['startTest', 'addFailure', 'stopTest']
       
  2183         self.assertEqual(events, expected)
       
  2184 
       
  2185     # "The default implementation does nothing."
       
  2186     def test_setUp(self):
       
  2187         class Foo(unittest.TestCase):
       
  2188             def runTest(self):
       
  2189                 pass
       
  2190 
       
  2191         # ... and nothing should happen
       
  2192         Foo().setUp()
       
  2193 
       
  2194     # "The default implementation does nothing."
       
  2195     def test_tearDown(self):
       
  2196         class Foo(unittest.TestCase):
       
  2197             def runTest(self):
       
  2198                 pass
       
  2199 
       
  2200         # ... and nothing should happen
       
  2201         Foo().tearDown()
       
  2202 
       
  2203     # "Return a string identifying the specific test case."
       
  2204     #
       
  2205     # Because of the vague nature of the docs, I'm not going to lock this
       
  2206     # test down too much. Really all that can be asserted is that the id()
       
  2207     # will be a string (either 8-byte or unicode -- again, because the docs
       
  2208     # just say "string")
       
  2209     def test_id(self):
       
  2210         class Foo(unittest.TestCase):
       
  2211             def runTest(self):
       
  2212                 pass
       
  2213 
       
  2214         self.failUnless(isinstance(Foo().id(), basestring))
       
  2215 
       
  2216     # "Returns a one-line description of the test, or None if no description
       
  2217     # has been provided. The default implementation of this method returns
       
  2218     # the first line of the test method's docstring, if available, or None."
       
  2219     def test_shortDescription__no_docstring(self):
       
  2220         class Foo(unittest.TestCase):
       
  2221             def runTest(self):
       
  2222                 pass
       
  2223 
       
  2224         self.assertEqual(Foo().shortDescription(), None)
       
  2225 
       
  2226     # "Returns a one-line description of the test, or None if no description
       
  2227     # has been provided. The default implementation of this method returns
       
  2228     # the first line of the test method's docstring, if available, or None."
       
  2229     def test_shortDescription__singleline_docstring(self):
       
  2230         class Foo(unittest.TestCase):
       
  2231             def runTest(self):
       
  2232                 "this tests foo"
       
  2233                 pass
       
  2234 
       
  2235         self.assertEqual(Foo().shortDescription(), "this tests foo")
       
  2236 
       
  2237     # "Returns a one-line description of the test, or None if no description
       
  2238     # has been provided. The default implementation of this method returns
       
  2239     # the first line of the test method's docstring, if available, or None."
       
  2240     def test_shortDescription__multiline_docstring(self):
       
  2241         class Foo(unittest.TestCase):
       
  2242             def runTest(self):
       
  2243                 """this tests foo
       
  2244                 blah, bar and baz are also tested"""
       
  2245                 pass
       
  2246 
       
  2247         self.assertEqual(Foo().shortDescription(), "this tests foo")
       
  2248 
       
  2249     # "If result is omitted or None, a temporary result object is created
       
  2250     # and used, but is not made available to the caller"
       
  2251     def test_run__uses_defaultTestResult(self):
       
  2252         events = []
       
  2253 
       
  2254         class Foo(unittest.TestCase):
       
  2255             def test(self):
       
  2256                 events.append('test')
       
  2257 
       
  2258             def defaultTestResult(self):
       
  2259                 return LoggingResult(events)
       
  2260 
       
  2261         # Make run() find a result object on its own
       
  2262         Foo('test').run()
       
  2263 
       
  2264         expected = ['startTest', 'test', 'stopTest']
       
  2265         self.assertEqual(events, expected)
       
  2266 
       
  2267 class Test_Assertions(TestCase):
       
  2268     def test_AlmostEqual(self):
       
  2269         self.failUnlessAlmostEqual(1.00000001, 1.0)
       
  2270         self.failIfAlmostEqual(1.0000001, 1.0)
       
  2271         self.assertRaises(AssertionError,
       
  2272                           self.failUnlessAlmostEqual, 1.0000001, 1.0)
       
  2273         self.assertRaises(AssertionError,
       
  2274                           self.failIfAlmostEqual, 1.00000001, 1.0)
       
  2275 
       
  2276         self.failUnlessAlmostEqual(1.1, 1.0, places=0)
       
  2277         self.assertRaises(AssertionError,
       
  2278                           self.failUnlessAlmostEqual, 1.1, 1.0, places=1)
       
  2279 
       
  2280         self.failUnlessAlmostEqual(0, .1+.1j, places=0)
       
  2281         self.failIfAlmostEqual(0, .1+.1j, places=1)
       
  2282         self.assertRaises(AssertionError,
       
  2283                           self.failUnlessAlmostEqual, 0, .1+.1j, places=1)
       
  2284         self.assertRaises(AssertionError,
       
  2285                           self.failIfAlmostEqual, 0, .1+.1j, places=0)
       
  2286 
       
  2287 ######################################################################
       
  2288 ## Main
       
  2289 ######################################################################
       
  2290 
       
  2291 def test_main():
       
  2292     test_support.run_unittest(Test_TestCase, Test_TestLoader,
       
  2293         Test_TestSuite, Test_TestResult, Test_FunctionTestCase,
       
  2294         Test_Assertions)
       
  2295 
       
  2296 if __name__ == "__main__":
       
  2297     test_main()