| Guido van Rossum | 4bb1e36 | 2001-09-28 23:49:48 +0000 | [diff] [blame] | 1 | # Test enhancements related to descriptors and new-style classes | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 2 |  | 
| Barry Warsaw | 04f357c | 2002-07-23 19:04:11 +0000 | [diff] [blame] | 3 | from test.test_support import verify, vereq, verbose, TestFailed, TESTFN | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 4 | from copy import deepcopy | 
| Tim Peters | 4d9b466 | 2002-04-16 01:59:17 +0000 | [diff] [blame] | 5 | import warnings | 
 | 6 |  | 
 | 7 | warnings.filterwarnings("ignore", | 
 | 8 |          r'complex divmod\(\), // and % are deprecated$', | 
| Guido van Rossum | 155a34d | 2002-06-03 19:45:32 +0000 | [diff] [blame] | 9 |          DeprecationWarning, r'(<string>|%s)$' % __name__) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 10 |  | 
| Guido van Rossum | 875eeaa | 2001-10-11 18:33:53 +0000 | [diff] [blame] | 11 | def veris(a, b): | 
 | 12 |     if a is not b: | 
 | 13 |         raise TestFailed, "%r is %r" % (a, b) | 
 | 14 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 15 | def testunop(a, res, expr="len(a)", meth="__len__"): | 
 | 16 |     if verbose: print "checking", expr | 
 | 17 |     dict = {'a': a} | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 18 |     vereq(eval(expr, dict), res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 19 |     t = type(a) | 
 | 20 |     m = getattr(t, meth) | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 21 |     while meth not in t.__dict__: | 
 | 22 |         t = t.__bases__[0] | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 23 |     vereq(m, t.__dict__[meth]) | 
 | 24 |     vereq(m(a), res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 25 |     bm = getattr(a, meth) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 26 |     vereq(bm(), res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 27 |  | 
 | 28 | def testbinop(a, b, res, expr="a+b", meth="__add__"): | 
 | 29 |     if verbose: print "checking", expr | 
 | 30 |     dict = {'a': a, 'b': b} | 
| Tim Peters | 3caca23 | 2001-12-06 06:23:26 +0000 | [diff] [blame] | 31 |  | 
 | 32 |     # XXX Hack so this passes before 2.3 when -Qnew is specified. | 
 | 33 |     if meth == "__div__" and 1/2 == 0.5: | 
 | 34 |         meth = "__truediv__" | 
 | 35 |  | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 36 |     vereq(eval(expr, dict), res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 37 |     t = type(a) | 
 | 38 |     m = getattr(t, meth) | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 39 |     while meth not in t.__dict__: | 
 | 40 |         t = t.__bases__[0] | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 41 |     vereq(m, t.__dict__[meth]) | 
 | 42 |     vereq(m(a, b), res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 43 |     bm = getattr(a, meth) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 44 |     vereq(bm(b), res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 45 |  | 
 | 46 | def testternop(a, b, c, res, expr="a[b:c]", meth="__getslice__"): | 
 | 47 |     if verbose: print "checking", expr | 
 | 48 |     dict = {'a': a, 'b': b, 'c': c} | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 49 |     vereq(eval(expr, dict), res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 50 |     t = type(a) | 
 | 51 |     m = getattr(t, meth) | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 52 |     while meth not in t.__dict__: | 
 | 53 |         t = t.__bases__[0] | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 54 |     vereq(m, t.__dict__[meth]) | 
 | 55 |     vereq(m(a, b, c), res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 56 |     bm = getattr(a, meth) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 57 |     vereq(bm(b, c), res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 58 |  | 
 | 59 | def testsetop(a, b, res, stmt="a+=b", meth="__iadd__"): | 
 | 60 |     if verbose: print "checking", stmt | 
 | 61 |     dict = {'a': deepcopy(a), 'b': b} | 
 | 62 |     exec stmt in dict | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 63 |     vereq(dict['a'], res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 64 |     t = type(a) | 
 | 65 |     m = getattr(t, meth) | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 66 |     while meth not in t.__dict__: | 
 | 67 |         t = t.__bases__[0] | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 68 |     vereq(m, t.__dict__[meth]) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 69 |     dict['a'] = deepcopy(a) | 
 | 70 |     m(dict['a'], b) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 71 |     vereq(dict['a'], res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 72 |     dict['a'] = deepcopy(a) | 
 | 73 |     bm = getattr(dict['a'], meth) | 
 | 74 |     bm(b) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 75 |     vereq(dict['a'], res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 76 |  | 
 | 77 | def testset2op(a, b, c, res, stmt="a[b]=c", meth="__setitem__"): | 
 | 78 |     if verbose: print "checking", stmt | 
 | 79 |     dict = {'a': deepcopy(a), 'b': b, 'c': c} | 
 | 80 |     exec stmt in dict | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 81 |     vereq(dict['a'], res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 82 |     t = type(a) | 
 | 83 |     m = getattr(t, meth) | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 84 |     while meth not in t.__dict__: | 
 | 85 |         t = t.__bases__[0] | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 86 |     vereq(m, t.__dict__[meth]) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 87 |     dict['a'] = deepcopy(a) | 
 | 88 |     m(dict['a'], b, c) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 89 |     vereq(dict['a'], res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 90 |     dict['a'] = deepcopy(a) | 
 | 91 |     bm = getattr(dict['a'], meth) | 
 | 92 |     bm(b, c) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 93 |     vereq(dict['a'], res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 94 |  | 
 | 95 | def testset3op(a, b, c, d, res, stmt="a[b:c]=d", meth="__setslice__"): | 
 | 96 |     if verbose: print "checking", stmt | 
 | 97 |     dict = {'a': deepcopy(a), 'b': b, 'c': c, 'd': d} | 
 | 98 |     exec stmt in dict | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 99 |     vereq(dict['a'], res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 100 |     t = type(a) | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 101 |     while meth not in t.__dict__: | 
 | 102 |         t = t.__bases__[0] | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 103 |     m = getattr(t, meth) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 104 |     vereq(m, t.__dict__[meth]) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 105 |     dict['a'] = deepcopy(a) | 
 | 106 |     m(dict['a'], b, c, d) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 107 |     vereq(dict['a'], res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 108 |     dict['a'] = deepcopy(a) | 
 | 109 |     bm = getattr(dict['a'], meth) | 
 | 110 |     bm(b, c, d) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 111 |     vereq(dict['a'], res) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 112 |  | 
| Tim Peters | 2f93e28 | 2001-10-04 05:27:00 +0000 | [diff] [blame] | 113 | def class_docstrings(): | 
 | 114 |     class Classic: | 
 | 115 |         "A classic docstring." | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 116 |     vereq(Classic.__doc__, "A classic docstring.") | 
 | 117 |     vereq(Classic.__dict__['__doc__'], "A classic docstring.") | 
| Tim Peters | 2f93e28 | 2001-10-04 05:27:00 +0000 | [diff] [blame] | 118 |  | 
 | 119 |     class Classic2: | 
 | 120 |         pass | 
 | 121 |     verify(Classic2.__doc__ is None) | 
 | 122 |  | 
| Tim Peters | 4fb1fe8 | 2001-10-04 05:48:13 +0000 | [diff] [blame] | 123 |     class NewStatic(object): | 
| Tim Peters | 2f93e28 | 2001-10-04 05:27:00 +0000 | [diff] [blame] | 124 |         "Another docstring." | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 125 |     vereq(NewStatic.__doc__, "Another docstring.") | 
 | 126 |     vereq(NewStatic.__dict__['__doc__'], "Another docstring.") | 
| Tim Peters | 2f93e28 | 2001-10-04 05:27:00 +0000 | [diff] [blame] | 127 |  | 
| Tim Peters | 4fb1fe8 | 2001-10-04 05:48:13 +0000 | [diff] [blame] | 128 |     class NewStatic2(object): | 
| Tim Peters | 2f93e28 | 2001-10-04 05:27:00 +0000 | [diff] [blame] | 129 |         pass | 
 | 130 |     verify(NewStatic2.__doc__ is None) | 
 | 131 |  | 
| Tim Peters | 4fb1fe8 | 2001-10-04 05:48:13 +0000 | [diff] [blame] | 132 |     class NewDynamic(object): | 
| Tim Peters | 2f93e28 | 2001-10-04 05:27:00 +0000 | [diff] [blame] | 133 |         "Another docstring." | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 134 |     vereq(NewDynamic.__doc__, "Another docstring.") | 
 | 135 |     vereq(NewDynamic.__dict__['__doc__'], "Another docstring.") | 
| Tim Peters | 2f93e28 | 2001-10-04 05:27:00 +0000 | [diff] [blame] | 136 |  | 
| Tim Peters | 4fb1fe8 | 2001-10-04 05:48:13 +0000 | [diff] [blame] | 137 |     class NewDynamic2(object): | 
| Tim Peters | 2f93e28 | 2001-10-04 05:27:00 +0000 | [diff] [blame] | 138 |         pass | 
 | 139 |     verify(NewDynamic2.__doc__ is None) | 
 | 140 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 141 | def lists(): | 
 | 142 |     if verbose: print "Testing list operations..." | 
 | 143 |     testbinop([1], [2], [1,2], "a+b", "__add__") | 
 | 144 |     testbinop([1,2,3], 2, 1, "b in a", "__contains__") | 
 | 145 |     testbinop([1,2,3], 4, 0, "b in a", "__contains__") | 
 | 146 |     testbinop([1,2,3], 1, 2, "a[b]", "__getitem__") | 
 | 147 |     testternop([1,2,3], 0, 2, [1,2], "a[b:c]", "__getslice__") | 
 | 148 |     testsetop([1], [2], [1,2], "a+=b", "__iadd__") | 
 | 149 |     testsetop([1,2], 3, [1,2,1,2,1,2], "a*=b", "__imul__") | 
 | 150 |     testunop([1,2,3], 3, "len(a)", "__len__") | 
 | 151 |     testbinop([1,2], 3, [1,2,1,2,1,2], "a*b", "__mul__") | 
 | 152 |     testbinop([1,2], 3, [1,2,1,2,1,2], "b*a", "__rmul__") | 
 | 153 |     testset2op([1,2], 1, 3, [1,3], "a[b]=c", "__setitem__") | 
 | 154 |     testset3op([1,2,3,4], 1, 3, [5,6], [1,5,6,4], "a[b:c]=d", "__setslice__") | 
 | 155 |  | 
 | 156 | def dicts(): | 
 | 157 |     if verbose: print "Testing dict operations..." | 
 | 158 |     testbinop({1:2}, {2:1}, -1, "cmp(a,b)", "__cmp__") | 
 | 159 |     testbinop({1:2,3:4}, 1, 1, "b in a", "__contains__") | 
 | 160 |     testbinop({1:2,3:4}, 2, 0, "b in a", "__contains__") | 
 | 161 |     testbinop({1:2,3:4}, 1, 2, "a[b]", "__getitem__") | 
 | 162 |     d = {1:2,3:4} | 
 | 163 |     l1 = [] | 
 | 164 |     for i in d.keys(): l1.append(i) | 
 | 165 |     l = [] | 
 | 166 |     for i in iter(d): l.append(i) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 167 |     vereq(l, l1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 168 |     l = [] | 
 | 169 |     for i in d.__iter__(): l.append(i) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 170 |     vereq(l, l1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 171 |     l = [] | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 172 |     for i in dict.__iter__(d): l.append(i) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 173 |     vereq(l, l1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 174 |     d = {1:2, 3:4} | 
 | 175 |     testunop(d, 2, "len(a)", "__len__") | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 176 |     vereq(eval(repr(d), {}), d) | 
 | 177 |     vereq(eval(d.__repr__(), {}), d) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 178 |     testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__") | 
 | 179 |  | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 180 | def dict_constructor(): | 
 | 181 |     if verbose: | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 182 |         print "Testing dict constructor ..." | 
 | 183 |     d = dict() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 184 |     vereq(d, {}) | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 185 |     d = dict({}) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 186 |     vereq(d, {}) | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 187 |     d = dict({1: 2, 'a': 'b'}) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 188 |     vereq(d, {1: 2, 'a': 'b'}) | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 189 |     vereq(d, dict(d.items())) | 
| Just van Rossum | a797d81 | 2002-11-23 09:45:04 +0000 | [diff] [blame] | 190 |     vereq(d, dict(d.iteritems())) | 
 | 191 |     d = dict({'one':1, 'two':2}) | 
 | 192 |     vereq(d, dict(one=1, two=2)) | 
 | 193 |     vereq(d, dict(**d)) | 
 | 194 |     vereq(d, dict({"one": 1}, two=2)) | 
 | 195 |     vereq(d, dict([("two", 2)], one=1)) | 
 | 196 |     vereq(d, dict([("one", 100), ("two", 200)], **d)) | 
 | 197 |     verify(d is not dict(**d)) | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 198 |     for badarg in 0, 0L, 0j, "0", [0], (0,): | 
 | 199 |         try: | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 200 |             dict(badarg) | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 201 |         except TypeError: | 
 | 202 |             pass | 
| Tim Peters | 1fc240e | 2001-10-26 05:06:50 +0000 | [diff] [blame] | 203 |         except ValueError: | 
 | 204 |             if badarg == "0": | 
 | 205 |                 # It's a sequence, and its elements are also sequences (gotta | 
 | 206 |                 # love strings <wink>), but they aren't of length 2, so this | 
 | 207 |                 # one seemed better as a ValueError than a TypeError. | 
 | 208 |                 pass | 
 | 209 |             else: | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 210 |                 raise TestFailed("no TypeError from dict(%r)" % badarg) | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 211 |         else: | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 212 |             raise TestFailed("no TypeError from dict(%r)" % badarg) | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 213 |  | 
 | 214 |     try: | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 215 |         dict({}, {}) | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 216 |     except TypeError: | 
 | 217 |         pass | 
 | 218 |     else: | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 219 |         raise TestFailed("no TypeError from dict({}, {})") | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 220 |  | 
 | 221 |     class Mapping: | 
| Tim Peters | 1fc240e | 2001-10-26 05:06:50 +0000 | [diff] [blame] | 222 |         # Lacks a .keys() method; will be added later. | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 223 |         dict = {1:2, 3:4, 'a':1j} | 
 | 224 |  | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 225 |     try: | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 226 |         dict(Mapping()) | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 227 |     except TypeError: | 
 | 228 |         pass | 
 | 229 |     else: | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 230 |         raise TestFailed("no TypeError from dict(incomplete mapping)") | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 231 |  | 
 | 232 |     Mapping.keys = lambda self: self.dict.keys() | 
| Tim Peters | 1fc240e | 2001-10-26 05:06:50 +0000 | [diff] [blame] | 233 |     Mapping.__getitem__ = lambda self, i: self.dict[i] | 
| Just van Rossum | a797d81 | 2002-11-23 09:45:04 +0000 | [diff] [blame] | 234 |     d = dict(Mapping()) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 235 |     vereq(d, Mapping.dict) | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 236 |  | 
| Tim Peters | 1fc240e | 2001-10-26 05:06:50 +0000 | [diff] [blame] | 237 |     # Init from sequence of iterable objects, each producing a 2-sequence. | 
 | 238 |     class AddressBookEntry: | 
 | 239 |         def __init__(self, first, last): | 
 | 240 |             self.first = first | 
 | 241 |             self.last = last | 
 | 242 |         def __iter__(self): | 
 | 243 |             return iter([self.first, self.last]) | 
 | 244 |  | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 245 |     d = dict([AddressBookEntry('Tim', 'Warsaw'), | 
| Tim Peters | fe677e2 | 2001-10-30 05:41:07 +0000 | [diff] [blame] | 246 |               AddressBookEntry('Barry', 'Peters'), | 
 | 247 |               AddressBookEntry('Tim', 'Peters'), | 
 | 248 |               AddressBookEntry('Barry', 'Warsaw')]) | 
| Tim Peters | 1fc240e | 2001-10-26 05:06:50 +0000 | [diff] [blame] | 249 |     vereq(d, {'Barry': 'Warsaw', 'Tim': 'Peters'}) | 
 | 250 |  | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 251 |     d = dict(zip(range(4), range(1, 5))) | 
 | 252 |     vereq(d, dict([(i, i+1) for i in range(4)])) | 
| Tim Peters | 1fc240e | 2001-10-26 05:06:50 +0000 | [diff] [blame] | 253 |  | 
 | 254 |     # Bad sequence lengths. | 
| Tim Peters | 9fda73c | 2001-10-26 20:57:38 +0000 | [diff] [blame] | 255 |     for bad in [('tooshort',)], [('too', 'long', 'by 1')]: | 
| Tim Peters | 1fc240e | 2001-10-26 05:06:50 +0000 | [diff] [blame] | 256 |         try: | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 257 |             dict(bad) | 
| Tim Peters | 1fc240e | 2001-10-26 05:06:50 +0000 | [diff] [blame] | 258 |         except ValueError: | 
 | 259 |             pass | 
 | 260 |         else: | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 261 |             raise TestFailed("no ValueError from dict(%r)" % bad) | 
| Tim Peters | 1fc240e | 2001-10-26 05:06:50 +0000 | [diff] [blame] | 262 |  | 
| Tim Peters | 5d2b77c | 2001-09-03 05:47:38 +0000 | [diff] [blame] | 263 | def test_dir(): | 
 | 264 |     if verbose: | 
 | 265 |         print "Testing dir() ..." | 
 | 266 |     junk = 12 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 267 |     vereq(dir(), ['junk']) | 
| Tim Peters | 5d2b77c | 2001-09-03 05:47:38 +0000 | [diff] [blame] | 268 |     del junk | 
 | 269 |  | 
 | 270 |     # Just make sure these don't blow up! | 
 | 271 |     for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir: | 
 | 272 |         dir(arg) | 
 | 273 |  | 
| Tim Peters | 37a309d | 2001-09-04 01:20:04 +0000 | [diff] [blame] | 274 |     # Try classic classes. | 
| Tim Peters | 5d2b77c | 2001-09-03 05:47:38 +0000 | [diff] [blame] | 275 |     class C: | 
 | 276 |         Cdata = 1 | 
 | 277 |         def Cmethod(self): pass | 
 | 278 |  | 
 | 279 |     cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__'] | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 280 |     vereq(dir(C), cstuff) | 
| Tim Peters | 305b585 | 2001-09-17 02:38:46 +0000 | [diff] [blame] | 281 |     verify('im_self' in dir(C.Cmethod)) | 
| Tim Peters | 5d2b77c | 2001-09-03 05:47:38 +0000 | [diff] [blame] | 282 |  | 
 | 283 |     c = C()  # c.__doc__ is an odd thing to see here; ditto c.__module__. | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 284 |     vereq(dir(c), cstuff) | 
| Tim Peters | 5d2b77c | 2001-09-03 05:47:38 +0000 | [diff] [blame] | 285 |  | 
 | 286 |     c.cdata = 2 | 
 | 287 |     c.cmethod = lambda self: 0 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 288 |     vereq(dir(c), cstuff + ['cdata', 'cmethod']) | 
| Tim Peters | 305b585 | 2001-09-17 02:38:46 +0000 | [diff] [blame] | 289 |     verify('im_self' in dir(c.Cmethod)) | 
| Tim Peters | 5d2b77c | 2001-09-03 05:47:38 +0000 | [diff] [blame] | 290 |  | 
 | 291 |     class A(C): | 
 | 292 |         Adata = 1 | 
 | 293 |         def Amethod(self): pass | 
| Tim Peters | 5d2b77c | 2001-09-03 05:47:38 +0000 | [diff] [blame] | 294 |  | 
| Tim Peters | 37a309d | 2001-09-04 01:20:04 +0000 | [diff] [blame] | 295 |     astuff = ['Adata', 'Amethod'] + cstuff | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 296 |     vereq(dir(A), astuff) | 
| Tim Peters | 305b585 | 2001-09-17 02:38:46 +0000 | [diff] [blame] | 297 |     verify('im_self' in dir(A.Amethod)) | 
| Tim Peters | 37a309d | 2001-09-04 01:20:04 +0000 | [diff] [blame] | 298 |     a = A() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 299 |     vereq(dir(a), astuff) | 
| Tim Peters | 305b585 | 2001-09-17 02:38:46 +0000 | [diff] [blame] | 300 |     verify('im_self' in dir(a.Amethod)) | 
| Tim Peters | 37a309d | 2001-09-04 01:20:04 +0000 | [diff] [blame] | 301 |     a.adata = 42 | 
 | 302 |     a.amethod = lambda self: 3 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 303 |     vereq(dir(a), astuff + ['adata', 'amethod']) | 
| Tim Peters | 37a309d | 2001-09-04 01:20:04 +0000 | [diff] [blame] | 304 |  | 
 | 305 |     # The same, but with new-style classes.  Since these have object as a | 
 | 306 |     # base class, a lot more gets sucked in. | 
 | 307 |     def interesting(strings): | 
 | 308 |         return [s for s in strings if not s.startswith('_')] | 
 | 309 |  | 
| Tim Peters | 5d2b77c | 2001-09-03 05:47:38 +0000 | [diff] [blame] | 310 |     class C(object): | 
 | 311 |         Cdata = 1 | 
 | 312 |         def Cmethod(self): pass | 
| Tim Peters | 37a309d | 2001-09-04 01:20:04 +0000 | [diff] [blame] | 313 |  | 
 | 314 |     cstuff = ['Cdata', 'Cmethod'] | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 315 |     vereq(interesting(dir(C)), cstuff) | 
| Tim Peters | 37a309d | 2001-09-04 01:20:04 +0000 | [diff] [blame] | 316 |  | 
 | 317 |     c = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 318 |     vereq(interesting(dir(c)), cstuff) | 
| Tim Peters | 305b585 | 2001-09-17 02:38:46 +0000 | [diff] [blame] | 319 |     verify('im_self' in dir(C.Cmethod)) | 
| Tim Peters | 37a309d | 2001-09-04 01:20:04 +0000 | [diff] [blame] | 320 |  | 
 | 321 |     c.cdata = 2 | 
 | 322 |     c.cmethod = lambda self: 0 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 323 |     vereq(interesting(dir(c)), cstuff + ['cdata', 'cmethod']) | 
| Tim Peters | 305b585 | 2001-09-17 02:38:46 +0000 | [diff] [blame] | 324 |     verify('im_self' in dir(c.Cmethod)) | 
| Tim Peters | 37a309d | 2001-09-04 01:20:04 +0000 | [diff] [blame] | 325 |  | 
| Tim Peters | 5d2b77c | 2001-09-03 05:47:38 +0000 | [diff] [blame] | 326 |     class A(C): | 
 | 327 |         Adata = 1 | 
 | 328 |         def Amethod(self): pass | 
| Tim Peters | 37a309d | 2001-09-04 01:20:04 +0000 | [diff] [blame] | 329 |  | 
 | 330 |     astuff = ['Adata', 'Amethod'] + cstuff | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 331 |     vereq(interesting(dir(A)), astuff) | 
| Tim Peters | 305b585 | 2001-09-17 02:38:46 +0000 | [diff] [blame] | 332 |     verify('im_self' in dir(A.Amethod)) | 
| Tim Peters | 37a309d | 2001-09-04 01:20:04 +0000 | [diff] [blame] | 333 |     a = A() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 334 |     vereq(interesting(dir(a)), astuff) | 
| Tim Peters | 37a309d | 2001-09-04 01:20:04 +0000 | [diff] [blame] | 335 |     a.adata = 42 | 
 | 336 |     a.amethod = lambda self: 3 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 337 |     vereq(interesting(dir(a)), astuff + ['adata', 'amethod']) | 
| Tim Peters | 305b585 | 2001-09-17 02:38:46 +0000 | [diff] [blame] | 338 |     verify('im_self' in dir(a.Amethod)) | 
| Tim Peters | 5d2b77c | 2001-09-03 05:47:38 +0000 | [diff] [blame] | 339 |  | 
| Tim Peters | caaff8d | 2001-09-10 23:12:14 +0000 | [diff] [blame] | 340 |     # Try a module subclass. | 
 | 341 |     import sys | 
 | 342 |     class M(type(sys)): | 
 | 343 |         pass | 
| Guido van Rossum | 1bdd9b0 | 2002-06-04 06:10:37 +0000 | [diff] [blame] | 344 |     minstance = M("m") | 
| Tim Peters | caaff8d | 2001-09-10 23:12:14 +0000 | [diff] [blame] | 345 |     minstance.b = 2 | 
 | 346 |     minstance.a = 1 | 
| Guido van Rossum | 1bdd9b0 | 2002-06-04 06:10:37 +0000 | [diff] [blame] | 347 |     names = [x for x in dir(minstance) if x not in ["__name__", "__doc__"]] | 
 | 348 |     vereq(names, ['a', 'b']) | 
| Tim Peters | caaff8d | 2001-09-10 23:12:14 +0000 | [diff] [blame] | 349 |  | 
 | 350 |     class M2(M): | 
 | 351 |         def getdict(self): | 
 | 352 |             return "Not a dict!" | 
 | 353 |         __dict__ = property(getdict) | 
 | 354 |  | 
| Guido van Rossum | 1bdd9b0 | 2002-06-04 06:10:37 +0000 | [diff] [blame] | 355 |     m2instance = M2("m2") | 
| Tim Peters | caaff8d | 2001-09-10 23:12:14 +0000 | [diff] [blame] | 356 |     m2instance.b = 2 | 
 | 357 |     m2instance.a = 1 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 358 |     vereq(m2instance.__dict__, "Not a dict!") | 
| Tim Peters | caaff8d | 2001-09-10 23:12:14 +0000 | [diff] [blame] | 359 |     try: | 
 | 360 |         dir(m2instance) | 
 | 361 |     except TypeError: | 
 | 362 |         pass | 
 | 363 |  | 
| Tim Peters | 9e6a399 | 2001-10-30 05:45:26 +0000 | [diff] [blame] | 364 |     # Two essentially featureless objects, just inheriting stuff from | 
 | 365 |     # object. | 
 | 366 |     vereq(dir(None), dir(Ellipsis)) | 
 | 367 |  | 
| Guido van Rossum | 4402241 | 2002-05-13 18:29:46 +0000 | [diff] [blame] | 368 |     # Nasty test case for proxied objects | 
 | 369 |     class Wrapper(object): | 
 | 370 |         def __init__(self, obj): | 
 | 371 |             self.__obj = obj | 
 | 372 |         def __repr__(self): | 
 | 373 |             return "Wrapper(%s)" % repr(self.__obj) | 
 | 374 |         def __getitem__(self, key): | 
 | 375 |             return Wrapper(self.__obj[key]) | 
 | 376 |         def __len__(self): | 
 | 377 |             return len(self.__obj) | 
 | 378 |         def __getattr__(self, name): | 
 | 379 |             return Wrapper(getattr(self.__obj, name)) | 
 | 380 |  | 
 | 381 |     class C(object): | 
 | 382 |         def __getclass(self): | 
 | 383 |             return Wrapper(type(self)) | 
 | 384 |         __class__ = property(__getclass) | 
 | 385 |  | 
 | 386 |     dir(C()) # This used to segfault | 
 | 387 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 388 | binops = { | 
 | 389 |     'add': '+', | 
 | 390 |     'sub': '-', | 
 | 391 |     'mul': '*', | 
 | 392 |     'div': '/', | 
 | 393 |     'mod': '%', | 
 | 394 |     'divmod': 'divmod', | 
 | 395 |     'pow': '**', | 
 | 396 |     'lshift': '<<', | 
 | 397 |     'rshift': '>>', | 
 | 398 |     'and': '&', | 
 | 399 |     'xor': '^', | 
 | 400 |     'or': '|', | 
 | 401 |     'cmp': 'cmp', | 
 | 402 |     'lt': '<', | 
 | 403 |     'le': '<=', | 
 | 404 |     'eq': '==', | 
 | 405 |     'ne': '!=', | 
 | 406 |     'gt': '>', | 
 | 407 |     'ge': '>=', | 
 | 408 |     } | 
 | 409 |  | 
 | 410 | for name, expr in binops.items(): | 
 | 411 |     if expr.islower(): | 
 | 412 |         expr = expr + "(a, b)" | 
 | 413 |     else: | 
 | 414 |         expr = 'a %s b' % expr | 
 | 415 |     binops[name] = expr | 
 | 416 |  | 
 | 417 | unops = { | 
 | 418 |     'pos': '+', | 
 | 419 |     'neg': '-', | 
 | 420 |     'abs': 'abs', | 
 | 421 |     'invert': '~', | 
 | 422 |     'int': 'int', | 
 | 423 |     'long': 'long', | 
 | 424 |     'float': 'float', | 
 | 425 |     'oct': 'oct', | 
 | 426 |     'hex': 'hex', | 
 | 427 |     } | 
 | 428 |  | 
 | 429 | for name, expr in unops.items(): | 
 | 430 |     if expr.islower(): | 
 | 431 |         expr = expr + "(a)" | 
 | 432 |     else: | 
 | 433 |         expr = '%s a' % expr | 
 | 434 |     unops[name] = expr | 
 | 435 |  | 
 | 436 | def numops(a, b, skip=[]): | 
 | 437 |     dict = {'a': a, 'b': b} | 
 | 438 |     for name, expr in binops.items(): | 
 | 439 |         if name not in skip: | 
 | 440 |             name = "__%s__" % name | 
 | 441 |             if hasattr(a, name): | 
 | 442 |                 res = eval(expr, dict) | 
 | 443 |                 testbinop(a, b, res, expr, name) | 
 | 444 |     for name, expr in unops.items(): | 
| Guido van Rossum | 0eb2a6e | 2001-10-09 11:07:24 +0000 | [diff] [blame] | 445 |         if name not in skip: | 
 | 446 |             name = "__%s__" % name | 
 | 447 |             if hasattr(a, name): | 
 | 448 |                 res = eval(expr, dict) | 
 | 449 |                 testunop(a, res, expr, name) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 450 |  | 
 | 451 | def ints(): | 
 | 452 |     if verbose: print "Testing int operations..." | 
 | 453 |     numops(100, 3) | 
| Guido van Rossum | 15d529a | 2002-03-11 00:07:13 +0000 | [diff] [blame] | 454 |     # The following crashes in Python 2.2 | 
 | 455 |     vereq((1).__nonzero__(), 1) | 
 | 456 |     vereq((0).__nonzero__(), 0) | 
| Guido van Rossum | c9e9e40 | 2002-03-11 13:21:25 +0000 | [diff] [blame] | 457 |     # This returns 'NotImplemented' in Python 2.2 | 
 | 458 |     class C(int): | 
 | 459 |         def __add__(self, other): | 
 | 460 |             return NotImplemented | 
 | 461 |     try: | 
 | 462 |         C() + "" | 
 | 463 |     except TypeError: | 
 | 464 |         pass | 
 | 465 |     else: | 
| Neal Norwitz | 1af5e35 | 2002-03-11 14:44:12 +0000 | [diff] [blame] | 466 |         raise TestFailed, "NotImplemented should have caused TypeError" | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 467 |  | 
 | 468 | def longs(): | 
 | 469 |     if verbose: print "Testing long operations..." | 
 | 470 |     numops(100L, 3L) | 
 | 471 |  | 
 | 472 | def floats(): | 
 | 473 |     if verbose: print "Testing float operations..." | 
 | 474 |     numops(100.0, 3.0) | 
 | 475 |  | 
 | 476 | def complexes(): | 
 | 477 |     if verbose: print "Testing complex operations..." | 
| Guido van Rossum | 0eb2a6e | 2001-10-09 11:07:24 +0000 | [diff] [blame] | 478 |     numops(100.0j, 3.0j, skip=['lt', 'le', 'gt', 'ge', 'int', 'long', 'float']) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 479 |     class Number(complex): | 
 | 480 |         __slots__ = ['prec'] | 
| Tim Peters | 3f996e7 | 2001-09-13 19:18:27 +0000 | [diff] [blame] | 481 |         def __new__(cls, *args, **kwds): | 
 | 482 |             result = complex.__new__(cls, *args) | 
 | 483 |             result.prec = kwds.get('prec', 12) | 
 | 484 |             return result | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 485 |         def __repr__(self): | 
 | 486 |             prec = self.prec | 
 | 487 |             if self.imag == 0.0: | 
 | 488 |                 return "%.*g" % (prec, self.real) | 
 | 489 |             if self.real == 0.0: | 
 | 490 |                 return "%.*gj" % (prec, self.imag) | 
 | 491 |             return "(%.*g+%.*gj)" % (prec, self.real, prec, self.imag) | 
 | 492 |         __str__ = __repr__ | 
| Tim Peters | 3f996e7 | 2001-09-13 19:18:27 +0000 | [diff] [blame] | 493 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 494 |     a = Number(3.14, prec=6) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 495 |     vereq(`a`, "3.14") | 
 | 496 |     vereq(a.prec, 6) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 497 |  | 
| Tim Peters | 3f996e7 | 2001-09-13 19:18:27 +0000 | [diff] [blame] | 498 |     a = Number(a, prec=2) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 499 |     vereq(`a`, "3.1") | 
 | 500 |     vereq(a.prec, 2) | 
| Tim Peters | 3f996e7 | 2001-09-13 19:18:27 +0000 | [diff] [blame] | 501 |  | 
 | 502 |     a = Number(234.5) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 503 |     vereq(`a`, "234.5") | 
 | 504 |     vereq(a.prec, 12) | 
| Tim Peters | 3f996e7 | 2001-09-13 19:18:27 +0000 | [diff] [blame] | 505 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 506 | def spamlists(): | 
 | 507 |     if verbose: print "Testing spamlist operations..." | 
 | 508 |     import copy, xxsubtype as spam | 
 | 509 |     def spamlist(l, memo=None): | 
 | 510 |         import xxsubtype as spam | 
 | 511 |         return spam.spamlist(l) | 
 | 512 |     # This is an ugly hack: | 
 | 513 |     copy._deepcopy_dispatch[spam.spamlist] = spamlist | 
 | 514 |  | 
 | 515 |     testbinop(spamlist([1]), spamlist([2]), spamlist([1,2]), "a+b", "__add__") | 
 | 516 |     testbinop(spamlist([1,2,3]), 2, 1, "b in a", "__contains__") | 
 | 517 |     testbinop(spamlist([1,2,3]), 4, 0, "b in a", "__contains__") | 
 | 518 |     testbinop(spamlist([1,2,3]), 1, 2, "a[b]", "__getitem__") | 
 | 519 |     testternop(spamlist([1,2,3]), 0, 2, spamlist([1,2]), | 
 | 520 |                "a[b:c]", "__getslice__") | 
 | 521 |     testsetop(spamlist([1]), spamlist([2]), spamlist([1,2]), | 
 | 522 |               "a+=b", "__iadd__") | 
 | 523 |     testsetop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*=b", "__imul__") | 
 | 524 |     testunop(spamlist([1,2,3]), 3, "len(a)", "__len__") | 
 | 525 |     testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "a*b", "__mul__") | 
 | 526 |     testbinop(spamlist([1,2]), 3, spamlist([1,2,1,2,1,2]), "b*a", "__rmul__") | 
 | 527 |     testset2op(spamlist([1,2]), 1, 3, spamlist([1,3]), "a[b]=c", "__setitem__") | 
 | 528 |     testset3op(spamlist([1,2,3,4]), 1, 3, spamlist([5,6]), | 
 | 529 |                spamlist([1,5,6,4]), "a[b:c]=d", "__setslice__") | 
 | 530 |     # Test subclassing | 
 | 531 |     class C(spam.spamlist): | 
 | 532 |         def foo(self): return 1 | 
 | 533 |     a = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 534 |     vereq(a, []) | 
 | 535 |     vereq(a.foo(), 1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 536 |     a.append(100) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 537 |     vereq(a, [100]) | 
 | 538 |     vereq(a.getstate(), 0) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 539 |     a.setstate(42) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 540 |     vereq(a.getstate(), 42) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 541 |  | 
 | 542 | def spamdicts(): | 
 | 543 |     if verbose: print "Testing spamdict operations..." | 
 | 544 |     import copy, xxsubtype as spam | 
 | 545 |     def spamdict(d, memo=None): | 
 | 546 |         import xxsubtype as spam | 
 | 547 |         sd = spam.spamdict() | 
 | 548 |         for k, v in d.items(): sd[k] = v | 
 | 549 |         return sd | 
 | 550 |     # This is an ugly hack: | 
 | 551 |     copy._deepcopy_dispatch[spam.spamdict] = spamdict | 
 | 552 |  | 
 | 553 |     testbinop(spamdict({1:2}), spamdict({2:1}), -1, "cmp(a,b)", "__cmp__") | 
 | 554 |     testbinop(spamdict({1:2,3:4}), 1, 1, "b in a", "__contains__") | 
 | 555 |     testbinop(spamdict({1:2,3:4}), 2, 0, "b in a", "__contains__") | 
 | 556 |     testbinop(spamdict({1:2,3:4}), 1, 2, "a[b]", "__getitem__") | 
 | 557 |     d = spamdict({1:2,3:4}) | 
 | 558 |     l1 = [] | 
 | 559 |     for i in d.keys(): l1.append(i) | 
 | 560 |     l = [] | 
 | 561 |     for i in iter(d): l.append(i) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 562 |     vereq(l, l1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 563 |     l = [] | 
 | 564 |     for i in d.__iter__(): l.append(i) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 565 |     vereq(l, l1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 566 |     l = [] | 
 | 567 |     for i in type(spamdict({})).__iter__(d): l.append(i) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 568 |     vereq(l, l1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 569 |     straightd = {1:2, 3:4} | 
 | 570 |     spamd = spamdict(straightd) | 
 | 571 |     testunop(spamd, 2, "len(a)", "__len__") | 
 | 572 |     testunop(spamd, repr(straightd), "repr(a)", "__repr__") | 
 | 573 |     testset2op(spamdict({1:2,3:4}), 2, 3, spamdict({1:2,2:3,3:4}), | 
 | 574 |                "a[b]=c", "__setitem__") | 
 | 575 |     # Test subclassing | 
 | 576 |     class C(spam.spamdict): | 
 | 577 |         def foo(self): return 1 | 
 | 578 |     a = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 579 |     vereq(a.items(), []) | 
 | 580 |     vereq(a.foo(), 1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 581 |     a['foo'] = 'bar' | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 582 |     vereq(a.items(), [('foo', 'bar')]) | 
 | 583 |     vereq(a.getstate(), 0) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 584 |     a.setstate(100) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 585 |     vereq(a.getstate(), 100) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 586 |  | 
 | 587 | def pydicts(): | 
 | 588 |     if verbose: print "Testing Python subclass of dict..." | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 589 |     verify(issubclass(dict, dict)) | 
 | 590 |     verify(isinstance({}, dict)) | 
 | 591 |     d = dict() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 592 |     vereq(d, {}) | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 593 |     verify(d.__class__ is dict) | 
 | 594 |     verify(isinstance(d, dict)) | 
 | 595 |     class C(dict): | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 596 |         state = -1 | 
 | 597 |         def __init__(self, *a, **kw): | 
 | 598 |             if a: | 
| Guido van Rossum | 90c4514 | 2001-11-24 21:07:01 +0000 | [diff] [blame] | 599 |                 vereq(len(a), 1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 600 |                 self.state = a[0] | 
 | 601 |             if kw: | 
 | 602 |                 for k, v in kw.items(): self[v] = k | 
 | 603 |         def __getitem__(self, key): | 
 | 604 |             return self.get(key, 0) | 
 | 605 |         def __setitem__(self, key, value): | 
| Guido van Rossum | 90c4514 | 2001-11-24 21:07:01 +0000 | [diff] [blame] | 606 |             verify(isinstance(key, type(0))) | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 607 |             dict.__setitem__(self, key, value) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 608 |         def setstate(self, state): | 
 | 609 |             self.state = state | 
 | 610 |         def getstate(self): | 
 | 611 |             return self.state | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 612 |     verify(issubclass(C, dict)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 613 |     a1 = C(12) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 614 |     vereq(a1.state, 12) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 615 |     a2 = C(foo=1, bar=2) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 616 |     vereq(a2[1] == 'foo' and a2[2], 'bar') | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 617 |     a = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 618 |     vereq(a.state, -1) | 
 | 619 |     vereq(a.getstate(), -1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 620 |     a.setstate(0) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 621 |     vereq(a.state, 0) | 
 | 622 |     vereq(a.getstate(), 0) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 623 |     a.setstate(10) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 624 |     vereq(a.state, 10) | 
 | 625 |     vereq(a.getstate(), 10) | 
 | 626 |     vereq(a[42], 0) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 627 |     a[42] = 24 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 628 |     vereq(a[42], 24) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 629 |     if verbose: print "pydict stress test ..." | 
 | 630 |     N = 50 | 
 | 631 |     for i in range(N): | 
 | 632 |         a[i] = C() | 
 | 633 |         for j in range(N): | 
 | 634 |             a[i][j] = i*j | 
 | 635 |     for i in range(N): | 
 | 636 |         for j in range(N): | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 637 |             vereq(a[i][j], i*j) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 638 |  | 
 | 639 | def pylists(): | 
 | 640 |     if verbose: print "Testing Python subclass of list..." | 
 | 641 |     class C(list): | 
 | 642 |         def __getitem__(self, i): | 
 | 643 |             return list.__getitem__(self, i) + 100 | 
 | 644 |         def __getslice__(self, i, j): | 
 | 645 |             return (i, j) | 
 | 646 |     a = C() | 
 | 647 |     a.extend([0,1,2]) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 648 |     vereq(a[0], 100) | 
 | 649 |     vereq(a[1], 101) | 
 | 650 |     vereq(a[2], 102) | 
 | 651 |     vereq(a[100:200], (100,200)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 652 |  | 
 | 653 | def metaclass(): | 
 | 654 |     if verbose: print "Testing __metaclass__..." | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 655 |     class C: | 
 | 656 |         __metaclass__ = type | 
 | 657 |         def __init__(self): | 
 | 658 |             self.__state = 0 | 
 | 659 |         def getstate(self): | 
 | 660 |             return self.__state | 
 | 661 |         def setstate(self, state): | 
 | 662 |             self.__state = state | 
 | 663 |     a = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 664 |     vereq(a.getstate(), 0) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 665 |     a.setstate(10) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 666 |     vereq(a.getstate(), 10) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 667 |     class D: | 
 | 668 |         class __metaclass__(type): | 
 | 669 |             def myself(cls): return cls | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 670 |     vereq(D.myself(), D) | 
| Guido van Rossum | 309b566 | 2001-08-17 11:43:17 +0000 | [diff] [blame] | 671 |     d = D() | 
 | 672 |     verify(d.__class__ is D) | 
 | 673 |     class M1(type): | 
 | 674 |         def __new__(cls, name, bases, dict): | 
 | 675 |             dict['__spam__'] = 1 | 
 | 676 |             return type.__new__(cls, name, bases, dict) | 
 | 677 |     class C: | 
 | 678 |         __metaclass__ = M1 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 679 |     vereq(C.__spam__, 1) | 
| Guido van Rossum | 309b566 | 2001-08-17 11:43:17 +0000 | [diff] [blame] | 680 |     c = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 681 |     vereq(c.__spam__, 1) | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 682 |  | 
| Guido van Rossum | 309b566 | 2001-08-17 11:43:17 +0000 | [diff] [blame] | 683 |     class _instance(object): | 
 | 684 |         pass | 
 | 685 |     class M2(object): | 
 | 686 |         def __new__(cls, name, bases, dict): | 
 | 687 |             self = object.__new__(cls) | 
 | 688 |             self.name = name | 
 | 689 |             self.bases = bases | 
 | 690 |             self.dict = dict | 
 | 691 |             return self | 
 | 692 |         __new__ = staticmethod(__new__) | 
 | 693 |         def __call__(self): | 
 | 694 |             it = _instance() | 
| Guido van Rossum | 7e1ff69 | 2001-08-17 11:55:58 +0000 | [diff] [blame] | 695 |             # Early binding of methods | 
 | 696 |             for key in self.dict: | 
 | 697 |                 if key.startswith("__"): | 
 | 698 |                     continue | 
 | 699 |                 setattr(it, key, self.dict[key].__get__(it, self)) | 
| Guido van Rossum | 309b566 | 2001-08-17 11:43:17 +0000 | [diff] [blame] | 700 |             return it | 
 | 701 |     class C: | 
 | 702 |         __metaclass__ = M2 | 
 | 703 |         def spam(self): | 
 | 704 |             return 42 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 705 |     vereq(C.name, 'C') | 
 | 706 |     vereq(C.bases, ()) | 
| Guido van Rossum | 309b566 | 2001-08-17 11:43:17 +0000 | [diff] [blame] | 707 |     verify('spam' in C.dict) | 
 | 708 |     c = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 709 |     vereq(c.spam(), 42) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 710 |  | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 711 |     # More metaclass examples | 
 | 712 |  | 
 | 713 |     class autosuper(type): | 
 | 714 |         # Automatically add __super to the class | 
 | 715 |         # This trick only works for dynamic classes | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 716 |         def __new__(metaclass, name, bases, dict): | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 717 |             cls = super(autosuper, metaclass).__new__(metaclass, | 
 | 718 |                                                       name, bases, dict) | 
| Guido van Rossum | bfa47b0 | 2001-08-31 04:35:14 +0000 | [diff] [blame] | 719 |             # Name mangling for __super removes leading underscores | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 720 |             while name[:1] == "_": | 
 | 721 |                 name = name[1:] | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 722 |             if name: | 
 | 723 |                 name = "_%s__super" % name | 
 | 724 |             else: | 
 | 725 |                 name = "__super" | 
 | 726 |             setattr(cls, name, super(cls)) | 
 | 727 |             return cls | 
 | 728 |     class A: | 
 | 729 |         __metaclass__ = autosuper | 
 | 730 |         def meth(self): | 
 | 731 |             return "A" | 
 | 732 |     class B(A): | 
 | 733 |         def meth(self): | 
 | 734 |             return "B" + self.__super.meth() | 
 | 735 |     class C(A): | 
 | 736 |         def meth(self): | 
 | 737 |             return "C" + self.__super.meth() | 
 | 738 |     class D(C, B): | 
 | 739 |         def meth(self): | 
 | 740 |             return "D" + self.__super.meth() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 741 |     vereq(D().meth(), "DCBA") | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 742 |     class E(B, C): | 
 | 743 |         def meth(self): | 
 | 744 |             return "E" + self.__super.meth() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 745 |     vereq(E().meth(), "EBCA") | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 746 |  | 
| Guido van Rossum | 8bce4ac | 2001-09-06 21:56:42 +0000 | [diff] [blame] | 747 |     class autoproperty(type): | 
 | 748 |         # Automatically create property attributes when methods | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 749 |         # named _get_x and/or _set_x are found | 
 | 750 |         def __new__(metaclass, name, bases, dict): | 
 | 751 |             hits = {} | 
 | 752 |             for key, val in dict.iteritems(): | 
 | 753 |                 if key.startswith("_get_"): | 
 | 754 |                     key = key[5:] | 
 | 755 |                     get, set = hits.get(key, (None, None)) | 
 | 756 |                     get = val | 
 | 757 |                     hits[key] = get, set | 
 | 758 |                 elif key.startswith("_set_"): | 
 | 759 |                     key = key[5:] | 
 | 760 |                     get, set = hits.get(key, (None, None)) | 
 | 761 |                     set = val | 
 | 762 |                     hits[key] = get, set | 
 | 763 |             for key, (get, set) in hits.iteritems(): | 
| Guido van Rossum | 8bce4ac | 2001-09-06 21:56:42 +0000 | [diff] [blame] | 764 |                 dict[key] = property(get, set) | 
 | 765 |             return super(autoproperty, metaclass).__new__(metaclass, | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 766 |                                                         name, bases, dict) | 
 | 767 |     class A: | 
| Guido van Rossum | 8bce4ac | 2001-09-06 21:56:42 +0000 | [diff] [blame] | 768 |         __metaclass__ = autoproperty | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 769 |         def _get_x(self): | 
 | 770 |             return -self.__x | 
 | 771 |         def _set_x(self, x): | 
 | 772 |             self.__x = -x | 
 | 773 |     a = A() | 
 | 774 |     verify(not hasattr(a, "x")) | 
 | 775 |     a.x = 12 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 776 |     vereq(a.x, 12) | 
 | 777 |     vereq(a._A__x, -12) | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 778 |  | 
| Guido van Rossum | 8bce4ac | 2001-09-06 21:56:42 +0000 | [diff] [blame] | 779 |     class multimetaclass(autoproperty, autosuper): | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 780 |         # Merge of multiple cooperating metaclasses | 
 | 781 |         pass | 
 | 782 |     class A: | 
 | 783 |         __metaclass__ = multimetaclass | 
 | 784 |         def _get_x(self): | 
 | 785 |             return "A" | 
 | 786 |     class B(A): | 
 | 787 |         def _get_x(self): | 
 | 788 |             return "B" + self.__super._get_x() | 
 | 789 |     class C(A): | 
 | 790 |         def _get_x(self): | 
 | 791 |             return "C" + self.__super._get_x() | 
 | 792 |     class D(C, B): | 
 | 793 |         def _get_x(self): | 
 | 794 |             return "D" + self.__super._get_x() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 795 |     vereq(D().x, "DCBA") | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 796 |  | 
| Guido van Rossum | f76de62 | 2001-10-18 15:49:21 +0000 | [diff] [blame] | 797 |     # Make sure type(x) doesn't call x.__class__.__init__ | 
 | 798 |     class T(type): | 
 | 799 |         counter = 0 | 
 | 800 |         def __init__(self, *args): | 
 | 801 |             T.counter += 1 | 
 | 802 |     class C: | 
 | 803 |         __metaclass__ = T | 
 | 804 |     vereq(T.counter, 1) | 
 | 805 |     a = C() | 
 | 806 |     vereq(type(a), C) | 
 | 807 |     vereq(T.counter, 1) | 
 | 808 |  | 
| Guido van Rossum | 29d2606 | 2001-12-11 04:37:34 +0000 | [diff] [blame] | 809 |     class C(object): pass | 
 | 810 |     c = C() | 
 | 811 |     try: c() | 
 | 812 |     except TypeError: pass | 
| Neal Norwitz | b1295da | 2002-04-01 18:59:20 +0000 | [diff] [blame] | 813 |     else: raise TestFailed, "calling object w/o call method should raise TypeError" | 
| Guido van Rossum | 29d2606 | 2001-12-11 04:37:34 +0000 | [diff] [blame] | 814 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 815 | def pymods(): | 
 | 816 |     if verbose: print "Testing Python subclass of module..." | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 817 |     log = [] | 
| Guido van Rossum | d307740 | 2001-08-12 05:24:18 +0000 | [diff] [blame] | 818 |     import sys | 
 | 819 |     MT = type(sys) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 820 |     class MM(MT): | 
| Guido van Rossum | 1bdd9b0 | 2002-06-04 06:10:37 +0000 | [diff] [blame] | 821 |         def __init__(self, name): | 
 | 822 |             MT.__init__(self, name) | 
| Guido van Rossum | 867a8d2 | 2001-09-21 19:29:08 +0000 | [diff] [blame] | 823 |         def __getattribute__(self, name): | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 824 |             log.append(("getattr", name)) | 
| Guido van Rossum | 867a8d2 | 2001-09-21 19:29:08 +0000 | [diff] [blame] | 825 |             return MT.__getattribute__(self, name) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 826 |         def __setattr__(self, name, value): | 
 | 827 |             log.append(("setattr", name, value)) | 
 | 828 |             MT.__setattr__(self, name, value) | 
 | 829 |         def __delattr__(self, name): | 
 | 830 |             log.append(("delattr", name)) | 
 | 831 |             MT.__delattr__(self, name) | 
| Guido van Rossum | 1bdd9b0 | 2002-06-04 06:10:37 +0000 | [diff] [blame] | 832 |     a = MM("a") | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 833 |     a.foo = 12 | 
 | 834 |     x = a.foo | 
 | 835 |     del a.foo | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 836 |     vereq(log, [("setattr", "foo", 12), | 
 | 837 |                 ("getattr", "foo"), | 
 | 838 |                 ("delattr", "foo")]) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 839 |  | 
 | 840 | def multi(): | 
 | 841 |     if verbose: print "Testing multiple inheritance..." | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 842 |     class C(object): | 
 | 843 |         def __init__(self): | 
 | 844 |             self.__state = 0 | 
 | 845 |         def getstate(self): | 
 | 846 |             return self.__state | 
 | 847 |         def setstate(self, state): | 
 | 848 |             self.__state = state | 
 | 849 |     a = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 850 |     vereq(a.getstate(), 0) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 851 |     a.setstate(10) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 852 |     vereq(a.getstate(), 10) | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 853 |     class D(dict, C): | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 854 |         def __init__(self): | 
 | 855 |             type({}).__init__(self) | 
 | 856 |             C.__init__(self) | 
 | 857 |     d = D() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 858 |     vereq(d.keys(), []) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 859 |     d["hello"] = "world" | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 860 |     vereq(d.items(), [("hello", "world")]) | 
 | 861 |     vereq(d["hello"], "world") | 
 | 862 |     vereq(d.getstate(), 0) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 863 |     d.setstate(10) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 864 |     vereq(d.getstate(), 10) | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 865 |     vereq(D.__mro__, (D, dict, C, object)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 866 |  | 
| Guido van Rossum | e45763a | 2001-08-10 21:28:46 +0000 | [diff] [blame] | 867 |     # SF bug #442833 | 
 | 868 |     class Node(object): | 
 | 869 |         def __int__(self): | 
 | 870 |             return int(self.foo()) | 
 | 871 |         def foo(self): | 
 | 872 |             return "23" | 
 | 873 |     class Frag(Node, list): | 
 | 874 |         def foo(self): | 
 | 875 |             return "42" | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 876 |     vereq(Node().__int__(), 23) | 
 | 877 |     vereq(int(Node()), 23) | 
 | 878 |     vereq(Frag().__int__(), 42) | 
 | 879 |     vereq(int(Frag()), 42) | 
| Guido van Rossum | e45763a | 2001-08-10 21:28:46 +0000 | [diff] [blame] | 880 |  | 
| Tim Peters | a91e964 | 2001-11-14 23:32:33 +0000 | [diff] [blame] | 881 |     # MI mixing classic and new-style classes. | 
| Tim Peters | 144b98d | 2001-11-14 23:56:45 +0000 | [diff] [blame] | 882 |  | 
 | 883 |     class A: | 
 | 884 |         x = 1 | 
 | 885 |  | 
 | 886 |     class B(A): | 
 | 887 |         pass | 
 | 888 |  | 
 | 889 |     class C(A): | 
 | 890 |         x = 2 | 
 | 891 |  | 
 | 892 |     class D(B, C): | 
 | 893 |         pass | 
 | 894 |     vereq(D.x, 1) | 
 | 895 |  | 
 | 896 |     # Classic MRO is preserved for a classic base class. | 
 | 897 |     class E(D, object): | 
 | 898 |         pass | 
 | 899 |     vereq(E.__mro__, (E, D, B, A, C, object)) | 
 | 900 |     vereq(E.x, 1) | 
 | 901 |  | 
 | 902 |     # But with a mix of classic bases, their MROs are combined using | 
 | 903 |     # new-style MRO. | 
 | 904 |     class F(B, C, object): | 
 | 905 |         pass | 
 | 906 |     vereq(F.__mro__, (F, B, C, A, object)) | 
 | 907 |     vereq(F.x, 2) | 
 | 908 |  | 
 | 909 |     # Try something else. | 
| Tim Peters | a91e964 | 2001-11-14 23:32:33 +0000 | [diff] [blame] | 910 |     class C: | 
 | 911 |         def cmethod(self): | 
 | 912 |             return "C a" | 
 | 913 |         def all_method(self): | 
 | 914 |             return "C b" | 
 | 915 |  | 
 | 916 |     class M1(C, object): | 
 | 917 |         def m1method(self): | 
 | 918 |             return "M1 a" | 
 | 919 |         def all_method(self): | 
 | 920 |             return "M1 b" | 
 | 921 |  | 
 | 922 |     vereq(M1.__mro__, (M1, C, object)) | 
 | 923 |     m = M1() | 
 | 924 |     vereq(m.cmethod(), "C a") | 
 | 925 |     vereq(m.m1method(), "M1 a") | 
 | 926 |     vereq(m.all_method(), "M1 b") | 
 | 927 |  | 
 | 928 |     class D(C): | 
 | 929 |         def dmethod(self): | 
 | 930 |             return "D a" | 
 | 931 |         def all_method(self): | 
 | 932 |             return "D b" | 
 | 933 |  | 
| Guido van Rossum | 9a81892 | 2002-11-14 19:50:14 +0000 | [diff] [blame] | 934 |     class M2(D, object): | 
| Tim Peters | a91e964 | 2001-11-14 23:32:33 +0000 | [diff] [blame] | 935 |         def m2method(self): | 
 | 936 |             return "M2 a" | 
 | 937 |         def all_method(self): | 
 | 938 |             return "M2 b" | 
 | 939 |  | 
| Guido van Rossum | 9a81892 | 2002-11-14 19:50:14 +0000 | [diff] [blame] | 940 |     vereq(M2.__mro__, (M2, D, C, object)) | 
| Tim Peters | a91e964 | 2001-11-14 23:32:33 +0000 | [diff] [blame] | 941 |     m = M2() | 
 | 942 |     vereq(m.cmethod(), "C a") | 
 | 943 |     vereq(m.dmethod(), "D a") | 
 | 944 |     vereq(m.m2method(), "M2 a") | 
 | 945 |     vereq(m.all_method(), "M2 b") | 
 | 946 |  | 
| Guido van Rossum | 9a81892 | 2002-11-14 19:50:14 +0000 | [diff] [blame] | 947 |     class M3(M1, M2, object): | 
| Tim Peters | a91e964 | 2001-11-14 23:32:33 +0000 | [diff] [blame] | 948 |         def m3method(self): | 
 | 949 |             return "M3 a" | 
 | 950 |         def all_method(self): | 
 | 951 |             return "M3 b" | 
| Guido van Rossum | 9a81892 | 2002-11-14 19:50:14 +0000 | [diff] [blame] | 952 |     vereq(M3.__mro__, (M3, M1, M2, D, C, object)) | 
| Tim Peters | 144b98d | 2001-11-14 23:56:45 +0000 | [diff] [blame] | 953 |     m = M3() | 
 | 954 |     vereq(m.cmethod(), "C a") | 
 | 955 |     vereq(m.dmethod(), "D a") | 
 | 956 |     vereq(m.m1method(), "M1 a") | 
 | 957 |     vereq(m.m2method(), "M2 a") | 
 | 958 |     vereq(m.m3method(), "M3 a") | 
 | 959 |     vereq(m.all_method(), "M3 b") | 
| Tim Peters | a91e964 | 2001-11-14 23:32:33 +0000 | [diff] [blame] | 960 |  | 
| Guido van Rossum | e54616c | 2001-12-14 04:19:56 +0000 | [diff] [blame] | 961 |     class Classic: | 
 | 962 |         pass | 
 | 963 |     try: | 
 | 964 |         class New(Classic): | 
 | 965 |             __metaclass__ = type | 
 | 966 |     except TypeError: | 
 | 967 |         pass | 
 | 968 |     else: | 
 | 969 |         raise TestFailed, "new class with only classic bases - shouldn't be" | 
 | 970 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 971 | def diamond(): | 
 | 972 |     if verbose: print "Testing multiple inheritance special cases..." | 
 | 973 |     class A(object): | 
 | 974 |         def spam(self): return "A" | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 975 |     vereq(A().spam(), "A") | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 976 |     class B(A): | 
 | 977 |         def boo(self): return "B" | 
 | 978 |         def spam(self): return "B" | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 979 |     vereq(B().spam(), "B") | 
 | 980 |     vereq(B().boo(), "B") | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 981 |     class C(A): | 
 | 982 |         def boo(self): return "C" | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 983 |     vereq(C().spam(), "A") | 
 | 984 |     vereq(C().boo(), "C") | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 985 |     class D(B, C): pass | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 986 |     vereq(D().spam(), "B") | 
 | 987 |     vereq(D().boo(), "B") | 
 | 988 |     vereq(D.__mro__, (D, B, C, A, object)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 989 |     class E(C, B): pass | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 990 |     vereq(E().spam(), "B") | 
 | 991 |     vereq(E().boo(), "C") | 
 | 992 |     vereq(E.__mro__, (E, C, B, A, object)) | 
| Guido van Rossum | 9a81892 | 2002-11-14 19:50:14 +0000 | [diff] [blame] | 993 |     # MRO order disagreement | 
 | 994 |     try: | 
 | 995 |         class F(D, E): pass | 
 | 996 |     except TypeError: | 
 | 997 |         pass | 
 | 998 |     else: | 
 | 999 |         raise TestFailed, "expected MRO order disagreement (F)" | 
 | 1000 |     try: | 
 | 1001 |         class G(E, D): pass | 
 | 1002 |     except TypeError: | 
 | 1003 |         pass | 
 | 1004 |     else: | 
 | 1005 |         raise TestFailed, "expected MRO order disagreement (G)" | 
 | 1006 |  | 
 | 1007 |  | 
 | 1008 | # see thread python-dev/2002-October/029035.html | 
 | 1009 | def ex5(): | 
 | 1010 |     if verbose: print "Testing ex5 from C3 switch discussion..." | 
 | 1011 |     class A(object): pass | 
 | 1012 |     class B(object): pass | 
 | 1013 |     class C(object): pass | 
 | 1014 |     class X(A): pass | 
 | 1015 |     class Y(A): pass | 
 | 1016 |     class Z(X,B,Y,C): pass | 
 | 1017 |     vereq(Z.__mro__, (Z, X, B, Y, A, C, object)) | 
 | 1018 |  | 
 | 1019 | # see "A Monotonic Superclass Linearization for Dylan", | 
 | 1020 | # by Kim Barrett et al. (OOPSLA 1996) | 
 | 1021 | def monotonicity(): | 
 | 1022 |     if verbose: print "Testing MRO monotonicity..." | 
 | 1023 |     class Boat(object): pass | 
 | 1024 |     class DayBoat(Boat): pass | 
 | 1025 |     class WheelBoat(Boat): pass | 
 | 1026 |     class EngineLess(DayBoat): pass | 
 | 1027 |     class SmallMultihull(DayBoat): pass | 
 | 1028 |     class PedalWheelBoat(EngineLess,WheelBoat): pass | 
 | 1029 |     class SmallCatamaran(SmallMultihull): pass | 
 | 1030 |     class Pedalo(PedalWheelBoat,SmallCatamaran): pass | 
 | 1031 |  | 
 | 1032 |     vereq(PedalWheelBoat.__mro__, | 
 | 1033 |           (PedalWheelBoat, EngineLess, DayBoat, WheelBoat, Boat, | 
 | 1034 |            object)) | 
 | 1035 |     vereq(SmallCatamaran.__mro__, | 
 | 1036 |           (SmallCatamaran, SmallMultihull, DayBoat, Boat, object)) | 
 | 1037 |  | 
 | 1038 |     vereq(Pedalo.__mro__, | 
 | 1039 |           (Pedalo, PedalWheelBoat, EngineLess, SmallCatamaran, | 
 | 1040 |            SmallMultihull, DayBoat, WheelBoat, Boat, object)) | 
 | 1041 |  | 
 | 1042 | # see "A Monotonic Superclass Linearization for Dylan", | 
 | 1043 | # by Kim Barrett et al. (OOPSLA 1996) | 
 | 1044 | def consistency_with_epg(): | 
 | 1045 |     if verbose: print "Testing consistentcy with EPG..." | 
 | 1046 |     class Pane(object): pass | 
 | 1047 |     class ScrollingMixin(object): pass | 
 | 1048 |     class EditingMixin(object): pass | 
 | 1049 |     class ScrollablePane(Pane,ScrollingMixin): pass | 
 | 1050 |     class EditablePane(Pane,EditingMixin): pass | 
 | 1051 |     class EditableScrollablePane(ScrollablePane,EditablePane): pass | 
 | 1052 |  | 
 | 1053 |     vereq(EditableScrollablePane.__mro__, | 
 | 1054 |           (EditableScrollablePane, ScrollablePane, EditablePane, | 
 | 1055 |            Pane, ScrollingMixin, EditingMixin, object)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1056 |  | 
| Guido van Rossum | d32047f | 2002-11-25 21:38:52 +0000 | [diff] [blame] | 1057 | def mro_disagreement(): | 
 | 1058 |     if verbose: print "Testing error messages for MRO disagreement..." | 
 | 1059 |     def raises(exc, expected, callable, *args): | 
 | 1060 |         try: | 
 | 1061 |             callable(*args) | 
 | 1062 |         except exc, msg: | 
| Guido van Rossum | a01fa26 | 2002-11-27 04:00:59 +0000 | [diff] [blame] | 1063 |             if not str(msg).startswith(expected): | 
| Guido van Rossum | d32047f | 2002-11-25 21:38:52 +0000 | [diff] [blame] | 1064 |                 raise TestFailed, "Message %r, expected %r" % (str(msg), | 
 | 1065 |                                                                expected) | 
 | 1066 |         else: | 
 | 1067 |             raise TestFailed, "Expected %s" % exc | 
 | 1068 |     class A(object): pass | 
 | 1069 |     class B(A): pass | 
 | 1070 |     class C(object): pass | 
 | 1071 |     # Test some very simple errors | 
 | 1072 |     raises(TypeError, "duplicate base class A", | 
 | 1073 |            type, "X", (A, A), {}) | 
| Guido van Rossum | a01fa26 | 2002-11-27 04:00:59 +0000 | [diff] [blame] | 1074 |     raises(TypeError, "MRO conflict among bases ", | 
| Guido van Rossum | d32047f | 2002-11-25 21:38:52 +0000 | [diff] [blame] | 1075 |            type, "X", (A, B), {}) | 
| Guido van Rossum | a01fa26 | 2002-11-27 04:00:59 +0000 | [diff] [blame] | 1076 |     raises(TypeError, "MRO conflict among bases ", | 
| Guido van Rossum | d32047f | 2002-11-25 21:38:52 +0000 | [diff] [blame] | 1077 |            type, "X", (A, C, B), {}) | 
 | 1078 |     # Test a slightly more complex error | 
 | 1079 |     class GridLayout(object): pass | 
 | 1080 |     class HorizontalGrid(GridLayout): pass | 
 | 1081 |     class VerticalGrid(GridLayout): pass | 
 | 1082 |     class HVGrid(HorizontalGrid, VerticalGrid): pass | 
 | 1083 |     class VHGrid(VerticalGrid, HorizontalGrid): pass | 
| Guido van Rossum | a01fa26 | 2002-11-27 04:00:59 +0000 | [diff] [blame] | 1084 |     raises(TypeError, "MRO conflict among bases ", | 
| Guido van Rossum | d32047f | 2002-11-25 21:38:52 +0000 | [diff] [blame] | 1085 |            type, "ConfusedGrid", (HVGrid, VHGrid), {}) | 
 | 1086 |  | 
| Guido van Rossum | 3720261 | 2001-08-09 19:45:21 +0000 | [diff] [blame] | 1087 | def objects(): | 
 | 1088 |     if verbose: print "Testing object class..." | 
 | 1089 |     a = object() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1090 |     vereq(a.__class__, object) | 
 | 1091 |     vereq(type(a), object) | 
| Guido van Rossum | 3720261 | 2001-08-09 19:45:21 +0000 | [diff] [blame] | 1092 |     b = object() | 
 | 1093 |     verify(a is not b) | 
 | 1094 |     verify(not hasattr(a, "foo")) | 
 | 1095 |     try: | 
 | 1096 |         a.foo = 12 | 
| Guido van Rossum | 6d94627 | 2001-08-10 19:42:38 +0000 | [diff] [blame] | 1097 |     except (AttributeError, TypeError): | 
| Guido van Rossum | 3720261 | 2001-08-09 19:45:21 +0000 | [diff] [blame] | 1098 |         pass | 
 | 1099 |     else: | 
 | 1100 |         verify(0, "object() should not allow setting a foo attribute") | 
 | 1101 |     verify(not hasattr(object(), "__dict__")) | 
 | 1102 |  | 
 | 1103 |     class Cdict(object): | 
 | 1104 |         pass | 
 | 1105 |     x = Cdict() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1106 |     vereq(x.__dict__, {}) | 
| Guido van Rossum | 3720261 | 2001-08-09 19:45:21 +0000 | [diff] [blame] | 1107 |     x.foo = 1 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1108 |     vereq(x.foo, 1) | 
 | 1109 |     vereq(x.__dict__, {'foo': 1}) | 
| Guido van Rossum | 3720261 | 2001-08-09 19:45:21 +0000 | [diff] [blame] | 1110 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1111 | def slots(): | 
 | 1112 |     if verbose: print "Testing __slots__..." | 
 | 1113 |     class C0(object): | 
 | 1114 |         __slots__ = [] | 
 | 1115 |     x = C0() | 
 | 1116 |     verify(not hasattr(x, "__dict__")) | 
 | 1117 |     verify(not hasattr(x, "foo")) | 
 | 1118 |  | 
 | 1119 |     class C1(object): | 
 | 1120 |         __slots__ = ['a'] | 
 | 1121 |     x = C1() | 
 | 1122 |     verify(not hasattr(x, "__dict__")) | 
| Guido van Rossum | 6b70599 | 2001-12-04 16:23:42 +0000 | [diff] [blame] | 1123 |     verify(not hasattr(x, "a")) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1124 |     x.a = 1 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1125 |     vereq(x.a, 1) | 
| Guido van Rossum | 6b70599 | 2001-12-04 16:23:42 +0000 | [diff] [blame] | 1126 |     x.a = None | 
 | 1127 |     veris(x.a, None) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1128 |     del x.a | 
| Guido van Rossum | 6b70599 | 2001-12-04 16:23:42 +0000 | [diff] [blame] | 1129 |     verify(not hasattr(x, "a")) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1130 |  | 
 | 1131 |     class C3(object): | 
 | 1132 |         __slots__ = ['a', 'b', 'c'] | 
 | 1133 |     x = C3() | 
 | 1134 |     verify(not hasattr(x, "__dict__")) | 
| Guido van Rossum | 6b70599 | 2001-12-04 16:23:42 +0000 | [diff] [blame] | 1135 |     verify(not hasattr(x, 'a')) | 
 | 1136 |     verify(not hasattr(x, 'b')) | 
 | 1137 |     verify(not hasattr(x, 'c')) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1138 |     x.a = 1 | 
 | 1139 |     x.b = 2 | 
 | 1140 |     x.c = 3 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1141 |     vereq(x.a, 1) | 
 | 1142 |     vereq(x.b, 2) | 
 | 1143 |     vereq(x.c, 3) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1144 |  | 
| Raymond Hettinger | 0ae0c07 | 2002-06-20 22:23:15 +0000 | [diff] [blame] | 1145 |     class C4(object): | 
 | 1146 |         """Validate name mangling""" | 
 | 1147 |         __slots__ = ['__a'] | 
 | 1148 |         def __init__(self, value): | 
 | 1149 |             self.__a = value | 
 | 1150 |         def get(self): | 
 | 1151 |             return self.__a | 
 | 1152 |     x = C4(5) | 
 | 1153 |     verify(not hasattr(x, '__dict__')) | 
 | 1154 |     verify(not hasattr(x, '__a')) | 
 | 1155 |     vereq(x.get(), 5) | 
 | 1156 |     try: | 
 | 1157 |         x.__a = 6 | 
 | 1158 |     except AttributeError: | 
 | 1159 |         pass | 
 | 1160 |     else: | 
 | 1161 |         raise TestFailed, "Double underscored names not mangled" | 
 | 1162 |  | 
| Guido van Rossum | 9923ffe | 2002-06-04 19:52:53 +0000 | [diff] [blame] | 1163 |     # Make sure slot names are proper identifiers | 
 | 1164 |     try: | 
 | 1165 |         class C(object): | 
 | 1166 |             __slots__ = [None] | 
 | 1167 |     except TypeError: | 
 | 1168 |         pass | 
 | 1169 |     else: | 
 | 1170 |         raise TestFailed, "[None] slots not caught" | 
 | 1171 |     try: | 
 | 1172 |         class C(object): | 
 | 1173 |             __slots__ = ["foo bar"] | 
 | 1174 |     except TypeError: | 
 | 1175 |         pass | 
 | 1176 |     else: | 
 | 1177 |         raise TestFailed, "['foo bar'] slots not caught" | 
 | 1178 |     try: | 
 | 1179 |         class C(object): | 
 | 1180 |             __slots__ = ["foo\0bar"] | 
 | 1181 |     except TypeError: | 
 | 1182 |         pass | 
 | 1183 |     else: | 
 | 1184 |         raise TestFailed, "['foo\\0bar'] slots not caught" | 
 | 1185 |     try: | 
 | 1186 |         class C(object): | 
 | 1187 |             __slots__ = ["1"] | 
 | 1188 |     except TypeError: | 
 | 1189 |         pass | 
 | 1190 |     else: | 
 | 1191 |         raise TestFailed, "['1'] slots not caught" | 
 | 1192 |     try: | 
 | 1193 |         class C(object): | 
 | 1194 |             __slots__ = [""] | 
 | 1195 |     except TypeError: | 
 | 1196 |         pass | 
 | 1197 |     else: | 
 | 1198 |         raise TestFailed, "[''] slots not caught" | 
 | 1199 |     class C(object): | 
 | 1200 |         __slots__ = ["a", "a_b", "_a", "A0123456789Z"] | 
 | 1201 |  | 
| Guido van Rossum | 33bab01 | 2001-12-05 22:45:48 +0000 | [diff] [blame] | 1202 |     # Test leaks | 
 | 1203 |     class Counted(object): | 
 | 1204 |         counter = 0    # counts the number of instances alive | 
 | 1205 |         def __init__(self): | 
 | 1206 |             Counted.counter += 1 | 
 | 1207 |         def __del__(self): | 
 | 1208 |             Counted.counter -= 1 | 
 | 1209 |     class C(object): | 
 | 1210 |         __slots__ = ['a', 'b', 'c'] | 
 | 1211 |     x = C() | 
 | 1212 |     x.a = Counted() | 
 | 1213 |     x.b = Counted() | 
 | 1214 |     x.c = Counted() | 
 | 1215 |     vereq(Counted.counter, 3) | 
 | 1216 |     del x | 
 | 1217 |     vereq(Counted.counter, 0) | 
 | 1218 |     class D(C): | 
 | 1219 |         pass | 
 | 1220 |     x = D() | 
 | 1221 |     x.a = Counted() | 
 | 1222 |     x.z = Counted() | 
 | 1223 |     vereq(Counted.counter, 2) | 
 | 1224 |     del x | 
 | 1225 |     vereq(Counted.counter, 0) | 
 | 1226 |     class E(D): | 
 | 1227 |         __slots__ = ['e'] | 
 | 1228 |     x = E() | 
 | 1229 |     x.a = Counted() | 
 | 1230 |     x.z = Counted() | 
 | 1231 |     x.e = Counted() | 
 | 1232 |     vereq(Counted.counter, 3) | 
 | 1233 |     del x | 
 | 1234 |     vereq(Counted.counter, 0) | 
 | 1235 |  | 
| Guido van Rossum | 9923ffe | 2002-06-04 19:52:53 +0000 | [diff] [blame] | 1236 |     # Test cyclical leaks [SF bug 519621] | 
 | 1237 |     class F(object): | 
 | 1238 |         __slots__ = ['a', 'b'] | 
 | 1239 |     log = [] | 
 | 1240 |     s = F() | 
 | 1241 |     s.a = [Counted(), s] | 
 | 1242 |     vereq(Counted.counter, 1) | 
 | 1243 |     s = None | 
 | 1244 |     import gc | 
 | 1245 |     gc.collect() | 
 | 1246 |     vereq(Counted.counter, 0) | 
 | 1247 |  | 
| Raymond Hettinger | ab5dae3 | 2002-06-24 13:08:16 +0000 | [diff] [blame] | 1248 |     # Test lookup leaks [SF bug 572567] | 
 | 1249 |     import sys,gc | 
 | 1250 |     class G(object): | 
 | 1251 |         def __cmp__(self, other): | 
 | 1252 |             return 0 | 
 | 1253 |     g = G() | 
 | 1254 |     orig_objects = len(gc.get_objects()) | 
 | 1255 |     for i in xrange(10): | 
 | 1256 |         g==g | 
 | 1257 |     new_objects = len(gc.get_objects()) | 
 | 1258 |     vereq(orig_objects, new_objects) | 
 | 1259 |  | 
| Guido van Rossum | 8b056da | 2002-08-13 18:26:26 +0000 | [diff] [blame] | 1260 | def slotspecials(): | 
 | 1261 |     if verbose: print "Testing __dict__ and __weakref__ in __slots__..." | 
 | 1262 |  | 
 | 1263 |     class D(object): | 
 | 1264 |         __slots__ = ["__dict__"] | 
 | 1265 |     a = D() | 
 | 1266 |     verify(hasattr(a, "__dict__")) | 
 | 1267 |     verify(not hasattr(a, "__weakref__")) | 
 | 1268 |     a.foo = 42 | 
 | 1269 |     vereq(a.__dict__, {"foo": 42}) | 
 | 1270 |  | 
 | 1271 |     class W(object): | 
 | 1272 |         __slots__ = ["__weakref__"] | 
 | 1273 |     a = W() | 
 | 1274 |     verify(hasattr(a, "__weakref__")) | 
 | 1275 |     verify(not hasattr(a, "__dict__")) | 
 | 1276 |     try: | 
 | 1277 |         a.foo = 42 | 
 | 1278 |     except AttributeError: | 
 | 1279 |         pass | 
 | 1280 |     else: | 
 | 1281 |         raise TestFailed, "shouldn't be allowed to set a.foo" | 
 | 1282 |  | 
 | 1283 |     class C1(W, D): | 
 | 1284 |         __slots__ = [] | 
 | 1285 |     a = C1() | 
 | 1286 |     verify(hasattr(a, "__dict__")) | 
 | 1287 |     verify(hasattr(a, "__weakref__")) | 
 | 1288 |     a.foo = 42 | 
 | 1289 |     vereq(a.__dict__, {"foo": 42}) | 
 | 1290 |  | 
 | 1291 |     class C2(D, W): | 
 | 1292 |         __slots__ = [] | 
 | 1293 |     a = C2() | 
 | 1294 |     verify(hasattr(a, "__dict__")) | 
 | 1295 |     verify(hasattr(a, "__weakref__")) | 
 | 1296 |     a.foo = 42 | 
 | 1297 |     vereq(a.__dict__, {"foo": 42}) | 
 | 1298 |  | 
| Guido van Rossum | 9a81892 | 2002-11-14 19:50:14 +0000 | [diff] [blame] | 1299 | # MRO order disagreement | 
 | 1300 | # | 
 | 1301 | #    class C3(C1, C2): | 
 | 1302 | #        __slots__ = [] | 
 | 1303 | # | 
 | 1304 | #    class C4(C2, C1): | 
 | 1305 | #        __slots__ = [] | 
| Guido van Rossum | 8b056da | 2002-08-13 18:26:26 +0000 | [diff] [blame] | 1306 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1307 | def dynamics(): | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 1308 |     if verbose: print "Testing class attribute propagation..." | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1309 |     class D(object): | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1310 |         pass | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 1311 |     class E(D): | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1312 |         pass | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 1313 |     class F(D): | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1314 |         pass | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1315 |     D.foo = 1 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1316 |     vereq(D.foo, 1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1317 |     # Test that dynamic attributes are inherited | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1318 |     vereq(E.foo, 1) | 
 | 1319 |     vereq(F.foo, 1) | 
| Guido van Rossum | 9d4fe42 | 2001-08-12 03:38:18 +0000 | [diff] [blame] | 1320 |     # Test dynamic instances | 
 | 1321 |     class C(object): | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 1322 |         pass | 
| Guido van Rossum | 9d4fe42 | 2001-08-12 03:38:18 +0000 | [diff] [blame] | 1323 |     a = C() | 
| Guido van Rossum | d307740 | 2001-08-12 05:24:18 +0000 | [diff] [blame] | 1324 |     verify(not hasattr(a, "foobar")) | 
| Guido van Rossum | 9d4fe42 | 2001-08-12 03:38:18 +0000 | [diff] [blame] | 1325 |     C.foobar = 2 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1326 |     vereq(a.foobar, 2) | 
| Guido van Rossum | 9d4fe42 | 2001-08-12 03:38:18 +0000 | [diff] [blame] | 1327 |     C.method = lambda self: 42 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1328 |     vereq(a.method(), 42) | 
| Guido van Rossum | 9d4fe42 | 2001-08-12 03:38:18 +0000 | [diff] [blame] | 1329 |     C.__repr__ = lambda self: "C()" | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1330 |     vereq(repr(a), "C()") | 
| Guido van Rossum | d307740 | 2001-08-12 05:24:18 +0000 | [diff] [blame] | 1331 |     C.__int__ = lambda self: 100 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1332 |     vereq(int(a), 100) | 
 | 1333 |     vereq(a.foobar, 2) | 
| Guido van Rossum | d307740 | 2001-08-12 05:24:18 +0000 | [diff] [blame] | 1334 |     verify(not hasattr(a, "spam")) | 
 | 1335 |     def mygetattr(self, name): | 
 | 1336 |         if name == "spam": | 
 | 1337 |             return "spam" | 
| Guido van Rossum | 19c1cd5 | 2001-09-21 21:24:49 +0000 | [diff] [blame] | 1338 |         raise AttributeError | 
 | 1339 |     C.__getattr__ = mygetattr | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1340 |     vereq(a.spam, "spam") | 
| Guido van Rossum | d307740 | 2001-08-12 05:24:18 +0000 | [diff] [blame] | 1341 |     a.new = 12 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1342 |     vereq(a.new, 12) | 
| Guido van Rossum | d307740 | 2001-08-12 05:24:18 +0000 | [diff] [blame] | 1343 |     def mysetattr(self, name, value): | 
 | 1344 |         if name == "spam": | 
 | 1345 |             raise AttributeError | 
 | 1346 |         return object.__setattr__(self, name, value) | 
 | 1347 |     C.__setattr__ = mysetattr | 
 | 1348 |     try: | 
 | 1349 |         a.spam = "not spam" | 
 | 1350 |     except AttributeError: | 
 | 1351 |         pass | 
 | 1352 |     else: | 
 | 1353 |         verify(0, "expected AttributeError") | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1354 |     vereq(a.spam, "spam") | 
| Guido van Rossum | 80e3675 | 2001-08-14 20:00:33 +0000 | [diff] [blame] | 1355 |     class D(C): | 
 | 1356 |         pass | 
 | 1357 |     d = D() | 
 | 1358 |     d.foo = 1 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1359 |     vereq(d.foo, 1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1360 |  | 
| Guido van Rossum | 7e35d57 | 2001-09-15 03:14:32 +0000 | [diff] [blame] | 1361 |     # Test handling of int*seq and seq*int | 
 | 1362 |     class I(int): | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 1363 |         pass | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1364 |     vereq("a"*I(2), "aa") | 
 | 1365 |     vereq(I(2)*"a", "aa") | 
 | 1366 |     vereq(2*I(3), 6) | 
 | 1367 |     vereq(I(3)*2, 6) | 
 | 1368 |     vereq(I(3)*I(2), 6) | 
| Guido van Rossum | 7e35d57 | 2001-09-15 03:14:32 +0000 | [diff] [blame] | 1369 |  | 
 | 1370 |     # Test handling of long*seq and seq*long | 
 | 1371 |     class L(long): | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 1372 |         pass | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1373 |     vereq("a"*L(2L), "aa") | 
 | 1374 |     vereq(L(2L)*"a", "aa") | 
 | 1375 |     vereq(2*L(3), 6) | 
 | 1376 |     vereq(L(3)*2, 6) | 
 | 1377 |     vereq(L(3)*L(2), 6) | 
| Guido van Rossum | 7e35d57 | 2001-09-15 03:14:32 +0000 | [diff] [blame] | 1378 |  | 
| Guido van Rossum | 3d45d8f | 2001-09-24 18:47:40 +0000 | [diff] [blame] | 1379 |     # Test comparison of classes with dynamic metaclasses | 
 | 1380 |     class dynamicmetaclass(type): | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 1381 |         pass | 
| Guido van Rossum | 3d45d8f | 2001-09-24 18:47:40 +0000 | [diff] [blame] | 1382 |     class someclass: | 
 | 1383 |         __metaclass__ = dynamicmetaclass | 
 | 1384 |     verify(someclass != object) | 
 | 1385 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1386 | def errors(): | 
 | 1387 |     if verbose: print "Testing errors..." | 
 | 1388 |  | 
 | 1389 |     try: | 
| Tim Peters | a427a2b | 2001-10-29 22:25:45 +0000 | [diff] [blame] | 1390 |         class C(list, dict): | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1391 |             pass | 
 | 1392 |     except TypeError: | 
 | 1393 |         pass | 
 | 1394 |     else: | 
 | 1395 |         verify(0, "inheritance from both list and dict should be illegal") | 
 | 1396 |  | 
 | 1397 |     try: | 
 | 1398 |         class C(object, None): | 
 | 1399 |             pass | 
 | 1400 |     except TypeError: | 
 | 1401 |         pass | 
 | 1402 |     else: | 
 | 1403 |         verify(0, "inheritance from non-type should be illegal") | 
 | 1404 |     class Classic: | 
 | 1405 |         pass | 
 | 1406 |  | 
 | 1407 |     try: | 
| Guido van Rossum | 8aea0cc | 2001-08-29 15:48:43 +0000 | [diff] [blame] | 1408 |         class C(type(len)): | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1409 |             pass | 
 | 1410 |     except TypeError: | 
 | 1411 |         pass | 
 | 1412 |     else: | 
| Guido van Rossum | 8aea0cc | 2001-08-29 15:48:43 +0000 | [diff] [blame] | 1413 |         verify(0, "inheritance from CFunction should be illegal") | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1414 |  | 
 | 1415 |     try: | 
 | 1416 |         class C(object): | 
 | 1417 |             __slots__ = 1 | 
 | 1418 |     except TypeError: | 
 | 1419 |         pass | 
 | 1420 |     else: | 
 | 1421 |         verify(0, "__slots__ = 1 should be illegal") | 
 | 1422 |  | 
 | 1423 |     try: | 
 | 1424 |         class C(object): | 
 | 1425 |             __slots__ = [1] | 
 | 1426 |     except TypeError: | 
 | 1427 |         pass | 
 | 1428 |     else: | 
 | 1429 |         verify(0, "__slots__ = [1] should be illegal") | 
 | 1430 |  | 
 | 1431 | def classmethods(): | 
 | 1432 |     if verbose: print "Testing class methods..." | 
 | 1433 |     class C(object): | 
 | 1434 |         def foo(*a): return a | 
 | 1435 |         goo = classmethod(foo) | 
 | 1436 |     c = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1437 |     vereq(C.goo(1), (C, 1)) | 
 | 1438 |     vereq(c.goo(1), (C, 1)) | 
 | 1439 |     vereq(c.foo(1), (c, 1)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1440 |     class D(C): | 
 | 1441 |         pass | 
 | 1442 |     d = D() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1443 |     vereq(D.goo(1), (D, 1)) | 
 | 1444 |     vereq(d.goo(1), (D, 1)) | 
 | 1445 |     vereq(d.foo(1), (d, 1)) | 
 | 1446 |     vereq(D.foo(d, 1), (d, 1)) | 
| Guido van Rossum | 7e30548 | 2002-03-18 03:09:06 +0000 | [diff] [blame] | 1447 |     # Test for a specific crash (SF bug 528132) | 
 | 1448 |     def f(cls, arg): return (cls, arg) | 
 | 1449 |     ff = classmethod(f) | 
 | 1450 |     vereq(ff.__get__(0, int)(42), (int, 42)) | 
 | 1451 |     vereq(ff.__get__(0)(42), (int, 42)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1452 |  | 
| Guido van Rossum | 155db9a | 2002-04-02 17:53:47 +0000 | [diff] [blame] | 1453 |     # Test super() with classmethods (SF bug 535444) | 
 | 1454 |     veris(C.goo.im_self, C) | 
 | 1455 |     veris(D.goo.im_self, D) | 
 | 1456 |     veris(super(D,D).goo.im_self, D) | 
 | 1457 |     veris(super(D,d).goo.im_self, D) | 
 | 1458 |     vereq(super(D,D).goo(), (D,)) | 
 | 1459 |     vereq(super(D,d).goo(), (D,)) | 
 | 1460 |  | 
| Fred Drake | f841aa6 | 2002-03-28 15:49:54 +0000 | [diff] [blame] | 1461 | def classmethods_in_c(): | 
 | 1462 |     if verbose: print "Testing C-based class methods..." | 
 | 1463 |     import xxsubtype as spam | 
 | 1464 |     a = (1, 2, 3) | 
 | 1465 |     d = {'abc': 123} | 
 | 1466 |     x, a1, d1 = spam.spamlist.classmeth(*a, **d) | 
 | 1467 |     veris(x, None) | 
 | 1468 |     vereq((spam.spamlist,) + a, a1) | 
 | 1469 |     vereq(d, d1) | 
 | 1470 |     x, a1, d1 = spam.spamlist().classmeth(*a, **d) | 
 | 1471 |     veris(x, None) | 
 | 1472 |     vereq((spam.spamlist,) + a, a1) | 
 | 1473 |     vereq(d, d1) | 
 | 1474 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1475 | def staticmethods(): | 
 | 1476 |     if verbose: print "Testing static methods..." | 
 | 1477 |     class C(object): | 
 | 1478 |         def foo(*a): return a | 
 | 1479 |         goo = staticmethod(foo) | 
 | 1480 |     c = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1481 |     vereq(C.goo(1), (1,)) | 
 | 1482 |     vereq(c.goo(1), (1,)) | 
 | 1483 |     vereq(c.foo(1), (c, 1,)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1484 |     class D(C): | 
 | 1485 |         pass | 
 | 1486 |     d = D() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1487 |     vereq(D.goo(1), (1,)) | 
 | 1488 |     vereq(d.goo(1), (1,)) | 
 | 1489 |     vereq(d.foo(1), (d, 1)) | 
 | 1490 |     vereq(D.foo(d, 1), (d, 1)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1491 |  | 
| Fred Drake | f841aa6 | 2002-03-28 15:49:54 +0000 | [diff] [blame] | 1492 | def staticmethods_in_c(): | 
 | 1493 |     if verbose: print "Testing C-based static methods..." | 
 | 1494 |     import xxsubtype as spam | 
 | 1495 |     a = (1, 2, 3) | 
 | 1496 |     d = {"abc": 123} | 
 | 1497 |     x, a1, d1 = spam.spamlist.staticmeth(*a, **d) | 
 | 1498 |     veris(x, None) | 
 | 1499 |     vereq(a, a1) | 
 | 1500 |     vereq(d, d1) | 
 | 1501 |     x, a1, d2 = spam.spamlist().staticmeth(*a, **d) | 
 | 1502 |     veris(x, None) | 
 | 1503 |     vereq(a, a1) | 
 | 1504 |     vereq(d, d1) | 
 | 1505 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1506 | def classic(): | 
 | 1507 |     if verbose: print "Testing classic classes..." | 
 | 1508 |     class C: | 
 | 1509 |         def foo(*a): return a | 
 | 1510 |         goo = classmethod(foo) | 
 | 1511 |     c = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1512 |     vereq(C.goo(1), (C, 1)) | 
 | 1513 |     vereq(c.goo(1), (C, 1)) | 
 | 1514 |     vereq(c.foo(1), (c, 1)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1515 |     class D(C): | 
 | 1516 |         pass | 
 | 1517 |     d = D() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1518 |     vereq(D.goo(1), (D, 1)) | 
 | 1519 |     vereq(d.goo(1), (D, 1)) | 
 | 1520 |     vereq(d.foo(1), (d, 1)) | 
 | 1521 |     vereq(D.foo(d, 1), (d, 1)) | 
| Guido van Rossum | 9301876 | 2001-08-17 13:40:47 +0000 | [diff] [blame] | 1522 |     class E: # *not* subclassing from C | 
 | 1523 |         foo = C.foo | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1524 |     vereq(E().foo, C.foo) # i.e., unbound | 
| Guido van Rossum | 84a79a8 | 2001-08-17 13:58:31 +0000 | [diff] [blame] | 1525 |     verify(repr(C.foo.__get__(C())).startswith("<bound method ")) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1526 |  | 
 | 1527 | def compattr(): | 
 | 1528 |     if verbose: print "Testing computed attributes..." | 
 | 1529 |     class C(object): | 
 | 1530 |         class computed_attribute(object): | 
| Guido van Rossum | 0dbab4c5 | 2002-08-01 14:39:25 +0000 | [diff] [blame] | 1531 |             def __init__(self, get, set=None, delete=None): | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1532 |                 self.__get = get | 
 | 1533 |                 self.__set = set | 
| Guido van Rossum | 0dbab4c5 | 2002-08-01 14:39:25 +0000 | [diff] [blame] | 1534 |                 self.__delete = delete | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1535 |             def __get__(self, obj, type=None): | 
 | 1536 |                 return self.__get(obj) | 
 | 1537 |             def __set__(self, obj, value): | 
 | 1538 |                 return self.__set(obj, value) | 
| Guido van Rossum | 0dbab4c5 | 2002-08-01 14:39:25 +0000 | [diff] [blame] | 1539 |             def __delete__(self, obj): | 
 | 1540 |                 return self.__delete(obj) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1541 |         def __init__(self): | 
 | 1542 |             self.__x = 0 | 
 | 1543 |         def __get_x(self): | 
 | 1544 |             x = self.__x | 
 | 1545 |             self.__x = x+1 | 
 | 1546 |             return x | 
 | 1547 |         def __set_x(self, x): | 
 | 1548 |             self.__x = x | 
| Guido van Rossum | 0dbab4c5 | 2002-08-01 14:39:25 +0000 | [diff] [blame] | 1549 |         def __delete_x(self): | 
 | 1550 |             del self.__x | 
 | 1551 |         x = computed_attribute(__get_x, __set_x, __delete_x) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1552 |     a = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1553 |     vereq(a.x, 0) | 
 | 1554 |     vereq(a.x, 1) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1555 |     a.x = 10 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1556 |     vereq(a.x, 10) | 
 | 1557 |     vereq(a.x, 11) | 
| Guido van Rossum | 0dbab4c5 | 2002-08-01 14:39:25 +0000 | [diff] [blame] | 1558 |     del a.x | 
 | 1559 |     vereq(hasattr(a, 'x'), 0) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1560 |  | 
 | 1561 | def newslot(): | 
 | 1562 |     if verbose: print "Testing __new__ slot override..." | 
 | 1563 |     class C(list): | 
 | 1564 |         def __new__(cls): | 
 | 1565 |             self = list.__new__(cls) | 
 | 1566 |             self.foo = 1 | 
 | 1567 |             return self | 
 | 1568 |         def __init__(self): | 
 | 1569 |             self.foo = self.foo + 2 | 
 | 1570 |     a = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1571 |     vereq(a.foo, 3) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1572 |     verify(a.__class__ is C) | 
 | 1573 |     class D(C): | 
 | 1574 |         pass | 
 | 1575 |     b = D() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1576 |     vereq(b.foo, 3) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1577 |     verify(b.__class__ is D) | 
 | 1578 |  | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1579 | def altmro(): | 
 | 1580 |     if verbose: print "Testing mro() and overriding it..." | 
 | 1581 |     class A(object): | 
 | 1582 |         def f(self): return "A" | 
 | 1583 |     class B(A): | 
 | 1584 |         pass | 
 | 1585 |     class C(A): | 
 | 1586 |         def f(self): return "C" | 
 | 1587 |     class D(B, C): | 
 | 1588 |         pass | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1589 |     vereq(D.mro(), [D, B, C, A, object]) | 
 | 1590 |     vereq(D.__mro__, (D, B, C, A, object)) | 
 | 1591 |     vereq(D().f(), "C") | 
| Guido van Rossum | 9a81892 | 2002-11-14 19:50:14 +0000 | [diff] [blame] | 1592 |  | 
| Guido van Rossum | d307740 | 2001-08-12 05:24:18 +0000 | [diff] [blame] | 1593 |     class PerverseMetaType(type): | 
 | 1594 |         def mro(cls): | 
 | 1595 |             L = type.mro(cls) | 
 | 1596 |             L.reverse() | 
 | 1597 |             return L | 
| Guido van Rossum | 9a81892 | 2002-11-14 19:50:14 +0000 | [diff] [blame] | 1598 |     class X(D,B,C,A): | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1599 |         __metaclass__ = PerverseMetaType | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1600 |     vereq(X.__mro__, (object, A, C, B, D, X)) | 
 | 1601 |     vereq(X().f(), "A") | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1602 |  | 
 | 1603 | def overloading(): | 
| Guido van Rossum | 65d5d7f | 2001-08-17 21:27:53 +0000 | [diff] [blame] | 1604 |     if verbose: print "Testing operator overloading..." | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1605 |  | 
 | 1606 |     class B(object): | 
 | 1607 |         "Intermediate class because object doesn't have a __setattr__" | 
 | 1608 |  | 
 | 1609 |     class C(B): | 
 | 1610 |  | 
| Guido van Rossum | 19c1cd5 | 2001-09-21 21:24:49 +0000 | [diff] [blame] | 1611 |         def __getattr__(self, name): | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1612 |             if name == "foo": | 
 | 1613 |                 return ("getattr", name) | 
 | 1614 |             else: | 
| Guido van Rossum | 19c1cd5 | 2001-09-21 21:24:49 +0000 | [diff] [blame] | 1615 |                 raise AttributeError | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1616 |         def __setattr__(self, name, value): | 
 | 1617 |             if name == "foo": | 
 | 1618 |                 self.setattr = (name, value) | 
 | 1619 |             else: | 
 | 1620 |                 return B.__setattr__(self, name, value) | 
 | 1621 |         def __delattr__(self, name): | 
 | 1622 |             if name == "foo": | 
 | 1623 |                 self.delattr = name | 
 | 1624 |             else: | 
 | 1625 |                 return B.__delattr__(self, name) | 
 | 1626 |  | 
 | 1627 |         def __getitem__(self, key): | 
 | 1628 |             return ("getitem", key) | 
 | 1629 |         def __setitem__(self, key, value): | 
 | 1630 |             self.setitem = (key, value) | 
 | 1631 |         def __delitem__(self, key): | 
 | 1632 |             self.delitem = key | 
 | 1633 |  | 
 | 1634 |         def __getslice__(self, i, j): | 
 | 1635 |             return ("getslice", i, j) | 
 | 1636 |         def __setslice__(self, i, j, value): | 
 | 1637 |             self.setslice = (i, j, value) | 
 | 1638 |         def __delslice__(self, i, j): | 
 | 1639 |             self.delslice = (i, j) | 
 | 1640 |  | 
 | 1641 |     a = C() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1642 |     vereq(a.foo, ("getattr", "foo")) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1643 |     a.foo = 12 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1644 |     vereq(a.setattr, ("foo", 12)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1645 |     del a.foo | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1646 |     vereq(a.delattr, "foo") | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1647 |  | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1648 |     vereq(a[12], ("getitem", 12)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1649 |     a[12] = 21 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1650 |     vereq(a.setitem, (12, 21)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1651 |     del a[12] | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1652 |     vereq(a.delitem, 12) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1653 |  | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1654 |     vereq(a[0:10], ("getslice", 0, 10)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1655 |     a[0:10] = "foo" | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1656 |     vereq(a.setslice, (0, 10, "foo")) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1657 |     del a[0:10] | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1658 |     vereq(a.delslice, (0, 10)) | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 1659 |  | 
| Guido van Rossum | b5a136b | 2001-08-15 17:51:17 +0000 | [diff] [blame] | 1660 | def methods(): | 
| Guido van Rossum | 65d5d7f | 2001-08-17 21:27:53 +0000 | [diff] [blame] | 1661 |     if verbose: print "Testing methods..." | 
| Guido van Rossum | b5a136b | 2001-08-15 17:51:17 +0000 | [diff] [blame] | 1662 |     class C(object): | 
 | 1663 |         def __init__(self, x): | 
 | 1664 |             self.x = x | 
 | 1665 |         def foo(self): | 
 | 1666 |             return self.x | 
 | 1667 |     c1 = C(1) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1668 |     vereq(c1.foo(), 1) | 
| Guido van Rossum | b5a136b | 2001-08-15 17:51:17 +0000 | [diff] [blame] | 1669 |     class D(C): | 
 | 1670 |         boo = C.foo | 
 | 1671 |         goo = c1.foo | 
 | 1672 |     d2 = D(2) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1673 |     vereq(d2.foo(), 2) | 
 | 1674 |     vereq(d2.boo(), 2) | 
 | 1675 |     vereq(d2.goo(), 1) | 
| Guido van Rossum | 9301876 | 2001-08-17 13:40:47 +0000 | [diff] [blame] | 1676 |     class E(object): | 
 | 1677 |         foo = C.foo | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1678 |     vereq(E().foo, C.foo) # i.e., unbound | 
| Guido van Rossum | 84a79a8 | 2001-08-17 13:58:31 +0000 | [diff] [blame] | 1679 |     verify(repr(C.foo.__get__(C(1))).startswith("<bound method ")) | 
| Guido van Rossum | b5a136b | 2001-08-15 17:51:17 +0000 | [diff] [blame] | 1680 |  | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1681 | def specials(): | 
 | 1682 |     # Test operators like __hash__ for which a built-in default exists | 
| Guido van Rossum | 65d5d7f | 2001-08-17 21:27:53 +0000 | [diff] [blame] | 1683 |     if verbose: print "Testing special operators..." | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1684 |     # Test the default behavior for static classes | 
 | 1685 |     class C(object): | 
 | 1686 |         def __getitem__(self, i): | 
 | 1687 |             if 0 <= i < 10: return i | 
 | 1688 |             raise IndexError | 
 | 1689 |     c1 = C() | 
 | 1690 |     c2 = C() | 
 | 1691 |     verify(not not c1) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1692 |     vereq(hash(c1), id(c1)) | 
 | 1693 |     vereq(cmp(c1, c2), cmp(id(c1), id(c2))) | 
 | 1694 |     vereq(c1, c1) | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1695 |     verify(c1 != c2) | 
 | 1696 |     verify(not c1 != c1) | 
 | 1697 |     verify(not c1 == c2) | 
| Tim Peters | 4d2dded | 2001-08-16 19:50:51 +0000 | [diff] [blame] | 1698 |     # Note that the module name appears in str/repr, and that varies | 
 | 1699 |     # depending on whether this test is run standalone or from a framework. | 
| Guido van Rossum | ff0e6d6 | 2001-09-24 16:03:59 +0000 | [diff] [blame] | 1700 |     verify(str(c1).find('C object at ') >= 0) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1701 |     vereq(str(c1), repr(c1)) | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1702 |     verify(-1 not in c1) | 
 | 1703 |     for i in range(10): | 
 | 1704 |         verify(i in c1) | 
 | 1705 |     verify(10 not in c1) | 
 | 1706 |     # Test the default behavior for dynamic classes | 
 | 1707 |     class D(object): | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1708 |         def __getitem__(self, i): | 
 | 1709 |             if 0 <= i < 10: return i | 
 | 1710 |             raise IndexError | 
 | 1711 |     d1 = D() | 
 | 1712 |     d2 = D() | 
 | 1713 |     verify(not not d1) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1714 |     vereq(hash(d1), id(d1)) | 
 | 1715 |     vereq(cmp(d1, d2), cmp(id(d1), id(d2))) | 
 | 1716 |     vereq(d1, d1) | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1717 |     verify(d1 != d2) | 
 | 1718 |     verify(not d1 != d1) | 
 | 1719 |     verify(not d1 == d2) | 
| Tim Peters | 4d2dded | 2001-08-16 19:50:51 +0000 | [diff] [blame] | 1720 |     # Note that the module name appears in str/repr, and that varies | 
 | 1721 |     # depending on whether this test is run standalone or from a framework. | 
| Guido van Rossum | ff0e6d6 | 2001-09-24 16:03:59 +0000 | [diff] [blame] | 1722 |     verify(str(d1).find('D object at ') >= 0) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1723 |     vereq(str(d1), repr(d1)) | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1724 |     verify(-1 not in d1) | 
 | 1725 |     for i in range(10): | 
 | 1726 |         verify(i in d1) | 
 | 1727 |     verify(10 not in d1) | 
 | 1728 |     # Test overridden behavior for static classes | 
 | 1729 |     class Proxy(object): | 
 | 1730 |         def __init__(self, x): | 
 | 1731 |             self.x = x | 
 | 1732 |         def __nonzero__(self): | 
 | 1733 |             return not not self.x | 
 | 1734 |         def __hash__(self): | 
 | 1735 |             return hash(self.x) | 
 | 1736 |         def __eq__(self, other): | 
 | 1737 |             return self.x == other | 
 | 1738 |         def __ne__(self, other): | 
 | 1739 |             return self.x != other | 
 | 1740 |         def __cmp__(self, other): | 
 | 1741 |             return cmp(self.x, other.x) | 
 | 1742 |         def __str__(self): | 
 | 1743 |             return "Proxy:%s" % self.x | 
 | 1744 |         def __repr__(self): | 
 | 1745 |             return "Proxy(%r)" % self.x | 
 | 1746 |         def __contains__(self, value): | 
 | 1747 |             return value in self.x | 
 | 1748 |     p0 = Proxy(0) | 
 | 1749 |     p1 = Proxy(1) | 
 | 1750 |     p_1 = Proxy(-1) | 
 | 1751 |     verify(not p0) | 
 | 1752 |     verify(not not p1) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1753 |     vereq(hash(p0), hash(0)) | 
 | 1754 |     vereq(p0, p0) | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1755 |     verify(p0 != p1) | 
 | 1756 |     verify(not p0 != p0) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1757 |     vereq(not p0, p1) | 
 | 1758 |     vereq(cmp(p0, p1), -1) | 
 | 1759 |     vereq(cmp(p0, p0), 0) | 
 | 1760 |     vereq(cmp(p0, p_1), 1) | 
 | 1761 |     vereq(str(p0), "Proxy:0") | 
 | 1762 |     vereq(repr(p0), "Proxy(0)") | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1763 |     p10 = Proxy(range(10)) | 
 | 1764 |     verify(-1 not in p10) | 
 | 1765 |     for i in range(10): | 
 | 1766 |         verify(i in p10) | 
 | 1767 |     verify(10 not in p10) | 
 | 1768 |     # Test overridden behavior for dynamic classes | 
 | 1769 |     class DProxy(object): | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1770 |         def __init__(self, x): | 
 | 1771 |             self.x = x | 
 | 1772 |         def __nonzero__(self): | 
 | 1773 |             return not not self.x | 
 | 1774 |         def __hash__(self): | 
 | 1775 |             return hash(self.x) | 
 | 1776 |         def __eq__(self, other): | 
 | 1777 |             return self.x == other | 
 | 1778 |         def __ne__(self, other): | 
 | 1779 |             return self.x != other | 
 | 1780 |         def __cmp__(self, other): | 
 | 1781 |             return cmp(self.x, other.x) | 
 | 1782 |         def __str__(self): | 
 | 1783 |             return "DProxy:%s" % self.x | 
 | 1784 |         def __repr__(self): | 
 | 1785 |             return "DProxy(%r)" % self.x | 
 | 1786 |         def __contains__(self, value): | 
 | 1787 |             return value in self.x | 
 | 1788 |     p0 = DProxy(0) | 
 | 1789 |     p1 = DProxy(1) | 
 | 1790 |     p_1 = DProxy(-1) | 
 | 1791 |     verify(not p0) | 
 | 1792 |     verify(not not p1) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1793 |     vereq(hash(p0), hash(0)) | 
 | 1794 |     vereq(p0, p0) | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1795 |     verify(p0 != p1) | 
 | 1796 |     verify(not p0 != p0) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1797 |     vereq(not p0, p1) | 
 | 1798 |     vereq(cmp(p0, p1), -1) | 
 | 1799 |     vereq(cmp(p0, p0), 0) | 
 | 1800 |     vereq(cmp(p0, p_1), 1) | 
 | 1801 |     vereq(str(p0), "DProxy:0") | 
 | 1802 |     vereq(repr(p0), "DProxy(0)") | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1803 |     p10 = DProxy(range(10)) | 
 | 1804 |     verify(-1 not in p10) | 
 | 1805 |     for i in range(10): | 
 | 1806 |         verify(i in p10) | 
 | 1807 |     verify(10 not in p10) | 
| Guido van Rossum | 843daa8 | 2001-09-18 20:04:26 +0000 | [diff] [blame] | 1808 |     # Safety test for __cmp__ | 
 | 1809 |     def unsafecmp(a, b): | 
 | 1810 |         try: | 
 | 1811 |             a.__class__.__cmp__(a, b) | 
 | 1812 |         except TypeError: | 
 | 1813 |             pass | 
 | 1814 |         else: | 
 | 1815 |             raise TestFailed, "shouldn't allow %s.__cmp__(%r, %r)" % ( | 
 | 1816 |                 a.__class__, a, b) | 
 | 1817 |     unsafecmp(u"123", "123") | 
 | 1818 |     unsafecmp("123", u"123") | 
 | 1819 |     unsafecmp(1, 1.0) | 
 | 1820 |     unsafecmp(1.0, 1) | 
 | 1821 |     unsafecmp(1, 1L) | 
 | 1822 |     unsafecmp(1L, 1) | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 1823 |  | 
| Guido van Rossum | 65d5d7f | 2001-08-17 21:27:53 +0000 | [diff] [blame] | 1824 | def weakrefs(): | 
 | 1825 |     if verbose: print "Testing weak references..." | 
 | 1826 |     import weakref | 
 | 1827 |     class C(object): | 
 | 1828 |         pass | 
 | 1829 |     c = C() | 
 | 1830 |     r = weakref.ref(c) | 
 | 1831 |     verify(r() is c) | 
 | 1832 |     del c | 
 | 1833 |     verify(r() is None) | 
 | 1834 |     del r | 
 | 1835 |     class NoWeak(object): | 
 | 1836 |         __slots__ = ['foo'] | 
 | 1837 |     no = NoWeak() | 
 | 1838 |     try: | 
 | 1839 |         weakref.ref(no) | 
 | 1840 |     except TypeError, msg: | 
| Fred Drake | 4bf018b | 2001-10-22 21:45:25 +0000 | [diff] [blame] | 1841 |         verify(str(msg).find("weak reference") >= 0) | 
| Guido van Rossum | 65d5d7f | 2001-08-17 21:27:53 +0000 | [diff] [blame] | 1842 |     else: | 
 | 1843 |         verify(0, "weakref.ref(no) should be illegal") | 
 | 1844 |     class Weak(object): | 
 | 1845 |         __slots__ = ['foo', '__weakref__'] | 
 | 1846 |     yes = Weak() | 
 | 1847 |     r = weakref.ref(yes) | 
 | 1848 |     verify(r() is yes) | 
 | 1849 |     del yes | 
 | 1850 |     verify(r() is None) | 
 | 1851 |     del r | 
 | 1852 |  | 
| Guido van Rossum | 8bce4ac | 2001-09-06 21:56:42 +0000 | [diff] [blame] | 1853 | def properties(): | 
 | 1854 |     if verbose: print "Testing property..." | 
| Guido van Rossum | 76f0cb8 | 2001-08-24 15:24:24 +0000 | [diff] [blame] | 1855 |     class C(object): | 
 | 1856 |         def getx(self): | 
 | 1857 |             return self.__x | 
 | 1858 |         def setx(self, value): | 
 | 1859 |             self.__x = value | 
 | 1860 |         def delx(self): | 
 | 1861 |             del self.__x | 
| Tim Peters | 66c1a52 | 2001-09-24 21:17:50 +0000 | [diff] [blame] | 1862 |         x = property(getx, setx, delx, doc="I'm the x property.") | 
| Guido van Rossum | 76f0cb8 | 2001-08-24 15:24:24 +0000 | [diff] [blame] | 1863 |     a = C() | 
 | 1864 |     verify(not hasattr(a, "x")) | 
 | 1865 |     a.x = 42 | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1866 |     vereq(a._C__x, 42) | 
 | 1867 |     vereq(a.x, 42) | 
| Guido van Rossum | 76f0cb8 | 2001-08-24 15:24:24 +0000 | [diff] [blame] | 1868 |     del a.x | 
 | 1869 |     verify(not hasattr(a, "x")) | 
 | 1870 |     verify(not hasattr(a, "_C__x")) | 
 | 1871 |     C.x.__set__(a, 100) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1872 |     vereq(C.x.__get__(a), 100) | 
| Guido van Rossum | 0dbab4c5 | 2002-08-01 14:39:25 +0000 | [diff] [blame] | 1873 |     C.x.__delete__(a) | 
 | 1874 |     verify(not hasattr(a, "x")) | 
| Guido van Rossum | 76f0cb8 | 2001-08-24 15:24:24 +0000 | [diff] [blame] | 1875 |  | 
| Tim Peters | 66c1a52 | 2001-09-24 21:17:50 +0000 | [diff] [blame] | 1876 |     raw = C.__dict__['x'] | 
 | 1877 |     verify(isinstance(raw, property)) | 
 | 1878 |  | 
 | 1879 |     attrs = dir(raw) | 
 | 1880 |     verify("__doc__" in attrs) | 
 | 1881 |     verify("fget" in attrs) | 
 | 1882 |     verify("fset" in attrs) | 
 | 1883 |     verify("fdel" in attrs) | 
 | 1884 |  | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1885 |     vereq(raw.__doc__, "I'm the x property.") | 
| Tim Peters | 66c1a52 | 2001-09-24 21:17:50 +0000 | [diff] [blame] | 1886 |     verify(raw.fget is C.__dict__['getx']) | 
 | 1887 |     verify(raw.fset is C.__dict__['setx']) | 
 | 1888 |     verify(raw.fdel is C.__dict__['delx']) | 
 | 1889 |  | 
 | 1890 |     for attr in "__doc__", "fget", "fset", "fdel": | 
 | 1891 |         try: | 
 | 1892 |             setattr(raw, attr, 42) | 
 | 1893 |         except TypeError, msg: | 
 | 1894 |             if str(msg).find('readonly') < 0: | 
 | 1895 |                 raise TestFailed("when setting readonly attr %r on a " | 
 | 1896 |                                  "property, got unexpected TypeError " | 
 | 1897 |                                  "msg %r" % (attr, str(msg))) | 
 | 1898 |         else: | 
 | 1899 |             raise TestFailed("expected TypeError from trying to set " | 
 | 1900 |                              "readonly %r attr on a property" % attr) | 
 | 1901 |  | 
| Neal Norwitz | 673cd82 | 2002-10-18 16:33:13 +0000 | [diff] [blame] | 1902 |     class D(object): | 
 | 1903 |         __getitem__ = property(lambda s: 1/0) | 
 | 1904 |  | 
 | 1905 |     d = D() | 
 | 1906 |     try: | 
 | 1907 |         for i in d: | 
 | 1908 |             str(i) | 
 | 1909 |     except ZeroDivisionError: | 
 | 1910 |         pass | 
 | 1911 |     else: | 
 | 1912 |         raise TestFailed, "expected ZeroDivisionError from bad property" | 
 | 1913 |  | 
| Guido van Rossum | c4a1880 | 2001-08-24 16:55:27 +0000 | [diff] [blame] | 1914 | def supers(): | 
| Guido van Rossum | 9881fc1 | 2001-08-24 17:07:20 +0000 | [diff] [blame] | 1915 |     if verbose: print "Testing super..." | 
| Guido van Rossum | c4a1880 | 2001-08-24 16:55:27 +0000 | [diff] [blame] | 1916 |  | 
 | 1917 |     class A(object): | 
 | 1918 |         def meth(self, a): | 
 | 1919 |             return "A(%r)" % a | 
 | 1920 |  | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1921 |     vereq(A().meth(1), "A(1)") | 
| Guido van Rossum | c4a1880 | 2001-08-24 16:55:27 +0000 | [diff] [blame] | 1922 |  | 
 | 1923 |     class B(A): | 
 | 1924 |         def __init__(self): | 
 | 1925 |             self.__super = super(B, self) | 
 | 1926 |         def meth(self, a): | 
 | 1927 |             return "B(%r)" % a + self.__super.meth(a) | 
 | 1928 |  | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1929 |     vereq(B().meth(2), "B(2)A(2)") | 
| Guido van Rossum | c4a1880 | 2001-08-24 16:55:27 +0000 | [diff] [blame] | 1930 |  | 
 | 1931 |     class C(A): | 
| Guido van Rossum | c4a1880 | 2001-08-24 16:55:27 +0000 | [diff] [blame] | 1932 |         def meth(self, a): | 
 | 1933 |             return "C(%r)" % a + self.__super.meth(a) | 
 | 1934 |     C._C__super = super(C) | 
 | 1935 |  | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 1936 |     vereq(C().meth(3), "C(3)A(3)") | 
| Guido van Rossum | c4a1880 | 2001-08-24 16:55:27 +0000 | [diff] [blame] | 1937 |  | 
 | 1938 |     class D(C, B): | 
 | 1939 |         def meth(self, a): | 
 | 1940 |             return "D(%r)" % a + super(D, self).meth(a) | 
 | 1941 |  | 
| Guido van Rossum | 5b443c6 | 2001-12-03 15:38:28 +0000 | [diff] [blame] | 1942 |     vereq(D().meth(4), "D(4)C(4)B(4)A(4)") | 
 | 1943 |  | 
 | 1944 |     # Test for subclassing super | 
 | 1945 |  | 
 | 1946 |     class mysuper(super): | 
 | 1947 |         def __init__(self, *args): | 
 | 1948 |             return super(mysuper, self).__init__(*args) | 
 | 1949 |  | 
 | 1950 |     class E(D): | 
 | 1951 |         def meth(self, a): | 
 | 1952 |             return "E(%r)" % a + mysuper(E, self).meth(a) | 
 | 1953 |  | 
 | 1954 |     vereq(E().meth(5), "E(5)D(5)C(5)B(5)A(5)") | 
 | 1955 |  | 
 | 1956 |     class F(E): | 
 | 1957 |         def meth(self, a): | 
 | 1958 |             s = self.__super | 
 | 1959 |             return "F(%r)[%s]" % (a, s.__class__.__name__) + s.meth(a) | 
 | 1960 |     F._F__super = mysuper(F) | 
 | 1961 |  | 
 | 1962 |     vereq(F().meth(6), "F(6)[mysuper]E(6)D(6)C(6)B(6)A(6)") | 
 | 1963 |  | 
 | 1964 |     # Make sure certain errors are raised | 
 | 1965 |  | 
 | 1966 |     try: | 
 | 1967 |         super(D, 42) | 
 | 1968 |     except TypeError: | 
 | 1969 |         pass | 
 | 1970 |     else: | 
 | 1971 |         raise TestFailed, "shouldn't allow super(D, 42)" | 
 | 1972 |  | 
 | 1973 |     try: | 
 | 1974 |         super(D, C()) | 
 | 1975 |     except TypeError: | 
 | 1976 |         pass | 
 | 1977 |     else: | 
 | 1978 |         raise TestFailed, "shouldn't allow super(D, C())" | 
 | 1979 |  | 
 | 1980 |     try: | 
 | 1981 |         super(D).__get__(12) | 
 | 1982 |     except TypeError: | 
 | 1983 |         pass | 
 | 1984 |     else: | 
 | 1985 |         raise TestFailed, "shouldn't allow super(D).__get__(12)" | 
 | 1986 |  | 
 | 1987 |     try: | 
 | 1988 |         super(D).__get__(C()) | 
 | 1989 |     except TypeError: | 
 | 1990 |         pass | 
 | 1991 |     else: | 
 | 1992 |         raise TestFailed, "shouldn't allow super(D).__get__(C())" | 
| Guido van Rossum | c4a1880 | 2001-08-24 16:55:27 +0000 | [diff] [blame] | 1993 |  | 
| Guido van Rossum | caa9f43 | 2001-08-30 20:06:08 +0000 | [diff] [blame] | 1994 | def inherits(): | 
 | 1995 |     if verbose: print "Testing inheritance from basic types..." | 
 | 1996 |  | 
 | 1997 |     class hexint(int): | 
 | 1998 |         def __repr__(self): | 
 | 1999 |             return hex(self) | 
 | 2000 |         def __add__(self, other): | 
 | 2001 |             return hexint(int.__add__(self, other)) | 
 | 2002 |         # (Note that overriding __radd__ doesn't work, | 
 | 2003 |         # because the int type gets first dibs.) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2004 |     vereq(repr(hexint(7) + 9), "0x10") | 
 | 2005 |     vereq(repr(hexint(1000) + 7), "0x3ef") | 
| Tim Peters | 64b5ce3 | 2001-09-10 20:52:51 +0000 | [diff] [blame] | 2006 |     a = hexint(12345) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2007 |     vereq(a, 12345) | 
 | 2008 |     vereq(int(a), 12345) | 
| Tim Peters | 64b5ce3 | 2001-09-10 20:52:51 +0000 | [diff] [blame] | 2009 |     verify(int(a).__class__ is int) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2010 |     vereq(hash(a), hash(12345)) | 
| Tim Peters | 73a1dfe | 2001-09-11 21:44:14 +0000 | [diff] [blame] | 2011 |     verify((+a).__class__ is int) | 
 | 2012 |     verify((a >> 0).__class__ is int) | 
 | 2013 |     verify((a << 0).__class__ is int) | 
 | 2014 |     verify((hexint(0) << 12).__class__ is int) | 
 | 2015 |     verify((hexint(0) >> 12).__class__ is int) | 
| Guido van Rossum | caa9f43 | 2001-08-30 20:06:08 +0000 | [diff] [blame] | 2016 |  | 
 | 2017 |     class octlong(long): | 
 | 2018 |         __slots__ = [] | 
 | 2019 |         def __str__(self): | 
 | 2020 |             s = oct(self) | 
 | 2021 |             if s[-1] == 'L': | 
 | 2022 |                 s = s[:-1] | 
 | 2023 |             return s | 
 | 2024 |         def __add__(self, other): | 
 | 2025 |             return self.__class__(super(octlong, self).__add__(other)) | 
 | 2026 |         __radd__ = __add__ | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2027 |     vereq(str(octlong(3) + 5), "010") | 
| Guido van Rossum | caa9f43 | 2001-08-30 20:06:08 +0000 | [diff] [blame] | 2028 |     # (Note that overriding __radd__ here only seems to work | 
 | 2029 |     # because the example uses a short int left argument.) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2030 |     vereq(str(5 + octlong(3000)), "05675") | 
| Tim Peters | 64b5ce3 | 2001-09-10 20:52:51 +0000 | [diff] [blame] | 2031 |     a = octlong(12345) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2032 |     vereq(a, 12345L) | 
 | 2033 |     vereq(long(a), 12345L) | 
 | 2034 |     vereq(hash(a), hash(12345L)) | 
| Tim Peters | 64b5ce3 | 2001-09-10 20:52:51 +0000 | [diff] [blame] | 2035 |     verify(long(a).__class__ is long) | 
| Tim Peters | 69c2de3 | 2001-09-11 22:31:33 +0000 | [diff] [blame] | 2036 |     verify((+a).__class__ is long) | 
 | 2037 |     verify((-a).__class__ is long) | 
 | 2038 |     verify((-octlong(0)).__class__ is long) | 
 | 2039 |     verify((a >> 0).__class__ is long) | 
 | 2040 |     verify((a << 0).__class__ is long) | 
 | 2041 |     verify((a - 0).__class__ is long) | 
 | 2042 |     verify((a * 1).__class__ is long) | 
 | 2043 |     verify((a ** 1).__class__ is long) | 
 | 2044 |     verify((a // 1).__class__ is long) | 
 | 2045 |     verify((1 * a).__class__ is long) | 
 | 2046 |     verify((a | 0).__class__ is long) | 
 | 2047 |     verify((a ^ 0).__class__ is long) | 
 | 2048 |     verify((a & -1L).__class__ is long) | 
 | 2049 |     verify((octlong(0) << 12).__class__ is long) | 
 | 2050 |     verify((octlong(0) >> 12).__class__ is long) | 
 | 2051 |     verify(abs(octlong(0)).__class__ is long) | 
 | 2052 |  | 
 | 2053 |     # Because octlong overrides __add__, we can't check the absence of +0 | 
 | 2054 |     # optimizations using octlong. | 
 | 2055 |     class longclone(long): | 
 | 2056 |         pass | 
 | 2057 |     a = longclone(1) | 
 | 2058 |     verify((a + 0).__class__ is long) | 
 | 2059 |     verify((0 + a).__class__ is long) | 
| Guido van Rossum | caa9f43 | 2001-08-30 20:06:08 +0000 | [diff] [blame] | 2060 |  | 
| Guido van Rossum | 2eb0b87 | 2002-03-01 22:24:49 +0000 | [diff] [blame] | 2061 |     # Check that negative clones don't segfault | 
 | 2062 |     a = longclone(-1) | 
 | 2063 |     vereq(a.__dict__, {}) | 
| Tim Peters | 5329cdb | 2002-03-02 04:18:04 +0000 | [diff] [blame] | 2064 |     vereq(long(a), -1)  # verify PyNumber_Long() copies the sign bit | 
| Guido van Rossum | 2eb0b87 | 2002-03-01 22:24:49 +0000 | [diff] [blame] | 2065 |  | 
| Guido van Rossum | caa9f43 | 2001-08-30 20:06:08 +0000 | [diff] [blame] | 2066 |     class precfloat(float): | 
 | 2067 |         __slots__ = ['prec'] | 
 | 2068 |         def __init__(self, value=0.0, prec=12): | 
 | 2069 |             self.prec = int(prec) | 
 | 2070 |             float.__init__(value) | 
 | 2071 |         def __repr__(self): | 
 | 2072 |             return "%.*g" % (self.prec, self) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2073 |     vereq(repr(precfloat(1.1)), "1.1") | 
| Tim Peters | 64b5ce3 | 2001-09-10 20:52:51 +0000 | [diff] [blame] | 2074 |     a = precfloat(12345) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2075 |     vereq(a, 12345.0) | 
 | 2076 |     vereq(float(a), 12345.0) | 
| Tim Peters | 7a50f25 | 2001-09-10 21:28:20 +0000 | [diff] [blame] | 2077 |     verify(float(a).__class__ is float) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2078 |     vereq(hash(a), hash(12345.0)) | 
| Tim Peters | 0280cf7 | 2001-09-11 21:53:35 +0000 | [diff] [blame] | 2079 |     verify((+a).__class__ is float) | 
| Guido van Rossum | caa9f43 | 2001-08-30 20:06:08 +0000 | [diff] [blame] | 2080 |  | 
| Tim Peters | 2400fa4 | 2001-09-12 19:12:49 +0000 | [diff] [blame] | 2081 |     class madcomplex(complex): | 
 | 2082 |         def __repr__(self): | 
 | 2083 |             return "%.17gj%+.17g" % (self.imag, self.real) | 
 | 2084 |     a = madcomplex(-3, 4) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2085 |     vereq(repr(a), "4j-3") | 
| Tim Peters | 2400fa4 | 2001-09-12 19:12:49 +0000 | [diff] [blame] | 2086 |     base = complex(-3, 4) | 
| Guido van Rossum | 875eeaa | 2001-10-11 18:33:53 +0000 | [diff] [blame] | 2087 |     veris(base.__class__, complex) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2088 |     vereq(a, base) | 
 | 2089 |     vereq(complex(a), base) | 
| Guido van Rossum | 875eeaa | 2001-10-11 18:33:53 +0000 | [diff] [blame] | 2090 |     veris(complex(a).__class__, complex) | 
| Tim Peters | 2400fa4 | 2001-09-12 19:12:49 +0000 | [diff] [blame] | 2091 |     a = madcomplex(a)  # just trying another form of the constructor | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2092 |     vereq(repr(a), "4j-3") | 
 | 2093 |     vereq(a, base) | 
 | 2094 |     vereq(complex(a), base) | 
| Guido van Rossum | 875eeaa | 2001-10-11 18:33:53 +0000 | [diff] [blame] | 2095 |     veris(complex(a).__class__, complex) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2096 |     vereq(hash(a), hash(base)) | 
| Guido van Rossum | 875eeaa | 2001-10-11 18:33:53 +0000 | [diff] [blame] | 2097 |     veris((+a).__class__, complex) | 
 | 2098 |     veris((a + 0).__class__, complex) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2099 |     vereq(a + 0, base) | 
| Guido van Rossum | 875eeaa | 2001-10-11 18:33:53 +0000 | [diff] [blame] | 2100 |     veris((a - 0).__class__, complex) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2101 |     vereq(a - 0, base) | 
| Guido van Rossum | 875eeaa | 2001-10-11 18:33:53 +0000 | [diff] [blame] | 2102 |     veris((a * 1).__class__, complex) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2103 |     vereq(a * 1, base) | 
| Guido van Rossum | 875eeaa | 2001-10-11 18:33:53 +0000 | [diff] [blame] | 2104 |     veris((a / 1).__class__, complex) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2105 |     vereq(a / 1, base) | 
| Tim Peters | 2400fa4 | 2001-09-12 19:12:49 +0000 | [diff] [blame] | 2106 |  | 
| Guido van Rossum | caa9f43 | 2001-08-30 20:06:08 +0000 | [diff] [blame] | 2107 |     class madtuple(tuple): | 
 | 2108 |         _rev = None | 
 | 2109 |         def rev(self): | 
 | 2110 |             if self._rev is not None: | 
 | 2111 |                 return self._rev | 
 | 2112 |             L = list(self) | 
 | 2113 |             L.reverse() | 
 | 2114 |             self._rev = self.__class__(L) | 
 | 2115 |             return self._rev | 
 | 2116 |     a = madtuple((1,2,3,4,5,6,7,8,9,0)) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2117 |     vereq(a, (1,2,3,4,5,6,7,8,9,0)) | 
 | 2118 |     vereq(a.rev(), madtuple((0,9,8,7,6,5,4,3,2,1))) | 
 | 2119 |     vereq(a.rev().rev(), madtuple((1,2,3,4,5,6,7,8,9,0))) | 
| Guido van Rossum | caa9f43 | 2001-08-30 20:06:08 +0000 | [diff] [blame] | 2120 |     for i in range(512): | 
 | 2121 |         t = madtuple(range(i)) | 
 | 2122 |         u = t.rev() | 
 | 2123 |         v = u.rev() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2124 |         vereq(v, t) | 
| Tim Peters | 64b5ce3 | 2001-09-10 20:52:51 +0000 | [diff] [blame] | 2125 |     a = madtuple((1,2,3,4,5)) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2126 |     vereq(tuple(a), (1,2,3,4,5)) | 
| Tim Peters | 4c3a0a3 | 2001-09-10 23:37:46 +0000 | [diff] [blame] | 2127 |     verify(tuple(a).__class__ is tuple) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2128 |     vereq(hash(a), hash((1,2,3,4,5))) | 
| Tim Peters | 7b07a41 | 2001-09-11 19:48:03 +0000 | [diff] [blame] | 2129 |     verify(a[:].__class__ is tuple) | 
 | 2130 |     verify((a * 1).__class__ is tuple) | 
 | 2131 |     verify((a * 0).__class__ is tuple) | 
 | 2132 |     verify((a + ()).__class__ is tuple) | 
| Tim Peters | 64b5ce3 | 2001-09-10 20:52:51 +0000 | [diff] [blame] | 2133 |     a = madtuple(()) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2134 |     vereq(tuple(a), ()) | 
| Guido van Rossum | 779ce4a | 2001-09-11 14:02:22 +0000 | [diff] [blame] | 2135 |     verify(tuple(a).__class__ is tuple) | 
| Tim Peters | 7b07a41 | 2001-09-11 19:48:03 +0000 | [diff] [blame] | 2136 |     verify((a + a).__class__ is tuple) | 
 | 2137 |     verify((a * 0).__class__ is tuple) | 
 | 2138 |     verify((a * 1).__class__ is tuple) | 
 | 2139 |     verify((a * 2).__class__ is tuple) | 
 | 2140 |     verify(a[:].__class__ is tuple) | 
| Guido van Rossum | caa9f43 | 2001-08-30 20:06:08 +0000 | [diff] [blame] | 2141 |  | 
 | 2142 |     class madstring(str): | 
 | 2143 |         _rev = None | 
 | 2144 |         def rev(self): | 
 | 2145 |             if self._rev is not None: | 
 | 2146 |                 return self._rev | 
 | 2147 |             L = list(self) | 
 | 2148 |             L.reverse() | 
 | 2149 |             self._rev = self.__class__("".join(L)) | 
 | 2150 |             return self._rev | 
 | 2151 |     s = madstring("abcdefghijklmnopqrstuvwxyz") | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2152 |     vereq(s, "abcdefghijklmnopqrstuvwxyz") | 
 | 2153 |     vereq(s.rev(), madstring("zyxwvutsrqponmlkjihgfedcba")) | 
 | 2154 |     vereq(s.rev().rev(), madstring("abcdefghijklmnopqrstuvwxyz")) | 
| Guido van Rossum | caa9f43 | 2001-08-30 20:06:08 +0000 | [diff] [blame] | 2155 |     for i in range(256): | 
 | 2156 |         s = madstring("".join(map(chr, range(i)))) | 
 | 2157 |         t = s.rev() | 
 | 2158 |         u = t.rev() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2159 |         vereq(u, s) | 
| Tim Peters | 64b5ce3 | 2001-09-10 20:52:51 +0000 | [diff] [blame] | 2160 |     s = madstring("12345") | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2161 |     vereq(str(s), "12345") | 
| Tim Peters | 5a49ade | 2001-09-11 01:41:59 +0000 | [diff] [blame] | 2162 |     verify(str(s).__class__ is str) | 
| Guido van Rossum | caa9f43 | 2001-08-30 20:06:08 +0000 | [diff] [blame] | 2163 |  | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2164 |     base = "\x00" * 5 | 
 | 2165 |     s = madstring(base) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2166 |     vereq(s, base) | 
 | 2167 |     vereq(str(s), base) | 
| Tim Peters | c636f56 | 2001-09-11 01:52:02 +0000 | [diff] [blame] | 2168 |     verify(str(s).__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2169 |     vereq(hash(s), hash(base)) | 
 | 2170 |     vereq({s: 1}[base], 1) | 
 | 2171 |     vereq({base: 1}[s], 1) | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2172 |     verify((s + "").__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2173 |     vereq(s + "", base) | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2174 |     verify(("" + s).__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2175 |     vereq("" + s, base) | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2176 |     verify((s * 0).__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2177 |     vereq(s * 0, "") | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2178 |     verify((s * 1).__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2179 |     vereq(s * 1, base) | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2180 |     verify((s * 2).__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2181 |     vereq(s * 2, base + base) | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2182 |     verify(s[:].__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2183 |     vereq(s[:], base) | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2184 |     verify(s[0:0].__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2185 |     vereq(s[0:0], "") | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2186 |     verify(s.strip().__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2187 |     vereq(s.strip(), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2188 |     verify(s.lstrip().__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2189 |     vereq(s.lstrip(), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2190 |     verify(s.rstrip().__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2191 |     vereq(s.rstrip(), base) | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2192 |     identitytab = ''.join([chr(i) for i in range(256)]) | 
 | 2193 |     verify(s.translate(identitytab).__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2194 |     vereq(s.translate(identitytab), base) | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2195 |     verify(s.translate(identitytab, "x").__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2196 |     vereq(s.translate(identitytab, "x"), base) | 
 | 2197 |     vereq(s.translate(identitytab, "\x00"), "") | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2198 |     verify(s.replace("x", "x").__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2199 |     vereq(s.replace("x", "x"), base) | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2200 |     verify(s.ljust(len(s)).__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2201 |     vereq(s.ljust(len(s)), base) | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2202 |     verify(s.rjust(len(s)).__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2203 |     vereq(s.rjust(len(s)), base) | 
| Tim Peters | 8fa5dd0 | 2001-09-12 02:18:30 +0000 | [diff] [blame] | 2204 |     verify(s.center(len(s)).__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2205 |     vereq(s.center(len(s)), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2206 |     verify(s.lower().__class__ is str) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2207 |     vereq(s.lower(), base) | 
| Tim Peters | c636f56 | 2001-09-11 01:52:02 +0000 | [diff] [blame] | 2208 |  | 
| Tim Peters | 111f609 | 2001-09-12 07:54:51 +0000 | [diff] [blame] | 2209 |     s = madstring("x y") | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2210 |     vereq(s, "x y") | 
| Tim Peters | 111f609 | 2001-09-12 07:54:51 +0000 | [diff] [blame] | 2211 |     verify(intern(s).__class__ is str) | 
 | 2212 |     verify(intern(s) is intern("x y")) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2213 |     vereq(intern(s), "x y") | 
| Tim Peters | 111f609 | 2001-09-12 07:54:51 +0000 | [diff] [blame] | 2214 |  | 
 | 2215 |     i = intern("y x") | 
 | 2216 |     s = madstring("y x") | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2217 |     vereq(s, i) | 
| Tim Peters | 111f609 | 2001-09-12 07:54:51 +0000 | [diff] [blame] | 2218 |     verify(intern(s).__class__ is str) | 
 | 2219 |     verify(intern(s) is i) | 
 | 2220 |  | 
 | 2221 |     s = madstring(i) | 
 | 2222 |     verify(intern(s).__class__ is str) | 
 | 2223 |     verify(intern(s) is i) | 
 | 2224 |  | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 2225 |     class madunicode(unicode): | 
 | 2226 |         _rev = None | 
 | 2227 |         def rev(self): | 
 | 2228 |             if self._rev is not None: | 
 | 2229 |                 return self._rev | 
 | 2230 |             L = list(self) | 
 | 2231 |             L.reverse() | 
 | 2232 |             self._rev = self.__class__(u"".join(L)) | 
 | 2233 |             return self._rev | 
 | 2234 |     u = madunicode("ABCDEF") | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2235 |     vereq(u, u"ABCDEF") | 
 | 2236 |     vereq(u.rev(), madunicode(u"FEDCBA")) | 
 | 2237 |     vereq(u.rev().rev(), madunicode(u"ABCDEF")) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2238 |     base = u"12345" | 
 | 2239 |     u = madunicode(base) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2240 |     vereq(unicode(u), base) | 
| Tim Peters | 78e0fc7 | 2001-09-11 03:07:38 +0000 | [diff] [blame] | 2241 |     verify(unicode(u).__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2242 |     vereq(hash(u), hash(base)) | 
 | 2243 |     vereq({u: 1}[base], 1) | 
 | 2244 |     vereq({base: 1}[u], 1) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2245 |     verify(u.strip().__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2246 |     vereq(u.strip(), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2247 |     verify(u.lstrip().__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2248 |     vereq(u.lstrip(), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2249 |     verify(u.rstrip().__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2250 |     vereq(u.rstrip(), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2251 |     verify(u.replace(u"x", u"x").__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2252 |     vereq(u.replace(u"x", u"x"), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2253 |     verify(u.replace(u"xy", u"xy").__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2254 |     vereq(u.replace(u"xy", u"xy"), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2255 |     verify(u.center(len(u)).__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2256 |     vereq(u.center(len(u)), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2257 |     verify(u.ljust(len(u)).__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2258 |     vereq(u.ljust(len(u)), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2259 |     verify(u.rjust(len(u)).__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2260 |     vereq(u.rjust(len(u)), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2261 |     verify(u.lower().__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2262 |     vereq(u.lower(), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2263 |     verify(u.upper().__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2264 |     vereq(u.upper(), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2265 |     verify(u.capitalize().__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2266 |     vereq(u.capitalize(), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2267 |     verify(u.title().__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2268 |     vereq(u.title(), base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2269 |     verify((u + u"").__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2270 |     vereq(u + u"", base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2271 |     verify((u"" + u).__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2272 |     vereq(u"" + u, base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2273 |     verify((u * 0).__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2274 |     vereq(u * 0, u"") | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2275 |     verify((u * 1).__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2276 |     vereq(u * 1, base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2277 |     verify((u * 2).__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2278 |     vereq(u * 2, base + base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2279 |     verify(u[:].__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2280 |     vereq(u[:], base) | 
| Tim Peters | 7a29bd5 | 2001-09-12 03:03:31 +0000 | [diff] [blame] | 2281 |     verify(u[0:0].__class__ is unicode) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2282 |     vereq(u[0:0], u"") | 
| Guido van Rossum | 91ee798 | 2001-08-30 20:52:40 +0000 | [diff] [blame] | 2283 |  | 
| Guido van Rossum | 12b22ff | 2001-10-09 20:36:44 +0000 | [diff] [blame] | 2284 |     class sublist(list): | 
 | 2285 |         pass | 
 | 2286 |     a = sublist(range(5)) | 
 | 2287 |     vereq(a, range(5)) | 
 | 2288 |     a.append("hello") | 
 | 2289 |     vereq(a, range(5) + ["hello"]) | 
 | 2290 |     a[5] = 5 | 
 | 2291 |     vereq(a, range(6)) | 
 | 2292 |     a.extend(range(6, 20)) | 
 | 2293 |     vereq(a, range(20)) | 
 | 2294 |     a[-5:] = [] | 
 | 2295 |     vereq(a, range(15)) | 
 | 2296 |     del a[10:15] | 
 | 2297 |     vereq(len(a), 10) | 
 | 2298 |     vereq(a, range(10)) | 
 | 2299 |     vereq(list(a), range(10)) | 
 | 2300 |     vereq(a[0], 0) | 
 | 2301 |     vereq(a[9], 9) | 
 | 2302 |     vereq(a[-10], 0) | 
 | 2303 |     vereq(a[-1], 9) | 
 | 2304 |     vereq(a[:5], range(5)) | 
 | 2305 |  | 
| Tim Peters | 59c9a64 | 2001-09-13 05:38:56 +0000 | [diff] [blame] | 2306 |     class CountedInput(file): | 
 | 2307 |         """Counts lines read by self.readline(). | 
 | 2308 |  | 
 | 2309 |         self.lineno is the 0-based ordinal of the last line read, up to | 
 | 2310 |         a maximum of one greater than the number of lines in the file. | 
 | 2311 |  | 
 | 2312 |         self.ateof is true if and only if the final "" line has been read, | 
 | 2313 |         at which point self.lineno stops incrementing, and further calls | 
 | 2314 |         to readline() continue to return "". | 
 | 2315 |         """ | 
 | 2316 |  | 
 | 2317 |         lineno = 0 | 
 | 2318 |         ateof = 0 | 
 | 2319 |         def readline(self): | 
 | 2320 |             if self.ateof: | 
 | 2321 |                 return "" | 
 | 2322 |             s = file.readline(self) | 
 | 2323 |             # Next line works too. | 
 | 2324 |             # s = super(CountedInput, self).readline() | 
 | 2325 |             self.lineno += 1 | 
 | 2326 |             if s == "": | 
 | 2327 |                 self.ateof = 1 | 
 | 2328 |             return s | 
 | 2329 |  | 
| Tim Peters | 561f899 | 2001-09-13 19:36:36 +0000 | [diff] [blame] | 2330 |     f = file(name=TESTFN, mode='w') | 
| Tim Peters | 59c9a64 | 2001-09-13 05:38:56 +0000 | [diff] [blame] | 2331 |     lines = ['a\n', 'b\n', 'c\n'] | 
 | 2332 |     try: | 
 | 2333 |         f.writelines(lines) | 
 | 2334 |         f.close() | 
 | 2335 |         f = CountedInput(TESTFN) | 
 | 2336 |         for (i, expected) in zip(range(1, 5) + [4], lines + 2 * [""]): | 
 | 2337 |             got = f.readline() | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2338 |             vereq(expected, got) | 
 | 2339 |             vereq(f.lineno, i) | 
 | 2340 |             vereq(f.ateof, (i > len(lines))) | 
| Tim Peters | 59c9a64 | 2001-09-13 05:38:56 +0000 | [diff] [blame] | 2341 |         f.close() | 
 | 2342 |     finally: | 
 | 2343 |         try: | 
 | 2344 |             f.close() | 
 | 2345 |         except: | 
 | 2346 |             pass | 
 | 2347 |         try: | 
 | 2348 |             import os | 
 | 2349 |             os.unlink(TESTFN) | 
 | 2350 |         except: | 
 | 2351 |             pass | 
 | 2352 |  | 
| Tim Peters | 808b94e | 2001-09-13 19:33:07 +0000 | [diff] [blame] | 2353 | def keywords(): | 
 | 2354 |     if verbose: | 
 | 2355 |         print "Testing keyword args to basic type constructors ..." | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2356 |     vereq(int(x=1), 1) | 
 | 2357 |     vereq(float(x=2), 2.0) | 
 | 2358 |     vereq(long(x=3), 3L) | 
 | 2359 |     vereq(complex(imag=42, real=666), complex(666, 42)) | 
 | 2360 |     vereq(str(object=500), '500') | 
 | 2361 |     vereq(unicode(string='abc', errors='strict'), u'abc') | 
 | 2362 |     vereq(tuple(sequence=range(3)), (0, 1, 2)) | 
 | 2363 |     vereq(list(sequence=(0, 1, 2)), range(3)) | 
| Just van Rossum | a797d81 | 2002-11-23 09:45:04 +0000 | [diff] [blame] | 2364 |     # note: as of Python 2.3, dict() no longer has an "items" keyword arg | 
| Tim Peters | 808b94e | 2001-09-13 19:33:07 +0000 | [diff] [blame] | 2365 |  | 
 | 2366 |     for constructor in (int, float, long, complex, str, unicode, | 
| Just van Rossum | a797d81 | 2002-11-23 09:45:04 +0000 | [diff] [blame] | 2367 |                         tuple, list, file): | 
| Tim Peters | 808b94e | 2001-09-13 19:33:07 +0000 | [diff] [blame] | 2368 |         try: | 
 | 2369 |             constructor(bogus_keyword_arg=1) | 
 | 2370 |         except TypeError: | 
 | 2371 |             pass | 
 | 2372 |         else: | 
 | 2373 |             raise TestFailed("expected TypeError from bogus keyword " | 
 | 2374 |                              "argument to %r" % constructor) | 
| Tim Peters | 561f899 | 2001-09-13 19:36:36 +0000 | [diff] [blame] | 2375 |  | 
| Tim Peters | 8fa4567 | 2001-09-13 21:01:29 +0000 | [diff] [blame] | 2376 | def restricted(): | 
 | 2377 |     import rexec | 
 | 2378 |     if verbose: | 
 | 2379 |         print "Testing interaction with restricted execution ..." | 
 | 2380 |  | 
 | 2381 |     sandbox = rexec.RExec() | 
 | 2382 |  | 
 | 2383 |     code1 = """f = open(%r, 'w')""" % TESTFN | 
 | 2384 |     code2 = """f = file(%r, 'w')""" % TESTFN | 
 | 2385 |     code3 = """\ | 
 | 2386 | f = open(%r) | 
 | 2387 | t = type(f)  # a sneaky way to get the file() constructor | 
 | 2388 | f.close() | 
 | 2389 | f = t(%r, 'w')  # rexec can't catch this by itself | 
 | 2390 | """ % (TESTFN, TESTFN) | 
 | 2391 |  | 
 | 2392 |     f = open(TESTFN, 'w')  # Create the file so code3 can find it. | 
 | 2393 |     f.close() | 
 | 2394 |  | 
 | 2395 |     try: | 
 | 2396 |         for code in code1, code2, code3: | 
 | 2397 |             try: | 
 | 2398 |                 sandbox.r_exec(code) | 
 | 2399 |             except IOError, msg: | 
 | 2400 |                 if str(msg).find("restricted") >= 0: | 
 | 2401 |                     outcome = "OK" | 
 | 2402 |                 else: | 
 | 2403 |                     outcome = "got an exception, but not an expected one" | 
 | 2404 |             else: | 
 | 2405 |                 outcome = "expected a restricted-execution exception" | 
 | 2406 |  | 
 | 2407 |             if outcome != "OK": | 
 | 2408 |                 raise TestFailed("%s, in %r" % (outcome, code)) | 
 | 2409 |  | 
 | 2410 |     finally: | 
 | 2411 |         try: | 
 | 2412 |             import os | 
 | 2413 |             os.unlink(TESTFN) | 
 | 2414 |         except: | 
 | 2415 |             pass | 
 | 2416 |  | 
| Tim Peters | 0ab085c | 2001-09-14 00:25:33 +0000 | [diff] [blame] | 2417 | def str_subclass_as_dict_key(): | 
 | 2418 |     if verbose: | 
 | 2419 |         print "Testing a str subclass used as dict key .." | 
 | 2420 |  | 
 | 2421 |     class cistr(str): | 
 | 2422 |         """Sublcass of str that computes __eq__ case-insensitively. | 
 | 2423 |  | 
 | 2424 |         Also computes a hash code of the string in canonical form. | 
 | 2425 |         """ | 
 | 2426 |  | 
 | 2427 |         def __init__(self, value): | 
 | 2428 |             self.canonical = value.lower() | 
 | 2429 |             self.hashcode = hash(self.canonical) | 
 | 2430 |  | 
 | 2431 |         def __eq__(self, other): | 
 | 2432 |             if not isinstance(other, cistr): | 
 | 2433 |                 other = cistr(other) | 
 | 2434 |             return self.canonical == other.canonical | 
 | 2435 |  | 
 | 2436 |         def __hash__(self): | 
 | 2437 |             return self.hashcode | 
 | 2438 |  | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2439 |     vereq(cistr('ABC'), 'abc') | 
 | 2440 |     vereq('aBc', cistr('ABC')) | 
 | 2441 |     vereq(str(cistr('ABC')), 'ABC') | 
| Tim Peters | 0ab085c | 2001-09-14 00:25:33 +0000 | [diff] [blame] | 2442 |  | 
 | 2443 |     d = {cistr('one'): 1, cistr('two'): 2, cistr('tHree'): 3} | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2444 |     vereq(d[cistr('one')], 1) | 
 | 2445 |     vereq(d[cistr('tWo')], 2) | 
 | 2446 |     vereq(d[cistr('THrEE')], 3) | 
| Tim Peters | 0ab085c | 2001-09-14 00:25:33 +0000 | [diff] [blame] | 2447 |     verify(cistr('ONe') in d) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2448 |     vereq(d.get(cistr('thrEE')), 3) | 
| Tim Peters | 0ab085c | 2001-09-14 00:25:33 +0000 | [diff] [blame] | 2449 |  | 
| Guido van Rossum | ab3b034 | 2001-09-18 20:38:53 +0000 | [diff] [blame] | 2450 | def classic_comparisons(): | 
 | 2451 |     if verbose: print "Testing classic comparisons..." | 
| Guido van Rossum | 0639f59 | 2001-09-18 21:06:04 +0000 | [diff] [blame] | 2452 |     class classic: | 
 | 2453 |         pass | 
 | 2454 |     for base in (classic, int, object): | 
| Guido van Rossum | ab3b034 | 2001-09-18 20:38:53 +0000 | [diff] [blame] | 2455 |         if verbose: print "        (base = %s)" % base | 
 | 2456 |         class C(base): | 
 | 2457 |             def __init__(self, value): | 
 | 2458 |                 self.value = int(value) | 
 | 2459 |             def __cmp__(self, other): | 
 | 2460 |                 if isinstance(other, C): | 
 | 2461 |                     return cmp(self.value, other.value) | 
 | 2462 |                 if isinstance(other, int) or isinstance(other, long): | 
 | 2463 |                     return cmp(self.value, other) | 
 | 2464 |                 return NotImplemented | 
 | 2465 |         c1 = C(1) | 
 | 2466 |         c2 = C(2) | 
 | 2467 |         c3 = C(3) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2468 |         vereq(c1, 1) | 
| Guido van Rossum | ab3b034 | 2001-09-18 20:38:53 +0000 | [diff] [blame] | 2469 |         c = {1: c1, 2: c2, 3: c3} | 
 | 2470 |         for x in 1, 2, 3: | 
 | 2471 |             for y in 1, 2, 3: | 
 | 2472 |                 verify(cmp(c[x], c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y)) | 
 | 2473 |                 for op in "<", "<=", "==", "!=", ">", ">=": | 
 | 2474 |                     verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op), | 
 | 2475 |                            "x=%d, y=%d" % (x, y)) | 
 | 2476 |                 verify(cmp(c[x], y) == cmp(x, y), "x=%d, y=%d" % (x, y)) | 
 | 2477 |                 verify(cmp(x, c[y]) == cmp(x, y), "x=%d, y=%d" % (x, y)) | 
 | 2478 |  | 
| Guido van Rossum | 0639f59 | 2001-09-18 21:06:04 +0000 | [diff] [blame] | 2479 | def rich_comparisons(): | 
 | 2480 |     if verbose: | 
 | 2481 |         print "Testing rich comparisons..." | 
| Guido van Rossum | 2205642 | 2001-09-24 17:52:04 +0000 | [diff] [blame] | 2482 |     class Z(complex): | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 2483 |         pass | 
| Guido van Rossum | 2205642 | 2001-09-24 17:52:04 +0000 | [diff] [blame] | 2484 |     z = Z(1) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2485 |     vereq(z, 1+0j) | 
 | 2486 |     vereq(1+0j, z) | 
| Guido van Rossum | 2205642 | 2001-09-24 17:52:04 +0000 | [diff] [blame] | 2487 |     class ZZ(complex): | 
 | 2488 |         def __eq__(self, other): | 
 | 2489 |             try: | 
 | 2490 |                 return abs(self - other) <= 1e-6 | 
 | 2491 |             except: | 
 | 2492 |                 return NotImplemented | 
 | 2493 |     zz = ZZ(1.0000003) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2494 |     vereq(zz, 1+0j) | 
 | 2495 |     vereq(1+0j, zz) | 
| Tim Peters | 66c1a52 | 2001-09-24 21:17:50 +0000 | [diff] [blame] | 2496 |  | 
| Guido van Rossum | 0639f59 | 2001-09-18 21:06:04 +0000 | [diff] [blame] | 2497 |     class classic: | 
 | 2498 |         pass | 
 | 2499 |     for base in (classic, int, object, list): | 
 | 2500 |         if verbose: print "        (base = %s)" % base | 
 | 2501 |         class C(base): | 
 | 2502 |             def __init__(self, value): | 
 | 2503 |                 self.value = int(value) | 
 | 2504 |             def __cmp__(self, other): | 
 | 2505 |                 raise TestFailed, "shouldn't call __cmp__" | 
 | 2506 |             def __eq__(self, other): | 
 | 2507 |                 if isinstance(other, C): | 
 | 2508 |                     return self.value == other.value | 
 | 2509 |                 if isinstance(other, int) or isinstance(other, long): | 
 | 2510 |                     return self.value == other | 
 | 2511 |                 return NotImplemented | 
 | 2512 |             def __ne__(self, other): | 
 | 2513 |                 if isinstance(other, C): | 
 | 2514 |                     return self.value != other.value | 
 | 2515 |                 if isinstance(other, int) or isinstance(other, long): | 
 | 2516 |                     return self.value != other | 
 | 2517 |                 return NotImplemented | 
 | 2518 |             def __lt__(self, other): | 
 | 2519 |                 if isinstance(other, C): | 
 | 2520 |                     return self.value < other.value | 
 | 2521 |                 if isinstance(other, int) or isinstance(other, long): | 
 | 2522 |                     return self.value < other | 
 | 2523 |                 return NotImplemented | 
 | 2524 |             def __le__(self, other): | 
 | 2525 |                 if isinstance(other, C): | 
 | 2526 |                     return self.value <= other.value | 
 | 2527 |                 if isinstance(other, int) or isinstance(other, long): | 
 | 2528 |                     return self.value <= other | 
 | 2529 |                 return NotImplemented | 
 | 2530 |             def __gt__(self, other): | 
 | 2531 |                 if isinstance(other, C): | 
 | 2532 |                     return self.value > other.value | 
 | 2533 |                 if isinstance(other, int) or isinstance(other, long): | 
 | 2534 |                     return self.value > other | 
 | 2535 |                 return NotImplemented | 
 | 2536 |             def __ge__(self, other): | 
 | 2537 |                 if isinstance(other, C): | 
 | 2538 |                     return self.value >= other.value | 
 | 2539 |                 if isinstance(other, int) or isinstance(other, long): | 
 | 2540 |                     return self.value >= other | 
 | 2541 |                 return NotImplemented | 
 | 2542 |         c1 = C(1) | 
 | 2543 |         c2 = C(2) | 
 | 2544 |         c3 = C(3) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2545 |         vereq(c1, 1) | 
| Guido van Rossum | 0639f59 | 2001-09-18 21:06:04 +0000 | [diff] [blame] | 2546 |         c = {1: c1, 2: c2, 3: c3} | 
 | 2547 |         for x in 1, 2, 3: | 
 | 2548 |             for y in 1, 2, 3: | 
 | 2549 |                 for op in "<", "<=", "==", "!=", ">", ">=": | 
 | 2550 |                     verify(eval("c[x] %s c[y]" % op) == eval("x %s y" % op), | 
 | 2551 |                            "x=%d, y=%d" % (x, y)) | 
 | 2552 |                     verify(eval("c[x] %s y" % op) == eval("x %s y" % op), | 
 | 2553 |                            "x=%d, y=%d" % (x, y)) | 
 | 2554 |                     verify(eval("x %s c[y]" % op) == eval("x %s y" % op), | 
 | 2555 |                            "x=%d, y=%d" % (x, y)) | 
 | 2556 |  | 
| Guido van Rossum | 1952e38 | 2001-09-19 01:25:16 +0000 | [diff] [blame] | 2557 | def coercions(): | 
 | 2558 |     if verbose: print "Testing coercions..." | 
 | 2559 |     class I(int): pass | 
 | 2560 |     coerce(I(0), 0) | 
 | 2561 |     coerce(0, I(0)) | 
 | 2562 |     class L(long): pass | 
 | 2563 |     coerce(L(0), 0) | 
 | 2564 |     coerce(L(0), 0L) | 
 | 2565 |     coerce(0, L(0)) | 
 | 2566 |     coerce(0L, L(0)) | 
 | 2567 |     class F(float): pass | 
 | 2568 |     coerce(F(0), 0) | 
 | 2569 |     coerce(F(0), 0L) | 
 | 2570 |     coerce(F(0), 0.) | 
 | 2571 |     coerce(0, F(0)) | 
 | 2572 |     coerce(0L, F(0)) | 
 | 2573 |     coerce(0., F(0)) | 
| Guido van Rossum | 2f3ca6e | 2001-10-15 21:05:10 +0000 | [diff] [blame] | 2574 |     class C(complex): pass | 
| Guido van Rossum | 1952e38 | 2001-09-19 01:25:16 +0000 | [diff] [blame] | 2575 |     coerce(C(0), 0) | 
 | 2576 |     coerce(C(0), 0L) | 
 | 2577 |     coerce(C(0), 0.) | 
 | 2578 |     coerce(C(0), 0j) | 
 | 2579 |     coerce(0, C(0)) | 
 | 2580 |     coerce(0L, C(0)) | 
 | 2581 |     coerce(0., C(0)) | 
 | 2582 |     coerce(0j, C(0)) | 
 | 2583 |  | 
| Guido van Rossum | 8b9cc7e | 2001-09-20 21:49:53 +0000 | [diff] [blame] | 2584 | def descrdoc(): | 
 | 2585 |     if verbose: print "Testing descriptor doc strings..." | 
 | 2586 |     def check(descr, what): | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2587 |         vereq(descr.__doc__, what) | 
| Guido van Rossum | 77f6a65 | 2002-04-03 22:41:51 +0000 | [diff] [blame] | 2588 |     check(file.closed, "True if the file is closed") # getset descriptor | 
| Guido van Rossum | 8b9cc7e | 2001-09-20 21:49:53 +0000 | [diff] [blame] | 2589 |     check(file.name, "file name") # member descriptor | 
 | 2590 |  | 
| Guido van Rossum | 5c294fb | 2001-09-25 03:43:42 +0000 | [diff] [blame] | 2591 | def setclass(): | 
 | 2592 |     if verbose: print "Testing __class__ assignment..." | 
 | 2593 |     class C(object): pass | 
 | 2594 |     class D(object): pass | 
 | 2595 |     class E(object): pass | 
 | 2596 |     class F(D, E): pass | 
 | 2597 |     for cls in C, D, E, F: | 
 | 2598 |         for cls2 in C, D, E, F: | 
 | 2599 |             x = cls() | 
 | 2600 |             x.__class__ = cls2 | 
 | 2601 |             verify(x.__class__ is cls2) | 
 | 2602 |             x.__class__ = cls | 
 | 2603 |             verify(x.__class__ is cls) | 
 | 2604 |     def cant(x, C): | 
 | 2605 |         try: | 
 | 2606 |             x.__class__ = C | 
 | 2607 |         except TypeError: | 
 | 2608 |             pass | 
 | 2609 |         else: | 
 | 2610 |             raise TestFailed, "shouldn't allow %r.__class__ = %r" % (x, C) | 
| Guido van Rossum | b6b8942 | 2002-04-15 01:03:30 +0000 | [diff] [blame] | 2611 |         try: | 
 | 2612 |             delattr(x, "__class__") | 
 | 2613 |         except TypeError: | 
 | 2614 |             pass | 
 | 2615 |         else: | 
 | 2616 |             raise TestFailed, "shouldn't allow del %r.__class__" % x | 
| Guido van Rossum | 5c294fb | 2001-09-25 03:43:42 +0000 | [diff] [blame] | 2617 |     cant(C(), list) | 
 | 2618 |     cant(list(), C) | 
 | 2619 |     cant(C(), 1) | 
 | 2620 |     cant(C(), object) | 
 | 2621 |     cant(object(), list) | 
 | 2622 |     cant(list(), object) | 
| Guido van Rossum | 40af889 | 2002-08-10 05:42:07 +0000 | [diff] [blame] | 2623 |     class Int(int): __slots__ = [] | 
 | 2624 |     cant(2, Int) | 
 | 2625 |     cant(Int(), int) | 
 | 2626 |     cant(True, int) | 
 | 2627 |     cant(2, bool) | 
| Guido van Rossum | 5c294fb | 2001-09-25 03:43:42 +0000 | [diff] [blame] | 2628 |  | 
| Guido van Rossum | 6661be3 | 2001-10-26 04:26:12 +0000 | [diff] [blame] | 2629 | def setdict(): | 
 | 2630 |     if verbose: print "Testing __dict__ assignment..." | 
 | 2631 |     class C(object): pass | 
 | 2632 |     a = C() | 
 | 2633 |     a.__dict__ = {'b': 1} | 
 | 2634 |     vereq(a.b, 1) | 
 | 2635 |     def cant(x, dict): | 
 | 2636 |         try: | 
 | 2637 |             x.__dict__ = dict | 
 | 2638 |         except TypeError: | 
 | 2639 |             pass | 
 | 2640 |         else: | 
 | 2641 |             raise TestFailed, "shouldn't allow %r.__dict__ = %r" % (x, dict) | 
 | 2642 |     cant(a, None) | 
 | 2643 |     cant(a, []) | 
 | 2644 |     cant(a, 1) | 
| Guido van Rossum | d331cb5 | 2001-12-05 19:46:42 +0000 | [diff] [blame] | 2645 |     del a.__dict__ # Deleting __dict__ is allowed | 
| Guido van Rossum | 6661be3 | 2001-10-26 04:26:12 +0000 | [diff] [blame] | 2646 |     # Classes don't allow __dict__ assignment | 
 | 2647 |     cant(C, {}) | 
 | 2648 |  | 
| Guido van Rossum | 3926a63 | 2001-09-25 16:25:58 +0000 | [diff] [blame] | 2649 | def pickles(): | 
| Guido van Rossum | 6cef6d5 | 2001-09-28 18:13:29 +0000 | [diff] [blame] | 2650 |     if verbose: | 
 | 2651 |         print "Testing pickling and copying new-style classes and objects..." | 
| Guido van Rossum | 3926a63 | 2001-09-25 16:25:58 +0000 | [diff] [blame] | 2652 |     import pickle, cPickle | 
 | 2653 |  | 
 | 2654 |     def sorteditems(d): | 
 | 2655 |         L = d.items() | 
 | 2656 |         L.sort() | 
 | 2657 |         return L | 
 | 2658 |  | 
 | 2659 |     global C | 
 | 2660 |     class C(object): | 
 | 2661 |         def __init__(self, a, b): | 
 | 2662 |             super(C, self).__init__() | 
 | 2663 |             self.a = a | 
 | 2664 |             self.b = b | 
 | 2665 |         def __repr__(self): | 
 | 2666 |             return "C(%r, %r)" % (self.a, self.b) | 
 | 2667 |  | 
 | 2668 |     global C1 | 
 | 2669 |     class C1(list): | 
 | 2670 |         def __new__(cls, a, b): | 
 | 2671 |             return super(C1, cls).__new__(cls) | 
 | 2672 |         def __init__(self, a, b): | 
 | 2673 |             self.a = a | 
 | 2674 |             self.b = b | 
 | 2675 |         def __repr__(self): | 
 | 2676 |             return "C1(%r, %r)<%r>" % (self.a, self.b, list(self)) | 
 | 2677 |  | 
 | 2678 |     global C2 | 
 | 2679 |     class C2(int): | 
 | 2680 |         def __new__(cls, a, b, val=0): | 
 | 2681 |             return super(C2, cls).__new__(cls, val) | 
 | 2682 |         def __init__(self, a, b, val=0): | 
 | 2683 |             self.a = a | 
 | 2684 |             self.b = b | 
 | 2685 |         def __repr__(self): | 
 | 2686 |             return "C2(%r, %r)<%r>" % (self.a, self.b, int(self)) | 
 | 2687 |  | 
| Guido van Rossum | 90c4514 | 2001-11-24 21:07:01 +0000 | [diff] [blame] | 2688 |     global C3 | 
 | 2689 |     class C3(object): | 
 | 2690 |         def __init__(self, foo): | 
 | 2691 |             self.foo = foo | 
 | 2692 |         def __getstate__(self): | 
 | 2693 |             return self.foo | 
 | 2694 |         def __setstate__(self, foo): | 
 | 2695 |             self.foo = foo | 
 | 2696 |  | 
 | 2697 |     global C4classic, C4 | 
 | 2698 |     class C4classic: # classic | 
 | 2699 |         pass | 
 | 2700 |     class C4(C4classic, object): # mixed inheritance | 
 | 2701 |         pass | 
 | 2702 |  | 
| Guido van Rossum | 3926a63 | 2001-09-25 16:25:58 +0000 | [diff] [blame] | 2703 |     for p in pickle, cPickle: | 
 | 2704 |         for bin in 0, 1: | 
| Guido van Rossum | fe1fd0e | 2001-10-02 19:58:32 +0000 | [diff] [blame] | 2705 |             if verbose: | 
 | 2706 |                 print p.__name__, ["text", "binary"][bin] | 
| Guido van Rossum | 3926a63 | 2001-09-25 16:25:58 +0000 | [diff] [blame] | 2707 |  | 
 | 2708 |             for cls in C, C1, C2: | 
 | 2709 |                 s = p.dumps(cls, bin) | 
 | 2710 |                 cls2 = p.loads(s) | 
 | 2711 |                 verify(cls2 is cls) | 
 | 2712 |  | 
 | 2713 |             a = C1(1, 2); a.append(42); a.append(24) | 
 | 2714 |             b = C2("hello", "world", 42) | 
 | 2715 |             s = p.dumps((a, b), bin) | 
 | 2716 |             x, y = p.loads(s) | 
| Guido van Rossum | 90c4514 | 2001-11-24 21:07:01 +0000 | [diff] [blame] | 2717 |             vereq(x.__class__, a.__class__) | 
 | 2718 |             vereq(sorteditems(x.__dict__), sorteditems(a.__dict__)) | 
 | 2719 |             vereq(y.__class__, b.__class__) | 
 | 2720 |             vereq(sorteditems(y.__dict__), sorteditems(b.__dict__)) | 
 | 2721 |             vereq(`x`, `a`) | 
 | 2722 |             vereq(`y`, `b`) | 
| Guido van Rossum | 3926a63 | 2001-09-25 16:25:58 +0000 | [diff] [blame] | 2723 |             if verbose: | 
 | 2724 |                 print "a = x =", a | 
 | 2725 |                 print "b = y =", b | 
| Guido van Rossum | 90c4514 | 2001-11-24 21:07:01 +0000 | [diff] [blame] | 2726 |             # Test for __getstate__ and __setstate__ on new style class | 
 | 2727 |             u = C3(42) | 
 | 2728 |             s = p.dumps(u, bin) | 
 | 2729 |             v = p.loads(s) | 
 | 2730 |             veris(u.__class__, v.__class__) | 
 | 2731 |             vereq(u.foo, v.foo) | 
 | 2732 |             # Test for picklability of hybrid class | 
 | 2733 |             u = C4() | 
 | 2734 |             u.foo = 42 | 
 | 2735 |             s = p.dumps(u, bin) | 
 | 2736 |             v = p.loads(s) | 
 | 2737 |             veris(u.__class__, v.__class__) | 
 | 2738 |             vereq(u.foo, v.foo) | 
| Guido van Rossum | 3926a63 | 2001-09-25 16:25:58 +0000 | [diff] [blame] | 2739 |  | 
| Guido van Rossum | fe1fd0e | 2001-10-02 19:58:32 +0000 | [diff] [blame] | 2740 |     # Testing copy.deepcopy() | 
 | 2741 |     if verbose: | 
 | 2742 |         print "deepcopy" | 
 | 2743 |     import copy | 
 | 2744 |     for cls in C, C1, C2: | 
 | 2745 |         cls2 = copy.deepcopy(cls) | 
 | 2746 |         verify(cls2 is cls) | 
| Guido van Rossum | 6cef6d5 | 2001-09-28 18:13:29 +0000 | [diff] [blame] | 2747 |  | 
| Guido van Rossum | fe1fd0e | 2001-10-02 19:58:32 +0000 | [diff] [blame] | 2748 |     a = C1(1, 2); a.append(42); a.append(24) | 
 | 2749 |     b = C2("hello", "world", 42) | 
 | 2750 |     x, y = copy.deepcopy((a, b)) | 
| Guido van Rossum | 90c4514 | 2001-11-24 21:07:01 +0000 | [diff] [blame] | 2751 |     vereq(x.__class__, a.__class__) | 
 | 2752 |     vereq(sorteditems(x.__dict__), sorteditems(a.__dict__)) | 
 | 2753 |     vereq(y.__class__, b.__class__) | 
 | 2754 |     vereq(sorteditems(y.__dict__), sorteditems(b.__dict__)) | 
 | 2755 |     vereq(`x`, `a`) | 
 | 2756 |     vereq(`y`, `b`) | 
| Guido van Rossum | fe1fd0e | 2001-10-02 19:58:32 +0000 | [diff] [blame] | 2757 |     if verbose: | 
 | 2758 |         print "a = x =", a | 
 | 2759 |         print "b = y =", b | 
| Guido van Rossum | 6cef6d5 | 2001-09-28 18:13:29 +0000 | [diff] [blame] | 2760 |  | 
| Guido van Rossum | 8c84255 | 2002-03-14 23:05:54 +0000 | [diff] [blame] | 2761 | def pickleslots(): | 
 | 2762 |     if verbose: print "Testing pickling of classes with __slots__ ..." | 
 | 2763 |     import pickle, cPickle | 
 | 2764 |     # Pickling of classes with __slots__ but without __getstate__ should fail | 
 | 2765 |     global B, C, D, E | 
 | 2766 |     class B(object): | 
 | 2767 |         pass | 
 | 2768 |     for base in [object, B]: | 
 | 2769 |         class C(base): | 
 | 2770 |             __slots__ = ['a'] | 
 | 2771 |         class D(C): | 
 | 2772 |             pass | 
 | 2773 |         try: | 
 | 2774 |             pickle.dumps(C()) | 
 | 2775 |         except TypeError: | 
 | 2776 |             pass | 
 | 2777 |         else: | 
 | 2778 |             raise TestFailed, "should fail: pickle C instance - %s" % base | 
 | 2779 |         try: | 
 | 2780 |             cPickle.dumps(C()) | 
 | 2781 |         except TypeError: | 
 | 2782 |             pass | 
 | 2783 |         else: | 
 | 2784 |             raise TestFailed, "should fail: cPickle C instance - %s" % base | 
 | 2785 |         try: | 
 | 2786 |             pickle.dumps(C()) | 
 | 2787 |         except TypeError: | 
 | 2788 |             pass | 
 | 2789 |         else: | 
 | 2790 |             raise TestFailed, "should fail: pickle D instance - %s" % base | 
 | 2791 |         try: | 
 | 2792 |             cPickle.dumps(D()) | 
 | 2793 |         except TypeError: | 
 | 2794 |             pass | 
 | 2795 |         else: | 
 | 2796 |             raise TestFailed, "should fail: cPickle D instance - %s" % base | 
 | 2797 |         # Give C a __getstate__ and __setstate__ | 
 | 2798 |         class C(base): | 
 | 2799 |             __slots__ = ['a'] | 
 | 2800 |             def __getstate__(self): | 
 | 2801 |                 try: | 
 | 2802 |                     d = self.__dict__.copy() | 
 | 2803 |                 except AttributeError: | 
 | 2804 |                     d = {} | 
 | 2805 |                 try: | 
 | 2806 |                     d['a'] = self.a | 
 | 2807 |                 except AttributeError: | 
 | 2808 |                     pass | 
 | 2809 |                 return d | 
 | 2810 |             def __setstate__(self, d): | 
 | 2811 |                 for k, v in d.items(): | 
 | 2812 |                     setattr(self, k, v) | 
 | 2813 |         class D(C): | 
 | 2814 |             pass | 
 | 2815 |         # Now it should work | 
 | 2816 |         x = C() | 
 | 2817 |         y = pickle.loads(pickle.dumps(x)) | 
 | 2818 |         vereq(hasattr(y, 'a'), 0) | 
 | 2819 |         y = cPickle.loads(cPickle.dumps(x)) | 
 | 2820 |         vereq(hasattr(y, 'a'), 0) | 
 | 2821 |         x.a = 42 | 
 | 2822 |         y = pickle.loads(pickle.dumps(x)) | 
 | 2823 |         vereq(y.a, 42) | 
 | 2824 |         y = cPickle.loads(cPickle.dumps(x)) | 
 | 2825 |         vereq(y.a, 42) | 
 | 2826 |         x = D() | 
 | 2827 |         x.a = 42 | 
 | 2828 |         x.b = 100 | 
 | 2829 |         y = pickle.loads(pickle.dumps(x)) | 
 | 2830 |         vereq(y.a + y.b, 142) | 
 | 2831 |         y = cPickle.loads(cPickle.dumps(x)) | 
 | 2832 |         vereq(y.a + y.b, 142) | 
 | 2833 |         # But a subclass that adds a slot should not work | 
 | 2834 |         class E(C): | 
 | 2835 |             __slots__ = ['b'] | 
 | 2836 |         try: | 
 | 2837 |             pickle.dumps(E()) | 
 | 2838 |         except TypeError: | 
 | 2839 |             pass | 
 | 2840 |         else: | 
 | 2841 |             raise TestFailed, "should fail: pickle E instance - %s" % base | 
 | 2842 |         try: | 
 | 2843 |             cPickle.dumps(E()) | 
 | 2844 |         except TypeError: | 
 | 2845 |             pass | 
 | 2846 |         else: | 
 | 2847 |             raise TestFailed, "should fail: cPickle E instance - %s" % base | 
 | 2848 |  | 
| Guido van Rossum | 6cef6d5 | 2001-09-28 18:13:29 +0000 | [diff] [blame] | 2849 | def copies(): | 
 | 2850 |     if verbose: print "Testing copy.copy() and copy.deepcopy()..." | 
 | 2851 |     import copy | 
 | 2852 |     class C(object): | 
 | 2853 |         pass | 
 | 2854 |  | 
 | 2855 |     a = C() | 
 | 2856 |     a.foo = 12 | 
 | 2857 |     b = copy.copy(a) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2858 |     vereq(b.__dict__, a.__dict__) | 
| Guido van Rossum | 6cef6d5 | 2001-09-28 18:13:29 +0000 | [diff] [blame] | 2859 |  | 
 | 2860 |     a.bar = [1,2,3] | 
 | 2861 |     c = copy.copy(a) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2862 |     vereq(c.bar, a.bar) | 
| Guido van Rossum | 6cef6d5 | 2001-09-28 18:13:29 +0000 | [diff] [blame] | 2863 |     verify(c.bar is a.bar) | 
 | 2864 |  | 
 | 2865 |     d = copy.deepcopy(a) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2866 |     vereq(d.__dict__, a.__dict__) | 
| Guido van Rossum | 6cef6d5 | 2001-09-28 18:13:29 +0000 | [diff] [blame] | 2867 |     a.bar.append(4) | 
| Guido van Rossum | 4570455 | 2001-10-08 16:35:45 +0000 | [diff] [blame] | 2868 |     vereq(d.bar, [1,2,3]) | 
| Guido van Rossum | 6cef6d5 | 2001-09-28 18:13:29 +0000 | [diff] [blame] | 2869 |  | 
| Guido van Rossum | 4bb1e36 | 2001-09-28 23:49:48 +0000 | [diff] [blame] | 2870 | def binopoverride(): | 
 | 2871 |     if verbose: print "Testing overrides of binary operations..." | 
 | 2872 |     class I(int): | 
 | 2873 |         def __repr__(self): | 
 | 2874 |             return "I(%r)" % int(self) | 
 | 2875 |         def __add__(self, other): | 
 | 2876 |             return I(int(self) + int(other)) | 
 | 2877 |         __radd__ = __add__ | 
 | 2878 |         def __pow__(self, other, mod=None): | 
 | 2879 |             if mod is None: | 
 | 2880 |                 return I(pow(int(self), int(other))) | 
 | 2881 |             else: | 
 | 2882 |                 return I(pow(int(self), int(other), int(mod))) | 
 | 2883 |         def __rpow__(self, other, mod=None): | 
 | 2884 |             if mod is None: | 
 | 2885 |                 return I(pow(int(other), int(self), mod)) | 
 | 2886 |             else: | 
 | 2887 |                 return I(pow(int(other), int(self), int(mod))) | 
| Tim Peters | 2f93e28 | 2001-10-04 05:27:00 +0000 | [diff] [blame] | 2888 |  | 
| Guido van Rossum | 4bb1e36 | 2001-09-28 23:49:48 +0000 | [diff] [blame] | 2889 |     vereq(`I(1) + I(2)`, "I(3)") | 
 | 2890 |     vereq(`I(1) + 2`, "I(3)") | 
 | 2891 |     vereq(`1 + I(2)`, "I(3)") | 
 | 2892 |     vereq(`I(2) ** I(3)`, "I(8)") | 
 | 2893 |     vereq(`2 ** I(3)`, "I(8)") | 
 | 2894 |     vereq(`I(2) ** 3`, "I(8)") | 
 | 2895 |     vereq(`pow(I(2), I(3), I(5))`, "I(3)") | 
 | 2896 |     class S(str): | 
 | 2897 |         def __eq__(self, other): | 
 | 2898 |             return self.lower() == other.lower() | 
 | 2899 |  | 
| Guido van Rossum | 875eeaa | 2001-10-11 18:33:53 +0000 | [diff] [blame] | 2900 | def subclasspropagation(): | 
 | 2901 |     if verbose: print "Testing propagation of slot functions to subclasses..." | 
 | 2902 |     class A(object): | 
 | 2903 |         pass | 
 | 2904 |     class B(A): | 
 | 2905 |         pass | 
 | 2906 |     class C(A): | 
 | 2907 |         pass | 
 | 2908 |     class D(B, C): | 
 | 2909 |         pass | 
 | 2910 |     d = D() | 
 | 2911 |     vereq(hash(d), id(d)) | 
 | 2912 |     A.__hash__ = lambda self: 42 | 
 | 2913 |     vereq(hash(d), 42) | 
 | 2914 |     C.__hash__ = lambda self: 314 | 
 | 2915 |     vereq(hash(d), 314) | 
 | 2916 |     B.__hash__ = lambda self: 144 | 
 | 2917 |     vereq(hash(d), 144) | 
 | 2918 |     D.__hash__ = lambda self: 100 | 
 | 2919 |     vereq(hash(d), 100) | 
 | 2920 |     del D.__hash__ | 
 | 2921 |     vereq(hash(d), 144) | 
 | 2922 |     del B.__hash__ | 
 | 2923 |     vereq(hash(d), 314) | 
 | 2924 |     del C.__hash__ | 
 | 2925 |     vereq(hash(d), 42) | 
 | 2926 |     del A.__hash__ | 
 | 2927 |     vereq(hash(d), id(d)) | 
 | 2928 |     d.foo = 42 | 
 | 2929 |     d.bar = 42 | 
 | 2930 |     vereq(d.foo, 42) | 
 | 2931 |     vereq(d.bar, 42) | 
 | 2932 |     def __getattribute__(self, name): | 
 | 2933 |         if name == "foo": | 
 | 2934 |             return 24 | 
 | 2935 |         return object.__getattribute__(self, name) | 
 | 2936 |     A.__getattribute__ = __getattribute__ | 
 | 2937 |     vereq(d.foo, 24) | 
 | 2938 |     vereq(d.bar, 42) | 
 | 2939 |     def __getattr__(self, name): | 
 | 2940 |         if name in ("spam", "foo", "bar"): | 
 | 2941 |             return "hello" | 
 | 2942 |         raise AttributeError, name | 
 | 2943 |     B.__getattr__ = __getattr__ | 
 | 2944 |     vereq(d.spam, "hello") | 
 | 2945 |     vereq(d.foo, 24) | 
 | 2946 |     vereq(d.bar, 42) | 
 | 2947 |     del A.__getattribute__ | 
 | 2948 |     vereq(d.foo, 42) | 
 | 2949 |     del d.foo | 
 | 2950 |     vereq(d.foo, "hello") | 
 | 2951 |     vereq(d.bar, 42) | 
 | 2952 |     del B.__getattr__ | 
 | 2953 |     try: | 
 | 2954 |         d.foo | 
 | 2955 |     except AttributeError: | 
 | 2956 |         pass | 
 | 2957 |     else: | 
 | 2958 |         raise TestFailed, "d.foo should be undefined now" | 
| Tim Peters | fc57ccb | 2001-10-12 02:38:24 +0000 | [diff] [blame] | 2959 |  | 
| Guido van Rossum | e7f3e24 | 2002-06-14 02:35:45 +0000 | [diff] [blame] | 2960 |     # Test a nasty bug in recurse_down_subclasses() | 
 | 2961 |     import gc | 
 | 2962 |     class A(object): | 
 | 2963 |         pass | 
 | 2964 |     class B(A): | 
 | 2965 |         pass | 
 | 2966 |     del B | 
 | 2967 |     gc.collect() | 
 | 2968 |     A.__setitem__ = lambda *a: None # crash | 
 | 2969 |  | 
| Tim Peters | fc57ccb | 2001-10-12 02:38:24 +0000 | [diff] [blame] | 2970 | def buffer_inherit(): | 
 | 2971 |     import binascii | 
 | 2972 |     # SF bug [#470040] ParseTuple t# vs subclasses. | 
 | 2973 |     if verbose: | 
 | 2974 |         print "Testing that buffer interface is inherited ..." | 
 | 2975 |  | 
 | 2976 |     class MyStr(str): | 
 | 2977 |         pass | 
 | 2978 |     base = 'abc' | 
 | 2979 |     m = MyStr(base) | 
 | 2980 |     # b2a_hex uses the buffer interface to get its argument's value, via | 
 | 2981 |     # PyArg_ParseTuple 't#' code. | 
 | 2982 |     vereq(binascii.b2a_hex(m), binascii.b2a_hex(base)) | 
 | 2983 |  | 
 | 2984 |     # It's not clear that unicode will continue to support the character | 
 | 2985 |     # buffer interface, and this test will fail if that's taken away. | 
 | 2986 |     class MyUni(unicode): | 
 | 2987 |         pass | 
 | 2988 |     base = u'abc' | 
 | 2989 |     m = MyUni(base) | 
 | 2990 |     vereq(binascii.b2a_hex(m), binascii.b2a_hex(base)) | 
 | 2991 |  | 
 | 2992 |     class MyInt(int): | 
 | 2993 |         pass | 
 | 2994 |     m = MyInt(42) | 
 | 2995 |     try: | 
 | 2996 |         binascii.b2a_hex(m) | 
 | 2997 |         raise TestFailed('subclass of int should not have a buffer interface') | 
 | 2998 |     except TypeError: | 
 | 2999 |         pass | 
| Tim Peters | 0ab085c | 2001-09-14 00:25:33 +0000 | [diff] [blame] | 3000 |  | 
| Tim Peters | c993315 | 2001-10-16 20:18:24 +0000 | [diff] [blame] | 3001 | def str_of_str_subclass(): | 
 | 3002 |     import binascii | 
 | 3003 |     import cStringIO | 
 | 3004 |  | 
 | 3005 |     if verbose: | 
 | 3006 |         print "Testing __str__ defined in subclass of str ..." | 
 | 3007 |  | 
 | 3008 |     class octetstring(str): | 
 | 3009 |         def __str__(self): | 
 | 3010 |             return binascii.b2a_hex(self) | 
 | 3011 |         def __repr__(self): | 
 | 3012 |             return self + " repr" | 
 | 3013 |  | 
 | 3014 |     o = octetstring('A') | 
 | 3015 |     vereq(type(o), octetstring) | 
 | 3016 |     vereq(type(str(o)), str) | 
 | 3017 |     vereq(type(repr(o)), str) | 
 | 3018 |     vereq(ord(o), 0x41) | 
 | 3019 |     vereq(str(o), '41') | 
 | 3020 |     vereq(repr(o), 'A repr') | 
 | 3021 |     vereq(o.__str__(), '41') | 
 | 3022 |     vereq(o.__repr__(), 'A repr') | 
 | 3023 |  | 
 | 3024 |     capture = cStringIO.StringIO() | 
 | 3025 |     # Calling str() or not exercises different internal paths. | 
 | 3026 |     print >> capture, o | 
 | 3027 |     print >> capture, str(o) | 
 | 3028 |     vereq(capture.getvalue(), '41\n41\n') | 
 | 3029 |     capture.close() | 
 | 3030 |  | 
| Guido van Rossum | c8e5645 | 2001-10-22 00:43:43 +0000 | [diff] [blame] | 3031 | def kwdargs(): | 
 | 3032 |     if verbose: print "Testing keyword arguments to __init__, __call__..." | 
 | 3033 |     def f(a): return a | 
 | 3034 |     vereq(f.__call__(a=42), 42) | 
 | 3035 |     a = [] | 
 | 3036 |     list.__init__(a, sequence=[0, 1, 2]) | 
| Tim Peters | 1fc240e | 2001-10-26 05:06:50 +0000 | [diff] [blame] | 3037 |     vereq(a, [0, 1, 2]) | 
| Guido van Rossum | c8e5645 | 2001-10-22 00:43:43 +0000 | [diff] [blame] | 3038 |  | 
| Guido van Rossum | ed87ad8 | 2001-10-30 02:33:02 +0000 | [diff] [blame] | 3039 | def delhook(): | 
 | 3040 |     if verbose: print "Testing __del__ hook..." | 
 | 3041 |     log = [] | 
 | 3042 |     class C(object): | 
 | 3043 |         def __del__(self): | 
 | 3044 |             log.append(1) | 
 | 3045 |     c = C() | 
 | 3046 |     vereq(log, []) | 
 | 3047 |     del c | 
 | 3048 |     vereq(log, [1]) | 
 | 3049 |  | 
| Guido van Rossum | 29d2606 | 2001-12-11 04:37:34 +0000 | [diff] [blame] | 3050 |     class D(object): pass | 
 | 3051 |     d = D() | 
 | 3052 |     try: del d[0] | 
 | 3053 |     except TypeError: pass | 
 | 3054 |     else: raise TestFailed, "invalid del() didn't raise TypeError" | 
 | 3055 |  | 
| Guido van Rossum | dbb53d9 | 2001-12-03 16:32:18 +0000 | [diff] [blame] | 3056 | def hashinherit(): | 
 | 3057 |     if verbose: print "Testing hash of mutable subclasses..." | 
 | 3058 |  | 
 | 3059 |     class mydict(dict): | 
 | 3060 |         pass | 
 | 3061 |     d = mydict() | 
 | 3062 |     try: | 
 | 3063 |         hash(d) | 
 | 3064 |     except TypeError: | 
 | 3065 |         pass | 
 | 3066 |     else: | 
 | 3067 |         raise TestFailed, "hash() of dict subclass should fail" | 
 | 3068 |  | 
 | 3069 |     class mylist(list): | 
 | 3070 |         pass | 
 | 3071 |     d = mylist() | 
 | 3072 |     try: | 
 | 3073 |         hash(d) | 
 | 3074 |     except TypeError: | 
 | 3075 |         pass | 
 | 3076 |     else: | 
 | 3077 |         raise TestFailed, "hash() of list subclass should fail" | 
 | 3078 |  | 
| Guido van Rossum | 29d2606 | 2001-12-11 04:37:34 +0000 | [diff] [blame] | 3079 | def strops(): | 
 | 3080 |     try: 'a' + 5 | 
 | 3081 |     except TypeError: pass | 
 | 3082 |     else: raise TestFailed, "'' + 5 doesn't raise TypeError" | 
 | 3083 |  | 
 | 3084 |     try: ''.split('') | 
 | 3085 |     except ValueError: pass | 
 | 3086 |     else: raise TestFailed, "''.split('') doesn't raise ValueError" | 
 | 3087 |  | 
 | 3088 |     try: ''.join([0]) | 
 | 3089 |     except TypeError: pass | 
 | 3090 |     else: raise TestFailed, "''.join([0]) doesn't raise TypeError" | 
 | 3091 |  | 
 | 3092 |     try: ''.rindex('5') | 
 | 3093 |     except ValueError: pass | 
 | 3094 |     else: raise TestFailed, "''.rindex('5') doesn't raise ValueError" | 
 | 3095 |  | 
| Guido van Rossum | 29d2606 | 2001-12-11 04:37:34 +0000 | [diff] [blame] | 3096 |     try: '%(n)s' % None | 
 | 3097 |     except TypeError: pass | 
 | 3098 |     else: raise TestFailed, "'%(n)s' % None doesn't raise TypeError" | 
 | 3099 |  | 
 | 3100 |     try: '%(n' % {} | 
 | 3101 |     except ValueError: pass | 
 | 3102 |     else: raise TestFailed, "'%(n' % {} '' doesn't raise ValueError" | 
 | 3103 |  | 
 | 3104 |     try: '%*s' % ('abc') | 
 | 3105 |     except TypeError: pass | 
 | 3106 |     else: raise TestFailed, "'%*s' % ('abc') doesn't raise TypeError" | 
 | 3107 |  | 
 | 3108 |     try: '%*.*s' % ('abc', 5) | 
 | 3109 |     except TypeError: pass | 
 | 3110 |     else: raise TestFailed, "'%*.*s' % ('abc', 5) doesn't raise TypeError" | 
 | 3111 |  | 
 | 3112 |     try: '%s' % (1, 2) | 
 | 3113 |     except TypeError: pass | 
 | 3114 |     else: raise TestFailed, "'%s' % (1, 2) doesn't raise TypeError" | 
 | 3115 |  | 
 | 3116 |     try: '%' % None | 
 | 3117 |     except ValueError: pass | 
 | 3118 |     else: raise TestFailed, "'%' % None doesn't raise ValueError" | 
 | 3119 |  | 
 | 3120 |     vereq('534253'.isdigit(), 1) | 
 | 3121 |     vereq('534253x'.isdigit(), 0) | 
 | 3122 |     vereq('%c' % 5, '\x05') | 
 | 3123 |     vereq('%c' % '5', '5') | 
 | 3124 |  | 
| Guido van Rossum | 2764a3a | 2001-12-28 21:39:03 +0000 | [diff] [blame] | 3125 | def deepcopyrecursive(): | 
 | 3126 |     if verbose: print "Testing deepcopy of recursive objects..." | 
 | 3127 |     class Node: | 
 | 3128 |         pass | 
 | 3129 |     a = Node() | 
 | 3130 |     b = Node() | 
 | 3131 |     a.b = b | 
 | 3132 |     b.a = a | 
 | 3133 |     z = deepcopy(a) # This blew up before | 
| Guido van Rossum | 29d2606 | 2001-12-11 04:37:34 +0000 | [diff] [blame] | 3134 |  | 
| Guido van Rossum | d703567 | 2002-03-12 20:43:31 +0000 | [diff] [blame] | 3135 | def modules(): | 
 | 3136 |     if verbose: print "Testing uninitialized module objects..." | 
 | 3137 |     from types import ModuleType as M | 
 | 3138 |     m = M.__new__(M) | 
 | 3139 |     str(m) | 
 | 3140 |     vereq(hasattr(m, "__name__"), 0) | 
 | 3141 |     vereq(hasattr(m, "__file__"), 0) | 
 | 3142 |     vereq(hasattr(m, "foo"), 0) | 
 | 3143 |     vereq(m.__dict__, None) | 
 | 3144 |     m.foo = 1 | 
 | 3145 |     vereq(m.__dict__, {"foo": 1}) | 
| Guido van Rossum | 29d2606 | 2001-12-11 04:37:34 +0000 | [diff] [blame] | 3146 |  | 
| Walter Dörwald | dbd2d25 | 2002-03-25 18:36:32 +0000 | [diff] [blame] | 3147 | def dictproxyiterkeys(): | 
 | 3148 |     class C(object): | 
 | 3149 |         def meth(self): | 
 | 3150 |             pass | 
 | 3151 |     if verbose: print "Testing dict-proxy iterkeys..." | 
 | 3152 |     keys = [ key for key in C.__dict__.iterkeys() ] | 
 | 3153 |     keys.sort() | 
 | 3154 |     vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth']) | 
 | 3155 |  | 
 | 3156 | def dictproxyitervalues(): | 
 | 3157 |     class C(object): | 
 | 3158 |         def meth(self): | 
 | 3159 |             pass | 
 | 3160 |     if verbose: print "Testing dict-proxy itervalues..." | 
 | 3161 |     values = [ values for values in C.__dict__.itervalues() ] | 
 | 3162 |     vereq(len(values), 5) | 
 | 3163 |  | 
 | 3164 | def dictproxyiteritems(): | 
 | 3165 |     class C(object): | 
 | 3166 |         def meth(self): | 
 | 3167 |             pass | 
 | 3168 |     if verbose: print "Testing dict-proxy iteritems..." | 
 | 3169 |     keys = [ key for (key, value) in C.__dict__.iteritems() ] | 
 | 3170 |     keys.sort() | 
 | 3171 |     vereq(keys, ['__dict__', '__doc__', '__module__', '__weakref__', 'meth']) | 
 | 3172 |  | 
| Guido van Rossum | 8ace1ab | 2002-04-06 01:05:01 +0000 | [diff] [blame] | 3173 | def funnynew(): | 
 | 3174 |     if verbose: print "Testing __new__ returning something unexpected..." | 
 | 3175 |     class C(object): | 
 | 3176 |         def __new__(cls, arg): | 
 | 3177 |             if isinstance(arg, str): return [1, 2, 3] | 
 | 3178 |             elif isinstance(arg, int): return object.__new__(D) | 
 | 3179 |             else: return object.__new__(cls) | 
 | 3180 |     class D(C): | 
 | 3181 |         def __init__(self, arg): | 
 | 3182 |             self.foo = arg | 
 | 3183 |     vereq(C("1"), [1, 2, 3]) | 
 | 3184 |     vereq(D("1"), [1, 2, 3]) | 
 | 3185 |     d = D(None) | 
 | 3186 |     veris(d.foo, None) | 
 | 3187 |     d = C(1) | 
 | 3188 |     vereq(isinstance(d, D), True) | 
 | 3189 |     vereq(d.foo, 1) | 
 | 3190 |     d = D(1) | 
 | 3191 |     vereq(isinstance(d, D), True) | 
 | 3192 |     vereq(d.foo, 1) | 
 | 3193 |  | 
| Guido van Rossum | e8fc640 | 2002-04-16 16:44:51 +0000 | [diff] [blame] | 3194 | def imulbug(): | 
 | 3195 |     # SF bug 544647 | 
 | 3196 |     if verbose: print "Testing for __imul__ problems..." | 
 | 3197 |     class C(object): | 
 | 3198 |         def __imul__(self, other): | 
 | 3199 |             return (self, other) | 
 | 3200 |     x = C() | 
 | 3201 |     y = x | 
 | 3202 |     y *= 1.0 | 
 | 3203 |     vereq(y, (x, 1.0)) | 
 | 3204 |     y = x | 
 | 3205 |     y *= 2 | 
 | 3206 |     vereq(y, (x, 2)) | 
 | 3207 |     y = x | 
 | 3208 |     y *= 3L | 
 | 3209 |     vereq(y, (x, 3L)) | 
 | 3210 |     y = x | 
 | 3211 |     y *= 1L<<100 | 
 | 3212 |     vereq(y, (x, 1L<<100)) | 
 | 3213 |     y = x | 
 | 3214 |     y *= None | 
 | 3215 |     vereq(y, (x, None)) | 
 | 3216 |     y = x | 
 | 3217 |     y *= "foo" | 
 | 3218 |     vereq(y, (x, "foo")) | 
 | 3219 |  | 
| Guido van Rossum | d99b3e7 | 2002-04-18 00:27:33 +0000 | [diff] [blame] | 3220 | def docdescriptor(): | 
 | 3221 |     # SF bug 542984 | 
 | 3222 |     if verbose: print "Testing __doc__ descriptor..." | 
 | 3223 |     class DocDescr(object): | 
 | 3224 |         def __get__(self, object, otype): | 
 | 3225 |             if object: | 
 | 3226 |                 object = object.__class__.__name__ + ' instance' | 
 | 3227 |             if otype: | 
 | 3228 |                 otype = otype.__name__ | 
 | 3229 |             return 'object=%s; type=%s' % (object, otype) | 
 | 3230 |     class OldClass: | 
 | 3231 |         __doc__ = DocDescr() | 
 | 3232 |     class NewClass(object): | 
 | 3233 |         __doc__ = DocDescr() | 
 | 3234 |     vereq(OldClass.__doc__, 'object=None; type=OldClass') | 
 | 3235 |     vereq(OldClass().__doc__, 'object=OldClass instance; type=OldClass') | 
 | 3236 |     vereq(NewClass.__doc__, 'object=None; type=NewClass') | 
 | 3237 |     vereq(NewClass().__doc__, 'object=NewClass instance; type=NewClass') | 
 | 3238 |  | 
| Tim Peters | afb2c80 | 2002-04-18 18:06:20 +0000 | [diff] [blame] | 3239 | def string_exceptions(): | 
 | 3240 |     if verbose: | 
 | 3241 |         print "Testing string exceptions ..." | 
 | 3242 |  | 
 | 3243 |     # Ensure builtin strings work OK as exceptions. | 
 | 3244 |     astring = "An exception string." | 
 | 3245 |     try: | 
 | 3246 |         raise astring | 
 | 3247 |     except astring: | 
 | 3248 |         pass | 
 | 3249 |     else: | 
 | 3250 |         raise TestFailed, "builtin string not usable as exception" | 
 | 3251 |  | 
 | 3252 |     # Ensure string subclass instances do not. | 
 | 3253 |     class MyStr(str): | 
 | 3254 |         pass | 
 | 3255 |  | 
 | 3256 |     newstring = MyStr("oops -- shouldn't work") | 
 | 3257 |     try: | 
 | 3258 |         raise newstring | 
 | 3259 |     except TypeError: | 
 | 3260 |         pass | 
 | 3261 |     except: | 
 | 3262 |         raise TestFailed, "string subclass allowed as exception" | 
 | 3263 |  | 
| Guido van Rossum | a48cb8f | 2002-06-06 17:53:03 +0000 | [diff] [blame] | 3264 | def copy_setstate(): | 
 | 3265 |     if verbose: | 
 | 3266 |         print "Testing that copy.*copy() correctly uses __setstate__..." | 
 | 3267 |     import copy | 
 | 3268 |     class C(object): | 
 | 3269 |         def __init__(self, foo=None): | 
 | 3270 |             self.foo = foo | 
 | 3271 |             self.__foo = foo | 
 | 3272 |         def setfoo(self, foo=None): | 
 | 3273 |             self.foo = foo | 
 | 3274 |         def getfoo(self): | 
 | 3275 |             return self.__foo | 
 | 3276 |         def __getstate__(self): | 
 | 3277 |             return [self.foo] | 
 | 3278 |         def __setstate__(self, lst): | 
 | 3279 |             assert len(lst) == 1 | 
 | 3280 |             self.__foo = self.foo = lst[0] | 
 | 3281 |     a = C(42) | 
 | 3282 |     a.setfoo(24) | 
 | 3283 |     vereq(a.foo, 24) | 
 | 3284 |     vereq(a.getfoo(), 42) | 
 | 3285 |     b = copy.copy(a) | 
 | 3286 |     vereq(b.foo, 24) | 
 | 3287 |     vereq(b.getfoo(), 24) | 
 | 3288 |     b = copy.deepcopy(a) | 
 | 3289 |     vereq(b.foo, 24) | 
 | 3290 |     vereq(b.getfoo(), 24) | 
 | 3291 |  | 
| Guido van Rossum | 09638c1 | 2002-06-13 19:17:46 +0000 | [diff] [blame] | 3292 | def slices(): | 
 | 3293 |     if verbose: | 
 | 3294 |         print "Testing cases with slices and overridden __getitem__ ..." | 
 | 3295 |     # Strings | 
 | 3296 |     vereq("hello"[:4], "hell") | 
 | 3297 |     vereq("hello"[slice(4)], "hell") | 
 | 3298 |     vereq(str.__getitem__("hello", slice(4)), "hell") | 
 | 3299 |     class S(str): | 
 | 3300 |         def __getitem__(self, x): | 
 | 3301 |             return str.__getitem__(self, x) | 
 | 3302 |     vereq(S("hello")[:4], "hell") | 
 | 3303 |     vereq(S("hello")[slice(4)], "hell") | 
 | 3304 |     vereq(S("hello").__getitem__(slice(4)), "hell") | 
 | 3305 |     # Tuples | 
 | 3306 |     vereq((1,2,3)[:2], (1,2)) | 
 | 3307 |     vereq((1,2,3)[slice(2)], (1,2)) | 
 | 3308 |     vereq(tuple.__getitem__((1,2,3), slice(2)), (1,2)) | 
 | 3309 |     class T(tuple): | 
 | 3310 |         def __getitem__(self, x): | 
 | 3311 |             return tuple.__getitem__(self, x) | 
 | 3312 |     vereq(T((1,2,3))[:2], (1,2)) | 
 | 3313 |     vereq(T((1,2,3))[slice(2)], (1,2)) | 
 | 3314 |     vereq(T((1,2,3)).__getitem__(slice(2)), (1,2)) | 
 | 3315 |     # Lists | 
 | 3316 |     vereq([1,2,3][:2], [1,2]) | 
 | 3317 |     vereq([1,2,3][slice(2)], [1,2]) | 
 | 3318 |     vereq(list.__getitem__([1,2,3], slice(2)), [1,2]) | 
 | 3319 |     class L(list): | 
 | 3320 |         def __getitem__(self, x): | 
 | 3321 |             return list.__getitem__(self, x) | 
 | 3322 |     vereq(L([1,2,3])[:2], [1,2]) | 
 | 3323 |     vereq(L([1,2,3])[slice(2)], [1,2]) | 
 | 3324 |     vereq(L([1,2,3]).__getitem__(slice(2)), [1,2]) | 
 | 3325 |     # Now do lists and __setitem__ | 
 | 3326 |     a = L([1,2,3]) | 
 | 3327 |     a[slice(1, 3)] = [3,2] | 
 | 3328 |     vereq(a, [1,3,2]) | 
 | 3329 |     a[slice(0, 2, 1)] = [3,1] | 
 | 3330 |     vereq(a, [3,1,2]) | 
 | 3331 |     a.__setitem__(slice(1, 3), [2,1]) | 
 | 3332 |     vereq(a, [3,2,1]) | 
 | 3333 |     a.__setitem__(slice(0, 2, 1), [2,3]) | 
 | 3334 |     vereq(a, [2,3,1]) | 
 | 3335 |  | 
| Tim Peters | 2484aae | 2002-07-11 06:56:07 +0000 | [diff] [blame] | 3336 | def subtype_resurrection(): | 
 | 3337 |     if verbose: | 
| Tim Peters | 45228ca | 2002-07-11 07:09:42 +0000 | [diff] [blame] | 3338 |         print "Testing resurrection of new-style instance..." | 
| Tim Peters | 2484aae | 2002-07-11 06:56:07 +0000 | [diff] [blame] | 3339 |  | 
 | 3340 |     class C(object): | 
 | 3341 |         container = [] | 
 | 3342 |  | 
 | 3343 |         def __del__(self): | 
 | 3344 |             # resurrect the instance | 
 | 3345 |             C.container.append(self) | 
 | 3346 |  | 
 | 3347 |     c = C() | 
 | 3348 |     c.attr = 42 | 
| Tim Peters | 14cb1e1 | 2002-07-11 18:26:21 +0000 | [diff] [blame] | 3349 |     # The most interesting thing here is whether this blows up, due to flawed | 
| Tim Peters | 45228ca | 2002-07-11 07:09:42 +0000 | [diff] [blame] | 3350 |     #  GC tracking logic in typeobject.c's call_finalizer() (a 2.2.1 bug). | 
| Tim Peters | 2484aae | 2002-07-11 06:56:07 +0000 | [diff] [blame] | 3351 |     del c | 
| Tim Peters | 14cb1e1 | 2002-07-11 18:26:21 +0000 | [diff] [blame] | 3352 |  | 
 | 3353 |     # If that didn't blow up, it's also interesting to see whether clearing | 
 | 3354 |     # the last container slot works:  that will attempt to delete c again, | 
 | 3355 |     # which will cause c to get appended back to the container again "during" | 
 | 3356 |     # the del. | 
 | 3357 |     del C.container[-1] | 
 | 3358 |     vereq(len(C.container), 1) | 
| Tim Peters | 2484aae | 2002-07-11 06:56:07 +0000 | [diff] [blame] | 3359 |     vereq(C.container[-1].attr, 42) | 
| Guido van Rossum | 09638c1 | 2002-06-13 19:17:46 +0000 | [diff] [blame] | 3360 |  | 
| Tim Peters | 14cb1e1 | 2002-07-11 18:26:21 +0000 | [diff] [blame] | 3361 |     # Make c mortal again, so that the test framework with -l doesn't report | 
 | 3362 |     # it as a leak. | 
 | 3363 |     del C.__del__ | 
 | 3364 |  | 
| Guido van Rossum | 2d70246 | 2002-08-06 21:28:28 +0000 | [diff] [blame] | 3365 | def slottrash(): | 
 | 3366 |     # Deallocating deeply nested slotted trash caused stack overflows | 
 | 3367 |     if verbose: | 
 | 3368 |         print "Testing slot trash..." | 
 | 3369 |     class trash(object): | 
 | 3370 |         __slots__ = ['x'] | 
 | 3371 |         def __init__(self, x): | 
 | 3372 |             self.x = x | 
 | 3373 |     o = None | 
 | 3374 |     for i in xrange(50000): | 
 | 3375 |         o = trash(o) | 
 | 3376 |     del o | 
 | 3377 |  | 
| Neal Norwitz | f9dd0f1 | 2002-08-13 17:16:49 +0000 | [diff] [blame] | 3378 | def slotmultipleinheritance(): | 
 | 3379 |     # SF bug 575229, multiple inheritance w/ slots dumps core | 
 | 3380 |     class A(object): | 
 | 3381 |         __slots__=() | 
 | 3382 |     class B(object): | 
 | 3383 |         pass | 
 | 3384 |     class C(A,B) : | 
 | 3385 |         __slots__=() | 
| Guido van Rossum | 8b056da | 2002-08-13 18:26:26 +0000 | [diff] [blame] | 3386 |     vereq(C.__basicsize__, B.__basicsize__) | 
 | 3387 |     verify(hasattr(C, '__dict__')) | 
 | 3388 |     verify(hasattr(C, '__weakref__')) | 
 | 3389 |     C().x = 2 | 
| Neal Norwitz | f9dd0f1 | 2002-08-13 17:16:49 +0000 | [diff] [blame] | 3390 |  | 
| Guido van Rossum | 0f5f0b8 | 2002-08-09 16:11:37 +0000 | [diff] [blame] | 3391 | def testrmul(): | 
 | 3392 |     # SF patch 592646 | 
 | 3393 |     if verbose: | 
 | 3394 |         print "Testing correct invocation of __rmul__..." | 
 | 3395 |     class C(object): | 
 | 3396 |         def __mul__(self, other): | 
 | 3397 |             return "mul" | 
 | 3398 |         def __rmul__(self, other): | 
 | 3399 |             return "rmul" | 
 | 3400 |     a = C() | 
 | 3401 |     vereq(a*2, "mul") | 
 | 3402 |     vereq(a*2.2, "mul") | 
 | 3403 |     vereq(2*a, "rmul") | 
 | 3404 |     vereq(2.2*a, "rmul") | 
 | 3405 |  | 
| Guido van Rossum | 6e5680f | 2002-10-15 01:01:53 +0000 | [diff] [blame] | 3406 | def testipow(): | 
 | 3407 |     # [SF bug 620179] | 
 | 3408 |     if verbose: | 
 | 3409 |         print "Testing correct invocation of __ipow__..." | 
 | 3410 |     class C(object): | 
 | 3411 |         def __ipow__(self, other): | 
 | 3412 |             pass | 
 | 3413 |     a = C() | 
 | 3414 |     a **= 2 | 
 | 3415 |  | 
| Guido van Rossum | 9fc8a29 | 2002-05-24 21:40:08 +0000 | [diff] [blame] | 3416 | def do_this_first(): | 
 | 3417 |     if verbose: | 
 | 3418 |         print "Testing SF bug 551412 ..." | 
 | 3419 |     # This dumps core when SF bug 551412 isn't fixed -- | 
 | 3420 |     # but only when test_descr.py is run separately. | 
 | 3421 |     # (That can't be helped -- as soon as PyType_Ready() | 
 | 3422 |     # is called for PyLong_Type, the bug is gone.) | 
 | 3423 |     class UserLong(object): | 
 | 3424 |         def __pow__(self, *args): | 
 | 3425 |             pass | 
 | 3426 |     try: | 
 | 3427 |         pow(0L, UserLong(), 0L) | 
 | 3428 |     except: | 
 | 3429 |         pass | 
 | 3430 |  | 
| Guido van Rossum | a96b0df | 2002-06-18 16:49:45 +0000 | [diff] [blame] | 3431 |     if verbose: | 
 | 3432 |         print "Testing SF bug 570483..." | 
 | 3433 |     # Another segfault only when run early | 
 | 3434 |     # (before PyType_Ready(tuple) is called) | 
 | 3435 |     type.mro(tuple) | 
 | 3436 |  | 
| Michael W. Hudson | 586da8f | 2002-11-27 15:20:19 +0000 | [diff] [blame] | 3437 | def test_mutable_bases(): | 
| Michael W. Hudson | 98bbc49 | 2002-11-26 14:47:27 +0000 | [diff] [blame] | 3438 |     # stuff that should work: | 
 | 3439 |     class C(object): | 
 | 3440 |         pass | 
 | 3441 |     class C2(object): | 
 | 3442 |         def __getattribute__(self, attr): | 
 | 3443 |             if attr == 'a': | 
 | 3444 |                 return 2 | 
 | 3445 |             else: | 
 | 3446 |                 return super(C2, self).__getattribute__(attr)         | 
 | 3447 |         def meth(self): | 
 | 3448 |             return 1 | 
 | 3449 |     class D(C): | 
 | 3450 |         pass | 
 | 3451 |     class E(D): | 
 | 3452 |         pass | 
 | 3453 |     d = D() | 
 | 3454 |     e = E() | 
| Michael W. Hudson | caf17be | 2002-11-27 10:24:44 +0000 | [diff] [blame] | 3455 |     D.__bases__ = (C,) | 
| Michael W. Hudson | 98bbc49 | 2002-11-26 14:47:27 +0000 | [diff] [blame] | 3456 |     D.__bases__ = (C2,) | 
 | 3457 |     vereq(d.meth(), 1) | 
 | 3458 |     vereq(e.meth(), 1) | 
 | 3459 |     vereq(d.a, 2) | 
 | 3460 |     vereq(e.a, 2) | 
 | 3461 |     vereq(C2.__subclasses__(), [D]) | 
 | 3462 |  | 
 | 3463 |     # stuff that shouldn't: | 
 | 3464 |     class L(list): | 
 | 3465 |         pass | 
 | 3466 |  | 
 | 3467 |     try: | 
 | 3468 |         L.__bases__ = (dict,) | 
 | 3469 |     except TypeError: | 
 | 3470 |         pass | 
 | 3471 |     else: | 
 | 3472 |         raise TestFailed, "shouldn't turn list subclass into dict subclass" | 
 | 3473 |  | 
 | 3474 |     try: | 
 | 3475 |         list.__bases__ = (dict,) | 
 | 3476 |     except TypeError: | 
 | 3477 |         pass | 
 | 3478 |     else: | 
 | 3479 |         raise TestFailed, "shouldn't be able to assign to list.__bases__" | 
 | 3480 |  | 
 | 3481 |     try: | 
 | 3482 |         del D.__bases__ | 
 | 3483 |     except TypeError: | 
 | 3484 |         pass | 
 | 3485 |     else: | 
 | 3486 |         raise TestFailed, "shouldn't be able to delete .__bases__" | 
 | 3487 |  | 
 | 3488 |     try: | 
 | 3489 |         D.__bases__ = (D,) | 
 | 3490 |     except TypeError: | 
 | 3491 |         pass | 
 | 3492 |     else: | 
 | 3493 |         # actually, we'll have crashed by here... | 
 | 3494 |         raise TestFailed, "shouldn't be able to create inheritance cycles" | 
 | 3495 |  | 
| Michael W. Hudson | caf17be | 2002-11-27 10:24:44 +0000 | [diff] [blame] | 3496 |     try: | 
 | 3497 |         D.__bases__ = (E,) | 
 | 3498 |     except TypeError: | 
 | 3499 |         pass | 
 | 3500 |     else: | 
 | 3501 |         raise TestFailed, "shouldn't be able to create inheritance cycles" | 
 | 3502 |  | 
| Michael W. Hudson | 98bbc49 | 2002-11-26 14:47:27 +0000 | [diff] [blame] | 3503 |     # let's throw a classic class into the mix: | 
 | 3504 |     class Classic: | 
 | 3505 |         def meth2(self): | 
 | 3506 |             return 3 | 
 | 3507 |  | 
 | 3508 |     D.__bases__ = (C, Classic) | 
 | 3509 |  | 
 | 3510 |     vereq(d.meth2(), 3) | 
 | 3511 |     vereq(e.meth2(), 3) | 
 | 3512 |     try: | 
 | 3513 |         d.a | 
 | 3514 |     except AttributeError: | 
 | 3515 |         pass | 
 | 3516 |     else: | 
 | 3517 |         raise TestFailed, "attribute should have vanished" | 
 | 3518 |  | 
 | 3519 |     try: | 
 | 3520 |         D.__bases__ = (Classic,) | 
 | 3521 |     except TypeError: | 
 | 3522 |         pass | 
 | 3523 |     else: | 
 | 3524 |         raise TestFailed, "new-style class must have a new-style base" | 
 | 3525 |  | 
| Michael W. Hudson | 586da8f | 2002-11-27 15:20:19 +0000 | [diff] [blame] | 3526 | def test_mutable_bases_with_failing_mro(): | 
 | 3527 |     class WorkOnce(type): | 
 | 3528 |         def __new__(self, name, bases, ns): | 
 | 3529 |             self.flag = 0 | 
 | 3530 |             return super(WorkOnce, self).__new__(WorkOnce, name, bases, ns) | 
 | 3531 |         def mro(self): | 
 | 3532 |             if self.flag > 0: | 
 | 3533 |                 raise RuntimeError, "bozo" | 
 | 3534 |             else: | 
 | 3535 |                 self.flag += 1 | 
 | 3536 |                 return type.mro(self) | 
 | 3537 |  | 
 | 3538 |     class WorkAlways(type): | 
 | 3539 |         def mro(self): | 
 | 3540 |             # this is here to make sure that .mro()s aren't called | 
 | 3541 |             # with an exception set (which was possible at one point). | 
 | 3542 |             # An error message will be printed in a debug build. | 
 | 3543 |             # What's a good way to test for this? | 
 | 3544 |             return type.mro(self) | 
 | 3545 |  | 
 | 3546 |     class C(object): | 
 | 3547 |         pass | 
 | 3548 |  | 
 | 3549 |     class C2(object): | 
 | 3550 |         pass | 
 | 3551 |  | 
 | 3552 |     class D(C): | 
 | 3553 |         pass | 
 | 3554 |  | 
 | 3555 |     class E(D): | 
 | 3556 |         pass | 
 | 3557 |  | 
 | 3558 |     class F(D): | 
 | 3559 |         __metaclass__ = WorkOnce | 
 | 3560 |  | 
 | 3561 |     class G(D): | 
 | 3562 |         __metaclass__ = WorkAlways | 
 | 3563 |  | 
 | 3564 |     # Immediate subclasses have their mro's adjusted in alphabetical | 
 | 3565 |     # order, so E's will get adjusted before adjusting F's fails.  We | 
 | 3566 |     # check here that E's gets restored. | 
 | 3567 |      | 
 | 3568 |     E_mro_before = E.__mro__ | 
| Michael W. Hudson | 7e7c00d | 2002-11-27 15:40:09 +0000 | [diff] [blame] | 3569 |     D_mro_before = D.__mro__ | 
| Michael W. Hudson | 586da8f | 2002-11-27 15:20:19 +0000 | [diff] [blame] | 3570 |  | 
 | 3571 |     try: | 
 | 3572 |         D.__bases__ = (C2,) | 
 | 3573 |     except RuntimeError: | 
 | 3574 |         vereq(E.__mro__, E_mro_before) | 
| Michael W. Hudson | 7e7c00d | 2002-11-27 15:40:09 +0000 | [diff] [blame] | 3575 |         vereq(D.__mro__, D_mro_before) | 
| Michael W. Hudson | 586da8f | 2002-11-27 15:20:19 +0000 | [diff] [blame] | 3576 |     else: | 
 | 3577 |         raise TestFailed, "exception not propagated" | 
 | 3578 |  | 
 | 3579 | def test_mutable_bases_catch_mro_conflict(): | 
 | 3580 |     class A(object): | 
 | 3581 |         pass | 
 | 3582 |  | 
 | 3583 |     class B(object): | 
 | 3584 |         pass | 
 | 3585 |  | 
 | 3586 |     class C(A, B): | 
 | 3587 |         pass | 
 | 3588 |  | 
 | 3589 |     class D(A, B): | 
 | 3590 |         pass | 
 | 3591 |  | 
 | 3592 |     class E(C, D): | 
 | 3593 |         pass | 
 | 3594 |  | 
 | 3595 |     try: | 
 | 3596 |         C.__bases__ = (B, A) | 
 | 3597 |     except TypeError: | 
 | 3598 |         pass | 
 | 3599 |     else: | 
 | 3600 |         raise TestFailed, "didn't catch MRO conflict" | 
 | 3601 |      | 
| Michael W. Hudson | 98bbc49 | 2002-11-26 14:47:27 +0000 | [diff] [blame] | 3602 | def mutable_names(): | 
 | 3603 |     class C(object): | 
 | 3604 |         pass | 
 | 3605 |  | 
| Michael W. Hudson | ade8c8b2 | 2002-11-27 16:29:26 +0000 | [diff] [blame^] | 3606 |     # C.__module__ could be 'test_descr' or '__main__' | 
 | 3607 |     mod = C.__module__ | 
 | 3608 |      | 
 | 3609 |     C.__name__ = 'D' | 
 | 3610 |     vereq((C.__module__, C.__name__), (mod, 'D')) | 
 | 3611 |  | 
 | 3612 |     C.__name__ = 'D.E' | 
 | 3613 |     vereq((C.__module__, C.__name__), (mod, 'D.E')) | 
 | 3614 |      | 
| Michael W. Hudson | 98bbc49 | 2002-11-26 14:47:27 +0000 | [diff] [blame] | 3615 |  | 
| Guido van Rossum | a56b42b | 2001-09-20 21:39:07 +0000 | [diff] [blame] | 3616 | def test_main(): | 
| Guido van Rossum | 9fc8a29 | 2002-05-24 21:40:08 +0000 | [diff] [blame] | 3617 |     do_this_first() | 
| Tim Peters | 2f93e28 | 2001-10-04 05:27:00 +0000 | [diff] [blame] | 3618 |     class_docstrings() | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 3619 |     lists() | 
 | 3620 |     dicts() | 
| Tim Peters | 25786c0 | 2001-09-02 08:22:48 +0000 | [diff] [blame] | 3621 |     dict_constructor() | 
| Tim Peters | 5d2b77c | 2001-09-03 05:47:38 +0000 | [diff] [blame] | 3622 |     test_dir() | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 3623 |     ints() | 
 | 3624 |     longs() | 
 | 3625 |     floats() | 
 | 3626 |     complexes() | 
 | 3627 |     spamlists() | 
 | 3628 |     spamdicts() | 
 | 3629 |     pydicts() | 
 | 3630 |     pylists() | 
 | 3631 |     metaclass() | 
 | 3632 |     pymods() | 
 | 3633 |     multi() | 
| Guido van Rossum | d32047f | 2002-11-25 21:38:52 +0000 | [diff] [blame] | 3634 |     mro_disagreement() | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 3635 |     diamond() | 
| Guido van Rossum | 9a81892 | 2002-11-14 19:50:14 +0000 | [diff] [blame] | 3636 |     ex5() | 
 | 3637 |     monotonicity() | 
 | 3638 |     consistency_with_epg() | 
| Guido van Rossum | 3720261 | 2001-08-09 19:45:21 +0000 | [diff] [blame] | 3639 |     objects() | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 3640 |     slots() | 
| Guido van Rossum | 8b056da | 2002-08-13 18:26:26 +0000 | [diff] [blame] | 3641 |     slotspecials() | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 3642 |     dynamics() | 
 | 3643 |     errors() | 
 | 3644 |     classmethods() | 
| Fred Drake | f841aa6 | 2002-03-28 15:49:54 +0000 | [diff] [blame] | 3645 |     classmethods_in_c() | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 3646 |     staticmethods() | 
| Fred Drake | f841aa6 | 2002-03-28 15:49:54 +0000 | [diff] [blame] | 3647 |     staticmethods_in_c() | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 3648 |     classic() | 
 | 3649 |     compattr() | 
 | 3650 |     newslot() | 
 | 3651 |     altmro() | 
 | 3652 |     overloading() | 
| Guido van Rossum | b5a136b | 2001-08-15 17:51:17 +0000 | [diff] [blame] | 3653 |     methods() | 
| Guido van Rossum | a4ff6ab | 2001-08-15 23:57:59 +0000 | [diff] [blame] | 3654 |     specials() | 
| Guido van Rossum | 65d5d7f | 2001-08-17 21:27:53 +0000 | [diff] [blame] | 3655 |     weakrefs() | 
| Guido van Rossum | 8bce4ac | 2001-09-06 21:56:42 +0000 | [diff] [blame] | 3656 |     properties() | 
| Guido van Rossum | c4a1880 | 2001-08-24 16:55:27 +0000 | [diff] [blame] | 3657 |     supers() | 
| Guido van Rossum | caa9f43 | 2001-08-30 20:06:08 +0000 | [diff] [blame] | 3658 |     inherits() | 
| Tim Peters | 808b94e | 2001-09-13 19:33:07 +0000 | [diff] [blame] | 3659 |     keywords() | 
| Tim Peters | 8fa4567 | 2001-09-13 21:01:29 +0000 | [diff] [blame] | 3660 |     restricted() | 
| Tim Peters | 0ab085c | 2001-09-14 00:25:33 +0000 | [diff] [blame] | 3661 |     str_subclass_as_dict_key() | 
| Guido van Rossum | ab3b034 | 2001-09-18 20:38:53 +0000 | [diff] [blame] | 3662 |     classic_comparisons() | 
| Guido van Rossum | 0639f59 | 2001-09-18 21:06:04 +0000 | [diff] [blame] | 3663 |     rich_comparisons() | 
| Guido van Rossum | 1952e38 | 2001-09-19 01:25:16 +0000 | [diff] [blame] | 3664 |     coercions() | 
| Guido van Rossum | 8b9cc7e | 2001-09-20 21:49:53 +0000 | [diff] [blame] | 3665 |     descrdoc() | 
| Guido van Rossum | 5c294fb | 2001-09-25 03:43:42 +0000 | [diff] [blame] | 3666 |     setclass() | 
| Guido van Rossum | 6661be3 | 2001-10-26 04:26:12 +0000 | [diff] [blame] | 3667 |     setdict() | 
| Guido van Rossum | 3926a63 | 2001-09-25 16:25:58 +0000 | [diff] [blame] | 3668 |     pickles() | 
| Guido van Rossum | 6cef6d5 | 2001-09-28 18:13:29 +0000 | [diff] [blame] | 3669 |     copies() | 
| Guido van Rossum | 4bb1e36 | 2001-09-28 23:49:48 +0000 | [diff] [blame] | 3670 |     binopoverride() | 
| Guido van Rossum | 875eeaa | 2001-10-11 18:33:53 +0000 | [diff] [blame] | 3671 |     subclasspropagation() | 
| Tim Peters | fc57ccb | 2001-10-12 02:38:24 +0000 | [diff] [blame] | 3672 |     buffer_inherit() | 
| Tim Peters | c993315 | 2001-10-16 20:18:24 +0000 | [diff] [blame] | 3673 |     str_of_str_subclass() | 
| Guido van Rossum | c8e5645 | 2001-10-22 00:43:43 +0000 | [diff] [blame] | 3674 |     kwdargs() | 
| Guido van Rossum | ed87ad8 | 2001-10-30 02:33:02 +0000 | [diff] [blame] | 3675 |     delhook() | 
| Guido van Rossum | dbb53d9 | 2001-12-03 16:32:18 +0000 | [diff] [blame] | 3676 |     hashinherit() | 
| Guido van Rossum | 29d2606 | 2001-12-11 04:37:34 +0000 | [diff] [blame] | 3677 |     strops() | 
| Guido van Rossum | 2764a3a | 2001-12-28 21:39:03 +0000 | [diff] [blame] | 3678 |     deepcopyrecursive() | 
| Guido van Rossum | d703567 | 2002-03-12 20:43:31 +0000 | [diff] [blame] | 3679 |     modules() | 
| Walter Dörwald | dbd2d25 | 2002-03-25 18:36:32 +0000 | [diff] [blame] | 3680 |     dictproxyiterkeys() | 
 | 3681 |     dictproxyitervalues() | 
 | 3682 |     dictproxyiteritems() | 
| Guido van Rossum | 8c84255 | 2002-03-14 23:05:54 +0000 | [diff] [blame] | 3683 |     pickleslots() | 
| Guido van Rossum | 8ace1ab | 2002-04-06 01:05:01 +0000 | [diff] [blame] | 3684 |     funnynew() | 
| Guido van Rossum | e8fc640 | 2002-04-16 16:44:51 +0000 | [diff] [blame] | 3685 |     imulbug() | 
| Guido van Rossum | d99b3e7 | 2002-04-18 00:27:33 +0000 | [diff] [blame] | 3686 |     docdescriptor() | 
| Tim Peters | afb2c80 | 2002-04-18 18:06:20 +0000 | [diff] [blame] | 3687 |     string_exceptions() | 
| Guido van Rossum | a48cb8f | 2002-06-06 17:53:03 +0000 | [diff] [blame] | 3688 |     copy_setstate() | 
| Guido van Rossum | 09638c1 | 2002-06-13 19:17:46 +0000 | [diff] [blame] | 3689 |     slices() | 
| Tim Peters | 2484aae | 2002-07-11 06:56:07 +0000 | [diff] [blame] | 3690 |     subtype_resurrection() | 
| Guido van Rossum | 2d70246 | 2002-08-06 21:28:28 +0000 | [diff] [blame] | 3691 |     slottrash() | 
| Neal Norwitz | f9dd0f1 | 2002-08-13 17:16:49 +0000 | [diff] [blame] | 3692 |     slotmultipleinheritance() | 
| Guido van Rossum | 0f5f0b8 | 2002-08-09 16:11:37 +0000 | [diff] [blame] | 3693 |     testrmul() | 
| Guido van Rossum | 6e5680f | 2002-10-15 01:01:53 +0000 | [diff] [blame] | 3694 |     testipow() | 
| Michael W. Hudson | 586da8f | 2002-11-27 15:20:19 +0000 | [diff] [blame] | 3695 |     test_mutable_bases() | 
 | 3696 |     test_mutable_bases_with_failing_mro() | 
 | 3697 |     test_mutable_bases_catch_mro_conflict() | 
| Michael W. Hudson | 98bbc49 | 2002-11-26 14:47:27 +0000 | [diff] [blame] | 3698 |     mutable_names() | 
| Michael W. Hudson | 586da8f | 2002-11-27 15:20:19 +0000 | [diff] [blame] | 3699 |  | 
| Guido van Rossum | a56b42b | 2001-09-20 21:39:07 +0000 | [diff] [blame] | 3700 |     if verbose: print "All OK" | 
| Tim Peters | 6d6c1a3 | 2001-08-02 04:15:00 +0000 | [diff] [blame] | 3701 |  | 
| Guido van Rossum | a56b42b | 2001-09-20 21:39:07 +0000 | [diff] [blame] | 3702 | if __name__ == "__main__": | 
 | 3703 |     test_main() |