author | Pierre-Yves David <pierre-yves.david@octobus.net> |
Tue, 18 Feb 2025 22:24:08 +0100 | |
changeset 52964 | 469b9a628b51 |
parent 52838 | e52dc683bf6b |
permissions | -rw-r--r-- |
41053
d9f439fcdb4c
rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents:
40968
diff
changeset
|
1 |
import sys |
40968
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
2 |
|
46113
59fa3890d40a
node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents:
43944
diff
changeset
|
3 |
from mercurial.node import wdirrev |
41350
ab0d762d89ef
rust-cpython: raising error.WdirUnsupported
Georges Racinet <georges.racinet@octobus.net>
parents:
41246
diff
changeset
|
4 |
|
43944
8a8305f557d0
test: extract some generic data and utility from test-rust-ancestor.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43076
diff
changeset
|
5 |
from mercurial.testing import revlog as revlogtesting |
8a8305f557d0
test: extract some generic data and utility from test-rust-ancestor.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43076
diff
changeset
|
6 |
|
40968
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
7 |
try: |
52838
e52dc683bf6b
rust-pyo3: switch over to the pyo3 `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52535
diff
changeset
|
8 |
from mercurial import pyo3_rustext |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41694
diff
changeset
|
9 |
|
52413
20fe0bf9a9a5
rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52405
diff
changeset
|
10 |
pyo3_rustext.__name__ |
40968
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
11 |
except ImportError: |
52838
e52dc683bf6b
rust-pyo3: switch over to the pyo3 `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52535
diff
changeset
|
12 |
pyo3_rustext = None |
40968
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
13 |
|
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
14 |
try: |
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
15 |
from mercurial.cext import parsers as cparsers |
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
16 |
except ImportError: |
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
17 |
cparsers = None |
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
18 |
|
41053
d9f439fcdb4c
rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents:
40968
diff
changeset
|
19 |
|
52532
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
20 |
class RustAncestorsTestMixin: |
40968
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
21 |
"""Test the correctness of binding to Rust code. |
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
22 |
|
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
23 |
This test is merely for the binding to Rust itself: extraction of |
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
24 |
Python variable, giving back the results etc. |
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
25 |
|
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
26 |
It is not meant to test the algorithmic correctness of the operations |
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
27 |
on ancestors it provides. Hence the very simple embedded index data is |
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
28 |
good enough. |
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
29 |
|
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
30 |
Algorithmic correctness is asserted by the Rust unit tests. |
52532
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
31 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
32 |
At this point, we have two sets of bindings, in `hg-cpython` and |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
33 |
`hg-pyo3`. This class used to be for the first and now contains |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
34 |
the tests that are identical in both bindings. As of this writing, |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
35 |
there are more implementations in `hg-cpython` than `hg-pyo3`, hence |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
36 |
some more tests in the subclass for `hg-cpython`. When the work on PyO3 |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
37 |
is complete, the subclasses for `hg-cpython` should have no specific |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
38 |
test left. Later on, when we remove the dead code in `hg-cpython`, the tests |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
39 |
should migrate from the mixin to the class for `hg-pyo3`, until we can |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
40 |
simply remove the mixin. |
40968
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
41 |
""" |
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
42 |
|
52532
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
43 |
@classmethod |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
44 |
def ancestors_mod(cls): |
52838
e52dc683bf6b
rust-pyo3: switch over to the pyo3 `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52535
diff
changeset
|
45 |
return pyo3_rustext.ancestor |
52532
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
46 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
47 |
@classmethod |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
48 |
def dagop_mod(cls): |
52838
e52dc683bf6b
rust-pyo3: switch over to the pyo3 `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52535
diff
changeset
|
49 |
return pyo3_rustext.dagop |
52532
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
50 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
51 |
@classmethod |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
52 |
def graph_error(cls): |
52838
e52dc683bf6b
rust-pyo3: switch over to the pyo3 `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52535
diff
changeset
|
53 |
return pyo3_rustext.GraphError |
52532
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
54 |
|
41053
d9f439fcdb4c
rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents:
40968
diff
changeset
|
55 |
def testiteratorrevlist(self): |
52532
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
56 |
AncestorsIterator = self.ancestors_mod().AncestorsIterator |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
57 |
|
51236
7eea2e4109ae
rust-index: using the `hg::index::Index` in ancestors iterator and lazy set
Georges Racinet <georges.racinet@octobus.net>
parents:
50976
diff
changeset
|
58 |
idx = self.parserustindex() |
41053
d9f439fcdb4c
rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents:
40968
diff
changeset
|
59 |
# checking test assumption about the index binary data: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41694
diff
changeset
|
60 |
self.assertEqual( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41694
diff
changeset
|
61 |
{i: (r[5], r[6]) for i, r in enumerate(idx)}, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41694
diff
changeset
|
62 |
{0: (-1, -1), 1: (0, -1), 2: (1, -1), 3: (2, -1)}, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41694
diff
changeset
|
63 |
) |
41053
d9f439fcdb4c
rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents:
40968
diff
changeset
|
64 |
ait = AncestorsIterator(idx, [3], 0, True) |
d9f439fcdb4c
rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents:
40968
diff
changeset
|
65 |
self.assertEqual([r for r in ait], [3, 2, 1, 0]) |
d9f439fcdb4c
rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents:
40968
diff
changeset
|
66 |
|
d9f439fcdb4c
rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents:
40968
diff
changeset
|
67 |
ait = AncestorsIterator(idx, [3], 0, False) |
d9f439fcdb4c
rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents:
40968
diff
changeset
|
68 |
self.assertEqual([r for r in ait], [2, 1, 0]) |
d9f439fcdb4c
rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents:
40968
diff
changeset
|
69 |
|
52533
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
70 |
ait = AncestorsIterator(idx, [3], 0, False) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
71 |
# tainting the index with a mutation, let's see what happens |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
72 |
# (should be more critical with AncestorsIterator) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
73 |
del idx[0:2] |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
74 |
try: |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
75 |
next(ait) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
76 |
except RuntimeError as exc: |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
77 |
assert "leaked reference after mutation" in exc.args[0] |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
78 |
else: |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
79 |
raise AssertionError("Expected an exception") |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
80 |
|
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
81 |
def testlazyancestors(self): |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
82 |
LazyAncestors = self.ancestors_mod().LazyAncestors |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
83 |
|
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
84 |
idx = self.parserustindex() |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
85 |
start_count = sys.getrefcount(idx.inner) # should be 2 (see Python doc) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
86 |
self.assertEqual( |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
87 |
{i: (r[5], r[6]) for i, r in enumerate(idx)}, |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
88 |
{0: (-1, -1), 1: (0, -1), 2: (1, -1), 3: (2, -1)}, |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
89 |
) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
90 |
lazy = LazyAncestors(idx, [3], 0, True) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
91 |
# the LazyAncestors instance holds just one reference to the |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
92 |
# inner revlog. TODO check that this is normal |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
93 |
self.assertEqual(sys.getrefcount(idx.inner), start_count + 1) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
94 |
|
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
95 |
self.assertTrue(2 in lazy) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
96 |
self.assertTrue(bool(lazy)) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
97 |
self.assertFalse(None in lazy) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
98 |
self.assertEqual(list(lazy), [3, 2, 1, 0]) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
99 |
# a second time to validate that we spawn new iterators |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
100 |
self.assertEqual(list(lazy), [3, 2, 1, 0]) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
101 |
|
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
102 |
# now let's watch the refcounts closer |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
103 |
ait = iter(lazy) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
104 |
self.assertEqual(sys.getrefcount(idx.inner), start_count + 2) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
105 |
del ait |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
106 |
self.assertEqual(sys.getrefcount(idx.inner), start_count + 1) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
107 |
del lazy |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
108 |
self.assertEqual(sys.getrefcount(idx.inner), start_count) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
109 |
|
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
110 |
# let's check bool for an empty one |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
111 |
self.assertFalse(LazyAncestors(idx, [0], 0, False)) |
6b694bdf752a
rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52532
diff
changeset
|
112 |
|
52532
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
113 |
def testrefcount(self): |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
114 |
AncestorsIterator = self.ancestors_mod().AncestorsIterator |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
115 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
116 |
idx = self.parserustindex() |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
117 |
start_count = sys.getrefcount(idx.inner) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
118 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
119 |
# refcount increases upon iterator init... |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
120 |
ait = AncestorsIterator(idx, [3], 0, True) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
121 |
self.assertEqual(sys.getrefcount(idx.inner), start_count + 1) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
122 |
self.assertEqual(next(ait), 3) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
123 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
124 |
# and decreases once the iterator is removed |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
125 |
del ait |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
126 |
self.assertEqual(sys.getrefcount(idx.inner), start_count) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
127 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
128 |
# and removing ref to the index after iterator init is no issue |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
129 |
ait = AncestorsIterator(idx, [3], 0, True) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
130 |
del idx |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
131 |
self.assertEqual(list(ait), [3, 2, 1, 0]) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
132 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
133 |
# the index is not tracked by the GC, hence there is nothing more |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
134 |
# we can assert to check that it is properly deleted once its refcount |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
135 |
# drops to 0 |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
136 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
137 |
def testgrapherror(self): |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
138 |
AncestorsIterator = self.ancestors_mod().AncestorsIterator |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
139 |
GraphError = self.graph_error() |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
140 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
141 |
data = ( |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
142 |
revlogtesting.data_non_inlined[: 64 + 27] |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
143 |
+ b'\xf2' |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
144 |
+ revlogtesting.data_non_inlined[64 + 28 :] |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
145 |
) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
146 |
idx = self.parserustindex(data=data) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
147 |
with self.assertRaises(GraphError) as arc: |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
148 |
AncestorsIterator(idx, [1], -1, False) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
149 |
exc = arc.exception |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
150 |
self.assertIsInstance(exc, ValueError) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
151 |
# rust-cpython issues appropriate str instances for Python 2 and 3 |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
152 |
self.assertEqual(exc.args, ('ParentOutOfRange', 1)) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
153 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
154 |
def testwdirunsupported(self): |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
155 |
AncestorsIterator = self.ancestors_mod().AncestorsIterator |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
156 |
GraphError = self.graph_error() |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
157 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
158 |
# trying to access ancestors of the working directory raises |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
159 |
idx = self.parserustindex() |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
160 |
with self.assertRaises(GraphError) as arc: |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
161 |
list(AncestorsIterator(idx, [wdirrev], -1, False)) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
162 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
163 |
exc = arc.exception |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
164 |
self.assertIsInstance(exc, ValueError) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
165 |
# rust-cpython issues appropriate str instances for Python 2 and 3 |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
166 |
self.assertEqual(exc.args, ('InvalidRevision', wdirrev)) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
167 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
168 |
def testheadrevs(self): |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
169 |
dagop = self.dagop_mod() |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
170 |
|
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
171 |
idx = self.parserustindex() |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
172 |
self.assertEqual(dagop.headrevs(idx, [1, 2, 3]), {3}) |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
173 |
|
41188
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
174 |
def testmissingancestors(self): |
52532
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
175 |
MissingAncestors = self.ancestors_mod().MissingAncestors |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
176 |
|
51237
59d81768ad6d
rust-index: using `hg::index::Index` in MissingAncestors
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51236
diff
changeset
|
177 |
idx = self.parserustindex() |
41188
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
178 |
missanc = MissingAncestors(idx, [1]) |
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
179 |
self.assertTrue(missanc.hasbases()) |
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
180 |
self.assertEqual(missanc.missingancestors([3]), [2, 3]) |
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
181 |
missanc.addbases({2}) |
41243
5257e6299d4c
rust-cpython: set conversion for MissingAncestors.bases()
Georges Racinet <georges.racinet@octobus.net>
parents:
41188
diff
changeset
|
182 |
self.assertEqual(missanc.bases(), {1, 2}) |
41188
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
183 |
self.assertEqual(missanc.missingancestors([3]), [3]) |
41246
619ee4039bd4
rust: MissingAncestors.basesheads()
Georges Racinet <georges.racinet@octobus.net>
parents:
41243
diff
changeset
|
184 |
self.assertEqual(missanc.basesheads(), {2}) |
41188
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
185 |
|
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
186 |
def testmissingancestorsremove(self): |
52532
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
187 |
MissingAncestors = self.ancestors_mod().MissingAncestors |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
188 |
|
51237
59d81768ad6d
rust-index: using `hg::index::Index` in MissingAncestors
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51236
diff
changeset
|
189 |
idx = self.parserustindex() |
41188
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
190 |
missanc = MissingAncestors(idx, [1]) |
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
191 |
revs = {0, 1, 2, 3} |
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
192 |
missanc.removeancestorsfrom(revs) |
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
193 |
self.assertEqual(revs, {2, 3}) |
006c9ce486fa
rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents:
41114
diff
changeset
|
194 |
|
52532
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
195 |
def test_rank(self): |
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
196 |
dagop = self.dagop_mod() |
40968
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
197 |
|
52413
20fe0bf9a9a5
rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52405
diff
changeset
|
198 |
idx = self.parserustindex() |
20fe0bf9a9a5
rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52405
diff
changeset
|
199 |
try: |
52532
3ffcdbf0b432
rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52413
diff
changeset
|
200 |
dagop.rank(idx, 1, 2) |
52413
20fe0bf9a9a5
rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52405
diff
changeset
|
201 |
except pyo3_rustext.GraphError as exc: |
20fe0bf9a9a5
rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52405
diff
changeset
|
202 |
self.assertEqual(exc.args, ("InconsistentGraphData",)) |
20fe0bf9a9a5
rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52405
diff
changeset
|
203 |
|
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41694
diff
changeset
|
204 |
|
40968
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
205 |
if __name__ == '__main__': |
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
206 |
import silenttestrunner |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41694
diff
changeset
|
207 |
|
40968
74f41329bf55
rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
208 |
silenttestrunner.main(__name__) |