annotate tests/test-rust-ancestor.py @ 53042:cdd7bf612c7b stable tip

bundle-spec: properly format boolean parameter (issue6960) This was breaking automatic clone bundle generation. This changeset fixes it and add a test to catch it in the future.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 11 Mar 2025 02:29:42 +0100
parents e52dc683bf6b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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__)