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