14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"Test the functionality of Python classes implementing operators."
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test import test_support
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaotestmeths = [
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Binary operations
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "add",
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "radd",
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "sub",
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "rsub",
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "mul",
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "rmul",
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "div",
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "rdiv",
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "mod",
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "rmod",
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "divmod",
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "rdivmod",
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "pow",
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "rpow",
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "rshift",
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "rrshift",
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "lshift",
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "rlshift",
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "and",
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "rand",
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "or",
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "ror",
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "xor",
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "rxor",
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# List/dict operations
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "contains",
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "getitem",
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "getslice",
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "setitem",
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "setslice",
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "delitem",
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "delslice",
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Unary operations
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "neg",
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "pos",
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "abs",
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# generic operations
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    "init",
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    ]
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# These need to return something other than None
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    "coerce",
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    "hash",
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    "str",
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    "repr",
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    "int",
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    "long",
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    "float",
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    "oct",
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    "hex",
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# These are separate because they can influence the test of other methods.
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    "getattr",
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    "setattr",
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao#    "delattr",
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
694adfde8bc82dd39f59e0445588c3e599ada477dJosh GaocallLst = []
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef trackCall(f):
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def track(*args, **kwargs):
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst.append((f.__name__, args))
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return f(*args, **kwargs)
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return track
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass AllTests:
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    trackCall = trackCall
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @trackCall
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __coerce__(self, *args):
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return (self,) + args
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @trackCall
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __hash__(self, *args):
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return hash(id(self))
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @trackCall
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __str__(self, *args):
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return "AllTests"
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @trackCall
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __repr__(self, *args):
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return "AllTests"
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @trackCall
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __int__(self, *args):
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @trackCall
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __float__(self, *args):
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1.0
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @trackCall
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __long__(self, *args):
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 1L
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @trackCall
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __oct__(self, *args):
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return '01'
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @trackCall
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __hex__(self, *args):
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return '0x1'
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @trackCall
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __cmp__(self, *args):
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return 0
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Synthesize all the other AllTests methods from the names in testmeths.
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaomethod_template = """\
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao@trackCall
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef __%(method)s__(self, *args):
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    pass
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofor method in testmeths:
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    exec method_template % locals() in AllTests.__dict__
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodel method, method_template
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass ClassTests(unittest.TestCase):
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def setUp(self):
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def assertCallStack(self, expected_calls):
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        actualCallList = callLst[:]  # need to copy because the comparison below will add
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                     # additional calls to callLst
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if expected_calls != actualCallList:
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("Expected call list:\n  %s\ndoes not match actual call list\n  %s" %
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      (expected_calls, actualCallList))
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testInit(self):
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        foo = AllTests()
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__init__", (foo,))])
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testBinaryOps(self):
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme = AllTests()
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Binary operations
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme + 1
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__add__", (testme, 1))])
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 + testme
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__radd__", (testme, 1))])
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme - 1
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__sub__", (testme, 1))])
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 - testme
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__rsub__", (testme, 1))])
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme * 1
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__mul__", (testme, 1))])
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 * testme
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__rmul__", (testme, 1))])
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if 1/2 == 0:
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            callLst[:] = []
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            testme / 1
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertCallStack([("__coerce__", (testme, 1)), ("__div__", (testme, 1))])
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            callLst[:] = []
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            1 / testme
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertCallStack([("__coerce__", (testme, 1)), ("__rdiv__", (testme, 1))])
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme % 1
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__mod__", (testme, 1))])
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 % testme
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__rmod__", (testme, 1))])
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        divmod(testme,1)
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__divmod__", (testme, 1))])
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        divmod(1, testme)
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__rdivmod__", (testme, 1))])
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme ** 1
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__pow__", (testme, 1))])
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 ** testme
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__rpow__", (testme, 1))])
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme >> 1
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__rshift__", (testme, 1))])
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 >> testme
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__rrshift__", (testme, 1))])
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme << 1
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__lshift__", (testme, 1))])
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 << testme
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__rlshift__", (testme, 1))])
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme & 1
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__and__", (testme, 1))])
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 & testme
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__rand__", (testme, 1))])
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme | 1
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__or__", (testme, 1))])
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 | testme
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__ror__", (testme, 1))])
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme ^ 1
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__xor__", (testme, 1))])
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 ^ testme
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ("__rxor__", (testme, 1))])
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testListAndDictOps(self):
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme = AllTests()
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # List/dict operations
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class Empty: pass
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            1 in Empty()
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail('failed, should have raised TypeError')
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except TypeError:
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 in testme
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__contains__', (testme, 1))])
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme[1]
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__getitem__', (testme, 1))])
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme[1] = 1
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__setitem__', (testme, 1, 1))])
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del testme[1]
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__delitem__', (testme, 1))])
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme[:42]
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__getslice__', (testme, 0, 42))])
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme[:42] = "The Answer"
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__setslice__', (testme, 0, 42, "The Answer"))])
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del testme[:42]
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__delslice__', (testme, 0, 42))])
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme[2:1024:10]
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__getitem__', (testme, slice(2, 1024, 10)))])
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme[2:1024:10] = "A lot"
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__setitem__', (testme, slice(2, 1024, 10),
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                                    "A lot"))])
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del testme[2:1024:10]
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__delitem__', (testme, slice(2, 1024, 10)))])
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme[:42, ..., :24:, 24, 100]
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__getitem__', (testme, (slice(None, 42, None),
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                        Ellipsis,
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                        slice(None, 24, None),
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                        24, 100)))])
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme[:42, ..., :24:, 24, 100] = "Strange"
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__setitem__', (testme, (slice(None, 42, None),
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                        Ellipsis,
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                        slice(None, 24, None),
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                        24, 100), "Strange"))])
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del testme[:42, ..., :24:, 24, 100]
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__delitem__', (testme, (slice(None, 42, None),
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                        Ellipsis,
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                        slice(None, 24, None),
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                        24, 100)))])
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Now remove the slice hooks to see if converting normal slices to
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #  slice object works.
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        getslice = AllTests.__getslice__
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del AllTests.__getslice__
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        setslice = AllTests.__setslice__
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del AllTests.__setslice__
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        delslice = AllTests.__delslice__
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del AllTests.__delslice__
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # XXX when using new-style classes the slice testme[:42] produces
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #  slice(None, 42, None) instead of slice(0, 42, None). py3k will have
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #  to change this test.
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme[:42]
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__getitem__', (testme, slice(0, 42, None)))])
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme[:42] = "The Answer"
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__setitem__', (testme, slice(0, 42, None),
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                                                "The Answer"))])
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del testme[:42]
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__delitem__', (testme, slice(0, 42, None)))])
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Restore the slice methods, or the tests will fail with regrtest -R.
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        AllTests.__getslice__ = getslice
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        AllTests.__setslice__ = setslice
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        AllTests.__delslice__ = delslice
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @test_support.cpython_only
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testDelItem(self):
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class A:
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ok = False
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __delitem__(self, key):
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.ok = True
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = A()
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Subtle: we need to call PySequence_SetItem, not PyMapping_SetItem.
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from _testcapi import sequence_delitem
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        sequence_delitem(a, 2)
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(a.ok)
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testUnaryOps(self):
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme = AllTests()
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        -testme
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__neg__', (testme,))])
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        +testme
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__pos__', (testme,))])
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        abs(testme)
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__abs__', (testme,))])
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        int(testme)
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__int__', (testme,))])
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        long(testme)
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__long__', (testme,))])
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        float(testme)
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__float__', (testme,))])
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        oct(testme)
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__oct__', (testme,))])
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        hex(testme)
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__hex__', (testme,))])
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testMisc(self):
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme = AllTests()
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        hash(testme)
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__hash__', (testme,))])
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        repr(testme)
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__repr__', (testme,))])
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        str(testme)
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__str__', (testme,))])
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme == 1
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ('__cmp__', (testme, 1))])
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme < 1
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ('__cmp__', (testme, 1))])
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme > 1
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ('__cmp__', (testme, 1))])
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eval('testme <> 1')  # XXX kill this in py3k
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ('__cmp__', (testme, 1))])
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme != 1
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ('__cmp__', (testme, 1))])
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 == testme
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ('__cmp__', (1, testme))])
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 < testme
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ('__cmp__', (1, testme))])
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 > testme
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ('__cmp__', (1, testme))])
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        eval('1 <> testme')
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ('__cmp__', (1, testme))])
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        1 != testme
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([("__coerce__", (testme, 1)), ('__cmp__', (1, testme))])
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testGetSetAndDel(self):
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Interfering tests
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class ExtraTests(AllTests):
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            @trackCall
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __getattr__(self, *args):
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return "SomeVal"
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            @trackCall
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __setattr__(self, *args):
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            @trackCall
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __delattr__(self, *args):
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme = ExtraTests()
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme.spam
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__getattr__', (testme, "spam"))])
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme.eggs = "spam, spam, spam and ham"
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__setattr__', (testme, "eggs",
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                               "spam, spam, spam and ham"))])
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del testme.cardinal
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__delattr__', (testme, "cardinal"))])
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testDel(self):
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = []
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class DelTest:
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __del__(self):
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                x.append("crab people, crab people")
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        testme = DelTest()
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del testme
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import gc
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        gc.collect()
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(["crab people, crab people"], x)
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testBadTypeReturned(self):
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # return values of some method are type-checked
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class BadTypeClass:
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __int__(self):
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return None
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            __float__ = __int__
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            __long__ = __int__
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            __str__ = __int__
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            __repr__ = __int__
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            __oct__ = __int__
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            __hex__ = __int__
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for f in [int, float, long, str, repr, oct, hex]:
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(TypeError, f, BadTypeClass())
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testMixIntsAndLongs(self):
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # mixing up ints and longs is okay
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class IntLongMixClass:
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            @trackCall
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __int__(self):
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return 42L
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            @trackCall
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __long__(self):
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return 64
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        mixIntAndLong = IntLongMixClass()
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        as_int = int(mixIntAndLong)
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(type(as_int), long)
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(as_int, 42L)
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__int__', (mixIntAndLong,))])
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        callLst[:] = []
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        as_long = long(mixIntAndLong)
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(type(as_long), long)
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(as_long, 64)
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertCallStack([('__long__', (mixIntAndLong,))])
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testHashStuff(self):
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test correct errors from hash() on objects with comparisons but
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #  no __hash__
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class C0:
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        hash(C0()) # This should work; the next two should raise TypeError
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class C1:
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __cmp__(self, other): return 0
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, hash, C1())
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class C2:
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __eq__(self, other): return 1
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, hash, C2())
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testSFBug532646(self):
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test for SF bug 532646
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class A:
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        A.__call__ = A()
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = A()
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            a() # This should not segfault
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except RuntimeError:
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("Failed to raise RuntimeError")
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testForExceptionsRaisedInInstanceGetattr2(self):
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Tests for exceptions raised in instance_getattr2().
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def booh(self):
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise AttributeError("booh")
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class A:
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            a = property(booh)
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            A().a # Raised AttributeError: A instance has no attribute 'a'
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except AttributeError, x:
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if str(x) != "booh":
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail("attribute error for A().a got masked: %s" % x)
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class E:
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            __eq__ = property(booh)
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        E() == E() # In debug mode, caused a C-level assert() to fail
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class I:
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            __init__ = property(booh)
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # In debug mode, printed XXX undetected error and
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            #  raises AttributeError
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            I()
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except AttributeError, x:
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("attribute error for I.__init__ got masked")
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testHashComparisonOfMethods(self):
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test comparison and hash of methods
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class A:
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self, x):
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.x = x
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def f(self):
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def g(self):
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                pass
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __eq__(self, other):
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.x == other.x
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __hash__(self):
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.x
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class B(A):
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a1 = A(1)
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a2 = A(2)
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a1.f, a1.f)
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(a1.f, a2.f)
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(a1.f, a1.g)
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(a1.f, A(1).f)
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(hash(a1.f), hash(a1.f))
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(hash(a1.f), hash(A(1).f))
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(A.f, a1.f)
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(A.f, A.g)
6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(B.f, A.f)
6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(hash(B.f), hash(A.f))
6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # the following triggers a SystemError in 2.4
6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        a = A(hash(A.f.im_func)^(-1))
6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        hash(a.f)
6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def testAttrSlots(self):
6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class C:
6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for c in C, C():
6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(TypeError, type(c).__getattribute__, c, [])
6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(TypeError, type(c).__setattr__, c, [], [])
6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    with test_support.check_py3k_warnings(
6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (".+__(get|set|del)slice__ has been removed", DeprecationWarning),
6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("classic int division", DeprecationWarning),
6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("<> not supported", DeprecationWarning)):
6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_support.run_unittest(ClassTests)
6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__=='__main__':
6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
647