Skip to content

Commit 57675ff

Browse files
committed
Add test case for with statement
1 parent 05e3323 commit 57675ff

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

tests/expressions/test_interpreter_coverage6.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1912,3 +1912,58 @@ def test_state_tracking():
19121912
"exit depth 2",
19131913
"exit depth 1",
19141914
]
1915+
1916+
# Test multiple context managers in single with statement
1917+
code = """
1918+
class Resource:
1919+
def __init__(self, name, fail_on_exit=False):
1920+
self.name = name
1921+
self.fail_on_exit = fail_on_exit
1922+
self.events = []
1923+
1924+
def __enter__(self):
1925+
self.events.append(f"acquire {self.name}")
1926+
return self
1927+
1928+
def __exit__(self, exc_type, exc_val, exc_tb):
1929+
self.events.append(f"release {self.name}")
1930+
if self.fail_on_exit:
1931+
raise RuntimeError(f"exit error in {self.name}")
1932+
return False
1933+
1934+
def test_multiple_contexts():
1935+
r1 = Resource("r1")
1936+
r2 = Resource("r2", fail_on_exit=True)
1937+
r3 = Resource("r3")
1938+
result = []
1939+
1940+
try:
1941+
with r1 as res1, r2 as res2, r3 as res3:
1942+
result.extend(res1.events)
1943+
result.extend(res2.events)
1944+
result.extend(res3.events)
1945+
result.append("using resources")
1946+
except RuntimeError as e:
1947+
result.append(f"error: {str(e)}")
1948+
1949+
result.extend(r1.events)
1950+
result.extend(r2.events)
1951+
result.extend(r3.events)
1952+
return result
1953+
1954+
result = test_multiple_contexts()
1955+
"""
1956+
interpreter.execute(parser.parse(code))
1957+
assert interpreter.local_env["result"] == [
1958+
"acquire r1",
1959+
"acquire r2",
1960+
"acquire r3",
1961+
"using resources",
1962+
"error: exit error in r2",
1963+
"acquire r1",
1964+
"release r1",
1965+
"acquire r2",
1966+
"release r2",
1967+
"acquire r3",
1968+
"release r3",
1969+
]

0 commit comments

Comments
 (0)