summaryrefslogtreecommitdiff
path: root/cli/tools/test/reporters/compound.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tools/test/reporters/compound.rs')
-rw-r--r--cli/tools/test/reporters/compound.rs131
1 files changed, 131 insertions, 0 deletions
diff --git a/cli/tools/test/reporters/compound.rs b/cli/tools/test/reporters/compound.rs
new file mode 100644
index 000000000..5d03af6ef
--- /dev/null
+++ b/cli/tools/test/reporters/compound.rs
@@ -0,0 +1,131 @@
+// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
+
+use super::*;
+
+pub struct CompoundTestReporter {
+ test_reporters: Vec<Box<dyn TestReporter>>,
+}
+
+impl CompoundTestReporter {
+ pub fn new(test_reporters: Vec<Box<dyn TestReporter>>) -> Self {
+ Self { test_reporters }
+ }
+}
+
+impl TestReporter for CompoundTestReporter {
+ fn report_register(&mut self, description: &TestDescription) {
+ for reporter in &mut self.test_reporters {
+ reporter.report_register(description);
+ }
+ }
+
+ fn report_plan(&mut self, plan: &TestPlan) {
+ for reporter in &mut self.test_reporters {
+ reporter.report_plan(plan);
+ }
+ }
+
+ fn report_wait(&mut self, description: &TestDescription) {
+ for reporter in &mut self.test_reporters {
+ reporter.report_wait(description);
+ }
+ }
+
+ fn report_output(&mut self, output: &[u8]) {
+ for reporter in &mut self.test_reporters {
+ reporter.report_output(output);
+ }
+ }
+
+ fn report_result(
+ &mut self,
+ description: &TestDescription,
+ result: &TestResult,
+ elapsed: u64,
+ ) {
+ for reporter in &mut self.test_reporters {
+ reporter.report_result(description, result, elapsed);
+ }
+ }
+
+ fn report_uncaught_error(&mut self, origin: &str, error: Box<JsError>) {
+ for reporter in &mut self.test_reporters {
+ reporter.report_uncaught_error(origin, error.clone());
+ }
+ }
+
+ fn report_step_register(&mut self, description: &TestStepDescription) {
+ for reporter in &mut self.test_reporters {
+ reporter.report_step_register(description)
+ }
+ }
+
+ fn report_step_wait(&mut self, description: &TestStepDescription) {
+ for reporter in &mut self.test_reporters {
+ reporter.report_step_wait(description)
+ }
+ }
+
+ fn report_step_result(
+ &mut self,
+ desc: &TestStepDescription,
+ result: &TestStepResult,
+ elapsed: u64,
+ tests: &IndexMap<usize, TestDescription>,
+ test_steps: &IndexMap<usize, TestStepDescription>,
+ ) {
+ for reporter in &mut self.test_reporters {
+ reporter.report_step_result(desc, result, elapsed, tests, test_steps);
+ }
+ }
+
+ fn report_summary(
+ &mut self,
+ elapsed: &Duration,
+ tests: &IndexMap<usize, TestDescription>,
+ test_steps: &IndexMap<usize, TestStepDescription>,
+ ) {
+ for reporter in &mut self.test_reporters {
+ reporter.report_summary(elapsed, tests, test_steps);
+ }
+ }
+
+ fn report_sigint(
+ &mut self,
+ tests_pending: &HashSet<usize>,
+ tests: &IndexMap<usize, TestDescription>,
+ test_steps: &IndexMap<usize, TestStepDescription>,
+ ) {
+ for reporter in &mut self.test_reporters {
+ reporter.report_sigint(tests_pending, tests, test_steps);
+ }
+ }
+
+ fn flush_report(
+ &mut self,
+ elapsed: &Duration,
+ tests: &IndexMap<usize, TestDescription>,
+ test_steps: &IndexMap<usize, TestStepDescription>,
+ ) -> anyhow::Result<()> {
+ let mut errors = vec![];
+ for reporter in &mut self.test_reporters {
+ if let Err(err) = reporter.flush_report(elapsed, tests, test_steps) {
+ errors.push(err)
+ }
+ }
+
+ if errors.is_empty() {
+ Ok(())
+ } else {
+ bail!(
+ "error in one or more wrapped reporters:\n{}",
+ errors
+ .iter()
+ .enumerate()
+ .fold(String::new(), |acc, (i, err)| {
+ format!("{}Error #{}: {:?}\n", acc, i + 1, err)
+ })
+ )
+ }
+ }
+}