From e7286ef2c7db77879178f45f6055d8af2fc68281 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sat, 29 Mar 2014 04:11:24 +0200 Subject: [PATCH] tests: Add "with" statement testcases. --- tests/basics/with-break.py | 14 +++++++ tests/basics/with-continue.py | 14 +++++++ tests/basics/with-return.py | 14 +++++++ tests/basics/with1.py | 71 +++++++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+) create mode 100644 tests/basics/with-break.py create mode 100644 tests/basics/with-continue.py create mode 100644 tests/basics/with-return.py create mode 100644 tests/basics/with1.py diff --git a/tests/basics/with-break.py b/tests/basics/with-break.py new file mode 100644 index 0000000000..f1063d5826 --- /dev/null +++ b/tests/basics/with-break.py @@ -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 diff --git a/tests/basics/with-continue.py b/tests/basics/with-continue.py new file mode 100644 index 0000000000..fc2b24bd4b --- /dev/null +++ b/tests/basics/with-continue.py @@ -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 diff --git a/tests/basics/with-return.py b/tests/basics/with-return.py new file mode 100644 index 0000000000..cb0135c8b3 --- /dev/null +++ b/tests/basics/with-return.py @@ -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()) diff --git a/tests/basics/with1.py b/tests/basics/with1.py new file mode 100644 index 0000000000..3db1d380d4 --- /dev/null +++ b/tests/basics/with1.py @@ -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")