extern crate lcov_parser; use std::fs:: { File }; use std::io:: { Result, Read }; use std::env:: { current_dir }; use lcov_parser:: { LCOVParser, LCOVRecord }; #[derive(Clone)] pub struct LineResult { executed: i32, unused: i32 } #[derive(Clone)] pub struct FileResult { name: String, lines: LineResult } #[derive(Clone)] pub struct CoverageResult { files: Vec } fn open_fixture(path: &str) -> Result { let current_dir = current_dir().unwrap(); let file = current_dir.join(path); let fixture_file = File::open(file)?; Ok(fixture_file) } #[test] fn without_checksum() { let mut buffer = String::new(); let mut report = open_fixture("tests/fixtures/parser/report.lcov").unwrap(); let _ = report.read_to_string(&mut buffer); let records = LCOVParser::new(buffer.as_bytes()).parse().unwrap(); let mut result = CoverageResult { files: vec!() }; let mut file_result = FileResult { name: "".to_string(), lines: LineResult { executed: 0, unused: 0 } }; let mut line_result = LineResult { executed: 0, unused: 0 }; for record in records.iter() { match record { &LCOVRecord::SourceFile(ref name) => { line_result = LineResult { executed: 0, unused: 0 }; file_result = FileResult { name: name.clone(), lines: LineResult { executed: 0, unused: 0 } }; }, &LCOVRecord::Data(ref line) => { if line.count >= 1 { line_result.executed = line_result.executed + 1; } else { line_result.unused = line_result.unused + 1; } }, &LCOVRecord::EndOfRecord => { file_result.lines = line_result.clone(); result.files.push( file_result.clone() ); }, _ => { continue; } } } assert_eq!(records.len(), 13); assert_eq!(result.files.len(), 2); let f1 = result.files.get(0).unwrap(); assert_eq!(f1.lines.executed, 4); assert_eq!(f1.lines.unused, 0); let f2 = result.files.get(1).unwrap(); assert_eq!(f2.lines.executed, 0); assert_eq!(f2.lines.unused, 4); }