diff -r bc625fce0aee Lib/test/test_sys.py --- a/Lib/test/test_sys.py Mon Jan 18 08:00:15 2016 +0100 +++ b/Lib/test/test_sys.py Mon Jan 18 10:14:14 2016 +0100 @@ -1169,8 +1169,88 @@ class SizeofTest(unittest.TestCase): check(sys.flags, vsize('') + self.P * len(sys.flags)) +class MyCodeTransformer: + name = 'mytransformer' + + def bytecode_transformer(self, bytecode): + # no-op + return bytecode + + def ast_transformers(self, tree, context): + # no-op + return tree + + +class CodeTransformersTests(unittest.TestCase): + def setUp(self): + transformers = sys.get_code_transformers() + self.addCleanup(sys.set_code_transformers, transformers) + + def test_sys_get_transformers(self): + transformers = sys.get_code_transformers() + self.assertIsInstance(transformers, list) + for transformer in transformers: + self.assertIsInstance(transformer.name, str) + + def test_sys_set_code_transformers(self): + transformer = MyCodeTransformer() + sys.set_code_transformers([transformer]) + + transformers = sys.get_code_transformers() + self.assertEqual(len(transformers), 1) + self.assertIs(transformers[0], transformer) + + def test_optim_tag(self): + transformer1 = MyCodeTransformer() + transformer1.name = "a" + sys.set_code_transformers([transformer1]) + self.assertEqual(sys.implementation.optim_tag, "a") + + transformer2 = MyCodeTransformer() + transformer2.name = "b" + sys.set_code_transformers([transformer1, transformer2]) + self.assertEqual(sys.implementation.optim_tag, "a-b") + + sys.set_code_transformers([]) + self.assertEqual(sys.implementation.optim_tag, "opt") + + def test_invalid_name(self): + transformer = MyCodeTransformer() + + # test invalid code transformer names + with self.assertRaises(TypeError): + transformer.name = None + sys.set_code_transformers([transformer]) + + with self.assertRaises(ValueError): + transformer.name = '' + sys.set_code_transformers([transformer]) + + invalid_chars = '.-' + os.path.sep + if os.path.altsep: + invalid_chars += os.path.altsep + for invalid_char in invalid_chars: + with self.assertRaises(ValueError): + transformer.name = 'a%sb' % invalid_char + sys.set_code_transformers([transformer]) + + def test_no_transformation(self): + class InvalidTransformer: + name = "invalid" + + transformer = InvalidTransformer() + + # a code transformer must have a bytecode_transformer() + # and/or a ast_transformer() method + with self.assertRaises(ValueError): + sys.set_code_transformers([transformer]) + + def test_main(): - test.support.run_unittest(SysModuleTest, SizeofTest) + test.support.run_unittest(SysModuleTest, + SizeofTest, + CodeTransformersTests) + if __name__ == "__main__": test_main()