async def test_scope_copy(scope): scope2 = Scope() scope2.update(scope) assert scope.globals == scope2.globals, "Checking scope globals copied" assert scope.locals == scope2.locals, "Checking scope locals copied" insert_dict = {'e': 7} scope.update_locals(insert_dict) assert 'e' in scope.locals, "Checking scope locals updated" assert 'e' not in scope2.locals, "Checking scope clone locals not updated" scope.clear_intersection(insert_dict) assert 'e' not in scope.locals, "Checking locals intersection cleared" scope.update_globals(insert_dict) assert 'e' in scope.globals, "Checking scope globals updated" assert 'e' not in scope2.globals, "Checking scope clone globals not updated" scope.clear_intersection(insert_dict) assert 'e' not in scope.globals, "Checking globals intersection cleared"
async def test_scope_copy(scope): scope2 = Scope() scope2.update(scope) assert scope.globals == scope2.globals, "Checking scope globals copied" assert scope.locals == scope2.locals, "Checking scope locals copied" scope.update_locals({'e': 7}) assert 'e' in scope.locals, "Checking scope locals updated" assert 'e' not in scope2.locals, "Checking scope clone locals not updated"
async def internal_test(self): scope = Scope() return_data = [] async for result in AsyncCodeExecutor('3 + 4', scope): return_data.append(result) self.assertEqual(len(return_data), 1, msg="Checking eval produces single result") self.assertEqual(return_data[0], 7, msg="Checking eval result is consistent") return_data = [] async for result in AsyncCodeExecutor('return 3 + 9', scope): return_data.append(result) self.assertEqual(len(return_data), 1, msg="Checking manual return produces single result") self.assertEqual(return_data[0], 12, msg="Checking return result is consistent") return_data = [] async for result in AsyncCodeExecutor('b = 12 + 82', scope): return_data.append(result) self.assertEqual(len(return_data), 1, msg="Checking that assignment returns") self.assertIsNone(return_data[0], msg="Checking assignment returns None") return_data = [] async for result in AsyncCodeExecutor('b', scope): return_data.append(result) self.assertEqual(len(return_data), 1, msg="Checking variable eval returns") self.assertEqual(return_data[0], 94, msg="Checking retained variable consistent") scope.update_globals({'d': 41}) return_data = [] async for result in AsyncCodeExecutor('c = d + 7; c', scope): return_data.append(result) self.assertEqual(len(return_data), 1, msg="Checking multi-expression implicitly returns") self.assertEqual(return_data[0], 48, msg="Checking last expression return is consistent") return_data = [] async for result in AsyncCodeExecutor('yield 30; yield 40', scope): return_data.append(result) self.assertEqual(len(return_data), 2, msg="Checking two yields returns two results") self.assertEqual(return_data[0], 30, msg="Checking first yield consistency") self.assertEqual(return_data[1], 40, msg="Checking second yield consistency") return_data = [] async for result in AsyncCodeExecutor('yield 60; 70', scope): return_data.append(result) self.assertEqual(len(return_data), 2, msg="Checking multi-statement implicitly yields") self.assertEqual(return_data[0], 60, msg="Checking explicit yield consistent") self.assertEqual(return_data[1], 70, msg="Checking implicit yield consistent") return_data = [] async for result in AsyncCodeExecutor('90; 100', scope): return_data.append(result) self.assertEqual(len(return_data), 1, msg="Checking multi-statement implicitly returns") self.assertEqual(return_data[0], 100, msg="Checking implicit return consistent") arg_dict = {'_cool_data': 45, '_not_so_cool': 400} return_data = [] async for result in AsyncCodeExecutor('_cool_data + _not_so_cool', scope, arg_dict=arg_dict): return_data.append(result) self.assertEqual(len(return_data), 1, msg="Checking arg dictionary expression returned") self.assertEqual(return_data[0], 445, msg="Checking arg dictionary expression consistent") scope.clean() hit_exception = False try: async for result in AsyncCodeExecutor('_cool_data', scope): pass except NameError: hit_exception = True self.assertTrue(hit_exception, msg="Checking private locals removed") scope2 = Scope() scope2.update(scope) self.assertEqual(scope.globals, scope2.globals, msg="Checking scope globals copied") self.assertEqual(scope.locals, scope2.locals, msg="Checking scope locals copied") scope.update_locals({'e': 7}) self.assertIn('e', scope.locals, msg="Checking scope locals updated") self.assertNotIn('e', scope2.locals, msg="Checking scope clone locals not updated") scope.clean() codeblock = inspect.cleandoc(""" def ensure_builtins(): return ValueError """) async for result in AsyncCodeExecutor(codeblock, scope): pass scope.clean() self.assertIn('ensure_builtins', scope.globals, msg="Checking function remains defined") self.assertTrue(callable(scope.globals['ensure_builtins']), msg="Checking defined is callable") self.assertEqual(scope.globals['ensure_builtins'](), ValueError, msg="Checking defined retuurn consistent") if sys.version_info >= (3, 7): codeblock = inspect.cleandoc(""" eval(''' 3 + 4 ''') """) return_data = [] async for result in AsyncCodeExecutor(codeblock, scope): return_data.append(result) self.assertEqual(len(return_data), 1, msg="Checking multi-line docstring eval returns") self.assertEqual(return_data[0], 7, msg="Checking eval return consistent") scope.clean() scope.update_globals({'add_numbers': self.add_numbers}) return_data = [] async for result in AsyncCodeExecutor("await add_numbers(10, 12)", scope): return_data.append(result) self.assertEqual(len(return_data), 1, msg="Checking await returns result") self.assertEqual(return_data[0], 22, msg="Checking await result consistent") return_data = [] async for result in AsyncCodeExecutor("", scope): return_data.append(result) self.assertEqual(len(return_data), 1, msg="Checking empty eval returns") self.assertIsNone(return_data[0], msg="Checking empty eval returns None") return_data = [] async for result in AsyncCodeExecutor("# this is a comment", scope): return_data.append(result) self.assertEqual(len(return_data), 1, msg="Checking eval of only comment returns") self.assertIsNone(return_data[0], msg="Checking eval of only comment returns None")