epics-ca 0.1.0

Client library for EPICS Channel Access protocol
Documentation
use crate::{
    types::{EpicsEnum, EpicsString},
    Context,
};
use async_std::test as async_test;
use cstr::cstr;
use serial_test::serial;
use std::f64::consts::{E, PI};

#[async_test]
#[serial]
async fn analog() {
    let ctx = Context::new().unwrap();
    let mut output = ctx.connect::<f64>(cstr!("ca:test:ao")).await.unwrap();
    let mut input = ctx.connect::<f64>(cstr!("ca:test:ai")).await.unwrap();

    output.put(E).unwrap().await.unwrap();
    assert_eq!(input.get().await.unwrap(), E);

    output.put(PI).unwrap().await.unwrap();
    assert_eq!(input.get().await.unwrap(), PI);
}

#[async_test]
#[serial]
async fn binary() {
    let ctx = Context::new().unwrap();
    let mut output = ctx.connect::<EpicsEnum>(cstr!("ca:test:bo")).await.unwrap();
    let mut input = ctx.connect::<EpicsEnum>(cstr!("ca:test:bi")).await.unwrap();

    output.put(EpicsEnum(1)).unwrap().await.unwrap();
    assert_eq!(input.get().await.unwrap(), EpicsEnum(1));

    output.put(EpicsEnum(0)).unwrap().await.unwrap();
    assert_eq!(input.get().await.unwrap(), EpicsEnum(0));
}

#[async_test]
#[serial]
async fn string() {
    let ctx = Context::new().unwrap();
    let mut output = ctx
        .connect::<EpicsString>(cstr!("ca:test:stringout"))
        .await
        .unwrap();
    let mut input = ctx
        .connect::<EpicsString>(cstr!("ca:test:stringin"))
        .await
        .unwrap();

    let data = EpicsString::from_cstr(cstr!("abcdefghijklmnopqrstuvwxyz")).unwrap();
    output.put(data).unwrap().await.unwrap();
    assert_eq!(input.get().await.unwrap(), data);

    let data = EpicsString::from_cstr(cstr!("0123456789abcdefghijABCDEFGHIJ!@#$%^&*(")).unwrap();
    output.put(data).unwrap().await.unwrap();
    assert_eq!(input.get().await.unwrap(), data);
}

#[async_test]
#[serial]
async fn array() {
    let ctx = Context::new().unwrap();
    let max_len = 64;
    let mut output = ctx.connect::<[i32]>(cstr!("ca:test:aao")).await.unwrap();
    let mut input = ctx.connect::<[i32]>(cstr!("ca:test:aai")).await.unwrap();
    assert_eq!(output.element_count().unwrap(), max_len);
    assert_eq!(input.element_count().unwrap(), max_len);

    let data = (0..42).collect::<Vec<_>>();
    output.put_ref(&data).unwrap().await.unwrap();
    assert_eq!(Vec::from(input.get_boxed().await.unwrap()), data);

    let data = (-64..0).collect::<Vec<_>>();
    output.put_ref(&data).unwrap().await.unwrap();
    assert_eq!(Vec::from(input.get_boxed().await.unwrap()), data);

    output.put_ref(&[]).unwrap().await.unwrap();
    assert_eq!(Vec::from(input.get_boxed().await.unwrap()), []);
}