summaryrefslogtreecommitdiff
path: root/src/bindings.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bindings.rs')
-rw-r--r--src/bindings.rs65
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();