From b5e21ab136ddedfb94aad34ab9d043afc4ceef1e Mon Sep 17 00:00:00 2001 From: NakanoMiku39 Date: Thu, 9 Nov 2023 14:59:59 +0800 Subject: [PATCH] Add Lib/test/test_opcodes.py cpython version: 3.12 --- Lib/test/test_opcodes.py | 138 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 Lib/test/test_opcodes.py diff --git a/Lib/test/test_opcodes.py b/Lib/test/test_opcodes.py new file mode 100644 index 000000000..72488b2bb --- /dev/null +++ b/Lib/test/test_opcodes.py @@ -0,0 +1,138 @@ +# Python test set -- part 2, opcodes + +import unittest +from test import support +from test.typinganndata import ann_module + +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') + + def test_setup_annotations_line(self): + # check that SETUP_ANNOTATIONS does not create spurious line numbers + try: + with open(ann_module.__file__, encoding="utf-8") as f: + txt = f.read() + co = compile(txt, ann_module.__file__, 'exec') + self.assertEqual(co.co_firstlineno, 1) + except OSError: + pass + + def test_default_annotations_exist(self): + class C: pass + self.assertEqual(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): + # Don't rely on the existence of the '__annotations__' global. + with support.swap_item(globals(), '__annotations__', {}): + del globals()['__annotations__'] + class C: + del __annotations__ + with self.assertRaises(NameError): + x: int + + 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() + + try: + raise b + except AClass as v: + self.assertEqual(v, b) + else: + self.fail("no exception") + + # not enough arguments + ##try: raise BClass, a + ##except TypeError: pass + ##else: self.fail("no exception") + + try: raise DClass(a) + except DClass as v: + self.assertIsInstance(v, DClass) + else: + self.fail("no exception") + + def test_compare_function_objects(self): + + f = eval('lambda: None') + g = eval('lambda: None') + self.assertNotEqual(f, g) + + f = eval('lambda a: a') + g = eval('lambda a: a') + self.assertNotEqual(f, g) + + f = eval('lambda a=1: a') + g = eval('lambda a=1: a') + self.assertNotEqual(f, g) + + f = eval('lambda: 0') + g = eval('lambda: 1') + self.assertNotEqual(f, g) + + f = eval('lambda: None') + g = eval('lambda a: None') + self.assertNotEqual(f, g) + + f = eval('lambda a: None') + g = eval('lambda b: None') + self.assertNotEqual(f, g) + + f = eval('lambda a: None') + g = eval('lambda a=None: None') + self.assertNotEqual(f, g) + + f = eval('lambda a=0: None') + g = eval('lambda a=1: None') + self.assertNotEqual(f, g) + + def test_modulo_of_string_subclasses(self): + class MyString(str): + def __mod__(self, value): + return 42 + self.assertEqual(MyString() % 3, 42) + + +if __name__ == '__main__': + unittest.main()