jellyflow_runtime/runtime/conformance/runner/
mod.rs1use 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}