From 47ea6112a9d511e9b1fa6e3041599b90e1418c7d Mon Sep 17 00:00:00 2001 From: Fumiaki MATSUSHIMA Date: Sat, 2 Jan 2021 03:14:01 +0000 Subject: [PATCH] v0.3.0 --- CHANGELOG.md | 4 +++ Cargo.lock | 2 +- Cargo.toml | 2 +- src/main.rs | 78 +++++++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 74 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 08abd2f..e7f21da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # CHANGELOG +## 0.3.0 + +- Consider xml structure `` (e.g. rspec_junit_formatter) + ## 0.2.0 - Make --tests-glob required diff --git a/Cargo.lock b/Cargo.lock index c26432f..cc80d7a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -224,7 +224,7 @@ dependencies = [ [[package]] name = "split-test" -version = "0.2.0" +version = "0.3.0" dependencies = [ "anyhow", "env_logger", diff --git a/Cargo.toml b/Cargo.toml index 4bca8c0..a83e079 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "split-test" -version = "0.2.0" +version = "0.3.0" authors = ["Fumiaki MATSUSHIMA "] edition = "2018" diff --git a/src/main.rs b/src/main.rs index 6890667..14ca996 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ use quick_xml::de::from_reader; use serde::Deserialize; use std::collections::HashMap; use std::collections::HashSet; +use std::collections::VecDeque; use std::fs::canonicalize; use std::fs::File; use std::io::BufReader; @@ -29,15 +30,59 @@ struct Opt { } #[derive(Debug, Deserialize, PartialEq)] -struct Testsuites { - #[serde(rename = "testsuite", default)] - testsuites: Vec, +struct TestResultXml { + #[serde(rename = "testsuite", alias = "testcase", default)] + test_results: Vec, } #[derive(Debug, Deserialize, PartialEq)] -struct Testsuite { - filepath: PathBuf, +struct TestResult { + #[serde(alias = "filepath", default)] + file: Option, time: f64, + #[serde(rename = "testsuite", alias = "testcase", default)] + test_results: Vec, +} + +struct TestResultData { + file: Option, + time: f64, +} + +impl IntoIterator for TestResultXml { + type IntoIter = IntoIter; + type Item = TestResultData; + + fn into_iter(self) -> Self::IntoIter { + IntoIter { + remaining: self.test_results.into_iter().collect(), + } + } +} + +struct IntoIter { + remaining: VecDeque, +} + +impl Iterator for IntoIter { + type Item = TestResultData; + + fn next(&mut self) -> Option { + self.remaining.pop_front().and_then( + |TestResult { + file, + time, + test_results, + }| { + self.remaining.extend(test_results); + + Some(TestResultData { + file: file, + time: time, + }) + }, + ) + } } struct Node<'a> { @@ -80,14 +125,20 @@ fn get_test_file_results( for xml_path in expand_globs(&vec![String::from(xml_glob)])? { let reader = BufReader::new(File::open(xml_path)?); - let testsuites: Testsuites = from_reader(reader)?; - - for suite in testsuites.testsuites { - let total_time = test_file_results.entry(suite.filepath).or_insert(0.0); - *total_time += suite.time; + let test_result_xml: TestResultXml = from_reader(reader)?; + + for TestResultData { file, time } in test_result_xml { + file.map(|f| { + canonicalize(f).map(|normalized_file| { + let total_time = test_file_results.entry(normalized_file).or_insert(0.0); + *total_time += time; + }) + }); } } + debug!("{:?}", test_file_results); + Ok(test_file_results) } @@ -159,3 +210,10 @@ fn main() -> Result<()> { Ok(()) } + +/* +TODOS: + +- Test +- Test +*/