--- a/tests/test-rust-revlog.py Mon Oct 30 21:25:28 2023 +0100
+++ b/tests/test-rust-revlog.py Mon Oct 30 21:26:17 2023 +0100
@@ -1,6 +1,8 @@
import struct
import unittest
+from mercurial.node import hex
+
try:
from mercurial import rustext
@@ -57,6 +59,35 @@
self.assertFalse(LazyAncestors(rustidx, [0], 0, False))
+@unittest.skipIf(
+ rustext is None,
+ "rustext module revlog relies on is not available",
+)
+class RustRevlogNodeTreeClassTest(revlogtesting.RustRevlogBasedTestBase):
+ def test_standalone_nodetree(self):
+ idx = self.parserustindex()
+ nt = revlog.NodeTree(idx)
+ for i in range(4):
+ nt.insert(i)
+
+ bin_nodes = [entry[7] for entry in idx]
+ hex_nodes = [hex(n) for n in bin_nodes]
+
+ for i, node in enumerate(hex_nodes):
+ self.assertEqual(nt.prefix_rev_lookup(node), i)
+ self.assertEqual(nt.prefix_rev_lookup(node[:5]), i)
+
+ # all 4 revisions in idx (standard data set) have different
+ # first nybbles in their Node IDs,
+ # hence `nt.shortest()` should return 1 for them, except when
+ # the leading nybble is 0 (ambiguity with NULL_NODE)
+ for i, (bin_node, hex_node) in enumerate(zip(bin_nodes, hex_nodes)):
+ shortest = nt.shortest(bin_node)
+ expected = 2 if hex_node[0] == ord('0') else 1
+ self.assertEqual(shortest, expected)
+ self.assertEqual(nt.prefix_rev_lookup(hex_node[:shortest]), i)
+
+
if __name__ == '__main__':
import silenttestrunner