1# Python test set -- part 2, opcodes
2
3import unittest
4from test import ann_module, support
5
6class OpcodeTest(unittest.TestCase):
7
8    def test_try_inside_for_loop(self):
9        n = 0
10        for i in range(10):
11            n = n+i
12            try: 1/0
13            except NameError: pass
14            except ZeroDivisionError: pass
15            except TypeError: pass
16            try: pass
17            except: pass
18            try: pass
19            finally: pass
20            n = n+i
21        if n != 90:
22            self.fail('try inside for')
23
24    def test_setup_annotations_line(self):
25        # check that SETUP_ANNOTATIONS does not create spurious line numbers
26        try:
27            with open(ann_module.__file__, encoding="utf-8") as f:
28                txt = f.read()
29            co = compile(txt, ann_module.__file__, 'exec')
30            self.assertEqual(co.co_firstlineno, 1)
31        except OSError:
32            pass
33
34    def test_default_annotations_exist(self):
35        class C: pass
36        self.assertEqual(C.__annotations__, {})
37
38    def test_use_existing_annotations(self):
39        ns = {'__annotations__': {1: 2}}
40        exec('x: int', ns)
41        self.assertEqual(ns['__annotations__'], {'x': int, 1: 2})
42
43    def test_do_not_recreate_annotations(self):
44        # Don't rely on the existence of the '__annotations__' global.
45        with support.swap_item(globals(), '__annotations__', {}):
46            del globals()['__annotations__']
47            class C:
48                del __annotations__
49                with self.assertRaises(NameError):
50                    x: int
51
52    def test_raise_class_exceptions(self):
53
54        class AClass(Exception): pass
55        class BClass(AClass): pass
56        class CClass(Exception): pass
57        class DClass(AClass):
58            def __init__(self, ignore):
59                pass
60
61        try: raise AClass()
62        except: pass
63
64        try: raise AClass()
65        except AClass: pass
66
67        try: raise BClass()
68        except AClass: pass
69
70        try: raise BClass()
71        except CClass: self.fail()
72        except: pass
73
74        a = AClass()
75        b = BClass()
76
77        try:
78            raise b
79        except AClass as v:
80            self.assertEqual(v, b)
81        else:
82            self.fail("no exception")
83
84        # not enough arguments
85        ##try:  raise BClass, a
86        ##except TypeError: pass
87        ##else: self.fail("no exception")
88
89        try:  raise DClass(a)
90        except DClass as v:
91            self.assertIsInstance(v, DClass)
92        else:
93            self.fail("no exception")
94
95    def test_compare_function_objects(self):
96
97        f = eval('lambda: None')
98        g = eval('lambda: None')
99        self.assertNotEqual(f, g)
100
101        f = eval('lambda a: a')
102        g = eval('lambda a: a')
103        self.assertNotEqual(f, g)
104
105        f = eval('lambda a=1: a')
106        g = eval('lambda a=1: a')
107        self.assertNotEqual(f, g)
108
109        f = eval('lambda: 0')
110        g = eval('lambda: 1')
111        self.assertNotEqual(f, g)
112
113        f = eval('lambda: None')
114        g = eval('lambda a: None')
115        self.assertNotEqual(f, g)
116
117        f = eval('lambda a: None')
118        g = eval('lambda b: None')
119        self.assertNotEqual(f, g)
120
121        f = eval('lambda a: None')
122        g = eval('lambda a=None: None')
123        self.assertNotEqual(f, g)
124
125        f = eval('lambda a=0: None')
126        g = eval('lambda a=1: None')
127        self.assertNotEqual(f, g)
128
129    def test_modulo_of_string_subclasses(self):
130        class MyString(str):
131            def __mod__(self, value):
132                return 42
133        self.assertEqual(MyString() % 3, 42)
134
135
136if __name__ == '__main__':
137    unittest.main()
138