Skip to content
Snippets Groups Projects
dummy.rs 5.95 KiB
Newer Older
Udo Eisenbarth's avatar
Udo Eisenbarth committed
#![warn(missing_docs)]
use crate::analyzer::AnalyzerType;
use crate::dottable::Dottable;
Udo Eisenbarth's avatar
Udo Eisenbarth committed
use crate::error::{OpmResult, OpossumError};
Udo Eisenbarth's avatar
Udo Eisenbarth committed
use crate::optic_ports::OpticPorts;
Udo Eisenbarth's avatar
Udo Eisenbarth committed
use crate::optical::{LightResult, Optical};
use crate::properties::{Properties, Property, Proptype};
use std::collections::HashMap;
#[derive(Debug, Clone)]
Udo Eisenbarth's avatar
Udo Eisenbarth committed
/// 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.
Udo Eisenbarth's avatar
Udo Eisenbarth committed
///
/// ## Optical Ports
///   - Inputs
///     - `front`
///   - Outputs
///     - `rear`
Udo Eisenbarth's avatar
Udo Eisenbarth committed
///
/// ## Properties
///   - `name`
///   - `inverted`
pub struct Dummy {
    props: Properties,
fn create_default_props() -> Properties {
    let mut props = Properties::default();
Udo Eisenbarth's avatar
Udo Eisenbarth committed
    props.set("name", "dummy".into());
    props.set("inverted", false.into());
impl Default for Dummy {
    fn default() -> Self {
        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's avatar
Udo Eisenbarth committed
        props.set("name", name.into());
Udo Eisenbarth's avatar
Udo Eisenbarth committed
impl Optical for Dummy {
    fn name(&self) -> &str {
        if let Some(value) = self.props.get("name") {
            if let Proptype::String(name) = &value.prop {
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        panic!("wrong format");
    fn node_type(&self) -> &str {
        "dummy"
Udo Eisenbarth's avatar
Udo Eisenbarth committed
    fn ports(&self) -> OpticPorts {
        let mut ports = OpticPorts::new();
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        ports.add_input("front").unwrap();
        ports.add_output("rear").unwrap();
        if self.properties().get_bool("inverted").unwrap().unwrap() {
            ports.set_inverted(true)
        }
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        ports
    }
    fn analyze(
        &mut self,
        incoming_data: LightResult,
        _analyzer_type: &AnalyzerType,
Udo Eisenbarth's avatar
Udo Eisenbarth committed
    ) -> OpmResult<LightResult> {
        let (src, target) = if self.inverted() {
            ("rear", "front")
        } else {
            ("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
Udo Eisenbarth's avatar
Udo Eisenbarth committed
    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()})
    }
impl Dottable for Dummy {}
Udo Eisenbarth's avatar
Udo Eisenbarth committed
    use crate::{
        lightdata::{DataEnergy, LightData},
        spectrum::create_he_ne_spectrum,
    };
    #[test]
    fn default() {
        let node = Dummy::default();
        assert_eq!(node.name(), "dummy");
        assert_eq!(node.node_type(), "dummy");
        assert_eq!(node.is_detector(), false);
        assert_eq!(node.inverted(), false);
        assert!(node.as_group().is_err());
    }
    #[test]
    fn new() {
        let node = Dummy::new("Test");
        assert_eq!(node.name(), "Test");
    fn name_property() {
        let mut node = Dummy::default();
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        node.set_property("name", "Test1".into()).unwrap();
        assert_eq!(node.name(), "Test1")
    }
    #[test]
    fn inverted() {
        let mut node = Dummy::default();
        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();
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        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()));
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        let output = dummy.analyze(input, &AnalyzerType::Energy);
        assert!(output.is_ok());
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        let output = output.unwrap();
        assert!(output.contains_key("rear".into()));
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        assert_eq!(output.len(), 1);
        let output = output.get("rear".into()).unwrap();
        assert!(output.is_some());
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        let output = output.clone().unwrap();
        assert_eq!(output, input_light);
    }
    #[test]
    fn analyze_wrong() {
        let mut dummy = Dummy::default();
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        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()));
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        let output = dummy.analyze(input, &AnalyzerType::Energy);
        assert!(output.is_ok());
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        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();
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        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()));

Udo Eisenbarth's avatar
Udo Eisenbarth committed
        let output = dummy.analyze(input, &AnalyzerType::Energy);
        assert!(output.is_ok());
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        let output = output.unwrap();
        assert!(output.contains_key("front".into()));
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        assert_eq!(output.len(), 1);
        let output = output.get("front".into()).unwrap();
        assert!(output.is_some());
Udo Eisenbarth's avatar
Udo Eisenbarth committed
        let output = output.clone().unwrap();
        assert_eq!(output, input_light);
    }