Fix collapse false to look at unescaped braces only
Sometimes the repr of an object can contain the "\n{" sequence which is used as a formatting language, so they are escaped to "\\n{". But the collapse-false code needs to look for the real "\n{" token instead of simply "{" as otherwise it may get unbalanced braces from the object's repr (sometimes caused by the collapsing of long reprs by saferepr). Fixes issue #731. --HG-- branch : pytest-2.7
This commit is contained in:
parent
e94f5727c4
commit
7f554f50e3
|
@ -1,6 +1,10 @@
|
|||
2.7.1.dev (compared to 2.7.0)
|
||||
-----------------------------
|
||||
|
||||
- fix issue731: do not get confused by the braces which may be present
|
||||
and unbalanced in an object's repr while collapsing False
|
||||
explanations. Thanks Carl Meyer for the report and test case.
|
||||
|
||||
- fix issue553: properly handling inspect.getsourcelines failures in
|
||||
FixtureLookupError which would lead to to an internal error,
|
||||
obfuscating the original problem. Thanks talljosh for initial
|
||||
|
|
|
@ -45,13 +45,15 @@ def _collapse_false(explanation):
|
|||
if where == -1:
|
||||
break
|
||||
level = 0
|
||||
prev_c = explanation[start]
|
||||
for i, c in enumerate(explanation[start:]):
|
||||
if c == "{":
|
||||
if prev_c + c == "\n{":
|
||||
level += 1
|
||||
elif c == "}":
|
||||
elif prev_c + c == "\n}":
|
||||
level -= 1
|
||||
if not level:
|
||||
break
|
||||
prev_c = c
|
||||
else:
|
||||
raise AssertionError("unbalanced braces: %r" % (explanation,))
|
||||
end = start + i
|
||||
|
|
|
@ -665,3 +665,24 @@ class TestAssertionRewriteHookDetails(object):
|
|||
result.stdout.fnmatch_lines([
|
||||
"* 1 passed*",
|
||||
])
|
||||
|
||||
|
||||
def test_issue731(testdir):
|
||||
testdir.makepyfile("""
|
||||
class LongReprWithBraces(object):
|
||||
def __repr__(self):
|
||||
return 'LongReprWithBraces({' + ('a' * 80) + '}' + ('a' * 120) + ')'
|
||||
|
||||
def some_method(self):
|
||||
return False
|
||||
|
||||
def test_long_repr():
|
||||
obj = LongReprWithBraces()
|
||||
assert obj.some_method()
|
||||
""")
|
||||
result = testdir.runpytest()
|
||||
assert 'unbalanced braces' not in result.stdout.str()
|
||||
|
||||
|
||||
def test_collapse_false_unbalanced_braces():
|
||||
util._collapse_false('some text{ False\n{False = some more text\n}')
|
||||
|
|
Loading…
Reference in New Issue