summaryrefslogtreecommitdiff
path: root/src/steps.rs
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2019-10-27 15:41:27 +0200
committerLars Wirzenius <liw@liw.fi>2019-10-27 15:41:27 +0200
commitf3bbb447458ef060c0d4dddfbebc5883f074824f (patch)
treeb69b876bbb4f98fb1369dcc0c2d410d6703b2280 /src/steps.rs
parentf9b209294282f1cf67ff91bf474926b3de63cfca (diff)
downloadsubplot-f3bbb447458ef060c0d4dddfbebc5883f074824f.tar.gz
Add: function to parse a scenario step
Diffstat (limited to 'src/steps.rs')
-rw-r--r--src/steps.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/steps.rs b/src/steps.rs
index ca9a75c..ce1c031 100644
--- a/src/steps.rs
+++ b/src/steps.rs
@@ -27,6 +27,27 @@ impl ScenarioStep {
pub fn text(&self) -> &str {
&self.text
}
+
+ pub fn from_str(text: &str) -> Option<ScenarioStep> {
+ let mut words = text.split_whitespace();
+
+ let kind = match words.next() {
+ Some("given") => StepKind::Given,
+ Some("when") => StepKind::When,
+ Some("then") => StepKind::Then,
+ _ => return None,
+ };
+
+ let mut joined = String::new();
+ for word in words {
+ joined.push_str(word);
+ joined.push_str(" ");
+ }
+ if joined.len() > 1 {
+ joined.pop();
+ }
+ Some(ScenarioStep::new(kind, &joined))
+ }
}
/// The kind of scenario step we have: given, when, or then.
@@ -40,3 +61,36 @@ pub enum StepKind {
When,
Then,
}
+
+#[cfg(test)]
+mod test {
+ use super::{ScenarioStep, StepKind};
+
+ #[test]
+ fn parses_given() {
+ let step = ScenarioStep::from_str("given I am Tomjon").unwrap();
+ assert_eq!(step.kind(), StepKind::Given);
+ assert_eq!(step.text(), "I am Tomjon");
+ }
+
+ #[test]
+ fn parses_given_with_extra_spaces() {
+ let step = ScenarioStep::from_str(" given I am Tomjon ").unwrap();
+ assert_eq!(step.kind(), StepKind::Given);
+ assert_eq!(step.text(), "I am Tomjon");
+ }
+
+ #[test]
+ fn parses_when() {
+ let step = ScenarioStep::from_str("when I declare myself king").unwrap();
+ assert_eq!(step.kind(), StepKind::When);
+ assert_eq!(step.text(), "I declare myself king");
+ }
+
+ #[test]
+ fn parses_then() {
+ let step = ScenarioStep::from_str("then everyone accepts it").unwrap();
+ assert_eq!(step.kind(), StepKind::Then);
+ assert_eq!(step.text(), "everyone accepts it");
+ }
+}