natnet-decode 0.1.0

Decode raw NatNet messages
Documentation
extern crate env_logger;
extern crate natnet_decode;
extern crate semver;

use natnet_decode::{NatNet, NatNetResponse};
use semver::Version;
use std::fs::File;
use std::io::BufReader;

#[test]
fn verions() {
    let files = vec![
        "tests/data/frame-motive-1.5.0-000.bin",
        "tests/data/frame-motive-1.7.2-000.bin",
        "tests/data/frame-motive-1.9.0-000.bin"];
    let versions = vec![
        Version::parse("2.5.0").unwrap(),
        Version::parse("2.7.0").unwrap(),
        Version::parse("2.9.0").unwrap()];
    for (f_name, version) in files.iter().zip(versions.iter()) {
        let f = File::open(f_name).unwrap();
        let mut buf = BufReader::new(f);
        if let NatNetResponse::Ping(sender)
            = NatNet::unpack_with(&version, &mut buf).unwrap() {
                assert_eq!("NatNetLib", sender.name);
                assert_eq!(*version, sender.natnet_version);
        } else {
            assert!(false);
        }
    }
}

fn test_parse(p: &NatNet, file_name: String) -> NatNetResponse {
    let f = File::open(file_name).unwrap();
    let mut buf = BufReader::new(f);
    p.unpack(&mut buf).unwrap()
}

#[test]
fn parse_2_5() {
    let parser = NatNet::new(Version::parse("2.5.0").unwrap());
    for i in 1..3 {
        let f_name = format!("tests/data/frame-motive-1.5.0-00{}.bin", i);
        if let NatNetResponse::FrameOfData(frame) = test_parse(&parser, f_name) {
            assert!(frame.marker_sets.contains_key("all"));
            assert!(frame.marker_sets.contains_key("Rigid Body 1"));
            assert_eq!(frame.other_markers.len(), 2);
            assert_eq!(frame.rigid_bodies.len(), 1);
            assert_eq!(frame.skeletons.len(), 0);
            assert_eq!(frame.labeled_markers.len(), 3);
            assert!(frame.force_plates.is_none());
            assert!(frame.timestamp.is_none());
            assert!(frame.is_recording.is_none());
            assert!(frame.tracked_models_changed.is_none());
        }
    }
}

#[test]
fn parse_2_7() {
    let parser = NatNet::new(Version::parse("2.7.0").unwrap());
    for i in 1..3 {
        let f_name = format!("tests/data/frame-motive-1.7.2-00{}.bin", i);
        if let NatNetResponse::FrameOfData(frame) = test_parse(&parser, f_name) {
            assert!(frame.marker_sets.contains_key("all"));
            assert!(frame.marker_sets.contains_key("Rigid Body 1"));
            assert_eq!(frame.other_markers.len(), 2);
            assert_eq!(frame.rigid_bodies.len(), 1);
            assert_eq!(frame.skeletons.len(), 0);
            assert_eq!(frame.labeled_markers.len(), 3);
            assert!(frame.force_plates.is_none());
            assert!(frame.timestamp.is_some());
            assert!(frame.is_recording.is_some());
            assert!(frame.tracked_models_changed.is_some());
        }
    }
}

#[test]
fn parse_2_9() {
    let parser = NatNet::new(Version::parse("2.9.0").unwrap());
    for i in 1..3 {
        let f_name = format!("tests/data/frame-motive-1.9.0-00{}.bin", i);
        if let NatNetResponse::FrameOfData(frame) = test_parse(&parser, f_name) {
            assert!(frame.marker_sets.contains_key("all"));
            assert!(frame.marker_sets.contains_key("Triangle"));
            assert_eq!(frame.other_markers.len(), 0);
            assert_eq!(frame.rigid_bodies.len(), 1);
            assert_eq!(frame.skeletons.len(), 0);
            assert_eq!(frame.labeled_markers.len(), 3);
            assert!(frame.force_plates.is_some());
            assert!(frame.timestamp.is_some());
            assert!(frame.is_recording.is_some());
            assert!(frame.tracked_models_changed.is_some());
        }
    }
}