sapling/eden/scm/tests/test-annotate.py

119 lines
3.5 KiB
Python
Raw Normal View History

from __future__ import absolute_import, print_function
import unittest
from edenscm.mercurial import mdiff
from edenscm.mercurial.context import _annotatepair, annotateline
from hghave import require
flake8: enable F821 check Summary: This check is useful and detects real errors (ex. fbconduit). Unfortunately `arc lint` will run it with both py2 and py3 so a lot of py2 builtins will still be warned. I didn't find a clean way to disable py3 check. So this diff tries to fix them. For `xrange`, the change was done by a script: ``` import sys import redbaron headertypes = {'comment', 'endl', 'from_import', 'import', 'string', 'assignment', 'atomtrailers'} xrangefix = '''try: xrange(0) except NameError: xrange = range ''' def isxrange(x): try: return x[0].value == 'xrange' except Exception: return False def main(argv): for i, path in enumerate(argv): print('(%d/%d) scanning %s' % (i + 1, len(argv), path)) content = open(path).read() try: red = redbaron.RedBaron(content) except Exception: print(' warning: failed to parse') continue hasxrange = red.find('atomtrailersnode', value=isxrange) hasxrangefix = 'xrange = range' in content if hasxrangefix or not hasxrange: print(' no need to change') continue # find a place to insert the compatibility statement changed = False for node in red: if node.type in headertypes: continue # node.insert_before is an easier API, but it has bugs changing # other "finally" and "except" positions. So do the insert # manually. # # node.insert_before(xrangefix) line = node.absolute_bounding_box.top_left.line - 1 lines = content.splitlines(1) content = ''.join(lines[:line]) + xrangefix + ''.join(lines[line:]) changed = True break if changed: # "content" is faster than "red.dumps()" open(path, 'w').write(content) print(' updated') if __name__ == "__main__": sys.exit(main(sys.argv[1:])) ``` For other py2 builtins that do not have a py3 equivalent, some `# noqa` were added as a workaround for now. Reviewed By: DurhamG Differential Revision: D6934535 fbshipit-source-id: 546b62830af144bc8b46788d2e0fd00496838939
2018-02-10 04:31:44 +03:00
try:
xrange(0)
except NameError:
xrange = range
class AnnotateTests(unittest.TestCase):
"""Unit tests for annotate code."""
def testannotatepair(self):
self.maxDiff = None # camelcase-required
oldfctx = "old"
p1fctx, p2fctx, childfctx = "p1", "p2", "c"
olddata = b"a\nb\n"
p1data = b"a\nb\nc\n"
p2data = b"a\nc\nd\n"
childdata = b"a\nb2\nc\nc2\nd\n"
diffopts = mdiff.diffopts()
def decorate(text, rev):
return (
[
annotateline(fctx=rev, lineno=i)
for i in xrange(1, text.count(b"\n") + 1)
],
text,
)
# Basic usage
oldann = decorate(olddata, oldfctx)
p1ann = decorate(p1data, p1fctx)
p1ann = _annotatepair([oldann], p1fctx, p1ann, False, diffopts)
self.assertEqual(
p1ann[0],
[annotateline("old", 1), annotateline("old", 2), annotateline("p1", 3)],
)
p2ann = decorate(p2data, p2fctx)
p2ann = _annotatepair([oldann], p2fctx, p2ann, False, diffopts)
self.assertEqual(
p2ann[0],
[annotateline("old", 1), annotateline("p2", 2), annotateline("p2", 3)],
)
# Test with multiple parents (note the difference caused by ordering)
childann = decorate(childdata, childfctx)
childann = _annotatepair([p1ann, p2ann], childfctx, childann, False, diffopts)
self.assertEqual(
childann[0],
[
annotateline("old", 1),
annotateline("c", 2),
annotateline("p2", 2),
annotateline("c", 4),
annotateline("p2", 3),
],
)
childann = decorate(childdata, childfctx)
childann = _annotatepair([p2ann, p1ann], childfctx, childann, False, diffopts)
self.assertEqual(
childann[0],
[
annotateline("old", 1),
annotateline("c", 2),
annotateline("p1", 3),
annotateline("c", 4),
annotateline("p2", 3),
],
)
# Test with skipchild (note the difference caused by ordering)
childann = decorate(childdata, childfctx)
childann = _annotatepair([p1ann, p2ann], childfctx, childann, True, diffopts)
self.assertEqual(
childann[0],
[
annotateline("old", 1),
annotateline("old", 2, True),
# note that this line was carried over from earlier so it is *not*
# marked skipped
annotateline("p2", 2),
annotateline("p2", 2, True),
annotateline("p2", 3),
],
)
childann = decorate(childdata, childfctx)
childann = _annotatepair([p2ann, p1ann], childfctx, childann, True, diffopts)
self.assertEqual(
childann[0],
[
annotateline("old", 1),
annotateline("old", 2, True),
annotateline("p1", 3),
annotateline("p1", 3, True),
annotateline("p2", 3),
],
)
if __name__ == "__main__":
import silenttestrunner
silenttestrunner.main(__name__)