use serde::Deserialize;
#[derive(Debug, Deserialize)]
pub struct Coverage {
#[serde(default)]
pub packages: Packages,
}
#[derive(Debug, Deserialize, Default)]
pub struct Packages {
#[serde(rename = "package", default)]
pub package: Vec<Package>,
}
#[derive(Debug, Deserialize, Default)]
pub struct Package {
#[serde(rename = "@name", default)]
pub name: String,
#[serde(rename = "classes", default)]
pub classes: Classes,
}
#[derive(Debug, Deserialize, Default)]
pub struct Classes {
#[serde(rename = "class", default)]
pub class: Vec<Class>,
}
#[derive(Debug, Deserialize, Default)]
pub struct Class {
#[serde(rename = "@name", default)]
pub name: String,
#[serde(rename = "@filename", default)]
pub filename: String,
#[serde(rename = "@line-rate", default)]
pub line_rate: f64,
}
#[cfg(test)]
mod tests {
use anyhow::Result;
use crate::platform::dotnet_cobertura::Coverage;
#[test]
fn parse_cobertura() -> Result<()> {
let cobertura = include_str!("../../tests/test_data/coverage.cobertura.xml");
let coverage: Coverage = quick_xml::de::from_str(cobertura)?;
println!("coverage: {coverage:?}");
assert_eq!(coverage.packages.package.len(), 17);
let pkg = &coverage.packages.package[0];
assert_eq!(pkg.name, "Microsoft.VisualStudio.TestPlatform.ObjectModel");
let pkg = &coverage.packages.package[12];
assert_eq!(pkg.name, "MathFunctions");
assert_eq!(pkg.classes.class.len(), 2);
let cls = &pkg.classes.class[0];
assert_eq!(cls.name, "MathFunctions.BasicOps");
assert_eq!(
cls.filename,
"home/mfenniak/Dev/testtrim-test-projects/dotnet-coverage-specimen/MathFunctions/BasicOps.cs"
);
assert!((cls.line_rate - 1.0).abs() < 0.01, "line_rate == 1.0");
Ok(())
}
}