##// END OF EJS Templates
branching: merge default into stable for 6.6rc0
branching: merge default into stable for 6.6rc0

File last commit:

r51872:4c5f6e95 default
r52018:4224b1aa merge stable
Show More
test-rust-ancestor.py
163 lines | 5.5 KiB | text/x-python | PythonLexer
/ tests / test-rust-ancestor.py
Georges Racinet
rust-cpython: binding for AncestorsIterator...
r41083 import sys
Georges Racinet
rust-cpython: testing the bindings from Python...
r41004 import unittest
Joerg Sonnenberger
node: import symbols explicitly...
r46729 from mercurial.node import wdirrev
Georges Racinet
rust-cpython: raising error.WdirUnsupported...
r41386
test: extract some generic data and utility from test-rust-ancestor.py...
r44397 from mercurial.testing import revlog as revlogtesting
Georges Racinet
rust-cpython: testing the bindings from Python...
r41004 try:
from mercurial import rustext
Augie Fackler
formatting: blacken the codebase...
r43346
Georges Racinet
rust-cpython: binding for AncestorsIterator...
r41083 rustext.__name__ # trigger immediate actual import
Georges Racinet
rust-cpython: testing the bindings from Python...
r41004 except ImportError:
rustext = None
Georges Racinet
rust-cpython: binding for AncestorsIterator...
r41083 else:
# this would fail already without appropriate ancestor.__package__
Georges Racinet
rust-cpython: binding for LazyAncestors...
r41149 from mercurial.rustext.ancestor import (
AncestorsIterator,
Georges Racinet
rust-cpython: bindings for MissingAncestors...
r41224 LazyAncestors,
MissingAncestors,
Georges Racinet
rust-cpython: binding for LazyAncestors...
r41149 )
Georges Racinet
rust-cpython: binding for headrevs()...
r41843 from mercurial.rustext import dagop
Georges Racinet
rust-cpython: testing the bindings from Python...
r41004
try:
from mercurial.cext import parsers as cparsers
except ImportError:
cparsers = None
Georges Racinet
rust-cpython: binding for AncestorsIterator...
r41083
Augie Fackler
formatting: blacken the codebase...
r43346 @unittest.skipIf(
test: extract some generic data and utility from test-rust-ancestor.py...
r44397 rustext is None,
'The Rust version of the "ancestor" module is not available. It is needed'
' for this test.',
Augie Fackler
formatting: blacken the codebase...
r43346 )
test: extract some generic data and utility from test-rust-ancestor.py...
r44397 @unittest.skipIf(
rustext is None,
'The Rust or C version of the "parsers" module, which the "ancestor" module'
' relies on, is not available.',
)
class rustancestorstest(revlogtesting.RevlogBasedTestBase):
Georges Racinet
rust-cpython: testing the bindings from Python...
r41004 """Test the correctness of binding to Rust code.
This test is merely for the binding to Rust itself: extraction of
Python variable, giving back the results etc.
It is not meant to test the algorithmic correctness of the operations
on ancestors it provides. Hence the very simple embedded index data is
good enough.
Algorithmic correctness is asserted by the Rust unit tests.
"""
Georges Racinet
rust-cpython: binding for AncestorsIterator...
r41083 def testiteratorrevlist(self):
idx = self.parseindex()
# checking test assumption about the index binary data:
Augie Fackler
formatting: blacken the codebase...
r43346 self.assertEqual(
{i: (r[5], r[6]) for i, r in enumerate(idx)},
{0: (-1, -1), 1: (0, -1), 2: (1, -1), 3: (2, -1)},
)
Georges Racinet
rust-cpython: binding for AncestorsIterator...
r41083 ait = AncestorsIterator(idx, [3], 0, True)
self.assertEqual([r for r in ait], [3, 2, 1, 0])
ait = AncestorsIterator(idx, [3], 0, False)
self.assertEqual([r for r in ait], [2, 1, 0])
Georges Racinet
rust-cpython: binding for LazyAncestors...
r41149 def testlazyancestors(self):
idx = self.parseindex()
start_count = sys.getrefcount(idx) # should be 2 (see Python doc)
Augie Fackler
formatting: blacken the codebase...
r43346 self.assertEqual(
{i: (r[5], r[6]) for i, r in enumerate(idx)},
{0: (-1, -1), 1: (0, -1), 2: (1, -1), 3: (2, -1)},
)
Georges Racinet
rust-cpython: binding for LazyAncestors...
r41149 lazy = LazyAncestors(idx, [3], 0, True)
# we have two more references to the index:
# - in its inner iterator for __contains__ and __bool__
# - in the LazyAncestors instance itself (to spawn new iterators)
self.assertEqual(sys.getrefcount(idx), start_count + 2)
self.assertTrue(2 in lazy)
self.assertTrue(bool(lazy))
self.assertEqual(list(lazy), [3, 2, 1, 0])
# a second time to validate that we spawn new iterators
self.assertEqual(list(lazy), [3, 2, 1, 0])
# now let's watch the refcounts closer
ait = iter(lazy)
self.assertEqual(sys.getrefcount(idx), start_count + 3)
del ait
self.assertEqual(sys.getrefcount(idx), start_count + 2)
del lazy
self.assertEqual(sys.getrefcount(idx), start_count)
# let's check bool for an empty one
self.assertFalse(LazyAncestors(idx, [0], 0, False))
Georges Racinet
rust-cpython: bindings for MissingAncestors...
r41224 def testmissingancestors(self):
idx = self.parseindex()
missanc = MissingAncestors(idx, [1])
self.assertTrue(missanc.hasbases())
self.assertEqual(missanc.missingancestors([3]), [2, 3])
missanc.addbases({2})
Georges Racinet
rust-cpython: set conversion for MissingAncestors.bases()...
r41279 self.assertEqual(missanc.bases(), {1, 2})
Georges Racinet
rust-cpython: bindings for MissingAncestors...
r41224 self.assertEqual(missanc.missingancestors([3]), [3])
Georges Racinet
rust: MissingAncestors.basesheads()...
r41282 self.assertEqual(missanc.basesheads(), {2})
Georges Racinet
rust-cpython: bindings for MissingAncestors...
r41224
def testmissingancestorsremove(self):
idx = self.parseindex()
missanc = MissingAncestors(idx, [1])
revs = {0, 1, 2, 3}
missanc.removeancestorsfrom(revs)
self.assertEqual(revs, {2, 3})
Georges Racinet
rust-cpython: binding for AncestorsIterator...
r41083 def testrefcount(self):
idx = self.parseindex()
start_count = sys.getrefcount(idx)
# refcount increases upon iterator init...
ait = AncestorsIterator(idx, [3], 0, True)
self.assertEqual(sys.getrefcount(idx), start_count + 1)
self.assertEqual(next(ait), 3)
# and decreases once the iterator is removed
del ait
self.assertEqual(sys.getrefcount(idx), start_count)
# and removing ref to the index after iterator init is no issue
ait = AncestorsIterator(idx, [3], 0, True)
del idx
Georges Racinet
rust-cpython: binding for LazyAncestors...
r41149 self.assertEqual(list(ait), [3, 2, 1, 0])
Georges Racinet
rust-cpython: testing the bindings from Python...
r41004
def testgrapherror(self):
Augie Fackler
formatting: blacken the codebase...
r43346 data = (
test: extract some generic data and utility from test-rust-ancestor.py...
r44397 revlogtesting.data_non_inlined[: 64 + 27]
+ b'\xf2'
+ revlogtesting.data_non_inlined[64 + 28 :]
Augie Fackler
formatting: blacken the codebase...
r43346 )
Georges Racinet
rust-cpython: binding for AncestorsIterator...
r41083 idx = cparsers.parse_index2(data, False)[0]
with self.assertRaises(rustext.GraphError) as arc:
AncestorsIterator(idx, [1], -1, False)
exc = arc.exception
self.assertIsInstance(exc, ValueError)
# rust-cpython issues appropriate str instances for Python 2 and 3
self.assertEqual(exc.args, ('ParentOutOfRange', 1))
Georges Racinet
rust-cpython: testing the bindings from Python...
r41004
Georges Racinet
rust-cpython: raising error.WdirUnsupported...
r41386 def testwdirunsupported(self):
# trying to access ancestors of the working directory raises
idx = self.parseindex()
Raphaël Gomès
rust: make `Revision` a newtype...
r51872 with self.assertRaises(rustext.GraphError) as arc:
Joerg Sonnenberger
node: import symbols explicitly...
r46729 list(AncestorsIterator(idx, [wdirrev], -1, False))
Georges Racinet
rust-cpython: testing the bindings from Python...
r41004
Raphaël Gomès
rust: make `Revision` a newtype...
r51872 exc = arc.exception
self.assertIsInstance(exc, ValueError)
# rust-cpython issues appropriate str instances for Python 2 and 3
self.assertEqual(exc.args, ('InvalidRevision', wdirrev))
Georges Racinet
rust-cpython: binding for headrevs()...
r41843 def testheadrevs(self):
idx = self.parseindex()
self.assertEqual(dagop.headrevs(idx, [1, 2, 3]), {3})
Augie Fackler
formatting: blacken the codebase...
r43346
Georges Racinet
rust-cpython: testing the bindings from Python...
r41004 if __name__ == '__main__':
import silenttestrunner
Augie Fackler
formatting: blacken the codebase...
r43346
Georges Racinet
rust-cpython: testing the bindings from Python...
r41004 silenttestrunner.main(__name__)