equihash: Test vectors for expand_array and indices_from_minimal

Migrated from src/gtest/test_equihash.cpp
This commit is contained in:
Jack Grigg 2020-07-10 21:12:39 +12:00
parent c89d1c8470
commit 20bb9a6c0f
1 changed files with 114 additions and 1 deletions

View File

@ -354,9 +354,122 @@ pub fn is_valid_solution(
#[cfg(test)]
mod tests {
use super::{is_valid_solution, is_valid_solution_iterative, is_valid_solution_recursive};
use super::{
expand_array, indices_from_minimal, is_valid_solution, is_valid_solution_iterative,
is_valid_solution_recursive, Params,
};
use crate::test_vectors::{INVALID_TEST_VECTORS, VALID_TEST_VECTORS};
#[test]
fn array_expansion() {
let check_array = |(bit_len, byte_pad), compact, expanded| {
assert_eq!(expand_array(compact, bit_len, byte_pad), expanded);
};
// 8 11-bit chunks, all-ones
check_array(
(11, 0),
&[
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
],
&[
0x07, 0xff, 0x07, 0xff, 0x07, 0xff, 0x07, 0xff, 0x07, 0xff, 0x07, 0xff, 0x07, 0xff,
0x07, 0xff,
][..],
);
// 8 21-bit chunks, alternating 1s and 0s
check_array(
(21, 0),
&[
0xaa, 0xaa, 0xad, 0x55, 0x55, 0x6a, 0xaa, 0xab, 0x55, 0x55, 0x5a, 0xaa, 0xaa, 0xd5,
0x55, 0x56, 0xaa, 0xaa, 0xb5, 0x55, 0x55,
],
&[
0x15, 0x55, 0x55, 0x15, 0x55, 0x55, 0x15, 0x55, 0x55, 0x15, 0x55, 0x55, 0x15, 0x55,
0x55, 0x15, 0x55, 0x55, 0x15, 0x55, 0x55, 0x15, 0x55, 0x55,
][..],
);
// 8 21-bit chunks, based on example in the spec
check_array(
(21, 0),
&[
0x00, 0x02, 0x20, 0x00, 0x0a, 0x7f, 0xff, 0xfe, 0x00, 0x12, 0x30, 0x22, 0xb3, 0x82,
0x26, 0xac, 0x19, 0xbd, 0xf2, 0x34, 0x56,
],
&[
0x00, 0x00, 0x44, 0x00, 0x00, 0x29, 0x1f, 0xff, 0xff, 0x00, 0x01, 0x23, 0x00, 0x45,
0x67, 0x00, 0x89, 0xab, 0x00, 0xcd, 0xef, 0x12, 0x34, 0x56,
][..],
);
// 16 14-bit chunks, alternating 11s and 00s
check_array(
(14, 0),
&[
0xcc, 0xcf, 0x33, 0x3c, 0xcc, 0xf3, 0x33, 0xcc, 0xcf, 0x33, 0x3c, 0xcc, 0xf3, 0x33,
0xcc, 0xcf, 0x33, 0x3c, 0xcc, 0xf3, 0x33, 0xcc, 0xcf, 0x33, 0x3c, 0xcc, 0xf3, 0x33,
],
&[
0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33,
0x33, 0x33, 0x33, 0x33,
][..],
);
// 8 11-bit chunks, all-ones, 2-byte padding
check_array(
(11, 2),
&[
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
],
&[
0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00,
0x07, 0xff, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x07, 0xff, 0x00, 0x00, 0x07, 0xff,
0x00, 0x00, 0x07, 0xff,
][..],
);
}
#[test]
fn minimal_solution_repr() {
let check_repr = |minimal, indices| {
assert_eq!(
indices_from_minimal(Params { n: 80, k: 3 }, minimal).unwrap(),
indices,
);
};
// The solutions here are not intended to be valid.
check_repr(
&[
0x00, 0x00, 0x08, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x80,
0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x01,
],
&[1, 1, 1, 1, 1, 1, 1, 1],
);
check_repr(
&[
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
],
&[
2097151, 2097151, 2097151, 2097151, 2097151, 2097151, 2097151, 2097151,
],
);
check_repr(
&[
0x0f, 0xff, 0xf8, 0x00, 0x20, 0x03, 0xff, 0xfe, 0x00, 0x08, 0x00, 0xff, 0xff, 0x80,
0x02, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x80,
],
&[131071, 128, 131071, 128, 131071, 128, 131071, 128],
);
check_repr(
&[
0x00, 0x02, 0x20, 0x00, 0x0a, 0x7f, 0xff, 0xfe, 0x00, 0x4d, 0x10, 0x01, 0x4c, 0x80,
0x0f, 0xfc, 0x00, 0x00, 0x2f, 0xff, 0xff,
],
&[68, 41, 2097151, 1233, 665, 1023, 1, 1048575],
);
}
#[test]
fn valid_test_vectors() {
for tv in VALID_TEST_VECTORS {