use super::*;
use crate::hwmon::sync_hwmon::Hwmons;
use crate::sensors::sync_sensors::{fan::*, temp::*};
use crate::tests::*;
use temp_dir::TempDir;
#[test]
fn test_sensor_read_value() {
let test_dir = TempDir::new().unwrap();
VirtualHwmonBuilder::create(test_dir.path(), 0, "system", None)
.add_temp(1, &[("_input", "40000"), ("_label", "temp1")])
.add_fan(1, &[("_input", "60")]);
let hwmons = Hwmons::parse_path(test_dir.path()).unwrap();
let hwmon = hwmons.hwmon_by_index(0).unwrap();
let temp = hwmon.temp(1).unwrap();
let fan = hwmon.fan(1).unwrap();
#[cfg(not(feature = "uom_units"))]
assert_eq!(40.0, temp.read_input().unwrap().as_degrees_celsius());
#[cfg(feature = "uom_units")]
assert_eq!(
40.0,
temp.read_input()
.unwrap()
.round::<uom::si::thermodynamic_temperature::degree_celsius>()
.get::<uom::si::thermodynamic_temperature::degree_celsius>()
);
#[cfg(not(feature = "uom_units"))]
assert_eq!(60, fan.read_input().unwrap().as_rpm());
#[cfg(feature = "uom_units")]
assert_eq!(
60.0,
fan.read_input()
.unwrap()
.round::<uom::si::angular_velocity::revolution_per_minute>()
.get::<uom::si::angular_velocity::revolution_per_minute>()
);
}
#[test]
fn test_label() {
let test_dir = TempDir::new().unwrap();
VirtualHwmonBuilder::create(test_dir.path(), 0, "system", None)
.add_temp(1, &[("_input", "40000"), ("_label", "test_temp1")]);
let hwmons: Hwmons = Hwmons::parse_path(test_dir.path()).unwrap();
let hwmon = hwmons.hwmon_by_index(0).unwrap();
let temp = hwmon.temp(1).unwrap();
assert_eq!(temp.name(), String::from("test_temp1"));
}
#[test]
#[cfg(feature = "writeable")]
fn test_state() {
let test_dir = TempDir::new().unwrap();
VirtualHwmonBuilder::create(test_dir.path(), 0, "system", None)
.add_temp(
1,
&[
("_input", "40000"),
("_label", "test_temp1"),
("_min", "100"),
],
)
.add_temp(
2,
&[
("_input", "40000"),
("_label", "test_temp2"),
("_min", "100"),
("_max", "120"),
],
);
let hwmons: Hwmons = Hwmons::parse_path(test_dir.path()).unwrap();
let hwmon = hwmons.hwmon_by_index(0).unwrap();
let temp = hwmon.writeable_temp(1).unwrap();
let mut state = temp.state().unwrap();
assert_eq!(
state.states.get(&SensorSubFunctionType::Min),
Option::<&String>::Some(&String::from("100"))
);
state
.states
.insert(SensorSubFunctionType::Max, String::from("200"));
assert_eq!(temp.write_state(&state).is_err(), true);
assert_eq!(temp.write_state_lossy(&state).is_ok(), true);
let temp2 = hwmon.writeable_temp(2).unwrap();
assert_eq!(temp2.write_state(&state).is_ok(), true);
assert_eq!(
temp2
.state()
.unwrap()
.states
.get(&SensorSubFunctionType::Max)
.unwrap()
.as_str(),
"200"
);
}
#[test]
#[cfg(feature = "virtual_sensors")]
fn test_virtual() {
use super::virt::*;
use crate::units::Current;
let test_dir = TempDir::new().unwrap();
let virtual_path = test_dir.path().join("virtual_sensor");
let custom_virtual_path = test_dir.path().join("customvirtual_sensor");
let _virtual_builder = VirtualSensorBuilder::create(&virtual_path, Some("100"));
let _custom_virtual_builder = VirtualSensorBuilder::create(&custom_virtual_path, Some("200"));
let virtual_sensor = virtual_sensor_from_path::<Current>(&virtual_path).unwrap();
let virtual_sensor_custom = custom_virtual_sensor_sync(|| {
std::fs::read_to_string(&custom_virtual_path)
.map(|r| Current::from_raw(&r).unwrap())
.map_err(|e| Error::read(e, &custom_virtual_path))
});
#[cfg(feature = "uom_units")]
{
assert_eq!(
virtual_sensor
.read()
.unwrap()
.get::<uom::si::electric_current::milliampere>(),
100.0
);
assert_eq!(
virtual_sensor_custom
.read()
.unwrap()
.get::<uom::si::electric_current::milliampere>(),
200.0
);
}
#[cfg(not(feature = "uom_units"))]
{
assert_eq!(virtual_sensor.read().unwrap().as_milli_amperes(), 100);
assert_eq!(
virtual_sensor_custom.read().unwrap().as_milli_amperes(),
200
);
}
}
#[test]
fn test_trait_object() {
let test_dir = TempDir::new().unwrap();
VirtualHwmonBuilder::create(test_dir.path(), 0, "system", None).add_temp(
1,
&[
("_input", "40000"),
("_label", "test_temp1"),
("_min", "100"),
],
);
let hwmons: Hwmons = Hwmons::parse_path(test_dir.path()).unwrap();
let hwmon = hwmons.hwmon_by_index(0).unwrap();
let _temp: Box<&dyn TempSensor> = Box::new(hwmon.temp(1).unwrap());
}