use std::collections::{HashMap, HashSet};
use epics_base_rs::server::database::PvDatabase;
use epics_base_rs::server::ioc_builder::IocBuilder;
use epics_base_rs::types::EpicsValue;
async fn read_val(db: &PvDatabase, name: &str) -> EpicsValue {
let rec = db.get_record(name).expect("record exists");
let inst = rec.read();
inst.record.get_field("VAL").expect("VAL field present")
}
#[tokio::test]
async fn std_time_of_day_devices_write_val_when_registered() {
let db_content = r#"
record(ai, "TOD_SEC") {
field(DTYP, "Sec Past Epoch")
field(TSE, "0")
}
record(stringin, "TOD_STR") {
field(DTYP, "Time of Day")
field(TSE, "0")
}
"#;
let mut builder = IocBuilder::new();
for (dtyp, factory) in std_rs::std_device_supports() {
builder = builder.register_device_support(dtyp, factory);
}
let (db, _) = builder
.db_string(db_content, &HashMap::new())
.unwrap()
.build()
.await
.unwrap();
let mut visited = HashSet::new();
db.process_record_with_links("TOD_SEC", &mut visited, 0)
.await
.unwrap();
let mut visited = HashSet::new();
db.process_record_with_links("TOD_STR", &mut visited, 0)
.await
.unwrap();
match read_val(&db, "TOD_SEC").await {
EpicsValue::Double(v) => assert!(
v > 1.0e9,
"Sec Past Epoch VAL must be the current secPastEpoch (>1e9), got {v}"
),
other => panic!("expected Double VAL, got {other:?}"),
}
match read_val(&db, "TOD_STR").await {
EpicsValue::String(s) => {
let s = s.as_str_lossy();
assert!(
s.contains(", 20"),
"Time of Day VAL must be a formatted date with a 20xx year, got {s:?}"
);
}
other => panic!("expected String VAL, got {other:?}"),
}
}