##// END OF EJS Templates
rhg: add resolve_file_args to path_utils.rs...
rhg: add resolve_file_args to path_utils.rs Extracted logic for resolving `FILE ...` arguments from cat.rs into a new function in path_utils.rs. I plan to use this for rhg annotate. I tried to reuse hg::utils::files::canonical_path instead, but that didn't work. For example it reports a InsideDotHg error for any path containing "..".

File last commit:

r52828:77e2994b default
r53438:f33f37ac tip default
Show More
test-linerange.py
241 lines | 7.4 KiB | text/x-python | PythonLexer
/ tests / test-linerange.py
Denis Laxalde
mdiff: add a "blocksinrange" function to filter diff blocks by line range...
r30717 import unittest
from mercurial import error, mdiff
Emmanuel Leblond
py3: fix exception message check in test-linerange.py's testOutOfRange...
r43683 from mercurial.utils import stringutil
Denis Laxalde
mdiff: add a "blocksinrange" function to filter diff blocks by line range...
r30717
# for readability, line numbers are 0-origin
Pulkit Goyal
py3: add b'' prefixes in tests/test-linerange.py...
r37601 text1 = b'''
Denis Laxalde
mdiff: add a "blocksinrange" function to filter diff blocks by line range...
r30717 00 at OLD
01 at OLD
02 at OLD
02 at NEW, 03 at OLD
03 at NEW, 04 at OLD
04 at NEW, 05 at OLD
05 at NEW, 06 at OLD
07 at OLD
08 at OLD
09 at OLD
10 at OLD
11 at OLD
Augie Fackler
formatting: blacken the codebase...
r43346 '''[
1:
] # strip initial LF
Denis Laxalde
mdiff: add a "blocksinrange" function to filter diff blocks by line range...
r30717
Pulkit Goyal
py3: add b'' prefixes in tests/test-linerange.py...
r37601 text2 = b'''
Denis Laxalde
mdiff: add a "blocksinrange" function to filter diff blocks by line range...
r30717 00 at NEW
01 at NEW
02 at NEW, 03 at OLD
03 at NEW, 04 at OLD
04 at NEW, 05 at OLD
05 at NEW, 06 at OLD
06 at NEW
07 at NEW
08 at NEW
09 at NEW
10 at NEW
11 at NEW
Augie Fackler
formatting: blacken the codebase...
r43346 '''[
1:
] # strip initial LF
Denis Laxalde
mdiff: add a "blocksinrange" function to filter diff blocks by line range...
r30717
def filteredblocks(blocks, rangeb):
"""return `rangea` extracted from `blocks` coming from
`mdiff.blocksinrange` along with the mask of blocks within rangeb.
"""
filtered, rangea = mdiff.blocksinrange(blocks, rangeb)
skipped = [b not in filtered for b in blocks]
return rangea, skipped
Augie Fackler
formatting: blacken the codebase...
r43346
Denis Laxalde
mdiff: add a "blocksinrange" function to filter diff blocks by line range...
r30717 class blocksinrangetests(unittest.TestCase):
def setUp(self):
self.blocks = list(mdiff.allblocks(text1, text2))
assert self.blocks == [
Matt Harbison
mdiff: convert a few block definitions from lists to tuples...
r52828 ((0, 3, 0, 2), b'!'),
Pulkit Goyal
py3: add b'' prefixes in tests/test-linerange.py...
r37601 ((3, 7, 2, 6), b'='),
Matt Harbison
mdiff: convert a few block definitions from lists to tuples...
r52828 ((7, 12, 6, 12), b'!'),
Pulkit Goyal
py3: add b'' prefixes in tests/test-linerange.py...
r37601 ((12, 12, 12, 12), b'='),
Denis Laxalde
mdiff: add a "blocksinrange" function to filter diff blocks by line range...
r30717 ], self.blocks
def testWithinEqual(self):
"""linerange within an "=" block"""
# IDX 0 1
# 012345678901
# SRC NNOOOONNNNNN (New/Old)
# ^^
linerange2 = (3, 5)
linerange1, skipped = filteredblocks(self.blocks, linerange2)
self.assertEqual(linerange1, (4, 6))
self.assertEqual(skipped, [True, False, True, True])
def testWithinEqualStrictly(self):
"""linerange matching exactly an "=" block"""
# IDX 0 1
# 012345678901
# SRC NNOOOONNNNNN (New/Old)
# ^^^^
linerange2 = (2, 6)
linerange1, skipped = filteredblocks(self.blocks, linerange2)
self.assertEqual(linerange1, (3, 7))
self.assertEqual(skipped, [True, False, True, True])
def testWithinEqualLowerbound(self):
"""linerange at beginning of an "=" block"""
# IDX 0 1
# 012345678901
# SRC NNOOOONNNNNN (New/Old)
# ^^
linerange2 = (2, 4)
linerange1, skipped = filteredblocks(self.blocks, linerange2)
self.assertEqual(linerange1, (3, 5))
self.assertEqual(skipped, [True, False, True, True])
def testWithinEqualLowerboundOneline(self):
"""oneline-linerange at beginning of an "=" block"""
# IDX 0 1
# 012345678901
# SRC NNOOOONNNNNN (New/Old)
# ^
linerange2 = (2, 3)
linerange1, skipped = filteredblocks(self.blocks, linerange2)
self.assertEqual(linerange1, (3, 4))
self.assertEqual(skipped, [True, False, True, True])
def testWithinEqualUpperbound(self):
"""linerange at end of an "=" block"""
# IDX 0 1
# 012345678901
# SRC NNOOOONNNNNN (New/Old)
# ^^^
linerange2 = (3, 6)
linerange1, skipped = filteredblocks(self.blocks, linerange2)
self.assertEqual(linerange1, (4, 7))
self.assertEqual(skipped, [True, False, True, True])
def testWithinEqualUpperboundOneLine(self):
"""oneline-linerange at end of an "=" block"""
# IDX 0 1
# 012345678901
# SRC NNOOOONNNNNN (New/Old)
# ^
linerange2 = (5, 6)
linerange1, skipped = filteredblocks(self.blocks, linerange2)
self.assertEqual(linerange1, (6, 7))
self.assertEqual(skipped, [True, False, True, True])
def testWithinFirstBlockNeq(self):
"""linerange within the first "!" block"""
# IDX 0 1
# 012345678901
# SRC NNOOOONNNNNN (New/Old)
# ^
# | (empty)
# ^
# ^^
for linerange2 in [
(0, 1),
(1, 1),
(1, 2),
(0, 2),
]:
linerange1, skipped = filteredblocks(self.blocks, linerange2)
self.assertEqual(linerange1, (0, 3))
self.assertEqual(skipped, [False, True, True, True])
def testWithinLastBlockNeq(self):
"""linerange within the last "!" block"""
# IDX 0 1
# 012345678901
# SRC NNOOOONNNNNN (New/Old)
# ^
# ^
# | (empty)
# ^^^^^^
# ^
for linerange2 in [
(6, 7),
(7, 8),
(7, 7),
(6, 12),
(11, 12),
]:
linerange1, skipped = filteredblocks(self.blocks, linerange2)
self.assertEqual(linerange1, (7, 12))
self.assertEqual(skipped, [True, True, False, True])
def testAccrossTwoBlocks(self):
"""linerange accross two blocks"""
# IDX 0 1
# 012345678901
# SRC NNOOOONNNNNN (New/Old)
# ^^^^
linerange2 = (1, 5)
linerange1, skipped = filteredblocks(self.blocks, linerange2)
self.assertEqual(linerange1, (0, 6))
self.assertEqual(skipped, [False, False, True, True])
def testCrossingSeveralBlocks(self):
"""linerange accross three blocks"""
# IDX 0 1
# 012345678901
# SRC NNOOOONNNNNN (New/Old)
# ^^^^^^^
linerange2 = (1, 8)
linerange1, skipped = filteredblocks(self.blocks, linerange2)
self.assertEqual(linerange1, (0, 12))
self.assertEqual(skipped, [False, False, False, True])
def testStartInEqBlock(self):
"""linerange starting in an "=" block"""
# IDX 0 1
# 012345678901
# SRC NNOOOONNNNNN (New/Old)
# ^^^^
# ^^^^^^^
for linerange2, expectedlinerange1 in [
((5, 9), (6, 12)),
((4, 11), (5, 12)),
]:
linerange1, skipped = filteredblocks(self.blocks, linerange2)
self.assertEqual(linerange1, expectedlinerange1)
self.assertEqual(skipped, [True, False, False, True])
def testEndInEqBlock(self):
"""linerange ending in an "=" block"""
# IDX 0 1
# 012345678901
# SRC NNOOOONNNNNN (New/Old)
# ^^
# ^^^^^
for linerange2, expectedlinerange1 in [
((1, 3), (0, 4)),
((0, 4), (0, 5)),
]:
linerange1, skipped = filteredblocks(self.blocks, linerange2)
self.assertEqual(linerange1, expectedlinerange1)
self.assertEqual(skipped, [False, False, True, True])
def testOutOfRange(self):
"""linerange exceeding file size"""
exctype = error.Abort
for linerange2 in [
(0, 34),
(15, 12),
]:
# Could be `with self.assertRaises(error.Abort)` but python2.6
# does not have assertRaises context manager.
try:
mdiff.blocksinrange(self.blocks, linerange2)
except exctype as exc:
Emmanuel Leblond
py3: fix exception message check in test-linerange.py's testOutOfRange...
r43683 self.assertTrue(
b'line range exceeds file size'
in stringutil.forcebytestr(exc)
)
Denis Laxalde
mdiff: add a "blocksinrange" function to filter diff blocks by line range...
r30717 else:
self.fail('%s not raised' % exctype.__name__)
Augie Fackler
formatting: blacken the codebase...
r43346
Denis Laxalde
mdiff: add a "blocksinrange" function to filter diff blocks by line range...
r30717 if __name__ == '__main__':
import silenttestrunner
Augie Fackler
formatting: blacken the codebase...
r43346
Denis Laxalde
mdiff: add a "blocksinrange" function to filter diff blocks by line range...
r30717 silenttestrunner.main(__name__)