dsdl_parser 0.1.3

A nom parser for the DSDL (Data structure description language) used when transmiting over uavcan
Documentation
extern crate dsdl_parser;
extern crate test_logger;

use std::io::BufReader;
use std::io::Read;

use dsdl_parser::*;

#[test]
fn parse_protocol() {
    test_logger::ensure_env_logger_initialized();
    let _dsdl = DSDL::read("./tests/dsdl/uavcan/protocol").unwrap();
}

#[test]
fn parse_dsdl() {
    test_logger::ensure_env_logger_initialized();
    let _dsdl = DSDL::read("./tests/dsdl/").unwrap();
}

#[test]
fn verify_display() {
    test_logger::ensure_env_logger_initialized();
    let dsdl = DSDL::read("./tests/dsdl/").unwrap();
    for dsdl_file in dsdl.files() {
        let mut filename = String::from("./tests/dsdl/");
        if dsdl_file.name.namespace != "" {
            filename = filename + dsdl_file.name.namespace.replace(".", "/").as_str() + "/";
        }
        if let Some(ref id) = dsdl_file.name.id {
            filename = filename + id.as_str() + ".";
        }
        if let Some(ref version) = dsdl_file.name.version {
            filename = filename + format!(".{}", version).as_str();
        }
        filename.push_str(dsdl_file.name.name.as_str());
        filename.push_str(".uavcan");
        
            
        let file = std::fs::File::open(filename.clone()).unwrap();
        let mut buf_reader = BufReader::new(file);
        let mut contents = String::new();
        buf_reader.read_to_string(&mut contents).unwrap();

        assert_eq!(format!("{}", dsdl_file.definition).split_whitespace().collect::<Vec<_>>(), contents.split_whitespace().collect::<Vec<_>>(), "Parsed file not equivalent to read file\n\nParsed file: \n{}\n\nRead file: \n{}", dsdl_file, contents);
        
        println!("Verified correct parsing on file: {}", filename);
    }
}

#[test]
fn normalize_get_node_info() {
    let dsdl = DSDL::read("./tests/dsdl/").unwrap();
    
    assert_eq!(format!("{}", dsdl.get_file("uavcan.protocol.GetNodeInfo").unwrap().clone().normalize()),
               "uavcan.protocol.GetNodeInfo
---
uavcan.protocol.NodeStatus status
uavcan.protocol.SoftwareVersion software_version
uavcan.protocol.HardwareVersion hardware_version
saturated uint8[<=80] name");
}

#[test]
fn normalize_actuator_status() {
    let dsdl = DSDL::read("./tests/dsdl/").unwrap();
    
    assert_eq!(format!("{}", dsdl.get_file("uavcan.equipment.actuator.Status").unwrap().clone().normalize()),
               "uavcan.equipment.actuator.Status
saturated uint8 actuator_id
saturated float16 position
saturated float16 force
saturated float16 speed
void1
saturated uint7 power_rating_pct");
}

#[test]
fn normalize_node_status() {
    let dsdl = DSDL::read("./tests/dsdl/").unwrap();
    
    assert_eq!(format!("{}", dsdl.get_file("uavcan.protocol.NodeStatus").unwrap().clone().normalize()),
               "uavcan.protocol.NodeStatus
saturated uint32 uptime_sec
saturated uint2 health
saturated uint3 mode
saturated uint3 sub_mode
saturated uint16 vendor_specific_status_code");
}


#[test]
fn verify_dsdl_signature() {
    let dsdl = DSDL::read("./tests/dsdl/").unwrap();

    assert_eq!(dsdl.get_file("uavcan.protocol.NodeStatus").unwrap().clone().normalize().dsdl_signature(), 0x0f0868d0c1a7c6f1);
    assert_eq!(dsdl.get_file("uavcan.protocol.AccessCommandShell").unwrap().clone().normalize().dsdl_signature(), 0x59276b5921c9246e);
    assert_eq!(dsdl.get_file("uavcan.equipment.actuator.Command").unwrap().clone().normalize().dsdl_signature(), 0x8d9a6a920c1d616c);
    assert_eq!(dsdl.get_file("uavcan.equipment.actuator.Status").unwrap().clone().normalize().dsdl_signature(), 0x5e9bba44faf1ea04);

}


#[test]
fn verify_data_type_signature() {
    let dsdl = DSDL::read("./tests/dsdl/").unwrap();

    assert_eq!(dsdl.data_type_signature("uavcan.protocol.NodeStatus").unwrap(), 0x0f0868d0c1a7c6f1);
    assert_eq!(dsdl.data_type_signature("uavcan.protocol.CANIfaceStats").unwrap(), 0x13b106f0c44ca350);
    
    assert_eq!(dsdl.data_type_signature("uavcan.protocol.GetTransportStats").unwrap(), 0xbe6f76a7ec312b04);

    assert_eq!(dsdl.data_type_signature("uavcan.protocol.GetNodeInfo").unwrap(), 0xee468a8121c46a9e);

}