python-uncompyle6/pytest/test_deparse.py

319 lines
5.4 KiB
Python

from uncompyle6.semantics.fragments import deparse_code as deparse
from uncompyle6 import PYTHON_VERSION, PYTHON3
def map_stmts(x, y):
x = []
y = {}
return x, y
def return_stmt(x, y):
return x, y
def try_stmt():
try:
x = 1
except:
pass
return x
def for_range_stmt():
for i in range(2):
i+1
# # FIXME: add this test - but for Python 2.7+ only
# def set_comp():
# {y for y in range(3)}
# FIXME: add this test
def list_comp():
[y for y in range(3)]
def get_parsed_for_fn(fn):
code = fn.__code__ if PYTHON3 else fn.func_code
return deparse(PYTHON_VERSION, code)
def check_expect(expect, parsed):
debug = False
i = 2
max_expect = len(expect)
for name, offset in sorted(parsed.offsets.keys()):
assert i+1 <= max_expect, "ran out if items in testing node"
nodeInfo = parsed.offsets[name, offset]
node = nodeInfo.node
extractInfo = parsed.extract_node_info(node)
assert expect[i] == extractInfo.selectedLine, \
('line %s expect:\n%s\ngot:\n%s' %
(i, expect[i], extractInfo.selectedLine))
assert expect[i+1] == extractInfo.markerLine, \
('line %s expect:\n%s\ngot:\n%s' %
(i+1, expect[i+1], extractInfo.markerLine))
i += 3
if debug:
print(node.offset)
print(extractInfo.selectedLine)
print(extractInfo.markerLine)
extractInfo, p = parsed.extract_parent_info(node)
if extractInfo:
assert i+1 < max_expect, "ran out of items in testing parent"
if debug:
print("Contained in...")
print(extractInfo.selectedLine)
print(extractInfo.markerLine)
assert expect[i] == extractInfo.selectedLine, \
("parent line %s expect:\n%s\ngot:\n%s" %
(i, expect[i], extractInfo.selectedLine))
assert expect[i+1] == extractInfo.markerLine, \
("parent line %s expect:\n%s\ngot:\n%s" %
(i+1, expect[i+1], extractInfo.markerLine))
i += 3
pass
pass
def test_stuff():
parsed = get_parsed_for_fn(map_stmts)
expect = """
-1
return (x, y)
^
Contained in...
return (x, y)
-------------
0
x = []
--
Contained in...
x = []
------
3
x = []
-
Contained in...
x = []
------
6
y = {}
--
Contained in...
y = {}
------
9
y = {}
-
Contained in...
y = {}
------
12
return (x, y)
-
Contained in...
return (x, y)
------
15
return (x, y)
-
Contained in...
return (x, y)
------
18
return (x, y)
------
Contained in...
return (x, y)
-------------
21
return (x, y)
-------------
Contained in...
x = [] ...
------ ...
""".split("\n")
check_expect(expect, parsed)
########################################################
# return
parsed = get_parsed_for_fn(return_stmt)
expect = """
-1
return (x, y)
^
Contained in...
return (x, y)
-------------
0
return (x, y)
-
Contained in...
return (x, y)
------
3
return (x, y)
-
Contained in...
return (x, y)
------
6
return (x, y)
------
Contained in...
return (x, y)
-------------
9
return (x, y)
-------------
Contained in...
return (x, y)
-------------
""".split("\n")
check_expect(expect, parsed)
########################################################
# # try
# expect = """
# -1
# return (x, y)
# ^
# Contained in...
# return (x, y)
# -------------
# 0
# try:
# ----
# Contained in...
# try: ...
# ---- ...
# 3
# x = 1
# -
# Contained in...
# x = 1
# -----
# 6
# x = 1
# -
# Contained in...
# x = 1
# -----
# 9
# pass
# ^
# Contained in...
# try: ...
# ---- ...
# 10
# except:
# ^
# Contained in...
# except: ...
# ------- ...
# 19
# pass
# ^
# Contained in...
# except: ...
# ------- ...
# 13_0
# except:
# ^
# Contained in...
# except: ...
# ------- ...
# 20_0
# pass
# ^
# Contained in...
# except: ...
# ------- ...
# """.split("\n")
# parsed = get_parsed_for_fn(try_stmt)
# check_expect(expect, parsed)
# ########################################################
# # for range
expect = """
0
for i in range(2):
-
Contained in...
for i in range(2): ...
------------------ ...
3
for i in range(2):
-----
Contained in...
for i in range(2):
--------
6
for i in range(2):
-
Contained in...
for i in range(2):
--------
9
for i in range(2):
--------
Contained in...
for i in range(2): ...
------------------ ...
12
for i in range(2):
-
Contained in...
for i in range(2): ...
------------------ ...
13
for i in range(2):
-
Contained in...
for i in range(2): ...
------------------ ...
16
for i in range(2):
-
Contained in...
for i in range(2): ...
------------------ ...
19
i + 1
-
Contained in...
i + 1
-----
22
i + 1
-
Contained in...
i + 1
-----
25
i + 1
-
Contained in...
i + 1
-----
27
return
^
Contained in...
i + 1
-----
31
return
------
Contained in...
for i in range(2): ...
------------------ ...
34
return
------
Contained in...
for i in range(2): ...
------------------ ...
.
""".split("\n")
parsed = get_parsed_for_fn(for_range_stmt)
if not PYTHON3:
check_expect(expect, parsed)