Mercurial > public > mercurial-scm > hg
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 |
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__) |