put the explanation generating code in the conditional fail body (fixes #79)

This commit is contained in:
Benjamin Peterson 2011-10-14 16:26:13 -04:00
parent 6ac638ba87
commit 29b4082b00
3 changed files with 12 additions and 3 deletions

View File

@ -1,6 +1,7 @@
Changes between 2.1.2 and [next version] Changes between 2.1.2 and [next version]
---------------------------------------- ----------------------------------------
- fix issue79: rewriting failed on some comparisons in boolops
- correctly handle zero length arguments (a la pytest '') - correctly handle zero length arguments (a la pytest '')
- fix issue67 / junitxml now contains correct test durations, thanks ronny - fix issue67 / junitxml now contains correct test durations, thanks ronny
- fix issue75 / skipping test failure on jython - fix issue75 / skipping test failure on jython

View File

@ -491,13 +491,13 @@ class AssertionRewriter(ast.NodeVisitor):
self.push_format_context() self.push_format_context()
# Process each operand, short-circuting if needed. # Process each operand, short-circuting if needed.
for i, v in enumerate(boolop.values): for i, v in enumerate(boolop.values):
self.push_format_context()
res, expl = self.visit(v)
body.append(ast.Assign([ast.Name(res_var, ast.Store())], res))
if i: if i:
fail_inner = [] fail_inner = []
self.on_failure.append(ast.If(cond, fail_inner, [])) self.on_failure.append(ast.If(cond, fail_inner, []))
self.on_failure = fail_inner self.on_failure = fail_inner
self.push_format_context()
res, expl = self.visit(v)
body.append(ast.Assign([ast.Name(res_var, ast.Store())], res))
expl_format = self.pop_format_context(ast.Str(expl)) expl_format = self.pop_format_context(ast.Str(expl))
call = ast.Call(app, [expl_format], [], None, None) call = ast.Call(app, [expl_format], [], None, None)
self.on_failure.append(ast.Expr(call)) self.on_failure.append(ast.Expr(call))

View File

@ -144,6 +144,14 @@ class TestAssertionRewrite:
def f(): def f():
assert False or x() assert False or x()
assert getmsg(f, {"x" : x}) == "assert (False or x())" assert getmsg(f, {"x" : x}) == "assert (False or x())"
def f():
assert 1 in {} and 2 in {}
assert getmsg(f) == "assert (1 in {})"
def f():
x = 1
y = 2
assert x in {1 : None} and y in {}
assert getmsg(f) == "assert (1 in {1: None} and 2 in {})"
def f(): def f():
f = True f = True
g = False g = False