Newer
Older
pub struct OpticPorts {
inputs: HashSet<String>,
outputs: HashSet<String>,
}
impl OpticPorts {
pub fn new() -> Self {
Self::default()
}
pub fn inputs(&self) -> Vec<String> {
if self.inverted {
self.outputs.clone().into_iter().collect::<Vec<String>>()
} else {
self.inputs.clone().into_iter().collect::<Vec<String>>()
}
}
pub fn outputs(&self) -> Vec<String> {
if self.inverted {
self.inputs.clone().into_iter().collect::<Vec<String>>()
} else {
self.outputs.clone().into_iter().collect::<Vec<String>>()
}
pub fn add_input(&mut self, name: &str) -> Result<(), OpossumError> {
if self.inputs.insert(name.into()) {
Ok(())
} else {
Err(OpossumError::OpticPort(format!(
"input port with name {} already exists",
name
)))
}
pub fn add_output(&mut self, name: &str) -> Result<(), OpossumError> {
if self.outputs.insert(name.into()) {
Ok(())
} else {
Err(OpossumError::OpticPort(format!(
"output port with name {} already exists",
name
)))
}
pub fn set_inverted(&mut self, inverted: bool) {
self.inverted = inverted;
}
pub fn inverted(&self) -> bool {
self.inverted
}
}
#[cfg(test)]
mod test {
#[test]
fn new() {
let ports = OpticPorts::new();
assert_eq!(ports.inputs.len(), 0);
assert_eq!(ports.outputs.len(), 0);
assert_eq!(ports.inverted, false);
}
#[test]
fn add_input_ok() {
let mut ports = OpticPorts::new();
assert!(ports.add_input("Test").is_ok());
assert_eq!(ports.inputs.len(), 1);
}
#[test]
fn add_input_twice() {
let mut ports = OpticPorts::new();
assert!(ports.add_input("Test").is_ok());
assert!(ports.add_input("Test").is_err());
assert_eq!(ports.inputs.len(), 1);
}
#[test]
fn add_output_ok() {
let mut ports = OpticPorts::new();
assert!(ports.add_output("Test").is_ok());
assert_eq!(ports.outputs.len(), 1);
}
#[test]
fn add_output_twice() {
let mut ports = OpticPorts::new();
assert!(ports.add_output("Test").is_ok());
assert!(ports.add_output("Test").is_err());
assert_eq!(ports.outputs.len(), 1);
}
#[test]
fn inputs() {
let mut ports = OpticPorts::new();
ports.add_input("Test1").unwrap();
ports.add_input("Test2").unwrap();
ports.add_output("Test3").unwrap();
ports.add_output("Test4").unwrap();
v.sort();
assert_eq!(v, vec!["Test1".to_string(), "Test2".to_string()]);
}
#[test]
fn inputs_inverted() {
let mut ports = OpticPorts::new();
ports.set_inverted(true);
ports.add_input("Test1").unwrap();
ports.add_input("Test2").unwrap();
ports.add_output("Test3").unwrap();
ports.add_output("Test4").unwrap();
let mut v = ports.inputs();
v.sort();
assert_eq!(v, vec!["Test3".to_string(), "Test4".to_string()]);
}
#[test]
fn outputs() {
let mut ports = OpticPorts::new();
ports.add_input("Test1").unwrap();
ports.add_input("Test2").unwrap();
ports.add_output("Test3").unwrap();
ports.add_output("Test4").unwrap();
let mut v = ports.outputs();
v.sort();
assert_eq!(v, vec!["Test3".to_string(), "Test4".to_string()]);
}
#[test]
fn outputs_inverted() {
let mut ports = OpticPorts::new();
ports.set_inverted(true);
ports.add_input("Test1").unwrap();
ports.add_input("Test2").unwrap();
ports.add_output("Test3").unwrap();
ports.add_output("Test4").unwrap();
v.sort();
assert_eq!(v, vec!["Test1".to_string(), "Test2".to_string()]);
}
#[test]
fn set_inverted() {
let mut ports = OpticPorts::new();
ports.set_inverted(true);
assert_eq!(ports.inverted, true);
}
#[test]
fn inverted() {
let mut ports = OpticPorts::new();
ports.set_inverted(true);
assert_eq!(ports.inverted(), true);
}