sweet 0.4.2

A delightful cross-platform test runner
Documentation
use crate::prelude::*;
use colorize::*;

#[derive(Debug, Default)]
pub struct ResultCount {
	pub total: usize,
	pub failed: usize,
	pub skipped: usize,
}


impl ResultCount {
	pub fn from_file_results<'a>(
		results: impl Iterator<Item = &'a FileResult>,
	) -> Self {
		let mut count = Self::default();
		for result in results {
			count.append_result(&result.status());
		}
		count
	}
	pub fn from_case_results(results: &Vec<TestDescAndResult>) -> Self {
		let mut count = Self::default();
		for result in results {
			count.append_result(&result.result);
		}
		count
	}

	pub fn append_result(&mut self, result: &TestResult) {
		self.total += 1;
		match result {
			TestResult::Pass => {}
			TestResult::Fail(_) => self.failed += 1,
			TestResult::Ignore(_) => self.skipped += 1,
		}
	}

	pub fn is_empty(&self) -> bool { self.total == 0 }
	pub fn succeeded(&self) -> bool { self.failed == 0 }


	pub fn pretty_print(&self, prefix: &'static str) -> String {
		let ResultCount {
			total,
			failed,
			skipped,
		} = self;
		let passed = total - failed - skipped;
		let mut summaries: Vec<&str> = Vec::new();
		let passed_str = format!("{passed} passed").bold().green();
		let skipped_str = format!("{skipped} skipped").bold().yellow();
		let failed_str = format!("{failed} failed").bold().red();
		let total_str = if passed == *total {
			format!("{total} total")
		} else {
			format!("{passed} of {total} total")
		};
		if *failed > 0 {
			summaries.push(&failed_str);
		}
		if *skipped > 0 {
			summaries.push(&skipped_str);
		}
		summaries.push(&passed_str);
		summaries.push(&total_str);
		format!("{}:\t\t{}", prefix.bold(), summaries.join(", "))
	}
}