blob: 68a723ae4330d1580ca5807015042897f40a6d6d [file] [log] [blame]
Michael Foord2560e5c2010-03-27 12:34:21 +00001import unittest
2
3import warnings
4
5
6class Test_Assertions(unittest.TestCase):
7 def test_AlmostEqual(self):
8 self.assertAlmostEqual(1.00000001, 1.0)
9 self.assertNotAlmostEqual(1.0000001, 1.0)
10 self.assertRaises(self.failureException,
11 self.assertAlmostEqual, 1.0000001, 1.0)
12 self.assertRaises(self.failureException,
13 self.assertNotAlmostEqual, 1.00000001, 1.0)
14
15 self.assertAlmostEqual(1.1, 1.0, places=0)
16 self.assertRaises(self.failureException,
17 self.assertAlmostEqual, 1.1, 1.0, places=1)
18
19 self.assertAlmostEqual(0, .1+.1j, places=0)
20 self.assertNotAlmostEqual(0, .1+.1j, places=1)
21 self.assertRaises(self.failureException,
22 self.assertAlmostEqual, 0, .1+.1j, places=1)
23 self.assertRaises(self.failureException,
24 self.assertNotAlmostEqual, 0, .1+.1j, places=0)
25
26 self.assertAlmostEqual(float('inf'), float('inf'))
27 self.assertRaises(self.failureException, self.assertNotAlmostEqual,
28 float('inf'), float('inf'))
29
30
31 def test_assertRaises(self):
32 def _raise(e):
33 raise e
34 self.assertRaises(KeyError, _raise, KeyError)
35 self.assertRaises(KeyError, _raise, KeyError("key"))
36 try:
37 self.assertRaises(KeyError, lambda: None)
38 except self.failureException as e:
39 self.assertIn("KeyError not raised", str(e))
40 else:
41 self.fail("assertRaises() didn't fail")
42 try:
43 self.assertRaises(KeyError, _raise, ValueError)
44 except ValueError:
45 pass
46 else:
47 self.fail("assertRaises() didn't let exception pass through")
48 with self.assertRaises(KeyError) as cm:
49 try:
50 raise KeyError
51 except Exception as e:
52 exc = e
53 raise
54 self.assertIs(cm.exception, exc)
55
56 with self.assertRaises(KeyError):
57 raise KeyError("key")
58 try:
59 with self.assertRaises(KeyError):
60 pass
61 except self.failureException as e:
62 self.assertIn("KeyError not raised", str(e))
63 else:
64 self.fail("assertRaises() didn't fail")
65 try:
66 with self.assertRaises(KeyError):
67 raise ValueError
68 except ValueError:
69 pass
70 else:
71 self.fail("assertRaises() didn't let exception pass through")
72
73
74class TestLongMessage(unittest.TestCase):
75 """Test that the individual asserts honour longMessage.
76 This actually tests all the message behaviour for
77 asserts that use longMessage."""
78
79 def setUp(self):
80 class TestableTestFalse(unittest.TestCase):
81 longMessage = False
82 failureException = self.failureException
83
84 def testTest(self):
85 pass
86
87 class TestableTestTrue(unittest.TestCase):
88 longMessage = True
89 failureException = self.failureException
90
91 def testTest(self):
92 pass
93
94 self.testableTrue = TestableTestTrue('testTest')
95 self.testableFalse = TestableTestFalse('testTest')
96
97 def testDefault(self):
98 self.assertFalse(unittest.TestCase.longMessage)
99
100 def test_formatMsg(self):
101 self.assertEquals(self.testableFalse._formatMessage(None, "foo"), "foo")
102 self.assertEquals(self.testableFalse._formatMessage("foo", "bar"), "foo")
103
104 self.assertEquals(self.testableTrue._formatMessage(None, "foo"), "foo")
105 self.assertEquals(self.testableTrue._formatMessage("foo", "bar"), "bar : foo")
106
107 # This blows up if _formatMessage uses string concatenation
108 self.testableTrue._formatMessage(object(), 'foo')
109
110 def test_formatMessage_unicode_error(self):
111 with warnings.catch_warnings(record=True):
112 # This causes a UnicodeWarning due to its craziness
113 one = ''.join(chr(i) for i in range(255))
114 # this used to cause a UnicodeDecodeError constructing msg
115 self.testableTrue._formatMessage(one, '\uFFFD')
116
117 def assertMessages(self, methodName, args, errors):
118 def getMethod(i):
119 useTestableFalse = i < 2
120 if useTestableFalse:
121 test = self.testableFalse
122 else:
123 test = self.testableTrue
124 return getattr(test, methodName)
125
126 for i, expected_regexp in enumerate(errors):
127 testMethod = getMethod(i)
128 kwargs = {}
129 withMsg = i % 2
130 if withMsg:
131 kwargs = {"msg": "oops"}
132
133 with self.assertRaisesRegexp(self.failureException,
134 expected_regexp=expected_regexp):
135 testMethod(*args, **kwargs)
136
137 def testAssertTrue(self):
138 self.assertMessages('assertTrue', (False,),
139 ["^False is not True$", "^oops$", "^False is not True$",
140 "^False is not True : oops$"])
141
142 def testAssertFalse(self):
143 self.assertMessages('assertFalse', (True,),
144 ["^True is not False$", "^oops$", "^True is not False$",
145 "^True is not False : oops$"])
146
147 def testNotEqual(self):
148 self.assertMessages('assertNotEqual', (1, 1),
149 ["^1 == 1$", "^oops$", "^1 == 1$",
150 "^1 == 1 : oops$"])
151
152 def testAlmostEqual(self):
153 self.assertMessages('assertAlmostEqual', (1, 2),
154 ["^1 != 2 within 7 places$", "^oops$",
155 "^1 != 2 within 7 places$", "^1 != 2 within 7 places : oops$"])
156
157 def testNotAlmostEqual(self):
158 self.assertMessages('assertNotAlmostEqual', (1, 1),
159 ["^1 == 1 within 7 places$", "^oops$",
160 "^1 == 1 within 7 places$", "^1 == 1 within 7 places : oops$"])
161
162 def test_baseAssertEqual(self):
163 self.assertMessages('_baseAssertEqual', (1, 2),
164 ["^1 != 2$", "^oops$", "^1 != 2$", "^1 != 2 : oops$"])
165
166 def testAssertSequenceEqual(self):
167 # Error messages are multiline so not testing on full message
168 # assertTupleEqual and assertListEqual delegate to this method
169 self.assertMessages('assertSequenceEqual', ([], [None]),
170 ["\+ \[None\]$", "^oops$", r"\+ \[None\]$",
171 r"\+ \[None\] : oops$"])
172
173 def testAssertSetEqual(self):
174 self.assertMessages('assertSetEqual', (set(), set([None])),
175 ["None$", "^oops$", "None$",
176 "None : oops$"])
177
178 def testAssertIn(self):
179 self.assertMessages('assertIn', (None, []),
180 ['^None not found in \[\]$', "^oops$",
181 '^None not found in \[\]$',
182 '^None not found in \[\] : oops$'])
183
184 def testAssertNotIn(self):
185 self.assertMessages('assertNotIn', (None, [None]),
186 ['^None unexpectedly found in \[None\]$', "^oops$",
187 '^None unexpectedly found in \[None\]$',
188 '^None unexpectedly found in \[None\] : oops$'])
189
190 def testAssertDictEqual(self):
191 self.assertMessages('assertDictEqual', ({}, {'key': 'value'}),
192 [r"\+ \{'key': 'value'\}$", "^oops$",
193 "\+ \{'key': 'value'\}$",
194 "\+ \{'key': 'value'\} : oops$"])
195
196 def testAssertDictContainsSubset(self):
197 self.assertMessages('assertDictContainsSubset', ({'key': 'value'}, {}),
198 ["^Missing: 'key'$", "^oops$",
199 "^Missing: 'key'$",
200 "^Missing: 'key' : oops$"])
201
202 def testAssertItemsEqual(self):
203 self.assertMessages('assertItemsEqual', ([], [None]),
204 [r"\[None\]$", "^oops$",
205 r"\[None\]$",
206 r"\[None\] : oops$"])
207
208 def testAssertMultiLineEqual(self):
209 self.assertMessages('assertMultiLineEqual', ("", "foo"),
210 [r"\+ foo$", "^oops$",
211 r"\+ foo$",
212 r"\+ foo : oops$"])
213
214 def testAssertLess(self):
215 self.assertMessages('assertLess', (2, 1),
216 ["^2 not less than 1$", "^oops$",
217 "^2 not less than 1$", "^2 not less than 1 : oops$"])
218
219 def testAssertLessEqual(self):
220 self.assertMessages('assertLessEqual', (2, 1),
221 ["^2 not less than or equal to 1$", "^oops$",
222 "^2 not less than or equal to 1$",
223 "^2 not less than or equal to 1 : oops$"])
224
225 def testAssertGreater(self):
226 self.assertMessages('assertGreater', (1, 2),
227 ["^1 not greater than 2$", "^oops$",
228 "^1 not greater than 2$",
229 "^1 not greater than 2 : oops$"])
230
231 def testAssertGreaterEqual(self):
232 self.assertMessages('assertGreaterEqual', (1, 2),
233 ["^1 not greater than or equal to 2$", "^oops$",
234 "^1 not greater than or equal to 2$",
235 "^1 not greater than or equal to 2 : oops$"])
236
237 def testAssertIsNone(self):
238 self.assertMessages('assertIsNone', ('not None',),
239 ["^'not None' is not None$", "^oops$",
240 "^'not None' is not None$",
241 "^'not None' is not None : oops$"])
242
243 def testAssertIsNotNone(self):
244 self.assertMessages('assertIsNotNone', (None,),
245 ["^unexpectedly None$", "^oops$",
246 "^unexpectedly None$",
247 "^unexpectedly None : oops$"])
248
249 def testAssertIs(self):
250 self.assertMessages('assertIs', (None, 'foo'),
251 ["^None is not 'foo'$", "^oops$",
252 "^None is not 'foo'$",
253 "^None is not 'foo' : oops$"])
254
255 def testAssertIsNot(self):
256 self.assertMessages('assertIsNot', (None, None),
257 ["^unexpectedly identical: None$", "^oops$",
258 "^unexpectedly identical: None$",
259 "^unexpectedly identical: None : oops$"])