test_opcodes.py 3.4 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1 2
# Python test set -- part 2, opcodes

3
import unittest
4
from test import ann_module
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

class OpcodeTest(unittest.TestCase):

    def test_try_inside_for_loop(self):
        n = 0
        for i in range(10):
            n = n+i
            try: 1/0
            except NameError: pass
            except ZeroDivisionError: pass
            except TypeError: pass
            try: pass
            except: pass
            try: pass
            finally: pass
            n = n+i
        if n != 90:
            self.fail('try inside for')

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
    def test_setup_annotations_line(self):
        # check that SETUP_ANNOTATIONS does not create spurious line numbers
        try:
            with open(ann_module.__file__) as f:
                txt = f.read()
            co = compile(txt, ann_module.__file__, 'exec')
            self.assertEqual(co.co_firstlineno, 6)
        except OSError:
            pass

    def test_no_annotations_if_not_needed(self):
        class C: pass
        with self.assertRaises(AttributeError):
            C.__annotations__

    def test_use_existing_annotations(self):
        ns = {'__annotations__': {1: 2}}
        exec('x: int', ns)
        self.assertEqual(ns['__annotations__'], {'x': int, 1: 2})

    def test_do_not_recreate_annotations(self):
        class C:
            del __annotations__
            with self.assertRaises(NameError):
                x: int

50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
    def test_raise_class_exceptions(self):

        class AClass(Exception): pass
        class BClass(AClass): pass
        class CClass(Exception): pass
        class DClass(AClass):
            def __init__(self, ignore):
                pass

        try: raise AClass()
        except: pass

        try: raise AClass()
        except AClass: pass

        try: raise BClass()
        except AClass: pass

        try: raise BClass()
        except CClass: self.fail()
        except: pass

        a = AClass()
        b = BClass()

75 76
        try:
            raise b
77
        except AClass as v:
78
            self.assertEqual(v, b)
79 80 81 82 83 84 85 86
        else:
            self.fail("no exception")

        # not enough arguments
        ##try:  raise BClass, a
        ##except TypeError: pass
        ##else: self.fail("no exception")

87
        try:  raise DClass(a)
88
        except DClass as v:
89
            self.assertIsInstance(v, DClass)
90 91 92 93 94 95 96
        else:
            self.fail("no exception")

    def test_compare_function_objects(self):

        f = eval('lambda: None')
        g = eval('lambda: None')
97
        self.assertNotEqual(f, g)
98 99 100

        f = eval('lambda a: a')
        g = eval('lambda a: a')
101
        self.assertNotEqual(f, g)
102 103 104

        f = eval('lambda a=1: a')
        g = eval('lambda a=1: a')
105
        self.assertNotEqual(f, g)
106 107 108

        f = eval('lambda: 0')
        g = eval('lambda: 1')
109
        self.assertNotEqual(f, g)
110 111 112

        f = eval('lambda: None')
        g = eval('lambda a: None')
113
        self.assertNotEqual(f, g)
114 115 116

        f = eval('lambda a: None')
        g = eval('lambda b: None')
117
        self.assertNotEqual(f, g)
118 119 120

        f = eval('lambda a: None')
        g = eval('lambda a=None: None')
121
        self.assertNotEqual(f, g)
122 123 124

        f = eval('lambda a=0: None')
        g = eval('lambda a=1: None')
125
        self.assertNotEqual(f, g)
126

127 128 129 130 131 132
    def test_modulo_of_string_subclasses(self):
        class MyString(str):
            def __mod__(self, value):
                return 42
        self.assertEqual(MyString() % 3, 42)

133 134

if __name__ == '__main__':
135
    unittest.main()