diff options
Diffstat (limited to 'src/bindings.rs')
-rw-r--r-- | src/bindings.rs | 65 |
1 files changed, 44 insertions, 21 deletions
diff --git a/src/bindings.rs b/src/bindings.rs index 4233528..40ef0b4 100644 --- a/src/bindings.rs +++ b/src/bindings.rs @@ -274,15 +274,15 @@ impl Bindings { } /// Add a binding to the set. - pub fn add(&mut self, binding: &Binding) { - self.bindings.push(binding.clone()); + pub fn add(&mut self, binding: Binding) { + self.bindings.push(binding); } /// Add bindings from a YAML string pub fn add_from_yaml(&mut self, yaml: &str) -> Result<()> { let bindings: Vec<ParsedBinding> = serde_yaml::from_str(yaml)?; for b in bindings { - self.add(&from_hashmap(&b)?); + self.add(from_hashmap(&b)?); } Ok(()) } @@ -294,20 +294,17 @@ impl Bindings { /// Find the binding matching a given scenario step, if there is /// exactly one. - pub fn find(&self, step: &ScenarioStep) -> Option<MatchedStep> { + pub fn find(&self, step: &ScenarioStep) -> Result<MatchedStep> { let mut matches = self .bindings() .iter() - .map(|b| b.match_with_step(step)) - .filter(|o| o.is_some()); - if let Some(m) = matches.next() { - if matches.count() == 0 { - m - } else { - None - } - } else { - None + .filter_map(|b| b.match_with_step(step)); + match matches.next() { + None => Err(SubplotError::BindingUnknown(step.to_string())), + Some(matched) => match matches.next() { + None => Ok(matched), + Some(_) => Err(SubplotError::BindingNotUnique(step.to_string())), + }, } } @@ -398,7 +395,7 @@ mod test_bindings { let binding = Binding::new(StepKind::Given, r"I am (?P<name>\S+)", "set_name", None).unwrap(); let mut bindings = Bindings::new(); - bindings.add(&binding); + bindings.add(binding.clone()); assert_eq!(bindings.bindings(), &[binding]); } @@ -440,8 +437,11 @@ mod test_bindings { let step = ScenarioStep::new(StepKind::Given, "given", "I am Tomjon"); let binding = Binding::new(StepKind::When, r"I am Tomjon", "set_foo", None).unwrap(); let mut bindings = Bindings::new(); - bindings.add(&binding); - assert!(bindings.find(&step).is_none()); + bindings.add(binding); + assert!(match bindings.find(&step) { + Err(SubplotError::BindingUnknown(_)) => true, + _ => false, + }); } #[test] @@ -450,8 +450,31 @@ mod test_bindings { let binding = Binding::new(StepKind::Given, r"I am Tomjon of Lancre", "set_foo", None).unwrap(); let mut bindings = Bindings::new(); - bindings.add(&binding); - assert!(bindings.find(&step).is_none()); + bindings.add(binding); + assert!(match bindings.find(&step) { + Err(SubplotError::BindingUnknown(_)) => true, + _ => false, + }); + } + + #[test] + fn two_matching_bindings() { + let step = ScenarioStep::new(StepKind::Given, "given", "I am Tomjon"); + let mut bindings = Bindings::default(); + bindings.add(Binding::new(StepKind::Given, r"I am Tomjon", "set_foo", None).unwrap()); + bindings.add( + Binding::new( + StepKind::Given, + &super::regex_from_simple_pattern(r"I am {name}", false).unwrap(), + "set_foo", + None, + ) + .unwrap(), + ); + assert!(match bindings.find(&step) { + Err(SubplotError::BindingNotUnique(_)) => true, + _ => false, + }); } #[test] @@ -459,7 +482,7 @@ mod test_bindings { let step = ScenarioStep::new(StepKind::Given, "given", "I am Tomjon"); let binding = Binding::new(StepKind::Given, r"I am Tomjon", "set_name", None).unwrap(); let mut bindings = Bindings::new(); - bindings.add(&binding); + bindings.add(binding); let m = bindings.find(&step).unwrap(); assert_eq!(m.kind(), StepKind::Given); let mut parts = m.parts(); @@ -477,7 +500,7 @@ mod test_bindings { let binding = Binding::new(StepKind::Given, r"I am (?P<name>\S+)", "set_name", None).unwrap(); let mut bindings = Bindings::new(); - bindings.add(&binding); + bindings.add(binding); let m = bindings.find(&step).unwrap(); assert_eq!(m.kind(), StepKind::Given); let mut parts = m.parts(); |