tests/test-rust-ancestor.py
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--
dirstatemap: update, document and type the identity tracking This new form should hopefully be clearer and less error prone.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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__)