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        capabilities: suite.capabilities.clone(),
41        capability_gaps: suite.capabilities.gaps(&suite.capability_requirements),
42        scenario_reports,
43        errors,
44    }
45}
46
47#[derive(Debug)]
48pub struct ConformanceRunner<'a> {
49    scenario: &'a ConformanceScenario,
50}
51
52impl<'a> ConformanceRunner<'a> {
53    pub fn new(scenario: &'a ConformanceScenario) -> Self {
54        Self { scenario }
55    }
56
57    pub fn run(&self) -> Result<ConformanceRunReport, ConformanceRunError> {
58        let compiled = self.scenario.compiled();
59        let setup = self.scenario.setup();
60        let mut store = NodeGraphStore::new(
61            setup.graph.clone(),
62            setup.view_state.clone(),
63            setup.editor_config.clone(),
64        );
65        let trace = Rc::new(RefCell::new(Vec::new()));
66        install_trace_recorders(&mut store, setup.trace, trace.clone());
67
68        for (index, action) in compiled.actions().iter().enumerate() {
69            execute_action(&mut store, action).map_err(|message| ConformanceRunError {
70                scenario: self.scenario.name.clone(),
71                action_index: index,
72                action_kind: action.kind().to_owned(),
73                message,
74            })?;
75        }
76
77        Ok(ConformanceRunReport::new(
78            self.scenario.name.clone(),
79            trace.borrow().clone(),
80            compiled.expected_trace(),
81        ))
82    }
83}