Newer
Older
use serde_json::json;
use crate::properties::{Properties, Property, Proptype};
use std::collections::HashMap;
/// A fake / dummy component without any optical functionality.
///
/// Any [`LightResult`] is directly forwarded without any modification. It is mainly used for
/// development and debugging purposes.
///
/// ## Optical Ports
/// - Inputs
/// - `front`
/// - Outputs
/// - `rear`
fn create_default_props() -> Properties {
let mut props = Properties::default();
props.set("name", "dummy".into());
props.set("inverted", false.into());
impl Default for Dummy {
fn default() -> Self {
props: create_default_props(),
impl Dummy {
/// Creates a new [`Dummy`] with a given name.
pub fn new(name: &str) -> Self {
let mut props = create_default_props();

Udo Eisenbarth
committed
Self { props }
if let Some(value) = self.props.get("name") {
if let Proptype::String(name) = &value.prop {
let mut ports = OpticPorts::new();
ports.add_input("front").unwrap();
ports.add_output("rear").unwrap();

Udo Eisenbarth
committed
if self.properties().get_bool("inverted").unwrap().unwrap() {
ports.set_inverted(true)
}
fn analyze(
&mut self,
incoming_data: LightResult,
_analyzer_type: &AnalyzerType,
let (src, target) = if self.inverted() {
("rear", "front")
("front", "rear")
};
let data = incoming_data.get(src).unwrap_or(&None);
Ok(HashMap::from([(target.into(), data.clone())]))
fn inverted(&self) -> bool {
self.properties().get_bool("inverted").unwrap().unwrap()
fn properties(&self) -> &Properties {
&self.props
fn set_property(&mut self, name: &str, prop: Property) -> OpmResult<()> {
if self.props.set(name, prop).is_none() {
Err(OpossumError::Other("property not defined".into()))
} else {
Ok(())
}
}
fn report(&self) -> serde_json::Value {
json!({"type": self.node_type(),
"name": self.name()})
}
#[cfg(test)]
mod test {
use crate::{
lightdata::{DataEnergy, LightData},
spectrum::create_he_ne_spectrum,
};
assert_eq!(node.name(), "dummy");
assert_eq!(node.node_type(), "dummy");
assert_eq!(node.is_detector(), false);
assert!(node.as_group().is_err());
}
#[test]
fn new() {
let node = Dummy::new("Test");
assert_eq!(node.name(), "Test");
let mut node = Dummy::default();
assert_eq!(node.name(), "Test1")
}
#[test]
fn inverted() {
let mut node = Dummy::default();

Udo Eisenbarth
committed
node.set_property("inverted", true.into()).unwrap();
assert_eq!(node.inverted(), true)
}
#[test]
fn is_detector() {
let node = Dummy::default();
assert_eq!(node.is_detector(), false);
}
#[test]
fn node_type() {
let node = Dummy::default();
assert_eq!(node.node_type(), "dummy");
}
#[test]
fn analyze_ok() {
let mut dummy = Dummy::default();
let mut input = LightResult::default();
let input_light = LightData::Energy(DataEnergy {
spectrum: create_he_ne_spectrum(1.0),
});
input.insert("front".into(), Some(input_light.clone()));
assert!(output.contains_key("rear".into()));
assert_eq!(output.len(), 1);
let output = output.get("rear".into()).unwrap();
assert_eq!(output, input_light);
}
#[test]
fn analyze_wrong() {
let mut dummy = Dummy::default();
let mut input = LightResult::default();
let input_light = LightData::Energy(DataEnergy {
spectrum: create_he_ne_spectrum(1.0),
});
input.insert("rear".into(), Some(input_light.clone()));
let output = output.unwrap();
let output = output.get("rear".into()).unwrap();
assert!(output.is_none());
}
#[test]
fn analyze_inverse() {
let mut dummy = Dummy::default();
dummy.set_property("inverted", true.into()).unwrap();
let mut input = LightResult::default();
let input_light = LightData::Energy(DataEnergy {
spectrum: create_he_ne_spectrum(1.0),
});
input.insert("rear".into(), Some(input_light.clone()));
assert!(output.contains_key("front".into()));
assert_eq!(output.len(), 1);
let output = output.get("front".into()).unwrap();