Changeset 391 for python/trunk/Lib/test/test_functools.py
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Lib/test/test_functools.py
r2 r391 1 1 import functools 2 import sys 2 3 import unittest 3 4 from test import test_support 4 5 from weakref import proxy 6 import pickle 5 7 6 8 @staticmethod … … 19 21 """capture all positional and keyword arguments""" 20 22 return args, kw 23 24 def signature(part): 25 """ return the signature of a partial object """ 26 return (part.func, part.args, part.keywords, part.__dict__) 21 27 22 28 class TestPartial(unittest.TestCase): … … 100 106 expected = args + ('x',) 101 107 got, empty = p('x') 102 self. failUnless(expected == got and empty == {})108 self.assertTrue(expected == got and empty == {}) 103 109 104 110 def test_keyword(self): … … 108 114 expected = {'a':a,'x':None} 109 115 empty, got = p(x=None) 110 self. failUnless(expected == got and empty == ())116 self.assertTrue(expected == got and empty == ()) 111 117 112 118 def test_no_side_effects(self): … … 114 120 p = self.thetype(capture, 0, a=1) 115 121 args1, kw1 = p(1, b=2) 116 self. failUnless(args1 == (0,1) and kw1 == {'a':1,'b':2})122 self.assertTrue(args1 == (0,1) and kw1 == {'a':1,'b':2}) 117 123 args2, kw2 = p() 118 self. failUnless(args2 == (0,) and kw2 == {'a':1})124 self.assertTrue(args2 == (0,) and kw2 == {'a':1}) 119 125 120 126 def test_error_propagation(self): 121 127 def f(x, y): 122 x / y128 x // y 123 129 self.assertRaises(ZeroDivisionError, self.thetype(f, 1, 0)) 124 130 self.assertRaises(ZeroDivisionError, self.thetype(f, 1), 0) … … 140 146 self.assertEqual(join(data), '0123456789') 141 147 148 def test_pickle(self): 149 f = self.thetype(signature, 'asdf', bar=True) 150 f.add_something_to__dict__ = True 151 f_copy = pickle.loads(pickle.dumps(f)) 152 self.assertEqual(signature(f), signature(f_copy)) 153 154 # Issue 6083: Reference counting bug 155 def test_setstate_refcount(self): 156 class BadSequence: 157 def __len__(self): 158 return 4 159 def __getitem__(self, key): 160 if key == 0: 161 return max 162 elif key == 1: 163 return tuple(range(1000000)) 164 elif key in (2, 3): 165 return {} 166 raise IndexError 167 168 f = self.thetype(object) 169 self.assertRaises(SystemError, f.__setstate__, BadSequence()) 170 142 171 class PartialSubclass(functools.partial): 143 172 pass … … 147 176 thetype = PartialSubclass 148 177 149 150 178 class TestPythonPartial(TestPartial): 151 179 152 180 thetype = PythonPartial 181 182 # the python version isn't picklable 183 def test_pickle(self): pass 184 def test_setstate_refcount(self): pass 153 185 154 186 class TestUpdateWrapper(unittest.TestCase): … … 159 191 # Check attributes were assigned 160 192 for name in assigned: 161 self. failUnless(getattr(wrapper, name) is getattr(wrapped, name))193 self.assertTrue(getattr(wrapper, name) is getattr(wrapped, name)) 162 194 # Check attributes were updated 163 195 for name in updated: … … 165 197 wrapped_attr = getattr(wrapped, name) 166 198 for key in wrapped_attr: 167 self.failUnless(wrapped_attr[key] is wrapper_attr[key]) 199 self.assertTrue(wrapped_attr[key] is wrapper_attr[key]) 200 201 def _default_update(self): 202 def f(): 203 """This is a test""" 204 pass 205 f.attr = 'This is also a test' 206 def wrapper(): 207 pass 208 functools.update_wrapper(wrapper, f) 209 return wrapper, f 168 210 169 211 def test_default_update(self): 170 def f(): 171 """This is a test""" 172 pass 173 f.attr = 'This is also a test' 174 def wrapper(): 175 pass 176 functools.update_wrapper(wrapper, f) 212 wrapper, f = self._default_update() 177 213 self.check_wrapper(wrapper, f) 178 214 self.assertEqual(wrapper.__name__, 'f') 215 self.assertEqual(wrapper.attr, 'This is also a test') 216 217 @unittest.skipIf(sys.flags.optimize >= 2, 218 "Docstrings are omitted with -O2 and above") 219 def test_default_update_doc(self): 220 wrapper, f = self._default_update() 179 221 self.assertEqual(wrapper.__doc__, 'This is a test') 180 self.assertEqual(wrapper.attr, 'This is also a test')181 222 182 223 def test_no_update(self): … … 191 232 self.assertEqual(wrapper.__name__, 'wrapper') 192 233 self.assertEqual(wrapper.__doc__, None) 193 self. failIf(hasattr(wrapper, 'attr'))234 self.assertFalse(hasattr(wrapper, 'attr')) 194 235 195 236 def test_selective_update(self): … … 210 251 self.assertEqual(wrapper.dict_attr, f.dict_attr) 211 252 253 @test_support.requires_docstrings 212 254 def test_builtin_update(self): 213 255 # Test for bug #1576241 … … 216 258 functools.update_wrapper(wrapper, max) 217 259 self.assertEqual(wrapper.__name__, 'max') 218 self.assert _(wrapper.__doc__.startswith('max('))260 self.assertTrue(wrapper.__doc__.startswith('max(')) 219 261 220 262 class TestWraps(TestUpdateWrapper): 221 263 222 def test_default_update(self):264 def _default_update(self): 223 265 def f(): 224 266 """This is a test""" … … 229 271 pass 230 272 self.check_wrapper(wrapper, f) 273 return wrapper 274 275 def test_default_update(self): 276 wrapper = self._default_update() 231 277 self.assertEqual(wrapper.__name__, 'f') 278 self.assertEqual(wrapper.attr, 'This is also a test') 279 280 @unittest.skipIf(sys.flags.optimize >= 2, 281 "Docstrings are omitted with -O2 and above") 282 def test_default_update_doc(self): 283 wrapper = self._default_update() 232 284 self.assertEqual(wrapper.__doc__, 'This is a test') 233 self.assertEqual(wrapper.attr, 'This is also a test')234 285 235 286 def test_no_update(self): … … 244 295 self.assertEqual(wrapper.__name__, 'wrapper') 245 296 self.assertEqual(wrapper.__doc__, None) 246 self. failIf(hasattr(wrapper, 'attr'))297 self.assertFalse(hasattr(wrapper, 'attr')) 247 298 248 299 def test_selective_update(self): … … 307 358 self.assertRaises(TypeError, reduce, 42, (42, 42)) 308 359 309 310 360 class TestCmpToKey(unittest.TestCase): 361 def test_cmp_to_key(self): 362 def mycmp(x, y): 363 return y - x 364 self.assertEqual(sorted(range(5), key=functools.cmp_to_key(mycmp)), 365 [4, 3, 2, 1, 0]) 366 367 def test_hash(self): 368 def mycmp(x, y): 369 return y - x 370 key = functools.cmp_to_key(mycmp) 371 k = key(10) 372 self.assertRaises(TypeError, hash(k)) 373 374 class TestTotalOrdering(unittest.TestCase): 375 376 def test_total_ordering_lt(self): 377 @functools.total_ordering 378 class A: 379 def __init__(self, value): 380 self.value = value 381 def __lt__(self, other): 382 return self.value < other.value 383 def __eq__(self, other): 384 return self.value == other.value 385 self.assertTrue(A(1) < A(2)) 386 self.assertTrue(A(2) > A(1)) 387 self.assertTrue(A(1) <= A(2)) 388 self.assertTrue(A(2) >= A(1)) 389 self.assertTrue(A(2) <= A(2)) 390 self.assertTrue(A(2) >= A(2)) 391 392 def test_total_ordering_le(self): 393 @functools.total_ordering 394 class A: 395 def __init__(self, value): 396 self.value = value 397 def __le__(self, other): 398 return self.value <= other.value 399 def __eq__(self, other): 400 return self.value == other.value 401 self.assertTrue(A(1) < A(2)) 402 self.assertTrue(A(2) > A(1)) 403 self.assertTrue(A(1) <= A(2)) 404 self.assertTrue(A(2) >= A(1)) 405 self.assertTrue(A(2) <= A(2)) 406 self.assertTrue(A(2) >= A(2)) 407 408 def test_total_ordering_gt(self): 409 @functools.total_ordering 410 class A: 411 def __init__(self, value): 412 self.value = value 413 def __gt__(self, other): 414 return self.value > other.value 415 def __eq__(self, other): 416 return self.value == other.value 417 self.assertTrue(A(1) < A(2)) 418 self.assertTrue(A(2) > A(1)) 419 self.assertTrue(A(1) <= A(2)) 420 self.assertTrue(A(2) >= A(1)) 421 self.assertTrue(A(2) <= A(2)) 422 self.assertTrue(A(2) >= A(2)) 423 424 def test_total_ordering_ge(self): 425 @functools.total_ordering 426 class A: 427 def __init__(self, value): 428 self.value = value 429 def __ge__(self, other): 430 return self.value >= other.value 431 def __eq__(self, other): 432 return self.value == other.value 433 self.assertTrue(A(1) < A(2)) 434 self.assertTrue(A(2) > A(1)) 435 self.assertTrue(A(1) <= A(2)) 436 self.assertTrue(A(2) >= A(1)) 437 self.assertTrue(A(2) <= A(2)) 438 self.assertTrue(A(2) >= A(2)) 439 440 def test_total_ordering_no_overwrite(self): 441 # new methods should not overwrite existing 442 @functools.total_ordering 443 class A(str): 444 pass 445 self.assertTrue(A("a") < A("b")) 446 self.assertTrue(A("b") > A("a")) 447 self.assertTrue(A("a") <= A("b")) 448 self.assertTrue(A("b") >= A("a")) 449 self.assertTrue(A("b") <= A("b")) 450 self.assertTrue(A("b") >= A("b")) 451 452 def test_no_operations_defined(self): 453 with self.assertRaises(ValueError): 454 @functools.total_ordering 455 class A: 456 pass 457 458 def test_bug_10042(self): 459 @functools.total_ordering 460 class TestTO: 461 def __init__(self, value): 462 self.value = value 463 def __eq__(self, other): 464 if isinstance(other, TestTO): 465 return self.value == other.value 466 return False 467 def __lt__(self, other): 468 if isinstance(other, TestTO): 469 return self.value < other.value 470 raise TypeError 471 with self.assertRaises(TypeError): 472 TestTO(8) <= () 311 473 312 474 def test_main(verbose=None): 313 import sys314 475 test_classes = ( 315 476 TestPartial, … … 317 478 TestPythonPartial, 318 479 TestUpdateWrapper, 480 TestTotalOrdering, 319 481 TestWraps, 320 482 TestReduce,
Note:
See TracChangeset
for help on using the changeset viewer.