Merge rust-bitcoin/rust-bitcoin#4036: primitives: Add tests to witness

7e66091e1e Add from impl tests (Jamil Lambert, PhD)
2f95064cfd Add from_parts test (Jamil Lambert, PhD)
3ee66c5bb8 Modify push test (Jamil Lambert, PhD)

Pull request description:

  Add tests to kill the mutants in `primitives/src/witness.rs`

ACKs for top commit:
  tcharding:
    ACK 7e66091e1e
  apoelstra:
    ACK 7e66091e1e8b6cdd3e40d001ea1824125f7175e7; successfully ran local tests

Tree-SHA512: 57b2b0e4dbd93023d1a6a9709a02fa843e3ef9b25e7293ad641726b9c335e220a4ed87b717ec5dda999217677a916b86ac7daa9aaaec077afbfee4789836344e
This commit is contained in:
merge-script 2025-02-14 01:41:08 +00:00
commit fce0cf1692
No known key found for this signature in database
GPG Key ID: C588D63CE41B97C1
1 changed files with 48 additions and 6 deletions

View File

@ -497,6 +497,7 @@ mod test {
fn push() { fn push() {
// Sanity check default. // Sanity check default.
let mut witness = Witness::default(); let mut witness = Witness::default();
assert!(witness.is_empty());
assert_eq!(witness.last(), None); assert_eq!(witness.last(), None);
assert_eq!(witness.second_to_last(), None); assert_eq!(witness.second_to_last(), None);
@ -506,10 +507,11 @@ mod test {
assert_eq!(witness.nth(3), None); assert_eq!(witness.nth(3), None);
// Push a single byte element onto the witness stack. // Push a single byte element onto the witness stack.
let push = [0_u8]; let push = [11_u8];
witness.push(push); witness.push(push);
assert!(!witness.is_empty());
let elements = [1u8, 0]; let elements = [1u8, 11];
let expected = Witness { let expected = Witness {
witness_elements: 1, witness_elements: 1,
content: append_u32_vec(&elements, &[0]), // Start at index 0. content: append_u32_vec(&elements, &[0]), // Start at index 0.
@ -529,10 +531,10 @@ mod test {
assert_eq!(witness.nth(3), None); assert_eq!(witness.nth(3), None);
// Now push 2 byte element onto the witness stack. // Now push 2 byte element onto the witness stack.
let push = [2u8, 3u8]; let push = [21u8, 22u8];
witness.push(push); witness.push(push);
let elements = [1u8, 0, 2, 2, 3]; let elements = [1u8, 11, 2, 21, 22];
let expected = Witness { let expected = Witness {
witness_elements: 2, witness_elements: 2,
content: append_u32_vec(&elements, &[0, 2]), content: append_u32_vec(&elements, &[0, 2]),
@ -552,10 +554,10 @@ mod test {
assert_eq!(witness.last(), Some(element_1)); assert_eq!(witness.last(), Some(element_1));
// Now push another 2 byte element onto the witness stack. // Now push another 2 byte element onto the witness stack.
let push = [4u8, 5u8]; let push = [31u8, 32u8];
witness.push(push); witness.push(push);
let elements = [1u8, 0, 2, 2, 3, 2, 4, 5]; let elements = [1u8, 11, 2, 21, 22, 2, 31, 32];
let expected = Witness { let expected = Witness {
witness_elements: 3, witness_elements: 3,
content: append_u32_vec(&elements, &[0, 2, 5]), content: append_u32_vec(&elements, &[0, 2, 5]),
@ -571,6 +573,7 @@ mod test {
assert_eq!(witness.nth(2), Some(element_2)); assert_eq!(witness.nth(2), Some(element_2));
assert_eq!(witness.nth(3), None); assert_eq!(witness.nth(3), None);
assert_eq!(witness.third_to_last(), Some(element_0));
assert_eq!(witness.second_to_last(), Some(element_1)); assert_eq!(witness.second_to_last(), Some(element_1));
assert_eq!(witness.last(), Some(element_2)); assert_eq!(witness.last(), Some(element_2));
} }
@ -594,6 +597,45 @@ mod test {
} }
} }
#[test]
fn witness_from_parts() {
let elements = [1u8, 11, 2, 21, 22];
let witness_elements = 2;
let content = append_u32_vec(&elements, &[0, 2]);
let indices_start = elements.len();
let witness = Witness::from_parts__unstable(content.clone(), witness_elements, indices_start);
assert_eq!(witness.nth(0).unwrap(), [11_u8]);
assert_eq!(witness.nth(1).unwrap(), [21_u8, 22]);
assert_eq!(witness.size(), 6);
}
#[test]
fn witness_from_impl() {
// Test From implementations with the same 2 elements
let vec = vec![vec![11], vec![21, 22]];
let slice_vec: &[Vec<u8>] = &vec;
let slice_slice: &[&[u8]] = &[&[11u8], &[21, 22]];
let vec_slice: Vec<&[u8]> = vec![&[11u8], &[21, 22]];
let witness_vec_vec = Witness::from(vec.clone());
let witness_slice_vec = Witness::from(slice_vec);
let witness_slice_slice = Witness::from(slice_slice);
let witness_vec_slice = Witness::from(vec_slice);
let mut expected = Witness::from_slice(&vec);
assert_eq!(expected.len(), 2);
assert_eq!(expected.to_vec(), vec);
assert_eq!(witness_vec_vec, expected);
assert_eq!(witness_slice_vec, expected);
assert_eq!(witness_slice_slice, expected);
assert_eq!(witness_vec_slice, expected);
// Test clear method
expected.clear();
assert!(expected.is_empty());
}
#[test] #[test]
#[cfg(feature = "serde")] #[cfg(feature = "serde")]
fn serde_bincode_backward_compatibility() { fn serde_bincode_backward_compatibility() {