serde_molecule 1.1.2

Implementation of Molecule using Serde.
Documentation
use crate::molecule::{assemble_fixvec, assemble_table, disassemble_fixvec, disassemble_table};

#[test]
fn test_disassemble_fixvec() {
    let data: [u8; 0] = [];
    let result = disassemble_fixvec(&data);
    assert!(result.is_err());
    let data = [0, 0];
    let result = disassemble_fixvec(&data);
    assert!(result.is_err());
    let data = [0u8; 4];
    let result = disassemble_fixvec(&data);
    assert_eq!(result.unwrap().len(), 0);
    let data = [0x01, 0x00, 0x00, 0x00, 0x12];
    let result = disassemble_fixvec(&data);
    assert_eq!(result.unwrap().len(), 1);
    let data = [
        0x08, 0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef,
    ];
    let result = disassemble_fixvec(&data);
    assert_eq!(result.unwrap().len(), 8);
    let data = [0x01, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, 0x00];
    let result = disassemble_fixvec(&data);
    let result = result.unwrap();
    assert_eq!(result.len(), 1);
    assert_eq!(result[0].len(), 4);
    let data = [
        0x06, 0x00, 0x00, 0x00, 0x23, 0x01, 0x00, 0x00, 0x56, 0x04, 0x00, 0x00, 0x90, 0x78, 0x00,
        0x00, 0x0a, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xef, 0x0d, 0x00, 0x00,
    ];
    let result = disassemble_fixvec(&data);
    let result = result.unwrap();
    assert_eq!(result.len(), 6);
    assert_eq!(result[5].len(), 4);
}

fn assert_fixvec_result(d1: &[u8], d2: Vec<&[u8]>) {
    let data: Vec<u8> = d2.into_iter().fold(vec![], |mut acc, elem| {
        acc.extend(elem);
        acc
    });
    assert_eq!(&d1[4..], &data);
}

fn test_fixvec(data: Vec<Vec<u8>>) {
    let result = assemble_fixvec(&data);
    let result = result.unwrap();
    let result2 = disassemble_fixvec(&result);
    let result2 = result2.unwrap();
    assert_fixvec_result(&result, result2);
}

#[test]
fn test_assemble_fixvec() {
    let result = assemble_fixvec(&vec![vec![], vec![1]]);
    assert!(result.is_err());

    let result = assemble_fixvec(&vec![vec![1, 2, 3], vec![1, 2, 3], vec![1]]);
    assert!(result.is_err());

    let result = assemble_fixvec(&vec![vec![], vec![]]);
    assert!(result.is_err());

    test_fixvec(vec![]);
    test_fixvec(vec![vec![1]]);
    test_fixvec(vec![vec![1, 2, 3], vec![4, 5, 6]]);
    test_fixvec(vec![vec![1], vec![2], vec![3]]);
    test_fixvec(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]);
}

#[test]
fn test_disassemble_table() {
    let data = [];
    let result = disassemble_table(&data);
    assert!(result.is_err());

    let data = [1];
    let result = disassemble_table(&data);
    assert!(result.is_err());

    let data = [1, 1, 1, 1, 1];
    let result = disassemble_table(&data);
    assert!(result.is_err());

    let data = [1, 1, 1, 1, 1, 1, 1];
    let result = disassemble_table(&data);
    assert!(result.is_err());

    let data = [0x04, 0x00, 0x00, 0x00];
    let result = disassemble_table(&data);
    let result = result.unwrap();
    assert_eq!(result.len(), 0);

    let data = [
        0x0e, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x34,
    ];
    let result = disassemble_table(&data);
    let result = result.unwrap();
    assert_eq!(result.len(), 1);
    assert_eq!(result[0].len(), 6);

    let data = [
        0x34, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00,
        0x00, 0x28, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x34,
        0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x67, 0x01, 0x00, 0x00, 0x00, 0x89,
        0x03, 0x00, 0x00, 0x00, 0xab, 0xcd, 0xef,
    ];
    let result = disassemble_table(&data);
    let result = result.unwrap();
    assert_eq!(result.len(), 5);
    assert_eq!(result[0].len(), 6);
    assert_eq!(result[1].len(), 4);
    assert_eq!(result[2].len(), 6);
    assert_eq!(result[3].len(), 5);
    assert_eq!(result[4].len(), 7);
}

fn test_table(data: &[Vec<u8>]) {
    let result1 = assemble_table(data);
    let result2 = disassemble_table(&result1);
    let result2 = result2.unwrap();
    let result2: Vec<_> = result2.into_iter().map(|e| e.to_vec()).collect();
    assert_eq!(data.len(), result2.len());
    for (index, item) in data.iter().enumerate() {
        assert_eq!(item, &result2[index]);
    }
}

#[test]
fn test_assemble_table() {
    test_table(&[]);
    test_table(&[vec![]]);
    test_table(&[vec![1]]);
    test_table(&[vec![1, 2, 3]]);
    test_table(&[vec![], vec![]]);
    test_table(&[vec![], vec![1]]);
    test_table(&[vec![1], vec![]]);
    test_table(&[vec![], vec![1], vec![2]]);
    test_table(&[vec![1], vec![], vec![2]]);
    test_table(&[vec![1], vec![2], vec![]]);
    test_table(&[vec![1], vec![2], vec![3]]);
    test_table(&[vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]);
}