Jeremy Hylton | 62e2c7e | 2001-02-28 17:48:06 +0000 | [diff] [blame] | 1 | # Test various flavors of legal and illegal future statements |
| 2 | |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 3 | import unittest |
Benjamin Peterson | ee8712c | 2008-05-20 21:35:26 +0000 | [diff] [blame] | 4 | from test import support |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 5 | import os |
Jeremy Hylton | 62e2c7e | 2001-02-28 17:48:06 +0000 | [diff] [blame] | 6 | import re |
| 7 | |
R David Murray | 44b548d | 2016-09-08 13:59:53 -0400 | [diff] [blame] | 8 | rx = re.compile(r'\((\S+).py, line (\d+)') |
Jeremy Hylton | 62e2c7e | 2001-02-28 17:48:06 +0000 | [diff] [blame] | 9 | |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 10 | def get_error_location(msg): |
| 11 | mo = rx.search(str(msg)) |
| 12 | return mo.group(1, 2) |
Jeremy Hylton | 62e2c7e | 2001-02-28 17:48:06 +0000 | [diff] [blame] | 13 | |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 14 | class FutureTest(unittest.TestCase): |
Jeremy Hylton | 62e2c7e | 2001-02-28 17:48:06 +0000 | [diff] [blame] | 15 | |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 16 | def check_syntax_error(self, err, basename, lineno, offset=0): |
| 17 | self.assertIn('%s.py, line %d' % (basename, lineno), str(err)) |
| 18 | self.assertEqual(os.path.basename(err.filename), basename + '.py') |
| 19 | self.assertEqual(err.lineno, lineno) |
| 20 | self.assertEqual(err.offset, offset) |
| 21 | |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 22 | def test_future1(self): |
Ezio Melotti | 1ed6be3 | 2013-02-27 10:00:03 +0200 | [diff] [blame] | 23 | with support.CleanImport('future_test1'): |
| 24 | from test import future_test1 |
| 25 | self.assertEqual(future_test1.result, 6) |
Jeremy Hylton | 62e2c7e | 2001-02-28 17:48:06 +0000 | [diff] [blame] | 26 | |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 27 | def test_future2(self): |
Ezio Melotti | 1ed6be3 | 2013-02-27 10:00:03 +0200 | [diff] [blame] | 28 | with support.CleanImport('future_test2'): |
| 29 | from test import future_test2 |
| 30 | self.assertEqual(future_test2.result, 6) |
Jeremy Hylton | 62e2c7e | 2001-02-28 17:48:06 +0000 | [diff] [blame] | 31 | |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 32 | def test_future3(self): |
Ezio Melotti | 1ed6be3 | 2013-02-27 10:00:03 +0200 | [diff] [blame] | 33 | with support.CleanImport('test_future3'): |
| 34 | from test import test_future3 |
Jeremy Hylton | 8471a35 | 2001-08-20 20:33:42 +0000 | [diff] [blame] | 35 | |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 36 | def test_badfuture3(self): |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 37 | with self.assertRaises(SyntaxError) as cm: |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 38 | from test import badsyntax_future3 |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 39 | self.check_syntax_error(cm.exception, "badsyntax_future3", 3) |
Jeremy Hylton | 62e2c7e | 2001-02-28 17:48:06 +0000 | [diff] [blame] | 40 | |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 41 | def test_badfuture4(self): |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 42 | with self.assertRaises(SyntaxError) as cm: |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 43 | from test import badsyntax_future4 |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 44 | self.check_syntax_error(cm.exception, "badsyntax_future4", 3) |
Jeremy Hylton | 62e2c7e | 2001-02-28 17:48:06 +0000 | [diff] [blame] | 45 | |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 46 | def test_badfuture5(self): |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 47 | with self.assertRaises(SyntaxError) as cm: |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 48 | from test import badsyntax_future5 |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 49 | self.check_syntax_error(cm.exception, "badsyntax_future5", 4) |
Jeremy Hylton | 62e2c7e | 2001-02-28 17:48:06 +0000 | [diff] [blame] | 50 | |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 51 | def test_badfuture6(self): |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 52 | with self.assertRaises(SyntaxError) as cm: |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 53 | from test import badsyntax_future6 |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 54 | self.check_syntax_error(cm.exception, "badsyntax_future6", 3) |
Jeremy Hylton | 62e2c7e | 2001-02-28 17:48:06 +0000 | [diff] [blame] | 55 | |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 56 | def test_badfuture7(self): |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 57 | with self.assertRaises(SyntaxError) as cm: |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 58 | from test import badsyntax_future7 |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 59 | self.check_syntax_error(cm.exception, "badsyntax_future7", 3, 53) |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 60 | |
| 61 | def test_badfuture8(self): |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 62 | with self.assertRaises(SyntaxError) as cm: |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 63 | from test import badsyntax_future8 |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 64 | self.check_syntax_error(cm.exception, "badsyntax_future8", 3) |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 65 | |
| 66 | def test_badfuture9(self): |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 67 | with self.assertRaises(SyntaxError) as cm: |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 68 | from test import badsyntax_future9 |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 69 | self.check_syntax_error(cm.exception, "badsyntax_future9", 3, 0) |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 70 | |
Benjamin Peterson | 2d6acd2 | 2013-03-16 09:15:47 -0700 | [diff] [blame] | 71 | def test_badfuture10(self): |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 72 | with self.assertRaises(SyntaxError) as cm: |
Benjamin Peterson | 2d6acd2 | 2013-03-16 09:15:47 -0700 | [diff] [blame] | 73 | from test import badsyntax_future10 |
Serhiy Storchaka | 8b58339 | 2016-12-11 14:39:01 +0200 | [diff] [blame] | 74 | self.check_syntax_error(cm.exception, "badsyntax_future10", 3, 0) |
Benjamin Peterson | 2d6acd2 | 2013-03-16 09:15:47 -0700 | [diff] [blame] | 75 | |
Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 76 | def test_parserhack(self): |
| 77 | # test that the parser.c::future_hack function works as expected |
| 78 | # Note: although this test must pass, it's not testing the original |
| 79 | # bug as of 2.6 since the with statement is not optional and |
| 80 | # the parser hack disabled. If a new keyword is introduced in |
| 81 | # 2.6, change this to refer to the new future import. |
| 82 | try: |
Benjamin Peterson | 9aebc61 | 2008-10-26 20:58:53 +0000 | [diff] [blame] | 83 | exec("from __future__ import print_function; print 0") |
Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 84 | except SyntaxError: |
| 85 | pass |
| 86 | else: |
| 87 | self.fail("syntax error didn't occur") |
| 88 | |
| 89 | try: |
Benjamin Peterson | 9aebc61 | 2008-10-26 20:58:53 +0000 | [diff] [blame] | 90 | exec("from __future__ import (print_function); print 0") |
Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 91 | except SyntaxError: |
| 92 | pass |
| 93 | else: |
| 94 | self.fail("syntax error didn't occur") |
| 95 | |
Benjamin Peterson | 9aebc61 | 2008-10-26 20:58:53 +0000 | [diff] [blame] | 96 | def test_multiple_features(self): |
Ezio Melotti | 1ed6be3 | 2013-02-27 10:00:03 +0200 | [diff] [blame] | 97 | with support.CleanImport("test.test_future5"): |
| 98 | from test import test_future5 |
Benjamin Peterson | 9aebc61 | 2008-10-26 20:58:53 +0000 | [diff] [blame] | 99 | |
Benjamin Peterson | f216c94 | 2008-10-31 02:28:05 +0000 | [diff] [blame] | 100 | def test_unicode_literals_exec(self): |
| 101 | scope = {} |
| 102 | exec("from __future__ import unicode_literals; x = ''", {}, scope) |
Ezio Melotti | e961593 | 2010-01-24 19:26:24 +0000 | [diff] [blame] | 103 | self.assertIsInstance(scope["x"], str) |
Benjamin Peterson | f216c94 | 2008-10-31 02:28:05 +0000 | [diff] [blame] | 104 | |
Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame] | 105 | |
Neal Norwitz | 328f338 | 2003-12-13 22:43:34 +0000 | [diff] [blame] | 106 | |
| 107 | if __name__ == "__main__": |
Ezio Melotti | 1ed6be3 | 2013-02-27 10:00:03 +0200 | [diff] [blame] | 108 | unittest.main() |