xref: /aosp_15_r20/external/pigweed/pw_unit_test/public/pw_unit_test/multi_event_handler.h (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1 // Copyright 2024 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14 #pragma once
15 
16 #include <array>
17 #include <cstddef>
18 
19 #include "pw_unit_test/event_handler.h"
20 
21 namespace pw::unit_test {
22 
23 /// Event handler adapter that allows for multiple event handlers to be
24 /// registered and used during test runs.
25 template <size_t kNumHandlers>
26 class MultiEventHandler : public EventHandler {
27  public:
28   template <
29       typename... EventHandlers,
30       typename = std::enable_if_t<sizeof...(EventHandlers) == kNumHandlers>>
MultiEventHandler(EventHandlers &...event_handlers)31   constexpr MultiEventHandler(EventHandlers&... event_handlers)
32       : event_handlers_{&event_handlers...} {}
33 
TestProgramStart(const ProgramSummary & program_summary)34   void TestProgramStart(const ProgramSummary& program_summary) override {
35     for (EventHandler* event_handler : event_handlers_) {
36       event_handler->TestProgramStart(program_summary);
37     }
38   }
EnvironmentsSetUpEnd()39   void EnvironmentsSetUpEnd() override {
40     for (EventHandler* event_handler : event_handlers_) {
41       event_handler->EnvironmentsSetUpEnd();
42     }
43   }
TestSuiteStart(const TestSuite & test_suite)44   void TestSuiteStart(const TestSuite& test_suite) override {
45     for (EventHandler* event_handler : event_handlers_) {
46       event_handler->TestSuiteStart(test_suite);
47     }
48   }
TestSuiteEnd(const TestSuite & test_suite)49   void TestSuiteEnd(const TestSuite& test_suite) override {
50     for (EventHandler* event_handler : event_handlers_) {
51       event_handler->TestSuiteEnd(test_suite);
52     }
53   }
EnvironmentsTearDownEnd()54   void EnvironmentsTearDownEnd() override {
55     for (EventHandler* event_handler : event_handlers_) {
56       event_handler->EnvironmentsTearDownEnd();
57     }
58   }
TestProgramEnd(const ProgramSummary & program_summary)59   void TestProgramEnd(const ProgramSummary& program_summary) override {
60     for (EventHandler* event_handler : event_handlers_) {
61       event_handler->TestProgramEnd(program_summary);
62     }
63   }
RunAllTestsStart()64   void RunAllTestsStart() override {
65     for (EventHandler* event_handler : event_handlers_) {
66       event_handler->RunAllTestsStart();
67     }
68   }
RunAllTestsEnd(const RunTestsSummary & run_tests_summary)69   void RunAllTestsEnd(const RunTestsSummary& run_tests_summary) override {
70     for (EventHandler* event_handler : event_handlers_) {
71       event_handler->RunAllTestsEnd(run_tests_summary);
72     }
73   }
TestCaseStart(const TestCase & test_case)74   void TestCaseStart(const TestCase& test_case) override {
75     for (EventHandler* event_handler : event_handlers_) {
76       event_handler->TestCaseStart(test_case);
77     }
78   }
TestCaseEnd(const TestCase & test_case,TestResult result)79   void TestCaseEnd(const TestCase& test_case, TestResult result) override {
80     for (EventHandler* event_handler : event_handlers_) {
81       event_handler->TestCaseEnd(test_case, result);
82     }
83   }
TestCaseExpect(const TestCase & test_case,const TestExpectation & expectation)84   void TestCaseExpect(const TestCase& test_case,
85                       const TestExpectation& expectation) override {
86     for (EventHandler* event_handler : event_handlers_) {
87       event_handler->TestCaseExpect(test_case, expectation);
88     }
89   }
TestCaseDisabled(const TestCase & test_case)90   void TestCaseDisabled(const TestCase& test_case) override {
91     for (EventHandler* event_handler : event_handlers_) {
92       event_handler->TestCaseDisabled(test_case);
93     }
94   }
95 
96  private:
97   static_assert(kNumHandlers > 0);
98   std::array<EventHandler*, kNumHandlers> event_handlers_;
99 };
100 
101 }  // namespace pw::unit_test
102