// Copyright 2024 The Pigweed Authors // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include "pw_unit_test/multi_event_handler.h" #include "pw_unit_test/framework.h" namespace pw::unit_test { namespace { // Fake event handler that keeps track of how many times its functions were // invoked class FakeEventHandler : public EventHandler { public: struct { int TestProgramStart = 0; int EnvironmentsSetUpEnd = 0; int TestSuiteStart = 0; int TestSuiteEnd = 0; int EnvironmentsTearDownEnd = 0; int TestProgramEnd = 0; int RunAllTestsStart = 0; int RunAllTestsEnd = 0; int TestCaseStart = 0; int TestCaseEnd = 0; int TestCaseExpect = 0; int TestCaseDisabled = 0; } function_invocation_counts; void TestProgramStart(const ProgramSummary&) override { function_invocation_counts.TestProgramStart++; } void EnvironmentsSetUpEnd() override { function_invocation_counts.EnvironmentsSetUpEnd++; } void TestSuiteStart(const TestSuite&) override { function_invocation_counts.TestSuiteStart++; } void TestSuiteEnd(const TestSuite&) override { function_invocation_counts.TestSuiteEnd++; } void EnvironmentsTearDownEnd() override { function_invocation_counts.EnvironmentsTearDownEnd++; } void TestProgramEnd(const ProgramSummary&) override { function_invocation_counts.TestProgramEnd++; } void RunAllTestsStart() override { function_invocation_counts.RunAllTestsStart++; } void RunAllTestsEnd(const RunTestsSummary&) override { function_invocation_counts.RunAllTestsEnd++; } void TestCaseStart(const TestCase&) override { function_invocation_counts.TestCaseStart++; } void TestCaseEnd(const TestCase&, TestResult) override { function_invocation_counts.TestCaseEnd++; } void TestCaseExpect(const TestCase&, const TestExpectation&) override { function_invocation_counts.TestCaseExpect++; } void TestCaseDisabled(const TestCase&) override { function_invocation_counts.TestCaseDisabled++; } }; // Helper method for ensuring all methods of an event handler were called x // number of times void AssertFunctionInvocationCounts(FakeEventHandler handler, int num_invocations) { ASSERT_EQ(handler.function_invocation_counts.TestProgramStart, num_invocations); ASSERT_EQ(handler.function_invocation_counts.EnvironmentsSetUpEnd, num_invocations); ASSERT_EQ(handler.function_invocation_counts.TestSuiteStart, num_invocations); ASSERT_EQ(handler.function_invocation_counts.TestSuiteEnd, num_invocations); ASSERT_EQ(handler.function_invocation_counts.EnvironmentsTearDownEnd, num_invocations); ASSERT_EQ(handler.function_invocation_counts.TestProgramEnd, num_invocations); ASSERT_EQ(handler.function_invocation_counts.RunAllTestsStart, num_invocations); ASSERT_EQ(handler.function_invocation_counts.RunAllTestsEnd, num_invocations); ASSERT_EQ(handler.function_invocation_counts.TestCaseStart, num_invocations); ASSERT_EQ(handler.function_invocation_counts.TestCaseEnd, num_invocations); ASSERT_EQ(handler.function_invocation_counts.TestCaseExpect, num_invocations); ASSERT_EQ(handler.function_invocation_counts.TestCaseDisabled, num_invocations); } TEST(AllEventHandlerMethodsCalled, InvokeMethodMultipleTimes) { FakeEventHandler h1; FakeEventHandler h2; MultiEventHandler<2> multi_handler(h1, h2); ASSERT_EQ(h1.function_invocation_counts.TestCaseStart, 0); ASSERT_EQ(h2.function_invocation_counts.TestCaseEnd, 0); TestCase test_case{}; TestResult test_result = TestResult::kSuccess; multi_handler.TestCaseStart(test_case); multi_handler.TestCaseStart(test_case); multi_handler.TestCaseStart(test_case); multi_handler.TestCaseEnd(test_case, test_result); multi_handler.TestCaseEnd(test_case, test_result); multi_handler.TestCaseEnd(test_case, test_result); ASSERT_EQ(h1.function_invocation_counts.TestCaseStart, 3); ASSERT_EQ(h2.function_invocation_counts.TestCaseEnd, 3); } TEST(AllEventHandlerMethodsCalled, InvokeAllEventHandlerMethods) { FakeEventHandler h1; FakeEventHandler h2; MultiEventHandler<2> multi_handler(h1, h2); AssertFunctionInvocationCounts(h1, 0); AssertFunctionInvocationCounts(h2, 0); ProgramSummary program_summary{}; TestSuite test_suite{}; TestCase test_case{}; RunTestsSummary run_test_summary{}; TestExpectation expectation{}; TestResult test_result = TestResult::kSuccess; multi_handler.TestProgramStart(program_summary); multi_handler.EnvironmentsSetUpEnd(); multi_handler.TestSuiteStart(test_suite); multi_handler.TestSuiteEnd(test_suite); multi_handler.EnvironmentsTearDownEnd(); multi_handler.TestProgramEnd(program_summary); multi_handler.RunAllTestsStart(); multi_handler.RunAllTestsEnd(run_test_summary); multi_handler.TestCaseStart(test_case); multi_handler.TestCaseEnd(test_case, test_result); multi_handler.TestCaseExpect(test_case, expectation); multi_handler.TestCaseDisabled(test_case); AssertFunctionInvocationCounts(h1, 1); AssertFunctionInvocationCounts(h2, 1); } } // namespace } // namespace pw::unit_test