blob: d2be82c4a26c7c5d52fd8aab478e9e89877cde9e [file] [log] [blame]
Benjamin Peterson3059b002009-07-20 16:42:03 +00001""" Test suite for the code in fixer_util """
Martin v. Löwisef04c442008-03-19 05:04:44 +00002
3# Testing imports
4from . import support
5
6# Python imports
7import os.path
8
9# Local imports
Benjamin Peterson3059b002009-07-20 16:42:03 +000010from lib2to3.pytree import Node, Leaf
11from lib2to3 import fixer_util
12from lib2to3.fixer_util import Attr, Name, Call, Comma
13from lib2to3.pgen2 import token
Martin v. Löwisef04c442008-03-19 05:04:44 +000014
15def parse(code, strip_levels=0):
16 # The topmost node is file_input, which we don't care about.
17 # The next-topmost node is a *_stmt node, which we also don't care about
18 tree = support.parse_string(code)
19 for i in range(strip_levels):
20 tree = tree.children[0]
21 tree.parent = None
22 return tree
23
24class MacroTestCase(support.TestCase):
25 def assertStr(self, node, string):
26 if isinstance(node, (tuple, list)):
Benjamin Peterson3059b002009-07-20 16:42:03 +000027 node = Node(fixer_util.syms.simple_stmt, node)
Martin v. Löwisef04c442008-03-19 05:04:44 +000028 self.assertEqual(str(node), string)
29
30
31class Test_is_tuple(support.TestCase):
32 def is_tuple(self, string):
Benjamin Petersondf6dc8f2008-06-15 02:57:40 +000033 return fixer_util.is_tuple(parse(string, strip_levels=2))
Martin v. Löwisef04c442008-03-19 05:04:44 +000034
35 def test_valid(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +000036 self.assertTrue(self.is_tuple("(a, b)"))
37 self.assertTrue(self.is_tuple("(a, (b, c))"))
38 self.assertTrue(self.is_tuple("((a, (b, c)),)"))
39 self.assertTrue(self.is_tuple("(a,)"))
40 self.assertTrue(self.is_tuple("()"))
Martin v. Löwisef04c442008-03-19 05:04:44 +000041
42 def test_invalid(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +000043 self.assertFalse(self.is_tuple("(a)"))
44 self.assertFalse(self.is_tuple("('foo') % (b, c)"))
Martin v. Löwisef04c442008-03-19 05:04:44 +000045
46
47class Test_is_list(support.TestCase):
48 def is_list(self, string):
Benjamin Petersondf6dc8f2008-06-15 02:57:40 +000049 return fixer_util.is_list(parse(string, strip_levels=2))
Martin v. Löwisef04c442008-03-19 05:04:44 +000050
51 def test_valid(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +000052 self.assertTrue(self.is_list("[]"))
53 self.assertTrue(self.is_list("[a]"))
54 self.assertTrue(self.is_list("[a, b]"))
55 self.assertTrue(self.is_list("[a, [b, c]]"))
56 self.assertTrue(self.is_list("[[a, [b, c]],]"))
Martin v. Löwisef04c442008-03-19 05:04:44 +000057
58 def test_invalid(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +000059 self.assertFalse(self.is_list("[]+[]"))
Martin v. Löwisef04c442008-03-19 05:04:44 +000060
61
62class Test_Attr(MacroTestCase):
63 def test(self):
Martin v. Löwisef04c442008-03-19 05:04:44 +000064 call = parse("foo()", strip_levels=2)
65
66 self.assertStr(Attr(Name("a"), Name("b")), "a.b")
67 self.assertStr(Attr(call, Name("b")), "foo().b")
68
69 def test_returns(self):
Martin v. Löwisef04c442008-03-19 05:04:44 +000070 attr = Attr(Name("a"), Name("b"))
71 self.assertEqual(type(attr), list)
72
73
74class Test_Name(MacroTestCase):
75 def test(self):
Martin v. Löwisef04c442008-03-19 05:04:44 +000076 self.assertStr(Name("a"), "a")
77 self.assertStr(Name("foo.foo().bar"), "foo.foo().bar")
78 self.assertStr(Name("a", prefix="b"), "ba")
79
80
Benjamin Peterson3059b002009-07-20 16:42:03 +000081class Test_Call(MacroTestCase):
82 def _Call(self, name, args=None, prefix=None):
83 """Help the next test"""
84 children = []
85 if isinstance(args, list):
86 for arg in args:
87 children.append(arg)
88 children.append(Comma())
89 children.pop()
90 return Call(Name(name), children, prefix)
91
92 def test(self):
93 kids = [None,
94 [Leaf(token.NUMBER, 1), Leaf(token.NUMBER, 2),
95 Leaf(token.NUMBER, 3)],
96 [Leaf(token.NUMBER, 1), Leaf(token.NUMBER, 3),
97 Leaf(token.NUMBER, 2), Leaf(token.NUMBER, 4)],
98 [Leaf(token.STRING, "b"), Leaf(token.STRING, "j", prefix=" ")]
99 ]
100 self.assertStr(self._Call("A"), "A()")
101 self.assertStr(self._Call("b", kids[1]), "b(1,2,3)")
102 self.assertStr(self._Call("a.b().c", kids[2]), "a.b().c(1,3,2,4)")
103 self.assertStr(self._Call("d", kids[3], prefix=" "), " d(b, j)")
104
105
Martin v. Löwisef04c442008-03-19 05:04:44 +0000106class Test_does_tree_import(support.TestCase):
107 def _find_bind_rec(self, name, node):
108 # Search a tree for a binding -- used to find the starting
109 # point for these tests.
Benjamin Petersondf6dc8f2008-06-15 02:57:40 +0000110 c = fixer_util.find_binding(name, node)
Martin v. Löwisef04c442008-03-19 05:04:44 +0000111 if c: return c
112 for child in node.children:
113 c = self._find_bind_rec(name, child)
114 if c: return c
115
116 def does_tree_import(self, package, name, string):
117 node = parse(string)
118 # Find the binding of start -- that's what we'll go from
119 node = self._find_bind_rec('start', node)
Benjamin Petersondf6dc8f2008-06-15 02:57:40 +0000120 return fixer_util.does_tree_import(package, name, node)
Martin v. Löwisef04c442008-03-19 05:04:44 +0000121
122 def try_with(self, string):
123 failing_tests = (("a", "a", "from a import b"),
124 ("a.d", "a", "from a.d import b"),
125 ("d.a", "a", "from d.a import b"),
126 (None, "a", "import b"),
127 (None, "a", "import b, c, d"))
128 for package, name, import_ in failing_tests:
129 n = self.does_tree_import(package, name, import_ + "\n" + string)
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000130 self.assertFalse(n)
Martin v. Löwisef04c442008-03-19 05:04:44 +0000131 n = self.does_tree_import(package, name, string + "\n" + import_)
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000132 self.assertFalse(n)
Martin v. Löwisef04c442008-03-19 05:04:44 +0000133
134 passing_tests = (("a", "a", "from a import a"),
135 ("x", "a", "from x import a"),
136 ("x", "a", "from x import b, c, a, d"),
137 ("x.b", "a", "from x.b import a"),
138 ("x.b", "a", "from x.b import b, c, a, d"),
139 (None, "a", "import a"),
140 (None, "a", "import b, c, a, d"))
141 for package, name, import_ in passing_tests:
142 n = self.does_tree_import(package, name, import_ + "\n" + string)
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000143 self.assertTrue(n)
Martin v. Löwisef04c442008-03-19 05:04:44 +0000144 n = self.does_tree_import(package, name, string + "\n" + import_)
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000145 self.assertTrue(n)
Martin v. Löwisef04c442008-03-19 05:04:44 +0000146
147 def test_in_function(self):
148 self.try_with("def foo():\n\tbar.baz()\n\tstart=3")
149
150class Test_find_binding(support.TestCase):
151 def find_binding(self, name, string, package=None):
Benjamin Petersondf6dc8f2008-06-15 02:57:40 +0000152 return fixer_util.find_binding(name, parse(string), package)
Martin v. Löwisef04c442008-03-19 05:04:44 +0000153
154 def test_simple_assignment(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000155 self.assertTrue(self.find_binding("a", "a = b"))
156 self.assertTrue(self.find_binding("a", "a = [b, c, d]"))
157 self.assertTrue(self.find_binding("a", "a = foo()"))
158 self.assertTrue(self.find_binding("a", "a = foo().foo.foo[6][foo]"))
159 self.assertFalse(self.find_binding("a", "foo = a"))
160 self.assertFalse(self.find_binding("a", "foo = (a, b, c)"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000161
162 def test_tuple_assignment(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000163 self.assertTrue(self.find_binding("a", "(a,) = b"))
164 self.assertTrue(self.find_binding("a", "(a, b, c) = [b, c, d]"))
165 self.assertTrue(self.find_binding("a", "(c, (d, a), b) = foo()"))
166 self.assertTrue(self.find_binding("a", "(a, b) = foo().foo[6][foo]"))
167 self.assertFalse(self.find_binding("a", "(foo, b) = (b, a)"))
168 self.assertFalse(self.find_binding("a", "(foo, (b, c)) = (a, b, c)"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000169
170 def test_list_assignment(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000171 self.assertTrue(self.find_binding("a", "[a] = b"))
172 self.assertTrue(self.find_binding("a", "[a, b, c] = [b, c, d]"))
173 self.assertTrue(self.find_binding("a", "[c, [d, a], b] = foo()"))
174 self.assertTrue(self.find_binding("a", "[a, b] = foo().foo[a][foo]"))
175 self.assertFalse(self.find_binding("a", "[foo, b] = (b, a)"))
176 self.assertFalse(self.find_binding("a", "[foo, [b, c]] = (a, b, c)"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000177
178 def test_invalid_assignments(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000179 self.assertFalse(self.find_binding("a", "foo.a = 5"))
180 self.assertFalse(self.find_binding("a", "foo[a] = 5"))
181 self.assertFalse(self.find_binding("a", "foo(a) = 5"))
182 self.assertFalse(self.find_binding("a", "foo(a, b) = 5"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000183
184 def test_simple_import(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000185 self.assertTrue(self.find_binding("a", "import a"))
186 self.assertTrue(self.find_binding("a", "import b, c, a, d"))
187 self.assertFalse(self.find_binding("a", "import b"))
188 self.assertFalse(self.find_binding("a", "import b, c, d"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000189
190 def test_from_import(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000191 self.assertTrue(self.find_binding("a", "from x import a"))
192 self.assertTrue(self.find_binding("a", "from a import a"))
193 self.assertTrue(self.find_binding("a", "from x import b, c, a, d"))
194 self.assertTrue(self.find_binding("a", "from x.b import a"))
195 self.assertTrue(self.find_binding("a", "from x.b import b, c, a, d"))
196 self.assertFalse(self.find_binding("a", "from a import b"))
197 self.assertFalse(self.find_binding("a", "from a.d import b"))
198 self.assertFalse(self.find_binding("a", "from d.a import b"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000199
200 def test_import_as(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000201 self.assertTrue(self.find_binding("a", "import b as a"))
202 self.assertTrue(self.find_binding("a", "import b as a, c, a as f, d"))
203 self.assertFalse(self.find_binding("a", "import a as f"))
204 self.assertFalse(self.find_binding("a", "import b, c as f, d as e"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000205
206 def test_from_import_as(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000207 self.assertTrue(self.find_binding("a", "from x import b as a"))
208 self.assertTrue(self.find_binding("a", "from x import g as a, d as b"))
209 self.assertTrue(self.find_binding("a", "from x.b import t as a"))
210 self.assertTrue(self.find_binding("a", "from x.b import g as a, d"))
211 self.assertFalse(self.find_binding("a", "from a import b as t"))
212 self.assertFalse(self.find_binding("a", "from a.d import b as t"))
213 self.assertFalse(self.find_binding("a", "from d.a import b as t"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000214
215 def test_simple_import_with_package(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000216 self.assertTrue(self.find_binding("b", "import b"))
217 self.assertTrue(self.find_binding("b", "import b, c, d"))
218 self.assertFalse(self.find_binding("b", "import b", "b"))
219 self.assertFalse(self.find_binding("b", "import b, c, d", "c"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000220
221 def test_from_import_with_package(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000222 self.assertTrue(self.find_binding("a", "from x import a", "x"))
223 self.assertTrue(self.find_binding("a", "from a import a", "a"))
224 self.assertTrue(self.find_binding("a", "from x import *", "x"))
225 self.assertTrue(self.find_binding("a", "from x import b, c, a, d", "x"))
226 self.assertTrue(self.find_binding("a", "from x.b import a", "x.b"))
227 self.assertTrue(self.find_binding("a", "from x.b import *", "x.b"))
228 self.assertTrue(self.find_binding("a", "from x.b import b, c, a, d", "x.b"))
229 self.assertFalse(self.find_binding("a", "from a import b", "a"))
230 self.assertFalse(self.find_binding("a", "from a.d import b", "a.d"))
231 self.assertFalse(self.find_binding("a", "from d.a import b", "a.d"))
232 self.assertFalse(self.find_binding("a", "from x.y import *", "a.b"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000233
234 def test_import_as_with_package(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000235 self.assertFalse(self.find_binding("a", "import b.c as a", "b.c"))
236 self.assertFalse(self.find_binding("a", "import a as f", "f"))
237 self.assertFalse(self.find_binding("a", "import a as f", "a"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000238
239 def test_from_import_as_with_package(self):
240 # Because it would take a lot of special-case code in the fixers
241 # to deal with from foo import bar as baz, we'll simply always
242 # fail if there is an "from ... import ... as ..."
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000243 self.assertFalse(self.find_binding("a", "from x import b as a", "x"))
244 self.assertFalse(self.find_binding("a", "from x import g as a, d as b", "x"))
245 self.assertFalse(self.find_binding("a", "from x.b import t as a", "x.b"))
246 self.assertFalse(self.find_binding("a", "from x.b import g as a, d", "x.b"))
247 self.assertFalse(self.find_binding("a", "from a import b as t", "a"))
248 self.assertFalse(self.find_binding("a", "from a import b as t", "b"))
249 self.assertFalse(self.find_binding("a", "from a import b as t", "t"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000250
251 def test_function_def(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000252 self.assertTrue(self.find_binding("a", "def a(): pass"))
253 self.assertTrue(self.find_binding("a", "def a(b, c, d): pass"))
254 self.assertTrue(self.find_binding("a", "def a(): b = 7"))
255 self.assertFalse(self.find_binding("a", "def d(b, (c, a), e): pass"))
256 self.assertFalse(self.find_binding("a", "def d(a=7): pass"))
257 self.assertFalse(self.find_binding("a", "def d(a): pass"))
258 self.assertFalse(self.find_binding("a", "def d(): a = 7"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000259
260 s = """
261 def d():
262 def a():
263 pass"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000264 self.assertFalse(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000265
266 def test_class_def(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000267 self.assertTrue(self.find_binding("a", "class a: pass"))
268 self.assertTrue(self.find_binding("a", "class a(): pass"))
269 self.assertTrue(self.find_binding("a", "class a(b): pass"))
270 self.assertTrue(self.find_binding("a", "class a(b, c=8): pass"))
271 self.assertFalse(self.find_binding("a", "class d: pass"))
272 self.assertFalse(self.find_binding("a", "class d(a): pass"))
273 self.assertFalse(self.find_binding("a", "class d(b, a=7): pass"))
274 self.assertFalse(self.find_binding("a", "class d(b, *a): pass"))
275 self.assertFalse(self.find_binding("a", "class d(b, **a): pass"))
276 self.assertFalse(self.find_binding("a", "class d: a = 7"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000277
278 s = """
279 class d():
280 class a():
281 pass"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000282 self.assertFalse(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000283
284 def test_for(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000285 self.assertTrue(self.find_binding("a", "for a in r: pass"))
286 self.assertTrue(self.find_binding("a", "for a, b in r: pass"))
287 self.assertTrue(self.find_binding("a", "for (a, b) in r: pass"))
288 self.assertTrue(self.find_binding("a", "for c, (a,) in r: pass"))
289 self.assertTrue(self.find_binding("a", "for c, (a, b) in r: pass"))
290 self.assertTrue(self.find_binding("a", "for c in r: a = c"))
291 self.assertFalse(self.find_binding("a", "for c in a: pass"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000292
293 def test_for_nested(self):
294 s = """
295 for b in r:
296 for a in b:
297 pass"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000298 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000299
300 s = """
301 for b in r:
302 for a, c in b:
303 pass"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000304 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000305
306 s = """
307 for b in r:
308 for (a, c) in b:
309 pass"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000310 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000311
312 s = """
313 for b in r:
314 for (a,) in b:
315 pass"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000316 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000317
318 s = """
319 for b in r:
320 for c, (a, d) in b:
321 pass"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000322 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000323
324 s = """
325 for b in r:
326 for c in b:
327 a = 7"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000328 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000329
330 s = """
331 for b in r:
332 for c in b:
333 d = a"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000334 self.assertFalse(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000335
336 s = """
337 for b in r:
338 for c in a:
339 d = 7"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000340 self.assertFalse(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000341
342 def test_if(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000343 self.assertTrue(self.find_binding("a", "if b in r: a = c"))
344 self.assertFalse(self.find_binding("a", "if a in r: d = e"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000345
346 def test_if_nested(self):
347 s = """
348 if b in r:
349 if c in d:
350 a = c"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000351 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000352
353 s = """
354 if b in r:
355 if c in d:
356 c = a"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000357 self.assertFalse(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000358
359 def test_while(self):
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000360 self.assertTrue(self.find_binding("a", "while b in r: a = c"))
361 self.assertFalse(self.find_binding("a", "while a in r: d = e"))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000362
363 def test_while_nested(self):
364 s = """
365 while b in r:
366 while c in d:
367 a = c"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000368 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000369
370 s = """
371 while b in r:
372 while c in d:
373 c = a"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000374 self.assertFalse(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000375
376 def test_try_except(self):
377 s = """
378 try:
379 a = 6
380 except:
381 b = 8"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000382 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000383
384 s = """
385 try:
386 b = 8
387 except:
388 a = 6"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000389 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000390
391 s = """
392 try:
393 b = 8
394 except KeyError:
395 pass
396 except:
397 a = 6"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000398 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000399
400 s = """
401 try:
402 b = 8
403 except:
404 b = 6"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000405 self.assertFalse(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000406
407 def test_try_except_nested(self):
408 s = """
409 try:
410 try:
411 a = 6
412 except:
413 pass
414 except:
415 b = 8"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000416 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000417
418 s = """
419 try:
420 b = 8
421 except:
422 try:
423 a = 6
424 except:
425 pass"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000426 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000427
428 s = """
429 try:
430 b = 8
431 except:
432 try:
433 pass
434 except:
435 a = 6"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000436 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000437
438 s = """
439 try:
440 try:
441 b = 8
442 except KeyError:
443 pass
444 except:
445 a = 6
446 except:
447 pass"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000448 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000449
450 s = """
451 try:
452 pass
453 except:
454 try:
455 b = 8
456 except KeyError:
457 pass
458 except:
459 a = 6"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000460 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000461
462 s = """
463 try:
464 b = 8
465 except:
466 b = 6"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000467 self.assertFalse(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000468
469 s = """
470 try:
471 try:
472 b = 8
473 except:
474 c = d
475 except:
476 try:
477 b = 6
478 except:
479 t = 8
480 except:
481 o = y"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000482 self.assertFalse(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000483
484 def test_try_except_finally(self):
485 s = """
486 try:
487 c = 6
488 except:
489 b = 8
490 finally:
491 a = 9"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000492 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000493
494 s = """
495 try:
496 b = 8
497 finally:
498 a = 6"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000499 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000500
501 s = """
502 try:
503 b = 8
504 finally:
505 b = 6"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000506 self.assertFalse(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000507
508 s = """
509 try:
510 b = 8
511 except:
512 b = 9
513 finally:
514 b = 6"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000515 self.assertFalse(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000516
517 def test_try_except_finally_nested(self):
518 s = """
519 try:
520 c = 6
521 except:
522 b = 8
523 finally:
524 try:
525 a = 9
526 except:
527 b = 9
528 finally:
529 c = 9"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000530 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000531
532 s = """
533 try:
534 b = 8
535 finally:
536 try:
537 pass
538 finally:
539 a = 6"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000540 self.assertTrue(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000541
542 s = """
543 try:
544 b = 8
545 finally:
546 try:
547 b = 6
548 finally:
549 b = 7"""
Benjamin Peterson286a0d22009-07-01 01:06:56 +0000550 self.assertFalse(self.find_binding("a", s))
Martin v. Löwisef04c442008-03-19 05:04:44 +0000551
Benjamin Peterson0b24b3d2008-12-16 03:57:54 +0000552class Test_touch_import(support.TestCase):
553
554 def test_after_docstring(self):
555 node = parse('"""foo"""\nbar()')
556 fixer_util.touch_import(None, "foo", node)
557 self.assertEqual(str(node), '"""foo"""\nimport foo\nbar()\n\n')
558
559 def test_after_imports(self):
560 node = parse('"""foo"""\nimport bar\nbar()')
561 fixer_util.touch_import(None, "foo", node)
562 self.assertEqual(str(node), '"""foo"""\nimport bar\nimport foo\nbar()\n\n')
563
564 def test_beginning(self):
565 node = parse('bar()')
566 fixer_util.touch_import(None, "foo", node)
567 self.assertEqual(str(node), 'import foo\nbar()\n\n')
568
569 def test_from_import(self):
570 node = parse('bar()')
Martin v. Löwise2bb4eb2010-12-03 23:11:07 +0000571 fixer_util.touch_import("html", "escape", node)
572 self.assertEqual(str(node), 'from html import escape\nbar()\n\n')
Benjamin Peterson0b24b3d2008-12-16 03:57:54 +0000573
574 def test_name_import(self):
575 node = parse('bar()')
576 fixer_util.touch_import(None, "cgi", node)
577 self.assertEqual(str(node), 'import cgi\nbar()\n\n')
Benjamin Peterson4eb5fa52010-08-08 19:01:25 +0000578
579class Test_find_indentation(support.TestCase):
580
581 def test_nothing(self):
582 fi = fixer_util.find_indentation
583 node = parse("node()")
584 self.assertEqual(fi(node), "")
585 node = parse("")
586 self.assertEqual(fi(node), "")
587
588 def test_simple(self):
589 fi = fixer_util.find_indentation
590 node = parse("def f():\n x()")
591 self.assertEqual(fi(node), "")
592 self.assertEqual(fi(node.children[0].children[4].children[2]), " ")
593 node = parse("def f():\n x()\n y()")
594 self.assertEqual(fi(node.children[0].children[4].children[4]), " ")