tests/test-rust-ancestor.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 02 Jan 2025 14:50:06 +0100
changeset 52592 87ceb51d124c
parent 52535 507fec66014f
child 52838 e52dc683bf6b
permissions -rw-r--r--
run-tests: drop jython support I don't think we heard anything about jython support for the past 15 years, so let's drop special support for it in run-tests.py it is most probably broken at that point.
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:
52413
20fe0bf9a9a5 rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52405
diff changeset
     8
    from mercurial import pyo3_rustext, rustext
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41694
diff changeset
     9
41053
d9f439fcdb4c rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents: 40968
diff changeset
    10
    rustext.__name__  # trigger immediate actual import
52413
20fe0bf9a9a5 rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52405
diff changeset
    11
    pyo3_rustext.__name__
40968
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    12
except ImportError:
52413
20fe0bf9a9a5 rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52405
diff changeset
    13
    rustext = pyo3_rustext = None
40968
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    14
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    15
try:
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    16
    from mercurial.cext import parsers as cparsers
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    17
except ImportError:
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    18
    cparsers = None
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    19
41053
d9f439fcdb4c rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents: 40968
diff changeset
    20
52532
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    21
class RustAncestorsTestMixin:
40968
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    22
    """Test the correctness of binding to Rust code.
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    23
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    24
    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
    25
    Python variable, giving back the results etc.
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    26
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    27
    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
    28
    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
    29
    good enough.
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    30
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    31
    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
    32
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    33
    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
    34
    `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
    35
    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
    36
    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
    37
    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
    38
    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
    39
    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
    40
    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
    41
    simply remove the mixin.
40968
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    42
    """
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
    43
52532
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    44
    @classmethod
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    45
    def ancestors_mod(cls):
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    46
        return cls.rustext_pkg.ancestor
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    47
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    48
    @classmethod
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    49
    def dagop_mod(cls):
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    50
        return cls.rustext_pkg.dagop
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    51
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    52
    @classmethod
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    53
    def graph_error(cls):
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    54
        return cls.rustext_pkg.GraphError
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    55
41053
d9f439fcdb4c rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents: 40968
diff changeset
    56
    def testiteratorrevlist(self):
52532
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    57
        AncestorsIterator = self.ancestors_mod().AncestorsIterator
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
    58
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
    59
        idx = self.parserustindex()
41053
d9f439fcdb4c rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents: 40968
diff changeset
    60
        # checking test assumption about the index binary data:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41694
