"""Unit tests for zero-argument super() & related machinery."""
+import copy
+import pickle
import textwrap
import threading
import unittest
for thread in threads:
thread.join()
+ def test_special_methods(self):
+ for e in E(), E:
+ s = super(C, e)
+ self.assertEqual(s.__reduce__, e.__reduce__)
+ self.assertEqual(s.__reduce_ex__, e.__reduce_ex__)
+ self.assertEqual(s.__getstate__, e.__getstate__)
+ self.assertFalse(hasattr(s, '__getnewargs__'))
+ self.assertFalse(hasattr(s, '__getnewargs_ex__'))
+ self.assertFalse(hasattr(s, '__setstate__'))
+ self.assertFalse(hasattr(s, '__copy__'))
+ self.assertFalse(hasattr(s, '__deepcopy__'))
+
+ def test_pickling(self):
+ e = E()
+ e.x = 1
+ s = super(C, e)
+ for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+ with self.subTest(proto=proto):
+ u = pickle.loads(pickle.dumps(s, proto))
+ self.assertEqual(u.f(), s.f())
+ self.assertIs(type(u), type(s))
+ self.assertIs(type(u.__self__), E)
+ self.assertEqual(u.__self__.x, 1)
+ self.assertIs(u.__thisclass__, C)
+ self.assertIs(u.__self_class__, E)
+
+ s = super(C, E)
+ for proto in range(pickle.HIGHEST_PROTOCOL + 1):
+ with self.subTest(proto=proto):
+ u = pickle.loads(pickle.dumps(s, proto))
+ self.assertEqual(u.cm(), s.cm())
+ self.assertEqual(u.f, s.f)
+ self.assertIs(type(u), type(s))
+ self.assertIs(u.__self__, E)
+ self.assertIs(u.__thisclass__, C)
+ self.assertIs(u.__self_class__, E)
+
+ def test_shallow_copying(self):
+ s = super(C, E())
+ self.assertIs(copy.copy(s), s)
+ s = super(C, E)
+ self.assertIs(copy.copy(s), s)
+
+ def test_deep_copying(self):
+ e = E()
+ e.x = [1]
+ s = super(C, e)
+ u = copy.deepcopy(s)
+ self.assertEqual(u.f(), s.f())
+ self.assertIs(type(u), type(s))
+ self.assertIsNot(u, s)
+ self.assertIs(type(u.__self__), E)
+ self.assertIsNot(u.__self__, e)
+ self.assertIsNot(u.__self__.x, e.x)
+ self.assertEqual(u.__self__.x, [1])
+ self.assertIs(u.__thisclass__, C)
+ self.assertIs(u.__self_class__, E)
+
+ s = super(C, E)
+ u = copy.deepcopy(s)
+ self.assertEqual(u.cm(), s.cm())
+ self.assertEqual(u.f, s.f)
+ self.assertIsNot(u, s)
+ self.assertIs(type(u), type(s))
+ self.assertIs(u.__self__, E)
+ self.assertIs(u.__thisclass__, C)
+ self.assertIs(u.__self_class__, E)
+
if __name__ == "__main__":
unittest.main()