2024-11-20 15:04:32 +00:00
|
|
|
# Nimbus
|
|
|
|
# Copyright (c) 2024 Status Research & Development GmbH
|
|
|
|
# Licensed under either of
|
|
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0)
|
|
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
|
|
|
# http://opensource.org/licenses/MIT)
|
|
|
|
# at your option. This file may not be copied, modified, or
|
|
|
|
# distributed except according to those terms.
|
|
|
|
|
|
|
|
{.used.}
|
|
|
|
|
|
|
|
import
|
2024-12-09 07:15:04 +00:00
|
|
|
std/[sequtils, strutils],
|
2024-11-20 15:04:32 +00:00
|
|
|
stew/byteutils,
|
|
|
|
unittest2,
|
|
|
|
../../nimbus/db/aristo/aristo_desc/desc_nibbles
|
|
|
|
|
|
|
|
suite "Nibbles":
|
|
|
|
test "trivial cases":
|
|
|
|
block:
|
|
|
|
let n = NibblesBuf.fromBytes([])
|
|
|
|
check:
|
|
|
|
n.len == 0
|
|
|
|
block:
|
|
|
|
let n = NibblesBuf.fromBytes([byte 0x10])
|
|
|
|
check:
|
|
|
|
n.len == 2
|
|
|
|
n[0] == 1
|
|
|
|
n[1] == 0
|
|
|
|
$n.slice(1) == "0"
|
|
|
|
$n.slice(2) == ""
|
2024-12-09 07:15:04 +00:00
|
|
|
$n.slice(0, 0) == ""
|
|
|
|
$n.slice(1, 1) == ""
|
|
|
|
$n.slice(0, 1) == "1"
|
2024-11-20 15:04:32 +00:00
|
|
|
|
2024-12-09 07:15:04 +00:00
|
|
|
$(n & n) == "1010"
|
|
|
|
|
|
|
|
NibblesBuf.nibble(0) != NibblesBuf.nibble(1)
|
2024-11-20 15:04:32 +00:00
|
|
|
block:
|
|
|
|
let n = NibblesBuf.fromBytes(repeat(byte 0x12, 32))
|
|
|
|
check:
|
|
|
|
n.len == 64
|
|
|
|
n[0] == 1
|
|
|
|
n[63] == 2
|
|
|
|
|
|
|
|
block:
|
|
|
|
let n = NibblesBuf.fromBytes(repeat(byte 0x12, 33))
|
|
|
|
check:
|
|
|
|
n.len == 64
|
|
|
|
n[0] == 1
|
|
|
|
n[63] == 2
|
|
|
|
|
|
|
|
test "to/from hex encoding":
|
|
|
|
block:
|
|
|
|
let n = NibblesBuf.fromBytes([byte 0x12, 0x34, 0x56])
|
|
|
|
|
|
|
|
let
|
|
|
|
he = n.toHexPrefix(true)
|
|
|
|
ho = n.slice(1).toHexPrefix(true)
|
|
|
|
check:
|
|
|
|
NibblesBuf.fromHexPrefix(he.data()) == (true, n)
|
|
|
|
NibblesBuf.fromHexPrefix(ho.data()) == (true, n.slice(1))
|
|
|
|
block:
|
|
|
|
let n = NibblesBuf.fromBytes(repeat(byte 0x12, 32))
|
|
|
|
|
|
|
|
let
|
|
|
|
he = n.toHexPrefix(true)
|
|
|
|
ho = n.slice(1).toHexPrefix(true)
|
|
|
|
|
|
|
|
check:
|
|
|
|
NibblesBuf.fromHexPrefix(he.data()) == (true, n)
|
|
|
|
NibblesBuf.fromHexPrefix(ho.data()) == (true, n.slice(1))
|
|
|
|
|
|
|
|
NibblesBuf.fromHexPrefix(@(he.data()) & @[byte 1]) == (true, n)
|
|
|
|
NibblesBuf.fromHexPrefix(@(ho.data()) & @[byte 1]) == (true, n.slice(1))
|
|
|
|
|
|
|
|
test "long":
|
|
|
|
let n = NibblesBuf.fromBytes(
|
2024-12-09 07:15:04 +00:00
|
|
|
hexToSeqByte("0100000000000000000000000000000000000000000000000000000000000012")
|
2024-11-20 15:04:32 +00:00
|
|
|
)
|
2024-12-09 07:15:04 +00:00
|
|
|
check:
|
|
|
|
n.getBytes() ==
|
|
|
|
hexToSeqByte("0100000000000000000000000000000000000000000000000000000000000012")
|
|
|
|
|
|
|
|
$n == "0100000000000000000000000000000000000000000000000000000000000012"
|
|
|
|
$(n & default(NibblesBuf)) ==
|
|
|
|
"0100000000000000000000000000000000000000000000000000000000000012"
|
|
|
|
|
|
|
|
$n.slice(1) == "100000000000000000000000000000000000000000000000000000000000012"
|
|
|
|
$n.slice(1, 2) == "1"
|
|
|
|
$(n.slice(1) & NibblesBuf.nibble(1)) ==
|
|
|
|
"1000000000000000000000000000000000000000000000000000000000000121"
|
|
|
|
|
|
|
|
$n.replaceSuffix(n.slice(1, 2)) ==
|
|
|
|
"0100000000000000000000000000000000000000000000000000000000000011"
|
|
|
|
|
|
|
|
for i in 0 ..< 64:
|
|
|
|
check:
|
|
|
|
$n.slice(0, i) ==
|
|
|
|
"0100000000000000000000000000000000000000000000000000000000000012"[0 ..< i]
|
2024-11-20 15:04:32 +00:00
|
|
|
|
2024-12-09 07:15:04 +00:00
|
|
|
for i in 0 ..< 64:
|
|
|
|
check:
|
|
|
|
$n.slice(i) ==
|
|
|
|
"0100000000000000000000000000000000000000000000000000000000000012"[i ..< 64]
|
2024-11-20 15:04:32 +00:00
|
|
|
|
|
|
|
let
|
|
|
|
he = n.toHexPrefix(true)
|
|
|
|
ho = n.slice(1).toHexPrefix(true)
|
|
|
|
check:
|
|
|
|
NibblesBuf.fromHexPrefix(he.data()) == (true, n)
|
|
|
|
NibblesBuf.fromHexPrefix(ho.data()) == (true, n.slice(1))
|
2024-12-09 07:15:04 +00:00
|
|
|
|
|
|
|
test "sharedPrefixLen":
|
|
|
|
let n0 = NibblesBuf.fromBytes(hexToSeqByte("01000000"))
|
|
|
|
let n2 = NibblesBuf.fromBytes(hexToSeqByte("10"))
|
|
|
|
let n = NibblesBuf.fromBytes(
|
|
|
|
hexToSeqByte("0100000000000000000000000000000000000000000000000000000000000012")
|
|
|
|
)
|
|
|
|
let nn = NibblesBuf.fromBytes(
|
|
|
|
hexToSeqByte("0100000000000000000000000000000000000000000000000000000000000013")
|
|
|
|
)
|
|
|
|
|
|
|
|
check:
|
|
|
|
n0.sharedPrefixLen(n0) == 8
|
|
|
|
n0.sharedPrefixLen(n2) == 0
|
|
|
|
n0.slice(1).sharedPrefixLen(n0.slice(1)) == 7
|
|
|
|
n0.slice(7).sharedPrefixLen(n0.slice(7)) == 1
|
|
|
|
n0.slice(1).sharedPrefixLen(n2) == 2
|
|
|
|
|
|
|
|
for i in 0 .. 64:
|
|
|
|
check:
|
|
|
|
n.slice(0, i).sharedPrefixLen(n) == i
|
|
|
|
|
|
|
|
for i in 0 .. 63:
|
|
|
|
check:
|
|
|
|
n.slice(0, i).sharedPrefixLen(nn.slice(0, i)) == i
|
|
|
|
check:
|
|
|
|
n.sharedPrefixLen(nn) == 63
|
|
|
|
|
|
|
|
test "join":
|
|
|
|
block:
|
|
|
|
let
|
|
|
|
n0 = NibblesBuf.fromBytes(repeat(0x00'u8, 32))
|
|
|
|
n1 = NibblesBuf.fromBytes(repeat(0x11'u8, 32))
|
|
|
|
|
|
|
|
for i in 0 ..< 64:
|
|
|
|
check:
|
|
|
|
$(n0.slice(0, 64 - i) & n1.slice(0, i)) ==
|
|
|
|
(strutils.repeat('0', 64 - i) & strutils.repeat('1', i))
|
|
|
|
|
|
|
|
$(n0.slice(0, 1) & n1.slice(0, i)) ==
|
|
|
|
(strutils.repeat('0', 1) & strutils.repeat('1', i))
|
|
|
|
|
|
|
|
for i in 0 ..< 63:
|
|
|
|
check:
|
|
|
|
$(n0.slice(1, 64 - i) & n1.slice(0, i)) ==
|
|
|
|
(strutils.repeat('0', 63 - i) & strutils.repeat('1', i))
|
|
|
|
|
|
|
|
test "replaceSuffix":
|
|
|
|
let
|
|
|
|
n0 = NibblesBuf.fromBytes(repeat(0x00'u8, 32))
|
|
|
|
n1 = NibblesBuf.fromBytes(repeat(0x11'u8, 32))
|
|
|
|
|
|
|
|
check:
|
|
|
|
n0.replaceSuffix(default(NibblesBuf)) == n0
|
|
|
|
n0.replaceSuffix(n0) == n0
|
|
|
|
n0.replaceSuffix(n1) == n1
|
|
|
|
|
|
|
|
for i in 0 ..< 64:
|
|
|
|
check:
|
|
|
|
$n0.replaceSuffix(n1.slice(0, i)) ==
|
|
|
|
(strutils.repeat('0', 64 - i) & strutils.repeat('1', i))
|