mod script;
mod scenario;
use log::debug;
use crate::scenario::scenario::{Scenario, ScenarioError};
use crate::script::Script;
#[allow(missing_docs)]
pub struct Runner<'a> {
pub filename: String,
script: Option<Script<'a>>,
pub tags: Vec<String>,
}
impl<'a> Runner<'_> {
pub fn new(filename: String) -> Runner<'static> {
Runner {
filename: filename.clone(),
script: Some(Script::new(filename.to_string())),
tags: Vec::new() ,
}
}
pub fn tags(&mut self, p0: Vec<&str>) {
p0.iter().for_each(|x| self.tags.push(x.to_string()));
}
pub fn run(&mut self) -> Result<(), ScenarioError> {
debug!("Loading script: {}", self.filename);
self.script.as_mut().unwrap().load_script();
let background= match &self.script.as_mut().unwrap().background {
Some(background) => {background.clone()},
None => Scenario::new(),
};
for sc in self.script.as_mut().unwrap().scenarios.iter_mut() {
if self.tags.is_empty() || self.tags.contains(&sc.tag) {
debug!("Tag: {}", sc.tag);
match sc.execute(&background) {
Ok(_) => {
debug!("End of scenario: {}", sc.name)
}
Err(scenario_error) => {
return Err(scenario_error);
}
}
} else {
debug!("Skipping tag: {}", sc.tag);
}
}
return Ok(());
}
}
#[cfg(test)]
mod tests {
use log::error;
use super::*;
#[test]
fn runner_run() {
debug!("runner: apiRquest");
debug!("Load script file: ../features/test_api_restful_api.feature");
let mut runner = Runner::new("../features/test_api_restful_api.feature".to_string());
runner.tags(vec!["@ScenarioExample"]);
let r = runner.run();
r.unwrap_or_else(|e| error!("Error: {}", e))
}
}