tests/test-rust-revlog.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Tue, 18 Feb 2025 22:24:08 +0100
changeset 52964 469b9a628b51
parent 52814 3fcd86374074
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:
52783
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     1
import struct
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     2
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     3
from mercurial.node import (
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     4
    bin as node_bin,
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     5
    hex,
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     6
)
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
     7
from mercurial import error
52783
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     8
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
     9
try:
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    10
    from mercurial import rustext
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    11
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    12
    rustext.__name__  # trigger immediate actual import
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    13
except ImportError:
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    14
    rustext = None
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    15
else:
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    16
    # this would fail already without appropriate ancestor.__package__
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    17
    from mercurial.rustext.ancestor import LazyAncestors
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    18
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    19
from mercurial.testing import revlog as revlogtesting
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    20
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    21
header = struct.unpack(">I", revlogtesting.data_non_inlined[:4])[0]
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    22
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    23
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    24
class RustInnerRevlogTestMixin:
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    25
    """Common tests for both Rust Python bindings."""
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    26
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    27
    node_hex0 = b'd1f4bbb0befc13bd8cd39d0fcdd93b8c078c4a2f'
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    28
    node0 = node_bin(node_hex0)
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    29
    bogus_node_hex = b'cafe' * 10
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    30
    bogus_node = node_bin(bogus_node_hex)
52789
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    31
    node_hex2 = b"020a0ec626a192ae360b0269fe2de5ba6f05d1e7"
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    32
    node2 = node_bin(node_hex2)
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    33
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    34
    def test_index_nodemap(self):
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    35
        idx = self.parserustindex()
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    36
        self.assertTrue(idx.has_node(self.node0))
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    37
        self.assertFalse(idx.has_node(self.bogus_node))
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    38
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    39
        self.assertEqual(idx.get_rev(self.node0), 0)
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    40
        self.assertEqual(idx.get_rev(self.node0), 0)
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    41
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    42
        self.assertEqual(idx.rev(self.node0), 0)
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    43
        with self.assertRaises(error.RevlogError) as exc_info:
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    44
            idx.rev(self.bogus_node)
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    45
        self.assertEqual(exc_info.exception.args, (None,))
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    46
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    47
        self.assertEqual(idx.partialmatch(self.node_hex0[:3]), self.node0)
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    48
        self.assertIsNone(idx.partialmatch(self.bogus_node_hex[:3]))
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52783
diff changeset
    49
        self.assertEqual(idx.shortest(self.node0), 1)
52783
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
    50
52787
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
    51
    def test_len(self):
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
    52
        idx = self.parserustindex()
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
    53
        self.assertEqual(len(idx), 4)
e5f89bd1a5ee rust-pyo3-revlog: _index___len__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
    54
52791
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    55
    def test_getitem(self):
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    56
        idx = self.parserustindex()
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    57
        as_tuple = (0, 82969, 484626, 0, 0, -1, -1, self.node0, 0, 0, 2, 2, -1)
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    58
        self.assertEqual(idx[0], as_tuple)
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    59
        self.assertEqual(idx[self.node0], 0)
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    60
52795
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52793
diff changeset
    61
    def test_heads(self):
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52793
diff changeset
    62
        idx = self.parserustindex()
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52793
diff changeset
    63
        self.assertEqual(idx.headrevs(), [3])
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52793
diff changeset
    64
52789
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    65
    def test_index_append(self):
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    66
        idx = self.parserustindex(data=b'')
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    67
        self.assertEqual(len(idx), 0)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    68
        self.assertIsNone(idx.get_rev(self.node0))
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    69
52791
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    70
        non_empty_index = self.parserustindex()
0ac956db7ea7 rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52789
diff changeset
    71
        idx.append(non_empty_index[0])
52789
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    72
        self.assertEqual(len(idx), 1)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    73
        self.assertEqual(idx.get_rev(self.node0), 0)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    74
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    75
    def test_index_delitem_single(self):
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    76
        idx = self.parserustindex()
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    77
        del idx[2]
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    78
        self.assertEqual(len(idx), 2)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    79
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    80
        # the nodetree is consistent
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    81
        self.assertEqual(idx.get_rev(self.node0), 0)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    82
        self.assertIsNone(idx.get_rev(self.node2))
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    83
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    84
        # not an error and does nothing
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    85
        del idx[-1]
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    86
        self.assertEqual(len(idx), 2)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    87
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    88
        for bogus in (-2, 17):
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    89
            try:
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    90
                del idx[bogus]
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    91
            except ValueError as exc:
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    92
                # this underlines that we should do better with this message
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    93
                assert exc.args[0] == (
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    94
                    f"Inconsistency: Revision {bogus} found in nodemap "
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    95
                    "is not in revlog index"
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    96
                )
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    97
            else:
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    98
                raise AssertionError(
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
    99
                    f"an exception was expected for `del idx[{bogus}]`"
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   100
                )
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   101
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   102
    def test_index_delitem_slice(self):
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   103
        idx = self.parserustindex()
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   104
        del idx[2:3]
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   105
        self.assertEqual(len(idx), 2)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   106
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   107
        # not an error and not equivalent to `del idx[0::]` but to
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   108
        # `del idx[-1]` instead and thus does nothing.
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   109
        del idx[-1::]
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   110
        self.assertEqual(len(idx), 2)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   111
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   112
        for start, stop in (
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   113
            (-2, None),
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   114
            (17, None),
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   115
        ):
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   116
            try:
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   117
                del idx[start:stop]
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   118
            except ValueError as exc:
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   119
                # this underlines that we should do better with this message
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   120
                assert exc.args[0] == (
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   121
                    f"Inconsistency: Revision {start} found in nodemap "
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   122
                    "is not in revlog index"
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   123
                )
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   124
            else:
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   125
                raise AssertionError(
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   126
                    f"an exception was expected for `del idx[{start}:{stop}]`"
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   127
                )
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   128
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   129
        # although the upper bound is way too big, this is not an error:
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   130
        del idx[0::17]
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   131
        self.assertEqual(len(idx), 0)
