##// END OF EJS Templates
typing: add stub functions for `cext/charencoding`...
typing: add stub functions for `cext/charencoding` I'm not sure if it's better to have a separate file, and currently pytype doesn't really know how to handle these, so it's no help in figuring that out. Technically, these methods are part of the `mercurial.cext.parsers` module, so put them into the existing stub until there's a reason to split it out.

File last commit:

r52828:77e2994b default
r52834:e58f02e2 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__)