jamjam 0.3.0

Handles JAM, PCBOARD message bases & QWK packets.
Documentation
use jamjam::pcboard::{MessageStatus, PCBoardMessage, PCBoardMessageBase};
use pretty_assertions::assert_eq;

#[test]
fn test_open_base() {
    let mut base = PCBoardMessageBase::open("data/pcboard/test").unwrap();
    assert!(!base.is_locked().unwrap());

    assert_eq!(base.active_messages(), 4);
    assert_eq!(base.highest_message_number(), 4);
    assert_eq!(base.lowest_message_number(), 1);
    assert_eq!(base.callers(), 1);
}

#[test]
fn test_old_index() {
    let base = PCBoardMessageBase::open("data/pcboard/test").unwrap();
    let idx = base.read_old_index().unwrap();
    assert_eq!(idx.len(), 4);
}

#[test]
fn test_index() {
    let base = PCBoardMessageBase::open("data/pcboard/test").unwrap();

    let old_idx = base.read_old_index().unwrap();
    let new_idx = base.read_index().unwrap();
    assert_eq!(old_idx.len(), new_idx.len());
    for i in 0..old_idx.len() {
        assert_eq!(old_idx[i], new_idx[i].offset as u32);
    }
}

#[test]
fn test_read_message() {
    let base = PCBoardMessageBase::open("data/pcboard/test").unwrap();
    let msg = base.read_message(3).unwrap();
    assert_eq!(msg.header.from_field, "SYSOP");
    assert_eq!(msg.header.to_field, "ALL");
    assert_eq!(msg.header.subj_field, "Another message");
    assert!(!msg.header.password.is_empty());
}

#[test]
fn test_iter() {
    let base = PCBoardMessageBase::open("data/pcboard/test").unwrap();
    for (i, msg) in base.iter().unwrap().enumerate() {
        let msg = msg.unwrap();
        match i {
            0 => {
                assert_eq!(MessageStatus::SenderPassword, msg.status());
                assert_eq!("SECRET", msg.header.password);
            }
            1 => {
                assert_eq!(MessageStatus::Public, msg.status());
            }
            2 => {
                assert_eq!(MessageStatus::GroupPasswordMessageToAll, msg.status());
                assert_eq!("GROUPPW", msg.header.password);
            }
            3 => {
                assert_eq!(MessageStatus::Public, msg.status());
            }
            _ => panic!("Too many messages"),
        }
    }
    assert_eq!(4, base.iter().unwrap().count());
}

#[test]
fn test_truncated_message_is_rejected() {
    let data = std::fs::read("data/pcboard/test").unwrap();
    // The first 128 byte block holds the message base header.
    let full = PCBoardMessage::read(&mut &data[128..]).unwrap();
    let total = 128 * full.header.num_blocks as usize;

    assert!(PCBoardMessage::read(&mut &data[128..128 + total - 1]).is_err());
}