Skip to main content

katana_document_viewer/
evaluation.rs

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;