python (3.12.0)
1 # Copyright 2006 Google, Inc. All Rights Reserved.
2 # Licensed to PSF under a Contributor Agreement.
3
4 """Unit tests for pytree.py.
5
6 NOTE: Please *don't* add doc strings to individual test methods!
7 In verbose mode, printing of the module, class and method name is much
8 more helpful than printing of (the first line of) the docstring,
9 especially when debugging a test.
10 """
11
12 # Testing imports
13 from . import support
14
15 from lib2to3 import pytree
16
17 try:
18 sorted
19 except NameError:
20 def sorted(lst):
21 l = list(lst)
22 l.sort()
23 return l
24
25 class ESC[4;38;5;81mTestNodes(ESC[4;38;5;149msupportESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
26
27 """Unit tests for nodes (Base, Leaf, Node)."""
28
29 def test_instantiate_base(self):
30 if __debug__:
31 # Test that instantiating Base() raises an AssertionError
32 self.assertRaises(AssertionError, pytree.Base)
33
34 def test_leaf(self):
35 l1 = pytree.Leaf(100, "foo")
36 self.assertEqual(l1.type, 100)
37 self.assertEqual(l1.value, "foo")
38
39 def test_leaf_repr(self):
40 l1 = pytree.Leaf(100, "foo")
41 self.assertEqual(repr(l1), "Leaf(100, 'foo')")
42
43 def test_leaf_str(self):
44 l1 = pytree.Leaf(100, "foo")
45 self.assertEqual(str(l1), "foo")
46 l2 = pytree.Leaf(100, "foo", context=(" ", (10, 1)))
47 self.assertEqual(str(l2), " foo")
48
49 def test_leaf_str_numeric_value(self):
50 # Make sure that the Leaf's value is stringified. Failing to
51 # do this can cause a TypeError in certain situations.
52 l1 = pytree.Leaf(2, 5)
53 l1.prefix = "foo_"
54 self.assertEqual(str(l1), "foo_5")
55
56 def test_leaf_equality(self):
57 l1 = pytree.Leaf(100, "foo")
58 l2 = pytree.Leaf(100, "foo", context=(" ", (1, 0)))
59 self.assertEqual(l1, l2)
60 l3 = pytree.Leaf(101, "foo")
61 l4 = pytree.Leaf(100, "bar")
62 self.assertNotEqual(l1, l3)
63 self.assertNotEqual(l1, l4)
64
65 def test_leaf_prefix(self):
66 l1 = pytree.Leaf(100, "foo")
67 self.assertEqual(l1.prefix, "")
68 self.assertFalse(l1.was_changed)
69 l1.prefix = " ##\n\n"
70 self.assertEqual(l1.prefix, " ##\n\n")
71 self.assertTrue(l1.was_changed)
72
73 def test_node(self):
74 l1 = pytree.Leaf(100, "foo")
75 l2 = pytree.Leaf(200, "bar")
76 n1 = pytree.Node(1000, [l1, l2])
77 self.assertEqual(n1.type, 1000)
78 self.assertEqual(n1.children, [l1, l2])
79
80 def test_node_repr(self):
81 l1 = pytree.Leaf(100, "foo")
82 l2 = pytree.Leaf(100, "bar", context=(" ", (1, 0)))
83 n1 = pytree.Node(1000, [l1, l2])
84 self.assertEqual(repr(n1),
85 "Node(1000, [%s, %s])" % (repr(l1), repr(l2)))
86
87 def test_node_str(self):
88 l1 = pytree.Leaf(100, "foo")
89 l2 = pytree.Leaf(100, "bar", context=(" ", (1, 0)))
90 n1 = pytree.Node(1000, [l1, l2])
91 self.assertEqual(str(n1), "foo bar")
92
93 def test_node_prefix(self):
94 l1 = pytree.Leaf(100, "foo")
95 self.assertEqual(l1.prefix, "")
96 n1 = pytree.Node(1000, [l1])
97 self.assertEqual(n1.prefix, "")
98 n1.prefix = " "
99 self.assertEqual(n1.prefix, " ")
100 self.assertEqual(l1.prefix, " ")
101
102 def test_get_suffix(self):
103 l1 = pytree.Leaf(100, "foo", prefix="a")
104 l2 = pytree.Leaf(100, "bar", prefix="b")
105 n1 = pytree.Node(1000, [l1, l2])
106
107 self.assertEqual(l1.get_suffix(), l2.prefix)
108 self.assertEqual(l2.get_suffix(), "")
109 self.assertEqual(n1.get_suffix(), "")
110
111 l3 = pytree.Leaf(100, "bar", prefix="c")
112 n2 = pytree.Node(1000, [n1, l3])
113
114 self.assertEqual(n1.get_suffix(), l3.prefix)
115 self.assertEqual(l3.get_suffix(), "")
116 self.assertEqual(n2.get_suffix(), "")
117
118 def test_node_equality(self):
119 n1 = pytree.Node(1000, ())
120 n2 = pytree.Node(1000, [], context=(" ", (1, 0)))
121 self.assertEqual(n1, n2)
122 n3 = pytree.Node(1001, ())
123 self.assertNotEqual(n1, n3)
124
125 def test_node_recursive_equality(self):
126 l1 = pytree.Leaf(100, "foo")
127 l2 = pytree.Leaf(100, "foo")
128 n1 = pytree.Node(1000, [l1])
129 n2 = pytree.Node(1000, [l2])
130 self.assertEqual(n1, n2)
131 l3 = pytree.Leaf(100, "bar")
132 n3 = pytree.Node(1000, [l3])
133 self.assertNotEqual(n1, n3)
134
135 def test_replace(self):
136 l1 = pytree.Leaf(100, "foo")
137 l2 = pytree.Leaf(100, "+")
138 l3 = pytree.Leaf(100, "bar")
139 n1 = pytree.Node(1000, [l1, l2, l3])
140 self.assertEqual(n1.children, [l1, l2, l3])
141 self.assertIsInstance(n1.children, list)
142 self.assertFalse(n1.was_changed)
143 l2new = pytree.Leaf(100, "-")
144 l2.replace(l2new)
145 self.assertEqual(n1.children, [l1, l2new, l3])
146 self.assertIsInstance(n1.children, list)
147 self.assertTrue(n1.was_changed)
148
149 def test_replace_with_list(self):
150 l1 = pytree.Leaf(100, "foo")
151 l2 = pytree.Leaf(100, "+")
152 l3 = pytree.Leaf(100, "bar")
153 n1 = pytree.Node(1000, [l1, l2, l3])
154
155 l2.replace([pytree.Leaf(100, "*"), pytree.Leaf(100, "*")])
156 self.assertEqual(str(n1), "foo**bar")
157 self.assertIsInstance(n1.children, list)
158
159 def test_leaves(self):
160 l1 = pytree.Leaf(100, "foo")
161 l2 = pytree.Leaf(100, "bar")
162 l3 = pytree.Leaf(100, "fooey")
163 n2 = pytree.Node(1000, [l1, l2])
164 n3 = pytree.Node(1000, [l3])
165 n1 = pytree.Node(1000, [n2, n3])
166
167 self.assertEqual(list(n1.leaves()), [l1, l2, l3])
168
169 def test_depth(self):
170 l1 = pytree.Leaf(100, "foo")
171 l2 = pytree.Leaf(100, "bar")
172 n2 = pytree.Node(1000, [l1, l2])
173 n3 = pytree.Node(1000, [])
174 n1 = pytree.Node(1000, [n2, n3])
175
176 self.assertEqual(l1.depth(), 2)
177 self.assertEqual(n3.depth(), 1)
178 self.assertEqual(n1.depth(), 0)
179
180 def test_post_order(self):
181 l1 = pytree.Leaf(100, "foo")
182 l2 = pytree.Leaf(100, "bar")
183 l3 = pytree.Leaf(100, "fooey")
184 c1 = pytree.Node(1000, [l1, l2])
185 n1 = pytree.Node(1000, [c1, l3])
186 self.assertEqual(list(n1.post_order()), [l1, l2, c1, l3, n1])
187
188 def test_pre_order(self):
189 l1 = pytree.Leaf(100, "foo")
190 l2 = pytree.Leaf(100, "bar")
191 l3 = pytree.Leaf(100, "fooey")
192 c1 = pytree.Node(1000, [l1, l2])
193 n1 = pytree.Node(1000, [c1, l3])
194 self.assertEqual(list(n1.pre_order()), [n1, c1, l1, l2, l3])
195
196 def test_changed(self):
197 l1 = pytree.Leaf(100, "f")
198 self.assertFalse(l1.was_changed)
199 l1.changed()
200 self.assertTrue(l1.was_changed)
201
202 l1 = pytree.Leaf(100, "f")
203 n1 = pytree.Node(1000, [l1])
204 self.assertFalse(n1.was_changed)
205 n1.changed()
206 self.assertTrue(n1.was_changed)
207
208 l1 = pytree.Leaf(100, "foo")
209 l2 = pytree.Leaf(100, "+")
210 l3 = pytree.Leaf(100, "bar")
211 n1 = pytree.Node(1000, [l1, l2, l3])
212 n2 = pytree.Node(1000, [n1])
213 self.assertFalse(l1.was_changed)
214 self.assertFalse(n1.was_changed)
215 self.assertFalse(n2.was_changed)
216
217 n1.changed()
218 self.assertTrue(n1.was_changed)
219 self.assertTrue(n2.was_changed)
220 self.assertFalse(l1.was_changed)
221
222 def test_leaf_constructor_prefix(self):
223 for prefix in ("xyz_", ""):
224 l1 = pytree.Leaf(100, "self", prefix=prefix)
225 self.assertTrue(str(l1), prefix + "self")
226 self.assertEqual(l1.prefix, prefix)
227
228 def test_node_constructor_prefix(self):
229 for prefix in ("xyz_", ""):
230 l1 = pytree.Leaf(100, "self")
231 l2 = pytree.Leaf(100, "foo", prefix="_")
232 n1 = pytree.Node(1000, [l1, l2], prefix=prefix)
233 self.assertTrue(str(n1), prefix + "self_foo")
234 self.assertEqual(n1.prefix, prefix)
235 self.assertEqual(l1.prefix, prefix)
236 self.assertEqual(l2.prefix, "_")
237
238 def test_remove(self):
239 l1 = pytree.Leaf(100, "foo")
240 l2 = pytree.Leaf(100, "foo")
241 n1 = pytree.Node(1000, [l1, l2])
242 n2 = pytree.Node(1000, [n1])
243
244 self.assertEqual(n1.remove(), 0)
245 self.assertEqual(n2.children, [])
246 self.assertEqual(l1.parent, n1)
247 self.assertEqual(n1.parent, None)
248 self.assertEqual(n2.parent, None)
249 self.assertFalse(n1.was_changed)
250 self.assertTrue(n2.was_changed)
251
252 self.assertEqual(l2.remove(), 1)
253 self.assertEqual(l1.remove(), 0)
254 self.assertEqual(n1.children, [])
255 self.assertEqual(l1.parent, None)
256 self.assertEqual(n1.parent, None)
257 self.assertEqual(n2.parent, None)
258 self.assertTrue(n1.was_changed)
259 self.assertTrue(n2.was_changed)
260
261 def test_remove_parentless(self):
262 n1 = pytree.Node(1000, [])
263 n1.remove()
264 self.assertEqual(n1.parent, None)
265
266 l1 = pytree.Leaf(100, "foo")
267 l1.remove()
268 self.assertEqual(l1.parent, None)
269
270 def test_node_set_child(self):
271 l1 = pytree.Leaf(100, "foo")
272 n1 = pytree.Node(1000, [l1])
273
274 l2 = pytree.Leaf(100, "bar")
275 n1.set_child(0, l2)
276 self.assertEqual(l1.parent, None)
277 self.assertEqual(l2.parent, n1)
278 self.assertEqual(n1.children, [l2])
279
280 n2 = pytree.Node(1000, [l1])
281 n2.set_child(0, n1)
282 self.assertEqual(l1.parent, None)
283 self.assertEqual(n1.parent, n2)
284 self.assertEqual(n2.parent, None)
285 self.assertEqual(n2.children, [n1])
286
287 self.assertRaises(IndexError, n1.set_child, 4, l2)
288 # I don't care what it raises, so long as it's an exception
289 self.assertRaises(Exception, n1.set_child, 0, list)
290
291 def test_node_insert_child(self):
292 l1 = pytree.Leaf(100, "foo")
293 n1 = pytree.Node(1000, [l1])
294
295 l2 = pytree.Leaf(100, "bar")
296 n1.insert_child(0, l2)
297 self.assertEqual(l2.parent, n1)
298 self.assertEqual(n1.children, [l2, l1])
299
300 l3 = pytree.Leaf(100, "abc")
301 n1.insert_child(2, l3)
302 self.assertEqual(n1.children, [l2, l1, l3])
303
304 # I don't care what it raises, so long as it's an exception
305 self.assertRaises(Exception, n1.insert_child, 0, list)
306
307 def test_node_append_child(self):
308 n1 = pytree.Node(1000, [])
309
310 l1 = pytree.Leaf(100, "foo")
311 n1.append_child(l1)
312 self.assertEqual(l1.parent, n1)
313 self.assertEqual(n1.children, [l1])
314
315 l2 = pytree.Leaf(100, "bar")
316 n1.append_child(l2)
317 self.assertEqual(l2.parent, n1)
318 self.assertEqual(n1.children, [l1, l2])
319
320 # I don't care what it raises, so long as it's an exception
321 self.assertRaises(Exception, n1.append_child, list)
322
323 def test_node_next_sibling(self):
324 n1 = pytree.Node(1000, [])
325 n2 = pytree.Node(1000, [])
326 p1 = pytree.Node(1000, [n1, n2])
327
328 self.assertIs(n1.next_sibling, n2)
329 self.assertEqual(n2.next_sibling, None)
330 self.assertEqual(p1.next_sibling, None)
331
332 def test_leaf_next_sibling(self):
333 l1 = pytree.Leaf(100, "a")
334 l2 = pytree.Leaf(100, "b")
335 p1 = pytree.Node(1000, [l1, l2])
336
337 self.assertIs(l1.next_sibling, l2)
338 self.assertEqual(l2.next_sibling, None)
339 self.assertEqual(p1.next_sibling, None)
340
341 def test_node_prev_sibling(self):
342 n1 = pytree.Node(1000, [])
343 n2 = pytree.Node(1000, [])
344 p1 = pytree.Node(1000, [n1, n2])
345
346 self.assertIs(n2.prev_sibling, n1)
347 self.assertEqual(n1.prev_sibling, None)
348 self.assertEqual(p1.prev_sibling, None)
349
350 def test_leaf_prev_sibling(self):
351 l1 = pytree.Leaf(100, "a")
352 l2 = pytree.Leaf(100, "b")
353 p1 = pytree.Node(1000, [l1, l2])
354
355 self.assertIs(l2.prev_sibling, l1)
356 self.assertEqual(l1.prev_sibling, None)
357 self.assertEqual(p1.prev_sibling, None)
358
359
360 class ESC[4;38;5;81mTestPatterns(ESC[4;38;5;149msupportESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
361
362 """Unit tests for tree matching patterns."""
363
364 def test_basic_patterns(self):
365 # Build a tree
366 l1 = pytree.Leaf(100, "foo")
367 l2 = pytree.Leaf(100, "bar")
368 l3 = pytree.Leaf(100, "foo")
369 n1 = pytree.Node(1000, [l1, l2])
370 n2 = pytree.Node(1000, [l3])
371 root = pytree.Node(1000, [n1, n2])
372 # Build a pattern matching a leaf
373 pl = pytree.LeafPattern(100, "foo", name="pl")
374 r = {}
375 self.assertFalse(pl.match(root, results=r))
376 self.assertEqual(r, {})
377 self.assertFalse(pl.match(n1, results=r))
378 self.assertEqual(r, {})
379 self.assertFalse(pl.match(n2, results=r))
380 self.assertEqual(r, {})
381 self.assertTrue(pl.match(l1, results=r))
382 self.assertEqual(r, {"pl": l1})
383 r = {}
384 self.assertFalse(pl.match(l2, results=r))
385 self.assertEqual(r, {})
386 # Build a pattern matching a node
387 pn = pytree.NodePattern(1000, [pl], name="pn")
388 self.assertFalse(pn.match(root, results=r))
389 self.assertEqual(r, {})
390 self.assertFalse(pn.match(n1, results=r))
391 self.assertEqual(r, {})
392 self.assertTrue(pn.match(n2, results=r))
393 self.assertEqual(r, {"pn": n2, "pl": l3})
394 r = {}
395 self.assertFalse(pn.match(l1, results=r))
396 self.assertEqual(r, {})
397 self.assertFalse(pn.match(l2, results=r))
398 self.assertEqual(r, {})
399
400 def test_wildcard(self):
401 # Build a tree for testing
402 l1 = pytree.Leaf(100, "foo")
403 l2 = pytree.Leaf(100, "bar")
404 l3 = pytree.Leaf(100, "foo")
405 n1 = pytree.Node(1000, [l1, l2])
406 n2 = pytree.Node(1000, [l3])
407 root = pytree.Node(1000, [n1, n2])
408 # Build a pattern
409 pl = pytree.LeafPattern(100, "foo", name="pl")
410 pn = pytree.NodePattern(1000, [pl], name="pn")
411 pw = pytree.WildcardPattern([[pn], [pl, pl]], name="pw")
412 r = {}
413 self.assertFalse(pw.match_seq([root], r))
414 self.assertEqual(r, {})
415 self.assertFalse(pw.match_seq([n1], r))
416 self.assertEqual(r, {})
417 self.assertTrue(pw.match_seq([n2], r))
418 # These are easier to debug
419 self.assertEqual(sorted(r.keys()), ["pl", "pn", "pw"])
420 self.assertEqual(r["pl"], l1)
421 self.assertEqual(r["pn"], n2)
422 self.assertEqual(r["pw"], [n2])
423 # But this is equivalent
424 self.assertEqual(r, {"pl": l1, "pn": n2, "pw": [n2]})
425 r = {}
426 self.assertTrue(pw.match_seq([l1, l3], r))
427 self.assertEqual(r, {"pl": l3, "pw": [l1, l3]})
428 self.assertIs(r["pl"], l3)
429 r = {}
430
431 def test_generate_matches(self):
432 la = pytree.Leaf(1, "a")
433 lb = pytree.Leaf(1, "b")
434 lc = pytree.Leaf(1, "c")
435 ld = pytree.Leaf(1, "d")
436 le = pytree.Leaf(1, "e")
437 lf = pytree.Leaf(1, "f")
438 leaves = [la, lb, lc, ld, le, lf]
439 root = pytree.Node(1000, leaves)
440 pa = pytree.LeafPattern(1, "a", "pa")
441 pb = pytree.LeafPattern(1, "b", "pb")
442 pc = pytree.LeafPattern(1, "c", "pc")
443 pd = pytree.LeafPattern(1, "d", "pd")
444 pe = pytree.LeafPattern(1, "e", "pe")
445 pf = pytree.LeafPattern(1, "f", "pf")
446 pw = pytree.WildcardPattern([[pa, pb, pc], [pd, pe],
447 [pa, pb], [pc, pd], [pe, pf]],
448 min=1, max=4, name="pw")
449 self.assertEqual([x[0] for x in pw.generate_matches(leaves)],
450 [3, 5, 2, 4, 6])
451 pr = pytree.NodePattern(type=1000, content=[pw], name="pr")
452 matches = list(pytree.generate_matches([pr], [root]))
453 self.assertEqual(len(matches), 1)
454 c, r = matches[0]
455 self.assertEqual(c, 1)
456 self.assertEqual(str(r["pr"]), "abcdef")
457 self.assertEqual(r["pw"], [la, lb, lc, ld, le, lf])
458 for c in "abcdef":
459 self.assertEqual(r["p" + c], pytree.Leaf(1, c))
460
461 def test_has_key_example(self):
462 pattern = pytree.NodePattern(331,
463 (pytree.LeafPattern(7),
464 pytree.WildcardPattern(name="args"),
465 pytree.LeafPattern(8)))
466 l1 = pytree.Leaf(7, "(")
467 l2 = pytree.Leaf(3, "x")
468 l3 = pytree.Leaf(8, ")")
469 node = pytree.Node(331, [l1, l2, l3])
470 r = {}
471 self.assertTrue(pattern.match(node, r))
472 self.assertEqual(r["args"], [l2])