Skip to content
Snippets Groups Projects
dummy.rs 3.45 KiB
Newer Older
Udo Eisenbarth's avatar
Udo Eisenbarth committed
#![warn(missing_docs)]
use serde_derive::Serialize;
Udo Eisenbarth's avatar
Udo Eisenbarth committed
use std::collections::HashMap;

use crate::analyzer::AnalyzerType;
use crate::dottable::Dottable;
Udo Eisenbarth's avatar
Udo Eisenbarth committed
use crate::error::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};
type Result<T> = std::result::Result<T, OpossumError>;

#[derive(Debug, Serialize)]
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`
pub struct Dummy {
    is_inverted: bool,
Udo Eisenbarth's avatar
Udo Eisenbarth committed
    name: String,
impl Default for Dummy {
    fn default() -> Self {
        Self {
            is_inverted: Default::default(),
            name: String::from("dummy"),
        }
impl Dummy {
    /// Creates a new [`Dummy`] with a given name.
    pub fn new(name: &str) -> Self {
        Self {
            name: name.to_owned(),
Udo Eisenbarth's avatar
Udo Eisenbarth committed
            is_inverted: false,
Udo Eisenbarth's avatar
Udo Eisenbarth committed
impl Optical for Dummy {
    fn set_name(&mut self, name: &str) {
        self.name = name.to_owned()
    }
    fn name(&self) -> &str {
        &self.name
    }
    /// Returns "dummy" as node type.
    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();
        ports
    }

    fn analyze(
        &mut self,
        incoming_data: LightResult,
        _analyzer_type: &AnalyzerType,
    ) -> Result<LightResult> {
        if !self.is_inverted {
            if let Some(data) = incoming_data.get("front") {
                Ok(HashMap::from([("rear".into(), data.clone())]))
            } else {
                Ok(HashMap::from([("rear".into(), None)]))
            }
        } else if let Some(data) = incoming_data.get("rear") {
            Ok(HashMap::from([("front".into(), data.clone())]))
        } else {
            Ok(HashMap::from([("front".into(), None)]))
    fn set_inverted(&mut self, inverted: bool) {
        self.is_inverted = inverted;
    fn inverted(&self) -> bool {
        self.is_inverted
    }
impl Dottable for Dummy {}

#[cfg(test)]
mod test {
    use super::*;
    #[test]
    fn new() {
        let node = Dummy::new("Test");
        assert_eq!(node.name, "Test");
        assert_eq!(node.inverted(), false);
        let node = Dummy::default();
        assert_eq!(node.name, "dummy");
        assert_eq!(node.inverted(), false);
    }
    #[test]
    fn set_name() {
        let mut node = Dummy::default();
        node.set_name("Test1");
        assert_eq!(node.name, "Test1")
    }
    #[test]
    fn name() {
        let mut node = Dummy::default();
        node.set_name("Test1");
        assert_eq!(node.name(), "Test1")
    }
    #[test]
    fn set_inverted() {
        let mut node = Dummy::default();
        node.set_inverted(true);
        assert_eq!(node.is_inverted, true)
    }
    #[test]
    fn inverted() {
        let mut node = Dummy::default();
        node.set_inverted(true);
        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");
    }
}