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 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}