mantra_schema/
coverage.rs

1use std::path::PathBuf;
2
3use crate::{requirements::ReqId, Line};
4
5#[derive(
6    Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, schemars::JsonSchema,
7)]
8pub struct CoverageSchema {
9    #[serde(serialize_with = "crate::serialize_schema_version")]
10    pub version: Option<String>,
11    #[serde(alias = "test-runs")]
12    pub test_runs: Vec<TestRun>,
13}
14
15#[derive(
16    Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize, schemars::JsonSchema,
17)]
18pub struct TestRun {
19    pub name: String,
20    /// Test run date must be given in ISO8601 format.
21    #[serde(
22        serialize_with = "time::serde::iso8601::serialize",
23        deserialize_with = "time::serde::iso8601::deserialize"
24    )]
25    #[schemars(with = "String")]
26    pub date: time::OffsetDateTime,
27    #[serde(alias = "nr-of-tests")]
28    pub nr_of_tests: u32,
29    /// Field to store custom information per test run.
30    pub data: Option<serde_json::Value>,
31    pub logs: Option<String>,
32    pub tests: Vec<Test>,
33}
34
35#[derive(Debug, Clone, PartialEq, Eq, Hash)]
36pub struct TestRunPk {
37    pub name: String,
38    pub date: time::OffsetDateTime,
39}
40
41#[derive(
42    Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize, schemars::JsonSchema,
43)]
44pub struct Test {
45    pub name: String,
46    pub filepath: PathBuf,
47    pub line: Line,
48    pub state: TestState,
49    #[serde(default, alias = "covered-files")]
50    pub covered_files: Vec<CoveredFile>,
51}
52
53#[derive(
54    Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize, schemars::JsonSchema,
55)]
56pub struct CoveredFile {
57    pub filepath: PathBuf,
58    #[serde(default, alias = "covered-traces")]
59    pub covered_traces: Vec<CoveredFileTrace>,
60    #[serde(default, alias = "covered-lines")]
61    pub covered_lines: Vec<CoveredLine>,
62}
63
64#[derive(
65    Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize, schemars::JsonSchema,
66)]
67pub struct CoveredFileTrace {
68    #[serde(alias = "req-ids")]
69    pub req_ids: Vec<ReqId>,
70    pub line: Line,
71}
72
73#[derive(
74    Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize, schemars::JsonSchema,
75)]
76pub struct CoveredLine {
77    pub line: Line,
78    pub hits: usize,
79}
80
81impl std::cmp::PartialOrd for CoveredLine {
82    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
83        Some(self.cmp(other))
84    }
85}
86
87impl std::cmp::Ord for CoveredLine {
88    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
89        self.line.cmp(&other.line)
90    }
91}
92
93#[derive(
94    Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize, schemars::JsonSchema,
95)]
96#[serde(rename_all = "lowercase")]
97pub enum TestState {
98    Passed,
99    Failed,
100    Skipped { reason: Option<String> },
101}