1use serde::{Deserialize, Serialize};
2
3#[path = "evaluation_coverage.rs"]
4mod evaluation_coverage;
5#[path = "evaluation_fixtures.rs"]
6mod evaluation_fixtures;
7
8use evaluation_coverage::V01EvaluationCoverageFactory;
9use evaluation_fixtures::V01EvaluationFixtureFactory;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
12pub enum FixtureCategory {
13 CommonMark,
14 Gfm,
15 Math,
16 GitHubAlert,
17 KatanaCompatibility,
18 ExternalRendering,
19}
20
21#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
22pub enum CoverageStatus {
23 KmmDto,
24 KrrDirect,
25 KrrMermaidCompatibility,
26 KdvExportContract,
27 MissingImplementation,
28 ExternalBackendRequired,
29}
30
31#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
32pub struct EvaluationFixture {
33 pub id: String,
34 pub path: String,
35 pub category: FixtureCategory,
36 pub scenario: String,
37 pub coverage: CoverageStatus,
38}
39
40#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
41pub struct EvaluationFixtureMatrix {
42 pub fixtures: Vec<EvaluationFixture>,
43}
44
45#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
46pub struct EvaluationFeatureCoverage {
47 pub id: String,
48 pub fixture_id: String,
49 pub category: FixtureCategory,
50 pub scenario: String,
51 pub status: CoverageStatus,
52}
53
54#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
55pub struct EvaluationCoverageMatrix {
56 pub features: Vec<EvaluationFeatureCoverage>,
57}
58
59#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
60pub enum BackendCapability {
61 KrrDirect,
62 KrrMermaidCompatibility,
63 KdvManifestExport,
64 ExternalBackendRequired,
65}
66
67#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
68pub struct BackendCapabilityMatrix {
69 pub capabilities: Vec<BackendCapabilityEntry>,
70}
71
72#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
73pub struct BackendCapabilityEntry {
74 pub feature: String,
75 pub capability: BackendCapability,
76 pub backend: String,
77}
78
79impl EvaluationFixtureMatrix {
80 pub fn v0_1() -> Self {
81 Self {
82 fixtures: V01EvaluationFixtureFactory::create(),
83 }
84 }
85
86 pub fn status_count(&self, status: CoverageStatus) -> usize {
87 self.fixtures
88 .iter()
89 .filter(|fixture| fixture.coverage == status)
90 .count()
91 }
92
93 pub fn contains_category(&self, category: FixtureCategory) -> bool {
94 self.fixtures
95 .iter()
96 .any(|fixture| fixture.category == category)
97 }
98}
99
100impl EvaluationCoverageMatrix {
101 pub fn v0_1() -> Self {
102 Self {
103 features: V01EvaluationCoverageFactory::create(),
104 }
105 }
106
107 pub fn status_count(&self, status: CoverageStatus) -> usize {
108 self.features
109 .iter()
110 .filter(|feature| feature.status == status)
111 .count()
112 }
113
114 pub fn is_complete(&self) -> bool {
115 self.status_count(CoverageStatus::MissingImplementation) == 0
116 && self.status_count(CoverageStatus::ExternalBackendRequired) == 0
117 }
118
119 pub fn is_kdv_owned_complete(&self) -> bool {
120 self.status_count(CoverageStatus::MissingImplementation) == 0
121 }
122
123 pub fn contains_feature(&self, id: &str, status: CoverageStatus) -> bool {
124 self.features
125 .iter()
126 .any(|feature| feature.id == id && feature.status == status)
127 }
128}
129
130impl BackendCapabilityMatrix {
131 pub fn v0_1() -> Self {
132 Self {
133 capabilities: vec![
134 capability("mermaid", BackendCapability::KrrDirect, "krr"),
135 capability("drawio", BackendCapability::KrrDirect, "krr"),
136 capability("zenuml", BackendCapability::KrrMermaidCompatibility, "krr"),
137 capability("plantuml", BackendCapability::KrrDirect, "krr"),
138 capability("html-export", BackendCapability::KdvManifestExport, "kdv"),
139 capability("pdf-export", BackendCapability::KdvManifestExport, "kdv"),
140 capability("png-export", BackendCapability::KdvManifestExport, "kdv"),
141 capability("jpeg-export", BackendCapability::KdvManifestExport, "kdv"),
142 capability("math", BackendCapability::KdvManifestExport, "kdv"),
143 ],
144 }
145 }
146}
147
148fn capability(
149 feature: &'static str,
150 capability: BackendCapability,
151 backend: &'static str,
152) -> BackendCapabilityEntry {
153 BackendCapabilityEntry {
154 feature: feature.to_string(),
155 capability,
156 backend: backend.to_string(),
157 }
158}
159
160#[cfg(test)]
161#[path = "evaluation_kmm_tests.rs"]
162mod kmm_tests;
163
164#[cfg(test)]
165#[path = "evaluation_tests.rs"]
166mod tests;