use std::collections::HashSet;
use epics_base_rs::server::database::PvDatabase;
use epics_base_rs::server::record::Record;
use epics_base_rs::server::records::ao::AoRecord;
use epics_base_rs::server::records::histogram::HistogramRecord;
use epics_base_rs::server::records::waveform::WaveformRecord;
use epics_base_rs::types::{DbFieldType, EpicsValue};
#[tokio::test]
async fn sim_waveform_reads_siol_array_into_val() {
let db = PvDatabase::new();
db.add_record("WFIN_SW", Box::new(AoRecord::new(1.0)))
.await
.unwrap();
let mut src = WaveformRecord::new(8, DbFieldType::Double);
let _ = src.put_field("VAL", EpicsValue::DoubleArray(vec![10.0, 20.0, 30.0]));
db.add_record("WFIN_SRC", Box::new(src)).await.unwrap();
let mut wf = WaveformRecord::new(8, DbFieldType::Double);
wf.siml = "WFIN_SW".to_string();
wf.siol = "WFIN_SRC".to_string();
db.add_record("WFIN", Box::new(wf)).await.unwrap();
let mut v = HashSet::new();
db.process_record_with_links("WFIN", &mut v, 0)
.await
.unwrap();
let val = db.get_pv("WFIN").await.unwrap();
assert!(
matches!(val, EpicsValue::DoubleArray(ref a) if a.as_slice() == [10.0, 20.0, 30.0]),
"simulated waveform read the SIOL array INTO VAL, got {val:?}"
);
let src = db.get_pv("WFIN_SRC").await.unwrap();
assert!(
matches!(src, EpicsValue::DoubleArray(ref a) if a.as_slice() == [10.0, 20.0, 30.0]),
"SIOL source untouched (input direction, not VAL->SIOL write), got {src:?}"
);
}
#[tokio::test]
async fn sim_histogram_does_not_write_val_out_to_siol() {
let db = PvDatabase::new();
db.add_record("HGIN_SW", Box::new(AoRecord::new(1.0)))
.await
.unwrap();
db.add_record("HGIN_SRC", Box::new(AoRecord::new(42.0)))
.await
.unwrap();
let mut hg = HistogramRecord::new(4, 0.0, 100.0);
hg.siml = "HGIN_SW".to_string();
hg.siol = "HGIN_SRC".to_string();
db.add_record("HGIN", Box::new(hg)).await.unwrap();
let mut v = HashSet::new();
db.process_record_with_links("HGIN", &mut v, 0)
.await
.unwrap();
let src = db.get_pv("HGIN_SRC").await.unwrap();
assert!(
matches!(src, EpicsValue::Double(v) if (v - 42.0).abs() < 1e-10),
"simulated histogram did NOT write VAL out to SIOL (input direction), got {src:?}"
);
let val = db.get_pv("HGIN").await.unwrap();
assert!(
matches!(val, EpicsValue::LongArray(ref a) if a.as_slice() == [0, 0, 0, 0]),
"histogram bin array unchanged in sim (no real-device accumulation), got {val:?}"
);
}