tests: Add "with" statement testcases.
This commit is contained in:
parent
44307d5ef8
commit
e7286ef2c7
14
tests/basics/with-break.py
Normal file
14
tests/basics/with-break.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
class CtxMgr:
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
print("__enter__")
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, a, b, c):
|
||||||
|
print("__exit__", repr(a), repr(b))
|
||||||
|
|
||||||
|
for i in range(5):
|
||||||
|
print(i)
|
||||||
|
with CtxMgr():
|
||||||
|
if i == 3:
|
||||||
|
break
|
14
tests/basics/with-continue.py
Normal file
14
tests/basics/with-continue.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
class CtxMgr:
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
print("__enter__")
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, a, b, c):
|
||||||
|
print("__exit__", repr(a), repr(b))
|
||||||
|
|
||||||
|
for i in range(5):
|
||||||
|
print(i)
|
||||||
|
with CtxMgr():
|
||||||
|
if i == 3:
|
||||||
|
continue
|
14
tests/basics/with-return.py
Normal file
14
tests/basics/with-return.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
class CtxMgr:
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
print("__enter__")
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, a, b, c):
|
||||||
|
print("__exit__", repr(a), repr(b))
|
||||||
|
|
||||||
|
def foo():
|
||||||
|
with CtxMgr():
|
||||||
|
return 4
|
||||||
|
|
||||||
|
print(foo())
|
71
tests/basics/with1.py
Normal file
71
tests/basics/with1.py
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
class CtxMgr:
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
print("__enter__")
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, a, b, c):
|
||||||
|
print("__exit__", repr(a), repr(b))
|
||||||
|
|
||||||
|
|
||||||
|
with CtxMgr() as a:
|
||||||
|
print(isinstance(a, CtxMgr))
|
||||||
|
|
||||||
|
try:
|
||||||
|
with CtxMgr() as a:
|
||||||
|
raise ValueError
|
||||||
|
except ValueError:
|
||||||
|
print("ValueError")
|
||||||
|
|
||||||
|
|
||||||
|
class CtxMgr2:
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
print("__enter__")
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, a, b, c):
|
||||||
|
print("__exit__", repr(a), repr(b))
|
||||||
|
return True
|
||||||
|
|
||||||
|
try:
|
||||||
|
with CtxMgr2() as a:
|
||||||
|
raise ValueError
|
||||||
|
print("No ValueError2")
|
||||||
|
except ValueError:
|
||||||
|
print("ValueError2")
|
||||||
|
|
||||||
|
|
||||||
|
# These recursive try-finally tests are attempt to get some interpretation
|
||||||
|
# of last phrase in http://docs.python.org/3.4/library/dis.html#opcode-WITH_CLEANUP
|
||||||
|
# "If the stack represents an exception, and the function call returns a ‘true’
|
||||||
|
# value, this information is “zapped” and replaced with a single WHY_SILENCED
|
||||||
|
# to prevent END_FINALLY from re-raising the exception. (But non-local gotos
|
||||||
|
# will still be resumed.)"
|
||||||
|
print("===")
|
||||||
|
with CtxMgr2() as a:
|
||||||
|
try:
|
||||||
|
try:
|
||||||
|
raise ValueError
|
||||||
|
print("No ValueError3")
|
||||||
|
finally:
|
||||||
|
print("finally1")
|
||||||
|
finally:
|
||||||
|
print("finally2")
|
||||||
|
|
||||||
|
print("===")
|
||||||
|
try:
|
||||||
|
try:
|
||||||
|
with CtxMgr2() as a:
|
||||||
|
try:
|
||||||
|
try:
|
||||||
|
raise ValueError
|
||||||
|
print("No ValueError3")
|
||||||
|
finally:
|
||||||
|
print("finally1")
|
||||||
|
finally:
|
||||||
|
print("finally2")
|
||||||
|
finally:
|
||||||
|
print("finally3")
|
||||||
|
finally:
|
||||||
|
print("finally4")
|
Loading…
x
Reference in New Issue
Block a user