7
from copy import deepcopy
8
from test import test_support
12
from .support import (
13
TestEquality, TestHashing, LoggingResult, ResultWithNoStartTestRunStopTestRun
18
"Keep these TestCase classes out of the main namespace"
20
class Foo(unittest.TestCase):
21
def runTest(self): pass
27
class LoggingTestCase(unittest.TestCase):
28
"""A test case which logs its calls."""
30
def __init__(self, events):
31
super(Test.LoggingTestCase, self).__init__('test')
35
self.events.append('setUp')
38
self.events.append('test')
41
self.events.append('tearDown')
44
class Test_TestCase(unittest.TestCase, TestEquality, TestHashing):
46
### Set up attributes used by inherited tests
47
################################################################
49
# Used by TestHashing.test_hash and TestEquality.test_eq
50
eq_pairs = [(Test.Foo('test1'), Test.Foo('test1'))]
52
# Used by TestEquality.test_ne
53
ne_pairs = [(Test.Foo('test1'), Test.Foo('runTest'))
54
,(Test.Foo('test1'), Test.Bar('test1'))
55
,(Test.Foo('test1'), Test.Bar('test2'))]
57
################################################################
58
### /Set up attributes used by inherited tests
61
# "class TestCase([methodName])"
63
# "Each instance of TestCase will run a single test method: the
64
# method named methodName."
66
# "methodName defaults to "runTest"."
68
# Make sure it really is optional, and that it defaults to the proper
70
def test_init__no_test_name(self):
71
class Test(unittest.TestCase):
72
def runTest(self): raise TypeError()
75
self.assertEqual(Test().id()[-13:], '.Test.runTest')
77
# "class TestCase([methodName])"
79
# "Each instance of TestCase will run a single test method: the
80
# method named methodName."
81
def test_init__test_name__valid(self):
82
class Test(unittest.TestCase):
83
def runTest(self): raise TypeError()
86
self.assertEqual(Test('test').id()[-10:], '.Test.test')
88
# "class TestCase([methodName])"
90
# "Each instance of TestCase will run a single test method: the
91
# method named methodName."
92
def test_init__test_name__invalid(self):
93
class Test(unittest.TestCase):
94
def runTest(self): raise TypeError()
102
self.fail("Failed to raise ValueError")
104
# "Return the number of tests represented by the this test object. For
105
# TestCase instances, this will always be 1"
106
def test_countTestCases(self):
107
class Foo(unittest.TestCase):
110
self.assertEqual(Foo('test').countTestCases(), 1)
112
# "Return the default type of test result object to be used to run this
113
# test. For TestCase instances, this will always be
114
# unittest.TestResult; subclasses of TestCase should
115
# override this as necessary."
116
def test_defaultTestResult(self):
117
class Foo(unittest.TestCase):
121
result = Foo().defaultTestResult()
122
self.assertEqual(type(result), unittest.TestResult)
124
# "When a setUp() method is defined, the test runner will run that method
125
# prior to each test. Likewise, if a tearDown() method is defined, the
126
# test runner will invoke that method after each test. In the example,
127
# setUp() was used to create a fresh sequence for each test."
129
# Make sure the proper call order is maintained, even if setUp() raises
131
def test_run_call_order__error_in_setUp(self):
133
result = LoggingResult(events)
135
class Foo(Test.LoggingTestCase):
137
super(Foo, self).setUp()
138
raise RuntimeError('raised by Foo.setUp')
140
Foo(events).run(result)
141
expected = ['startTest', 'setUp', 'addError', 'stopTest']
142
self.assertEqual(events, expected)
144
# "With a temporary result stopTestRun is called when setUp errors.
145
def test_run_call_order__error_in_setUp_default_result(self):
148
class Foo(Test.LoggingTestCase):
149
def defaultTestResult(self):
150
return LoggingResult(self.events)
153
super(Foo, self).setUp()
154
raise RuntimeError('raised by Foo.setUp')
157
expected = ['startTestRun', 'startTest', 'setUp', 'addError',
158
'stopTest', 'stopTestRun']
159
self.assertEqual(events, expected)
161
# "When a setUp() method is defined, the test runner will run that method
162
# prior to each test. Likewise, if a tearDown() method is defined, the
163
# test runner will invoke that method after each test. In the example,
164
# setUp() was used to create a fresh sequence for each test."
166
# Make sure the proper call order is maintained, even if the test raises
167
# an error (as opposed to a failure).
168
def test_run_call_order__error_in_test(self):
170
result = LoggingResult(events)
172
class Foo(Test.LoggingTestCase):
174
super(Foo, self).test()
175
raise RuntimeError('raised by Foo.test')
177
expected = ['startTest', 'setUp', 'test', 'addError', 'tearDown',
179
Foo(events).run(result)
180
self.assertEqual(events, expected)
182
# "With a default result, an error in the test still results in stopTestRun
184
def test_run_call_order__error_in_test_default_result(self):
187
class Foo(Test.LoggingTestCase):
188
def defaultTestResult(self):
189
return LoggingResult(self.events)
192
super(Foo, self).test()
193
raise RuntimeError('raised by Foo.test')
195
expected = ['startTestRun', 'startTest', 'setUp', 'test', 'addError',
196
'tearDown', 'stopTest', 'stopTestRun']
198
self.assertEqual(events, expected)
200
# "When a setUp() method is defined, the test runner will run that method
201
# prior to each test. Likewise, if a tearDown() method is defined, the
202
# test runner will invoke that method after each test. In the example,
203
# setUp() was used to create a fresh sequence for each test."
205
# Make sure the proper call order is maintained, even if the test signals
206
# a failure (as opposed to an error).
207
def test_run_call_order__failure_in_test(self):
209
result = LoggingResult(events)
211
class Foo(Test.LoggingTestCase):
213
super(Foo, self).test()
214
self.fail('raised by Foo.test')
216
expected = ['startTest', 'setUp', 'test', 'addFailure', 'tearDown',
218
Foo(events).run(result)
219
self.assertEqual(events, expected)
221
# "When a test fails with a default result stopTestRun is still called."
222
def test_run_call_order__failure_in_test_default_result(self):
224
class Foo(Test.LoggingTestCase):
225
def defaultTestResult(self):
226
return LoggingResult(self.events)
228
super(Foo, self).test()
229
self.fail('raised by Foo.test')
231
expected = ['startTestRun', 'startTest', 'setUp', 'test', 'addFailure',
232
'tearDown', 'stopTest', 'stopTestRun']
235
self.assertEqual(events, expected)
237
# "When a setUp() method is defined, the test runner will run that method
238
# prior to each test. Likewise, if a tearDown() method is defined, the
239
# test runner will invoke that method after each test. In the example,
240
# setUp() was used to create a fresh sequence for each test."
242
# Make sure the proper call order is maintained, even if tearDown() raises
244
def test_run_call_order__error_in_tearDown(self):
246
result = LoggingResult(events)
248
class Foo(Test.LoggingTestCase):
250
super(Foo, self).tearDown()
251
raise RuntimeError('raised by Foo.tearDown')
253
Foo(events).run(result)
254
expected = ['startTest', 'setUp', 'test', 'tearDown', 'addError',
256
self.assertEqual(events, expected)
258
# "When tearDown errors with a default result stopTestRun is still called."
259
def test_run_call_order__error_in_tearDown_default_result(self):
261
class Foo(Test.LoggingTestCase):
262
def defaultTestResult(self):
263
return LoggingResult(self.events)
265
super(Foo, self).tearDown()
266
raise RuntimeError('raised by Foo.tearDown')
270
expected = ['startTestRun', 'startTest', 'setUp', 'test', 'tearDown',
271
'addError', 'stopTest', 'stopTestRun']
272
self.assertEqual(events, expected)
274
# "TestCase.run() still works when the defaultTestResult is a TestResult
275
# that does not support startTestRun and stopTestRun.
276
def test_run_call_order_default_result(self):
278
class Foo(unittest.TestCase):
279
def defaultTestResult(self):
280
return ResultWithNoStartTestRunStopTestRun()
286
# "This class attribute gives the exception raised by the test() method.
287
# If a test framework needs to use a specialized exception, possibly to
288
# carry additional information, it must subclass this exception in
289
# order to ``play fair'' with the framework. The initial value of this
290
# attribute is AssertionError"
291
def test_failureException__default(self):
292
class Foo(unittest.TestCase):
296
self.assertTrue(Foo('test').failureException is AssertionError)
298
# "This class attribute gives the exception raised by the test() method.
299
# If a test framework needs to use a specialized exception, possibly to
300
# carry additional information, it must subclass this exception in
301
# order to ``play fair'' with the framework."
303
# Make sure TestCase.run() respects the designated failureException
304
def test_failureException__subclassing__explicit_raise(self):
306
result = LoggingResult(events)
308
class Foo(unittest.TestCase):
312
failureException = RuntimeError
314
self.assertTrue(Foo('test').failureException is RuntimeError)
317
Foo('test').run(result)
318
expected = ['startTest', 'addFailure', 'stopTest']
319
self.assertEqual(events, expected)
321
# "This class attribute gives the exception raised by the test() method.
322
# If a test framework needs to use a specialized exception, possibly to
323
# carry additional information, it must subclass this exception in
324
# order to ``play fair'' with the framework."
326
# Make sure TestCase.run() respects the designated failureException
327
def test_failureException__subclassing__implicit_raise(self):
329
result = LoggingResult(events)
331
class Foo(unittest.TestCase):
335
failureException = RuntimeError
337
self.assertTrue(Foo('test').failureException is RuntimeError)
340
Foo('test').run(result)
341
expected = ['startTest', 'addFailure', 'stopTest']
342
self.assertEqual(events, expected)
344
# "The default implementation does nothing."
345
def test_setUp(self):
346
class Foo(unittest.TestCase):
350
# ... and nothing should happen
353
# "The default implementation does nothing."
354
def test_tearDown(self):
355
class Foo(unittest.TestCase):
359
# ... and nothing should happen
362
# "Return a string identifying the specific test case."
364
# Because of the vague nature of the docs, I'm not going to lock this
365
# test down too much. Really all that can be asserted is that the id()
366
# will be a string (either 8-byte or unicode -- again, because the docs
369
class Foo(unittest.TestCase):
373
self.assertIsInstance(Foo().id(), basestring)
375
# "If result is omitted or None, a temporary result object is created
376
# and used, but is not made available to the caller. As TestCase owns the
377
# temporary result startTestRun and stopTestRun are called.
379
def test_run__uses_defaultTestResult(self):
382
class Foo(unittest.TestCase):
384
events.append('test')
386
def defaultTestResult(self):
387
return LoggingResult(events)
389
# Make run() find a result object on its own
392
expected = ['startTestRun', 'startTest', 'test', 'addSuccess',
393
'stopTest', 'stopTestRun']
394
self.assertEqual(events, expected)
396
def testShortDescriptionWithoutDocstring(self):
397
self.assertIsNone(self.shortDescription())
399
@unittest.skipIf(sys.flags.optimize >= 2,
400
"Docstrings are omitted with -O2 and above")
401
def testShortDescriptionWithOneLineDocstring(self):
402
"""Tests shortDescription() for a method with a docstring."""
404
self.shortDescription(),
405
'Tests shortDescription() for a method with a docstring.')
407
@unittest.skipIf(sys.flags.optimize >= 2,
408
"Docstrings are omitted with -O2 and above")
409
def testShortDescriptionWithMultiLineDocstring(self):
410
"""Tests shortDescription() for a method with a longer docstring.
412
This method ensures that only the first line of a docstring is
413
returned used in the short description, no matter how long the
417
self.shortDescription(),
418
'Tests shortDescription() for a method with a longer '
421
def testAddTypeEqualityFunc(self):
422
class SadSnake(object):
423
"""Dummy class for test_addTypeEqualityFunc."""
424
s1, s2 = SadSnake(), SadSnake()
425
self.assertNotEqual(s1, s2)
426
def AllSnakesCreatedEqual(a, b, msg=None):
427
return type(a) is type(b) is SadSnake
428
self.addTypeEqualityFunc(SadSnake, AllSnakesCreatedEqual)
429
self.assertEqual(s1, s2)
430
# No this doesn't clean up and remove the SadSnake equality func
431
# from this TestCase instance but since its a local nothing else
432
# will ever notice that.
434
def testAssertIs(self):
436
self.assertIs(thing, thing)
437
self.assertRaises(self.failureException, self.assertIs, thing, object())
439
def testAssertIsNot(self):
441
self.assertIsNot(thing, object())
442
self.assertRaises(self.failureException, self.assertIsNot, thing, thing)
444
def testAssertIsInstance(self):
446
self.assertIsInstance(thing, list)
447
self.assertRaises(self.failureException, self.assertIsInstance,
450
def testAssertNotIsInstance(self):
452
self.assertNotIsInstance(thing, dict)
453
self.assertRaises(self.failureException, self.assertNotIsInstance,
456
def testAssertIn(self):
457
animals = {'monkey': 'banana', 'cow': 'grass', 'seal': 'fish'}
459
self.assertIn('a', 'abc')
460
self.assertIn(2, [1, 2, 3])
461
self.assertIn('monkey', animals)
463
self.assertNotIn('d', 'abc')
464
self.assertNotIn(0, [1, 2, 3])
465
self.assertNotIn('otter', animals)
467
self.assertRaises(self.failureException, self.assertIn, 'x', 'abc')
468
self.assertRaises(self.failureException, self.assertIn, 4, [1, 2, 3])
469
self.assertRaises(self.failureException, self.assertIn, 'elephant',
472
self.assertRaises(self.failureException, self.assertNotIn, 'c', 'abc')
473
self.assertRaises(self.failureException, self.assertNotIn, 1, [1, 2, 3])
474
self.assertRaises(self.failureException, self.assertNotIn, 'cow',
477
def testAssertDictContainsSubset(self):
478
self.assertDictContainsSubset({}, {})
479
self.assertDictContainsSubset({}, {'a': 1})
480
self.assertDictContainsSubset({'a': 1}, {'a': 1})
481
self.assertDictContainsSubset({'a': 1}, {'a': 1, 'b': 2})
482
self.assertDictContainsSubset({'a': 1, 'b': 2}, {'a': 1, 'b': 2})
484
with self.assertRaises(self.failureException):
485
self.assertDictContainsSubset({1: "one"}, {})
487
with self.assertRaises(self.failureException):
488
self.assertDictContainsSubset({'a': 2}, {'a': 1})
490
with self.assertRaises(self.failureException):
491
self.assertDictContainsSubset({'c': 1}, {'a': 1})
493
with self.assertRaises(self.failureException):
494
self.assertDictContainsSubset({'a': 1, 'c': 1}, {'a': 1})
496
with self.assertRaises(self.failureException):
497
self.assertDictContainsSubset({'a': 1, 'c': 1}, {'a': 1})
499
with test_support.check_warnings(("", UnicodeWarning)):
500
one = ''.join(chr(i) for i in range(255))
501
# this used to cause a UnicodeDecodeError constructing the failure msg
502
with self.assertRaises(self.failureException):
503
self.assertDictContainsSubset({'foo': one}, {'foo': u'\uFFFD'})
505
def testAssertEqual(self):
511
(frozenset(), frozenset())]
512
for a, b in equal_pairs:
513
# This mess of try excepts is to test the assertEqual behavior
516
self.assertEqual(a, b)
517
except self.failureException:
518
self.fail('assertEqual(%r, %r) failed' % (a, b))
520
self.assertEqual(a, b, msg='foo')
521
except self.failureException:
522
self.fail('assertEqual(%r, %r) with msg= failed' % (a, b))
524
self.assertEqual(a, b, 'foo')
525
except self.failureException:
526
self.fail('assertEqual(%r, %r) with third parameter failed' %
532
(set([4,1]), frozenset([4,2])),
533
(frozenset([4,5]), set([2,3])),
534
(set([3,4]), set([5,4]))]
535
for a, b in unequal_pairs:
536
self.assertRaises(self.failureException, self.assertEqual, a, b)
537
self.assertRaises(self.failureException, self.assertEqual, a, b,
539
self.assertRaises(self.failureException, self.assertEqual, a, b,
542
def testEquality(self):
543
self.assertListEqual([], [])
544
self.assertTupleEqual((), ())
545
self.assertSequenceEqual([], ())
549
self.assertRaises(unittest.TestCase.failureException,
550
self.assertListEqual, a, b)
551
self.assertRaises(unittest.TestCase.failureException,
552
self.assertListEqual, tuple(a), tuple(b))
553
self.assertRaises(unittest.TestCase.failureException,
554
self.assertSequenceEqual, a, tuple(b))
557
self.assertListEqual(a, b)
558
self.assertTupleEqual(tuple(a), tuple(b))
559
self.assertSequenceEqual(a, tuple(b))
560
self.assertSequenceEqual(tuple(a), b)
562
self.assertRaises(self.failureException, self.assertListEqual,
564
self.assertRaises(self.failureException, self.assertTupleEqual,
566
self.assertRaises(self.failureException, self.assertListEqual, None, b)
567
self.assertRaises(self.failureException, self.assertTupleEqual, None,
569
self.assertRaises(self.failureException, self.assertSequenceEqual,
571
self.assertRaises(self.failureException, self.assertListEqual, 1, 1)
572
self.assertRaises(self.failureException, self.assertTupleEqual, 1, 1)
573
self.assertRaises(self.failureException, self.assertSequenceEqual,
576
self.assertDictEqual({}, {})
580
self.assertRaises(unittest.TestCase.failureException,
581
self.assertDictEqual, c, d)
584
self.assertDictEqual(c, d)
587
self.assertRaises(unittest.TestCase.failureException,
588
self.assertDictEqual, c, d, 'These are unequal')
590
self.assertRaises(self.failureException, self.assertDictEqual, None, d)
591
self.assertRaises(self.failureException, self.assertDictEqual, [], d)
592
self.assertRaises(self.failureException, self.assertDictEqual, 1, 1)
594
def testAssertSequenceEqualMaxDiff(self):
595
self.assertEqual(self.maxDiff, 80*8)
596
seq1 = 'a' + 'x' * 80**2
597
seq2 = 'b' + 'x' * 80**2
598
diff = '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
599
pprint.pformat(seq2).splitlines()))
600
# the +1 is the leading \n added by assertSequenceEqual
601
omitted = unittest.case.DIFF_OMITTED % (len(diff) + 1,)
603
self.maxDiff = len(diff)//2
605
self.assertSequenceEqual(seq1, seq2)
606
except self.failureException as e:
609
self.fail('assertSequenceEqual did not fail.')
610
self.assertTrue(len(msg) < len(diff))
611
self.assertIn(omitted, msg)
613
self.maxDiff = len(diff) * 2
615
self.assertSequenceEqual(seq1, seq2)
616
except self.failureException as e:
619
self.fail('assertSequenceEqual did not fail.')
620
self.assertTrue(len(msg) > len(diff))
621
self.assertNotIn(omitted, msg)
625
self.assertSequenceEqual(seq1, seq2)
626
except self.failureException as e:
629
self.fail('assertSequenceEqual did not fail.')
630
self.assertTrue(len(msg) > len(diff))
631
self.assertNotIn(omitted, msg)
633
def testTruncateMessage(self):
635
message = self._truncateMessage('foo', 'bar')
636
omitted = unittest.case.DIFF_OMITTED % len('bar')
637
self.assertEqual(message, 'foo' + omitted)
640
message = self._truncateMessage('foo', 'bar')
641
self.assertEqual(message, 'foobar')
644
message = self._truncateMessage('foo', 'bar')
645
self.assertEqual(message, 'foobar')
647
def testAssertDictEqualTruncates(self):
648
test = unittest.TestCase('assertEqual')
649
def truncate(msg, diff):
651
test._truncateMessage = truncate
653
test.assertDictEqual({}, {1: 0})
654
except self.failureException as e:
655
self.assertEqual(str(e), 'foo')
657
self.fail('assertDictEqual did not fail')
659
def testAssertMultiLineEqualTruncates(self):
660
test = unittest.TestCase('assertEqual')
661
def truncate(msg, diff):
663
test._truncateMessage = truncate
665
test.assertMultiLineEqual('foo', 'bar')
666
except self.failureException as e:
667
self.assertEqual(str(e), 'foo')
669
self.fail('assertMultiLineEqual did not fail')
671
def testAssertEqual_diffThreshold(self):
672
# check threshold value
673
self.assertEqual(self._diffThreshold, 2**16)
674
# disable madDiff to get diff markers
677
# set a lower threshold value and add a cleanup to restore it
678
old_threshold = self._diffThreshold
679
self._diffThreshold = 2**8
680
self.addCleanup(lambda: setattr(self, '_diffThreshold', old_threshold))
682
# under the threshold: diff marker (^) in error message
684
with self.assertRaises(self.failureException) as cm:
685
self.assertEqual(s + 'a', s + 'b')
686
self.assertIn('^', str(cm.exception))
687
self.assertEqual(s + 'a', s + 'a')
689
# over the threshold: diff not used and marker (^) not in error message
691
# if the path that uses difflib is taken, _truncateMessage will be
692
# called -- replace it with explodingTruncation to verify that this
694
def explodingTruncation(message, diff):
695
raise SystemError('this should not be raised')
696
old_truncate = self._truncateMessage
697
self._truncateMessage = explodingTruncation
698
self.addCleanup(lambda: setattr(self, '_truncateMessage', old_truncate))
700
s1, s2 = s + 'a', s + 'b'
701
with self.assertRaises(self.failureException) as cm:
702
self.assertEqual(s1, s2)
703
self.assertNotIn('^', str(cm.exception))
704
self.assertEqual(str(cm.exception), '%r != %r' % (s1, s2))
705
self.assertEqual(s + 'a', s + 'a')
707
def testAssertItemsEqual(self):
709
self.assertItemsEqual([1, 2, 3], [3, 2, 1])
710
self.assertItemsEqual(['foo', 'bar', 'baz'], ['bar', 'baz', 'foo'])
711
self.assertItemsEqual([a, a, 2, 2, 3], (a, 2, 3, a, 2))
712
self.assertItemsEqual([1, "2", "a", "a"], ["a", "2", True, "a"])
713
self.assertRaises(self.failureException, self.assertItemsEqual,
714
[1, 2] + [3] * 100, [1] * 100 + [2, 3])
715
self.assertRaises(self.failureException, self.assertItemsEqual,
716
[1, "2", "a", "a"], ["a", "2", True, 1])
717
self.assertRaises(self.failureException, self.assertItemsEqual,
719
self.assertRaises(self.failureException, self.assertItemsEqual,
721
self.assertRaises(self.failureException, self.assertItemsEqual,
722
[10, 11, 10], [10, 11])
724
# Test that sequences of unhashable objects can be tested for sameness:
725
self.assertItemsEqual([[1, 2], [3, 4], 0], [False, [3, 4], [1, 2]])
726
# Test that iterator of unhashable objects can be tested for sameness:
727
self.assertItemsEqual(iter([1, 2, [], 3, 4]),
728
iter([1, 2, [], 3, 4]))
730
# hashable types, but not orderable
731
self.assertRaises(self.failureException, self.assertItemsEqual,
732
[], [divmod, 'x', 1, 5j, 2j, frozenset()])
734
self.assertItemsEqual([{'a': 1}, {'b': 2}], [{'b': 2}, {'a': 1}])
735
# comparing heterogenous non-hashable sequences
736
self.assertItemsEqual([1, 'x', divmod, []], [divmod, [], 'x', 1])
737
self.assertRaises(self.failureException, self.assertItemsEqual,
738
[], [divmod, [], 'x', 1, 5j, 2j, set()])
739
self.assertRaises(self.failureException, self.assertItemsEqual,
742
# Same elements, but not same sequence length
743
self.assertRaises(self.failureException, self.assertItemsEqual,
745
self.assertRaises(self.failureException, self.assertItemsEqual,
746
[1, 1, "2", "a", "a"], ["2", "2", True, "a"])
747
self.assertRaises(self.failureException, self.assertItemsEqual,
748
[1, {'b': 2}, None, True], [{'b': 2}, True, None])
750
# Same elements which don't reliably compare, in
751
# different order, see issue 10242
754
self.assertItemsEqual(a, b)
756
# test utility functions supporting assertItemsEqual()
758
diffs = set(unittest.util._count_diff_all_purpose('aaabccd', 'abbbcce'))
759
expected = {(3,1,'a'), (1,3,'b'), (1,0,'d'), (0,1,'e')}
760
self.assertEqual(diffs, expected)
762
diffs = unittest.util._count_diff_all_purpose([[]], [])
763
self.assertEqual(diffs, [(1, 0, [])])
765
diffs = set(unittest.util._count_diff_hashable('aaabccd', 'abbbcce'))
766
expected = {(3,1,'a'), (1,3,'b'), (1,0,'d'), (0,1,'e')}
767
self.assertEqual(diffs, expected)
769
def testAssertSetEqual(self):
772
self.assertSetEqual(set1, set2)
774
self.assertRaises(self.failureException, self.assertSetEqual, None, set2)
775
self.assertRaises(self.failureException, self.assertSetEqual, [], set2)
776
self.assertRaises(self.failureException, self.assertSetEqual, set1, None)
777
self.assertRaises(self.failureException, self.assertSetEqual, set1, [])
781
self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
785
self.assertSetEqual(set1, set2)
788
set2 = set(['a', 'b'])
789
self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
792
set2 = frozenset(['a', 'b'])
793
self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
795
set1 = set(['a', 'b'])
796
set2 = frozenset(['a', 'b'])
797
self.assertSetEqual(set1, set2)
801
self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
802
self.assertRaises(self.failureException, self.assertSetEqual, set2, set1)
804
# make sure any string formatting is tuple-safe
805
set1 = set([(0, 1), (2, 3)])
807
self.assertRaises(self.failureException, self.assertSetEqual, set1, set2)
809
def testInequality(self):
811
self.assertGreater(2, 1)
812
self.assertGreaterEqual(2, 1)
813
self.assertGreaterEqual(1, 1)
814
self.assertLess(1, 2)
815
self.assertLessEqual(1, 2)
816
self.assertLessEqual(1, 1)
817
self.assertRaises(self.failureException, self.assertGreater, 1, 2)
818
self.assertRaises(self.failureException, self.assertGreater, 1, 1)
819
self.assertRaises(self.failureException, self.assertGreaterEqual, 1, 2)
820
self.assertRaises(self.failureException, self.assertLess, 2, 1)
821
self.assertRaises(self.failureException, self.assertLess, 1, 1)
822
self.assertRaises(self.failureException, self.assertLessEqual, 2, 1)
825
self.assertGreater(1.1, 1.0)
826
self.assertGreaterEqual(1.1, 1.0)
827
self.assertGreaterEqual(1.0, 1.0)
828
self.assertLess(1.0, 1.1)
829
self.assertLessEqual(1.0, 1.1)
830
self.assertLessEqual(1.0, 1.0)
831
self.assertRaises(self.failureException, self.assertGreater, 1.0, 1.1)
832
self.assertRaises(self.failureException, self.assertGreater, 1.0, 1.0)
833
self.assertRaises(self.failureException, self.assertGreaterEqual, 1.0, 1.1)
834
self.assertRaises(self.failureException, self.assertLess, 1.1, 1.0)
835
self.assertRaises(self.failureException, self.assertLess, 1.0, 1.0)
836
self.assertRaises(self.failureException, self.assertLessEqual, 1.1, 1.0)
839
self.assertGreater('bug', 'ant')
840
self.assertGreaterEqual('bug', 'ant')
841
self.assertGreaterEqual('ant', 'ant')
842
self.assertLess('ant', 'bug')
843
self.assertLessEqual('ant', 'bug')
844
self.assertLessEqual('ant', 'ant')
845
self.assertRaises(self.failureException, self.assertGreater, 'ant', 'bug')
846
self.assertRaises(self.failureException, self.assertGreater, 'ant', 'ant')
847
self.assertRaises(self.failureException, self.assertGreaterEqual, 'ant', 'bug')
848
self.assertRaises(self.failureException, self.assertLess, 'bug', 'ant')
849
self.assertRaises(self.failureException, self.assertLess, 'ant', 'ant')
850
self.assertRaises(self.failureException, self.assertLessEqual, 'bug', 'ant')
853
self.assertGreater(u'bug', u'ant')
854
self.assertGreaterEqual(u'bug', u'ant')
855
self.assertGreaterEqual(u'ant', u'ant')
856
self.assertLess(u'ant', u'bug')
857
self.assertLessEqual(u'ant', u'bug')
858
self.assertLessEqual(u'ant', u'ant')
859
self.assertRaises(self.failureException, self.assertGreater, u'ant', u'bug')
860
self.assertRaises(self.failureException, self.assertGreater, u'ant', u'ant')
861
self.assertRaises(self.failureException, self.assertGreaterEqual, u'ant',
863
self.assertRaises(self.failureException, self.assertLess, u'bug', u'ant')
864
self.assertRaises(self.failureException, self.assertLess, u'ant', u'ant')
865
self.assertRaises(self.failureException, self.assertLessEqual, u'bug', u'ant')
867
# Try Mixed String/Unicode
868
self.assertGreater('bug', u'ant')
869
self.assertGreater(u'bug', 'ant')
870
self.assertGreaterEqual('bug', u'ant')
871
self.assertGreaterEqual(u'bug', 'ant')
872
self.assertGreaterEqual('ant', u'ant')
873
self.assertGreaterEqual(u'ant', 'ant')
874
self.assertLess('ant', u'bug')
875
self.assertLess(u'ant', 'bug')
876
self.assertLessEqual('ant', u'bug')
877
self.assertLessEqual(u'ant', 'bug')
878
self.assertLessEqual('ant', u'ant')
879
self.assertLessEqual(u'ant', 'ant')
880
self.assertRaises(self.failureException, self.assertGreater, 'ant', u'bug')
881
self.assertRaises(self.failureException, self.assertGreater, u'ant', 'bug')
882
self.assertRaises(self.failureException, self.assertGreater, 'ant', u'ant')
883
self.assertRaises(self.failureException, self.assertGreater, u'ant', 'ant')
884
self.assertRaises(self.failureException, self.assertGreaterEqual, 'ant',
886
self.assertRaises(self.failureException, self.assertGreaterEqual, u'ant',
888
self.assertRaises(self.failureException, self.assertLess, 'bug', u'ant')
889
self.assertRaises(self.failureException, self.assertLess, u'bug', 'ant')
890
self.assertRaises(self.failureException, self.assertLess, 'ant', u'ant')
891
self.assertRaises(self.failureException, self.assertLess, u'ant', 'ant')
892
self.assertRaises(self.failureException, self.assertLessEqual, 'bug', u'ant')
893
self.assertRaises(self.failureException, self.assertLessEqual, u'bug', 'ant')
895
def testAssertMultiLineEqual(self):
897
http://www.python.org/doc/2.3/lib/module-unittest.html
899
A test case is the smallest unit of testing. [...]
901
revised_sample_text = b"""\
902
http://www.python.org/doc/2.4.1/lib/module-unittest.html
904
A test case is the smallest unit of testing. [...] You may provide your
905
own implementation that does not subclass from TestCase, of course.
907
sample_text_error = b"""\
908
- http://www.python.org/doc/2.3/lib/module-unittest.html
910
+ http://www.python.org/doc/2.4.1/lib/module-unittest.html
913
- A test case is the smallest unit of testing. [...]
914
+ A test case is the smallest unit of testing. [...] You may provide your
915
? +++++++++++++++++++++
916
+ own implementation that does not subclass from TestCase, of course.
919
for type_changer in (lambda x: x, lambda x: x.decode('utf8')):
921
self.assertMultiLineEqual(type_changer(sample_text),
922
type_changer(revised_sample_text))
923
except self.failureException, e:
924
# need to remove the first line of the error message
925
error = str(e).encode('utf8').split('\n', 1)[1]
927
# assertMultiLineEqual is hooked up as the default for
928
# unicode strings - so we can't use it for this check
929
self.assertTrue(sample_text_error == error)
931
def testAsertEqualSingleLine(self):
932
sample_text = u"laden swallows fly slowly"
933
revised_sample_text = u"unladen swallows fly quickly"
934
sample_text_error = """\
935
- laden swallows fly slowly
937
+ unladen swallows fly quickly
941
self.assertEqual(sample_text, revised_sample_text)
942
except self.failureException as e:
943
error = str(e).split('\n', 1)[1]
944
self.assertTrue(sample_text_error == error)
946
def testAssertIsNone(self):
947
self.assertIsNone(None)
948
self.assertRaises(self.failureException, self.assertIsNone, False)
949
self.assertIsNotNone('DjZoPloGears on Rails')
950
self.assertRaises(self.failureException, self.assertIsNotNone, None)
952
def testAssertRegexpMatches(self):
953
self.assertRegexpMatches('asdfabasdf', r'ab+')
954
self.assertRaises(self.failureException, self.assertRegexpMatches,
957
def testAssertRaisesRegexp(self):
958
class ExceptionMock(Exception):
962
raise ExceptionMock('We expect')
964
self.assertRaisesRegexp(ExceptionMock, re.compile('expect$'), Stub)
965
self.assertRaisesRegexp(ExceptionMock, 'expect$', Stub)
966
self.assertRaisesRegexp(ExceptionMock, u'expect$', Stub)
968
def testAssertNotRaisesRegexp(self):
969
self.assertRaisesRegexp(
970
self.failureException, '^Exception not raised$',
971
self.assertRaisesRegexp, Exception, re.compile('x'),
973
self.assertRaisesRegexp(
974
self.failureException, '^Exception not raised$',
975
self.assertRaisesRegexp, Exception, 'x',
977
self.assertRaisesRegexp(
978
self.failureException, '^Exception not raised$',
979
self.assertRaisesRegexp, Exception, u'x',
982
def testAssertRaisesRegexpMismatch(self):
984
raise Exception('Unexpected')
986
self.assertRaisesRegexp(
987
self.failureException,
988
r'"\^Expected\$" does not match "Unexpected"',
989
self.assertRaisesRegexp, Exception, '^Expected$',
991
self.assertRaisesRegexp(
992
self.failureException,
993
r'"\^Expected\$" does not match "Unexpected"',
994
self.assertRaisesRegexp, Exception, u'^Expected$',
996
self.assertRaisesRegexp(
997
self.failureException,
998
r'"\^Expected\$" does not match "Unexpected"',
999
self.assertRaisesRegexp, Exception,
1000
re.compile('^Expected$'), Stub)
1002
def testAssertRaisesExcValue(self):
1003
class ExceptionMock(Exception):
1007
raise ExceptionMock(foo)
1008
v = "particular value"
1010
ctx = self.assertRaises(ExceptionMock)
1014
self.assertIsInstance(e, ExceptionMock)
1015
self.assertEqual(e.args[0], v)
1017
def testSynonymAssertMethodNames(self):
1018
"""Test undocumented method name synonyms.
1020
Please do not use these methods names in your own code.
1022
This test confirms their continued existence and functionality
1023
in order to avoid breaking existing code.
1025
self.assertNotEquals(3, 5)
1026
self.assertEquals(3, 3)
1027
self.assertAlmostEquals(2.0, 2.0)
1028
self.assertNotAlmostEquals(3.0, 5.0)
1031
def testPendingDeprecationMethodNames(self):
1032
"""Test fail* methods pending deprecation, they will warn in 3.2.
1034
Do not use these methods. They will go away in 3.3.
1036
with test_support.check_warnings():
1037
self.failIfEqual(3, 5)
1038
self.failUnlessEqual(3, 3)
1039
self.failUnlessAlmostEqual(2.0, 2.0)
1040
self.failIfAlmostEqual(3.0, 5.0)
1041
self.failUnless(True)
1042
self.failUnlessRaises(TypeError, lambda _: 3.14 + u'spam')
1045
def testDeepcopy(self):
1047
class TestableTest(unittest.TestCase):
1048
def testNothing(self):
1051
test = TestableTest('testNothing')
1053
# This shouldn't blow up
1056
def testKeyboardInterrupt(self):
1057
def _raise(self=None):
1058
raise KeyboardInterrupt
1062
class Test1(unittest.TestCase):
1063
test_something = _raise
1065
class Test2(unittest.TestCase):
1067
test_something = nothing
1069
class Test3(unittest.TestCase):
1070
test_something = nothing
1073
class Test4(unittest.TestCase):
1074
def test_something(self):
1075
self.addCleanup(_raise)
1077
for klass in (Test1, Test2, Test3, Test4):
1078
with self.assertRaises(KeyboardInterrupt):
1079
klass('test_something').run()
1081
def testSystemExit(self):
1082
def _raise(self=None):
1087
class Test1(unittest.TestCase):
1088
test_something = _raise
1090
class Test2(unittest.TestCase):
1092
test_something = nothing
1094
class Test3(unittest.TestCase):
1095
test_something = nothing
1098
class Test4(unittest.TestCase):
1099
def test_something(self):
1100
self.addCleanup(_raise)
1102
for klass in (Test1, Test2, Test3, Test4):
1103
result = unittest.TestResult()
1104
klass('test_something').run(result)
1105
self.assertEqual(len(result.errors), 1)
1106
self.assertEqual(result.testsRun, 1)
1108
def testPickle(self):
1111
# Can't use TestCase classes defined in Test class as
1112
# pickle does not work with inner classes
1113
test = unittest.TestCase('run')
1114
for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1116
# blew up prior to fix
1117
pickled_test = pickle.dumps(test, protocol=protocol)
1119
unpickled_test = pickle.loads(pickled_test)
1120
self.assertEqual(test, unpickled_test)
1123
if __name__ == '__main__':