34f44aa5e844 rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52787
diff changeset
   132
52792
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   133
    def test_standalone_nodetree(self):
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   134
        idx = self.parserustindex()
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   135
        nt = self.nodetree(idx)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   136
        for i in range(4):
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   137
            nt.insert(i)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   138
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   139
        # invalidation is upon mutation *of the index*
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   140
        self.assertFalse(nt.is_invalidated())
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   141
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   142
        bin_nodes = [entry[7] for entry in idx]
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   143
        hex_nodes = [hex(n) for n in bin_nodes]
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   144
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   145
        for i, node in enumerate(hex_nodes):
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   146
            self.assertEqual(nt.prefix_rev_lookup(node), i)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   147
            self.assertEqual(nt.prefix_rev_lookup(node[:5]), i)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   148
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   149
        # all 4 revisions in idx (standard data set) have different
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   150
        # first nybbles in their Node IDs,
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   151
        # hence `nt.shortest()` should return 1 for them, except when
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   152
        # the leading nybble is 0 (ambiguity with NULL_NODE)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   153
        for i, (bin_node, hex_node) in enumerate(zip(bin_nodes, hex_nodes)):
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   154
            shortest = nt.shortest(bin_node)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   155
            expected = 2 if hex_node[0] == ord('0') else 1
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   156
            self.assertEqual(shortest, expected)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   157
            self.assertEqual(nt.prefix_rev_lookup(hex_node[:shortest]), i)
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   158
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   159
        # test invalidation (generation poisoning) detection
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   160
        del idx[3]
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   161
        self.assertTrue(nt.is_invalidated())
acae91fad6be rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52791
diff changeset
   162
52793
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   163
    def test_reading_context_manager(self):
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   164
        irl = self.make_inner_revlog()
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   165
        try:
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   166
            with irl.reading():
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   167
                # not much to do yet
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   168
                pass
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   169
        except error.RevlogError as exc:
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   170
            # well our data file does not even exist
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   171
            self.assertTrue(b"when reading Just a path/test.d" in exc.args[0])
6a70e4931773 rust-pyo3-revlog: ReadingContextManager
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
   172
52783
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   173
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   174
# Conditional skipping done by the base class
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   175
class RustInnerRevlogTest(
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   176
    revlogtesting.RustRevlogBasedTestBase, RustInnerRevlogTestMixin
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   177
):
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   178
    """For reference"""
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   179
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   180
    def test_ancestors(self):
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   181
        rustidx = self.parserustindex()
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   182
        lazy = LazyAncestors(rustidx, [3], 0, True)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   183
        # we have two more references to the index:
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   184
        # - in its inner iterator for __contains__ and __bool__
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   185
        # - in the LazyAncestors instance itself (to spawn new iterators)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   186
        self.assertTrue(2 in lazy)
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   187
        self.assertTrue(bool(lazy))
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   188
        self.assertEqual(list(lazy), [3, 2, 1, 0])
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   189
        # a second time to validate that we spawn new iterators
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   190
        self.assertEqual(list(lazy), [3, 2, 1, 0])
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   191
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   192
        # let's check bool for an empty one
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   193
        self.assertFalse(LazyAncestors(rustidx, [0], 0, False))
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   194
52814
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52795
diff changeset
   195
    def test_canonical_index_file(self):
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52795
diff changeset
   196
        irl = self.make_inner_revlog()
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52795
diff changeset
   197
        self.assertEqual(irl.canonical_index_file, b'test.i')
3fcd86374074 rust-pyo3-revlog: canonical_index_file property
Rapha?l Gom?s <rgomes@octobus.net>
parents: 52795
diff changeset
   198
52783
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   199
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   200
# Conditional skipping done by the base class
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   201
class PyO3InnerRevlogTest(
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   202
    revlogtesting.PyO3RevlogBasedTestBase, RustInnerRevlogTestMixin
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   203
):
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   204
    """Testing new PyO3 bindings, by comparison with rust-cpython bindings."""
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   205
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   206
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   207
if __name__ == '__main__':
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   208
    import silenttestrunner
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   209
07740bd86fd9 rust-pyo3: reviving test-rust-revlog.py
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
   210
    silenttestrunner.main(__name__)