| import __future__ | |
| import unittest | |
| class FLUFLTests(unittest.TestCase): | |
| def test_barry_as_bdfl(self): | |
| code = "from __future__ import barry_as_FLUFL\n2 {0} 3" | |
| compile(code.format('<>'), '<BDFL test>', 'exec', | |
| __future__.CO_FUTURE_BARRY_AS_BDFL) | |
| with self.assertRaises(SyntaxError) as cm: | |
| compile(code.format('!='), '<FLUFL test>', 'exec', | |
| __future__.CO_FUTURE_BARRY_AS_BDFL) | |
| self.assertRegex(str(cm.exception), | |
| "with Barry as BDFL, use '<>' instead of '!='") | |
| self.assertIn('2 != 3', cm.exception.text) | |
| self.assertEqual(cm.exception.filename, '<FLUFL test>') | |
| self.assertEqual(cm.exception.lineno, 2) | |
| # The old parser reports the end of the token and the new | |
| # parser reports the start of the token | |
| self.assertEqual(cm.exception.offset, 3) | |
| def test_guido_as_bdfl(self): | |
| code = '2 {0} 3' | |
| compile(code.format('!='), '<BDFL test>', 'exec') | |
| with self.assertRaises(SyntaxError) as cm: | |
| compile(code.format('<>'), '<FLUFL test>', 'exec') | |
| self.assertRegex(str(cm.exception), "invalid syntax") | |
| self.assertIn('2 <> 3', cm.exception.text) | |
| self.assertEqual(cm.exception.filename, '<FLUFL test>') | |
| self.assertEqual(cm.exception.lineno, 1) | |
| # The old parser reports the end of the token and the new | |
| # parser reports the start of the token | |
| self.assertEqual(cm.exception.offset, 3) | |
| def test_barry_as_bdfl_look_ma_with_no_compiler_flags(self): | |
| # Check that the future import is handled by the parser | |
| # even if the compiler flags are not passed. | |
| code = "from __future__ import barry_as_FLUFL;2 {0} 3" | |
| compile(code.format('<>'), '<BDFL test>', 'exec') | |
| with self.assertRaises(SyntaxError) as cm: | |
| compile(code.format('!='), '<FLUFL test>', 'exec') | |
| self.assertRegex(str(cm.exception), "with Barry as BDFL, use '<>' instead of '!='") | |
| self.assertIn('2 != 3', cm.exception.text) | |
| self.assertEqual(cm.exception.filename, '<FLUFL test>') | |
| self.assertEqual(cm.exception.lineno, 1) | |
| self.assertEqual(cm.exception.offset, len(code) - 4) | |
| def test_barry_as_bdfl_relative_import(self): | |
| code = "from .__future__ import barry_as_FLUFL;2 {0} 3" | |
| compile(code.format('!='), '<FLUFL test>', 'exec') | |
| with self.assertRaises(SyntaxError) as cm: | |
| compile(code.format('<>'), '<BDFL test>', 'exec') | |
| self.assertRegex(str(cm.exception), "<BDFL test>") | |
| self.assertIn('2 <> 3', cm.exception.text) | |
| self.assertEqual(cm.exception.filename, '<BDFL test>') | |
| self.assertEqual(cm.exception.lineno, 1) | |
| self.assertEqual(cm.exception.offset, len(code) - 4) | |
| if __name__ == '__main__': | |
| unittest.main() |