#[cfg(feature = "serde")]
use intern::{Interner, SerializeWithInterner};
use intern::Symbol;
use raw::{ArcAttr, BlockAttr};
use utils::tuple_4_add;
#[cfg(feature = "serde")]
use serde::{Serialize, Serializer};
use std::collections::{BTreeMap, HashMap};
derive_serialize_with_interner! {
#[derive(Clone, PartialEq, Eq, Debug, Default)]
#[cfg_attr(feature="serde", derive(Serialize, Deserialize))]
pub struct Report {
pub files: HashMap<Symbol, File>,
}
}
derive_serialize_with_interner! {
#[derive(Clone, PartialEq, Eq, Hash, Debug, Default)]
#[cfg_attr(feature="serde", derive(Serialize, Deserialize))]
pub struct File {
pub lines: BTreeMap<u32, Line>,
pub functions: Vec<Function>,
}
}
impl File {
pub fn summary(&self) -> FileSummary {
let lines_count = self.lines.len();
let lines_covered = self.lines.values().filter(|line| line.count > 0).count();
let functions_count = self.functions.len();
let (branches_count, branches_executed, branches_taken, functions_called) = self.functions
.iter()
.map(|f| {
let s = &f.summary;
(s.branches_count, s.branches_executed, s.branches_taken, (s.entry_count > 0) as usize)
})
.fold((0, 0, 0, 0), tuple_4_add);
FileSummary {
lines_count,
lines_covered,
branches_count,
branches_executed,
branches_taken,
functions_count,
functions_called,
}
}
}
derive_serialize_with_interner! {
#[derive(Clone, PartialEq, Eq, Hash, Debug, Default)]
#[cfg_attr(feature="serde", derive(Serialize, Deserialize))]
pub struct Line {
pub count: u64,
pub attr: BlockAttr,
pub branches: Vec<Branch>,
}
}
derive_serialize_with_interner! {
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Default)]
#[cfg_attr(feature="serde", derive(Serialize, Deserialize))]
pub struct Branch {
pub count: u64,
pub attr: ArcAttr,
pub filename: Symbol,
pub line: u32,
pub column: u32,
}
}
derive_serialize_with_interner! {
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Default)]
#[cfg_attr(feature="serde", derive(Serialize, Deserialize))]
pub struct Function {
pub name: Symbol,
pub line: u32,
pub column: u32,
pub summary: FunctionSummary,
}
}
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct FunctionSummary {
pub blocks_count: usize,
pub blocks_executed: usize,
pub entry_count: u64,
pub exit_count: u64,
pub branches_count: usize,
pub branches_executed: usize,
pub branches_taken: usize,
}
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct FileSummary {
pub lines_count: usize,
pub lines_covered: usize,
pub branches_count: usize,
pub branches_executed: usize,
pub branches_taken: usize,
pub functions_count: usize,
pub functions_called: usize,
}
derive_serialize_with_interner! {
direct: FunctionSummary, FileSummary
}