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