123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- # Copyright (c) 2015-2016 Claudiu Popa <pcmanticore@gmail.com>
-
- # Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
- # For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER
-
-
- """Tests for the astroid AST peephole optimizer."""
-
- import ast
- import textwrap
- import unittest
-
- import astroid
- from astroid import astpeephole
- from astroid import builder
- from astroid import manager
- from astroid import test_utils
- from astroid.tests import resources
-
-
- MANAGER = manager.AstroidManager()
-
-
- class PeepholeOptimizer(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
- MANAGER.optimize_ast = True
-
- @classmethod
- def tearDownClass(cls):
- MANAGER.optimize_ast = False
-
- def setUp(self):
- self._optimizer = astpeephole.ASTPeepholeOptimizer()
-
- @staticmethod
- def _get_binops(code):
- module = ast.parse(textwrap.dedent(code))
- return [node.value for node in module.body
- if isinstance(node, ast.Expr)]
-
- @test_utils.require_version(maxver='3.0')
- def test_optimize_binop_unicode(self):
- nodes = self._get_binops("""
- u"a" + u"b" + u"c"
-
- u"a" + "c" + "b"
- u"a" + b"c"
- """)
-
- result = self._optimizer.optimize_binop(nodes[0])
- self.assertIsInstance(result, astroid.Const)
- self.assertEqual(result.value, u"abc")
-
- self.assertIsNone(self._optimizer.optimize_binop(nodes[1]))
- self.assertIsNone(self._optimizer.optimize_binop(nodes[2]))
-
- def test_optimize_binop(self):
- nodes = self._get_binops("""
- "a" + "b" + "c" + "d"
- b"a" + b"b" + b"c" + b"d"
- "a" + "b"
-
- "a" + "b" + 1 + object
- var = 4
- "a" + "b" + var + "c"
- "a" + "b" + "c" - "4"
- "a" + "b" + "c" + "d".format()
- "a" - "b"
- "a"
- 1 + 4 + 5 + 6
- """)
-
- result = self._optimizer.optimize_binop(nodes[0])
- self.assertIsInstance(result, astroid.Const)
- self.assertEqual(result.value, "abcd")
-
- result = self._optimizer.optimize_binop(nodes[1])
- self.assertIsInstance(result, astroid.Const)
- self.assertEqual(result.value, b"abcd")
-
- for node in nodes[2:]:
- self.assertIsNone(self._optimizer.optimize_binop(node))
-
- def test_big_binop_crash(self):
- # Test that we don't fail on a lot of joined strings
- # through the addition operator.
- module = resources.build_file('data/joined_strings.py')
- element = next(module['x'].infer())
- self.assertIsInstance(element, astroid.Const)
- self.assertEqual(len(element.value), 61660)
-
- def test_optimisation_disabled(self):
- try:
- MANAGER.optimize_ast = False
- module = builder.parse("""
- '1' + '2' + '3'
- """)
- self.assertIsInstance(module.body[0], astroid.Expr)
- self.assertIsInstance(module.body[0].value, astroid.BinOp)
- self.assertIsInstance(module.body[0].value.left, astroid.BinOp)
- self.assertIsInstance(module.body[0].value.left.left,
- astroid.Const)
- finally:
- MANAGER.optimize_ast = True
-
-
- if __name__ == '__main__':
- unittest.main()
|