diff changeset
    61
        self.assertEqual(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41694
diff changeset
    62
            {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
    63
            {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
    64
        )
41053
d9f439fcdb4c rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents: 40968
diff changeset
    65
        ait = AncestorsIterator(idx, [3], 0, True)
d9f439fcdb4c rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents: 40968
diff changeset
    66
        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
    67
d9f439fcdb4c rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents: 40968
diff changeset
    68
        ait = AncestorsIterator(idx, [3], 0, False)
d9f439fcdb4c rust-cpython: binding for AncestorsIterator
Georges Racinet <gracinet@anybox.fr>
parents: 40968
diff changeset
    69
        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
    70
52533
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    71
        ait = AncestorsIterator(idx, [3], 0, False)
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    72
        # 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
    73
        # (should be more critical with AncestorsIterator)
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    74
        del idx[0:2]
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    75
        try:
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    76
            next(ait)
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    77
        except RuntimeError as exc:
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    78
            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
    79
        else:
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    80
            raise AssertionError("Expected an exception")
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    81
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    82
    def testlazyancestors(self):
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    83
        LazyAncestors = self.ancestors_mod().LazyAncestors
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    84
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    85
        idx = self.parserustindex()
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    86
        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
    87
        self.assertEqual(
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    88
            {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
    89
            {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
    90
        )
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    91
        lazy = LazyAncestors(idx, [3], 0, True)
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    92
        # 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
    93
        # inner revlog. TODO check that this is normal
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    94
        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
    95
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    96
        self.assertTrue(2 in lazy)
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    97
        self.assertTrue(bool(lazy))
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    98
        self.assertFalse(None in lazy)
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
    99
        self.assertEqual(list(lazy), [3, 2, 1, 0])
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
   100
        # 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
   101
        self.assertEqual(list(lazy), [3, 2, 1, 0])
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
   102
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
   103
        # now let's watch the refcounts closer
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
   104
        ait = iter(lazy)
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
   105
        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
   106
        del ait
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
   107
        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
   108
        del lazy
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
   109
        self.assertEqual(sys.getrefcount(idx.inner), start_count)
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
   110
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
   111
        # let's check bool for an empty one
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
   112
        self.assertFalse(LazyAncestors(idx, [0], 0, False))
6b694bdf752a rust-pyo3: implementation of LazyAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52532
diff changeset
   113
52532
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   114
    def testrefcount(self):
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   115
        AncestorsIterator = self.ancestors_mod().AncestorsIterator
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   116
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   117
        idx = self.parserustindex()
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   118
        start_count = sys.getrefcount(idx.inner)
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   119
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   120
        # refcount increases upon iterator init...
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   121
        ait = AncestorsIterator(idx, [3], 0, True)
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   122
        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
   123
        self.assertEqual(next(ait), 3)
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   124
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   125
        # and decreases once the iterator is removed
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   126
        del ait
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   127
        self.assertEqual(sys.getrefcount(idx.inner), start_count)
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   128
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   129
        # 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
   130
        ait = AncestorsIterator(idx, [3], 0, True)
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   131
        del idx
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   132
        self.assertEqual(list(ait), [3, 2, 1, 0])
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   133
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   134
        # 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
   135
        # 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
   136
        # drops to 0
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   137
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   138
    def testgrapherror(self):
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   139
        AncestorsIterator = self.ancestors_mod().AncestorsIterator
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   140
        GraphError = self.graph_error()
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   141
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   142
        data = (
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   143
            revlogtesting.data_non_inlined[: 64 + 27]
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   144
            + b'\xf2'
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   145
            + revlogtesting.data_non_inlined[64 + 28 :]
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   146
        )
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   147
        idx = self.parserustindex(data=data)
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   148
        with self.assertRaises(GraphError) as arc:
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   149
            AncestorsIterator(idx, [1], -1, False)
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   150
        exc = arc.exception
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   151
        self.assertIsInstance(exc, ValueError)
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   152
        # 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
   153
        self.assertEqual(exc.args, ('ParentOutOfRange', 1))
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   154
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   155
    def testwdirunsupported(self):
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   156
        AncestorsIterator = self.ancestors_mod().AncestorsIterator
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   157
        GraphError = self.graph_error()
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   158
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   159
        # 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
   160
        idx = self.parserustindex()
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   161
        with self.assertRaises(GraphError) as arc:
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   162
            list(AncestorsIterator(idx, [wdirrev], -1, False))
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   163
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   164
        exc = arc.exception
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   165
        self.assertIsInstance(exc, ValueError)
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   166
        # 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
   167
        self.assertEqual(exc.args, ('InvalidRevision', wdirrev))
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   168
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   169
    def testheadrevs(self):
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   170
        dagop = self.dagop_mod()
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   171
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   172
        idx = self.parserustindex()
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   173
        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
   174
41188
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   175
    def testmissingancestors(self):
52532
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   176
        MissingAncestors = self.ancestors_mod().MissingAncestors
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   177
51237
59d81768ad6d rust-index: using `hg::index::Index` in MissingAncestors
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents: 51236
diff changeset
   178
        idx = self.parserustindex()
41188
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   179
        missanc = MissingAncestors(idx, [1])
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   180
        self.assertTrue(missanc.hasbases())
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   181
        self.assertEqual(missanc.missingancestors([3]), [2, 3])
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   182
        missanc.addbases({2})
41243
5257e6299d4c rust-cpython: set conversion for MissingAncestors.bases()
Georges Racinet <georges.racinet@octobus.net>
parents: 41188
diff changeset
   183
        self.assertEqual(missanc.bases(), {1, 2})
41188
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   184
        self.assertEqual(missanc.missingancestors([3]), [3])
41246
619ee4039bd4 rust: MissingAncestors.basesheads()
Georges Racinet <georges.racinet@octobus.net>
parents: 41243
diff changeset
   185
        self.assertEqual(missanc.basesheads(), {2})
41188
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   186
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   187
    def testmissingancestorsremove(self):
52532
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   188
        MissingAncestors = self.ancestors_mod().MissingAncestors
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   189
51237
59d81768ad6d rust-index: using `hg::index::Index` in MissingAncestors
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents: 51236
diff changeset
   190
        idx = self.parserustindex()
41188
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   191
        missanc = MissingAncestors(idx, [1])
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   192
        revs = {0, 1, 2, 3}
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   193
        missanc.removeancestorsfrom(revs)
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   194
        self.assertEqual(revs, {2, 3})
006c9ce486fa rust-cpython: bindings for MissingAncestors
Georges Racinet <georges.racinet@octobus.net>
parents: 41114
diff changeset
   195
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
   196
52535
507fec66014f rust-pyo3: MissingAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52533
diff changeset
   197
class RustCPythonAncestorsTest(
507fec66014f rust-pyo3: MissingAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52533
diff changeset
   198
    revlogtesting.RustRevlogBasedTestBase, RustAncestorsTestMixin
507fec66014f rust-pyo3: MissingAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52533
diff changeset
   199
):
507fec66014f rust-pyo3: MissingAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52533
diff changeset
   200
    rustext_pkg = rustext
507fec66014f rust-pyo3: MissingAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52533
diff changeset
   201
507fec66014f rust-pyo3: MissingAncestors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52533
diff changeset
   202
52532
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   203
class PyO3AncestorsTest(
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   204
    revlogtesting.RustRevlogBasedTestBase, RustAncestorsTestMixin
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   205
):
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   206
    rustext_pkg = pyo3_rustext
40968
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
   207
52532
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   208
    def test_rank(self):
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   209
        dagop = self.dagop_mod()
40968
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
   210
52413
20fe0bf9a9a5 rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52405
diff changeset
   211
        idx = self.parserustindex()
20fe0bf9a9a5 rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52405
diff changeset
   212
        try:
52532
3ffcdbf0b432 rust: test AncestorsIterator without duplication
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52413
diff changeset
   213
            dagop.rank(idx, 1, 2)
52413
20fe0bf9a9a5 rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52405
diff changeset
   214
        except pyo3_rustext.GraphError as exc:
20fe0bf9a9a5 rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52405
diff changeset
   215
            self.assertEqual(exc.args, ("InconsistentGraphData",))
20fe0bf9a9a5 rust-pyo3: dagop submodule implementation
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52405
diff changeset
   216
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41694
diff changeset
   217
40968
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
   218
if __name__ == '__main__':
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
   219
    import silenttestrunner
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41694
diff changeset
   220
40968
74f41329bf55 rust-cpython: testing the bindings from Python
Georges Racinet <gracinet@anybox.fr>
parents:
diff changeset
   221
    silenttestrunner.main(__name__)