Skip to main content

jellyflow_runtime/runtime/conformance/runner/
mod.rs

1use std::cell::RefCell;
2use std::rc::Rc;
3
4use crate::runtime::store::NodeGraphStore;
5
6use super::reports::{ConformanceRunError, ConformanceRunReport, ConformanceSuiteReport};
7use super::scenario::{ConformanceScenario, ConformanceSuite};
8
9mod actions;
10mod trace;
11
12use actions::execute_action;
13use trace::install_trace_recorders;
14
15impl ConformanceSuite {
16    pub fn run(&self) -> ConformanceSuiteReport {
17        run_conformance_suite(self)
18    }
19}
20
21pub fn run_conformance_scenario(
22    scenario: &ConformanceScenario,
23) -> Result<ConformanceRunReport, ConformanceRunError> {
24    ConformanceRunner::new(scenario).run()
25}
26
27pub fn run_conformance_suite(suite: &ConformanceSuite) -> ConformanceSuiteReport {
28    let mut scenario_reports = Vec::new();
29    let mut errors = Vec::new();
30
31    for scenario in &suite.scenarios {
32        match run_conformance_scenario(scenario) {
33            Ok(report) => scenario_reports.push(report),
34            Err(error) => errors.push(error),
35        }
36    }
37
38    ConformanceSuiteReport {
39        suite: suite.name.clone(),
40        scenario_reports,
41        errors,
42    }
43}
44
45#[derive(Debug)]
46pub struct ConformanceRunner<'a> {
47    scenario: &'a ConformanceScenario,
48}
49
50impl<'a> ConformanceRunner<'a> {
51    pub fn new(scenario: &'a ConformanceScenario) -> Self {
52        Self { scenario }
53    }
54
55    pub fn run(&self) -> Result<ConformanceRunReport, ConformanceRunError> {
56        let compiled = self.scenario.compiled();
57        let setup = self.scenario.setup();
58        let mut store = NodeGraphStore::new(
59            setup.graph.clone(),
60            setup.view_state.clone(),
61            setup.editor_config.clone(),
62        );
63        let trace = Rc::new(RefCell::new(Vec::new()));
64        install_trace_recorders(&mut store, setup.trace, trace.clone());
65
66        for (index, action) in compiled.actions().iter().enumerate() {
67            execute_action(&mut store, action).map_err(|message| ConformanceRunError {
68                scenario: self.scenario.name.clone(),
69                action_index: index,
70                action_kind: action.kind().to_owned(),
71                message,
72            })?;
73        }
74
75        Ok(ConformanceRunReport::new(
76            self.scenario.name.clone(),
77            trace.borrow().clone(),
78            compiled.expected_trace(),
79        ))
80    }
81}