blob: c0ca89786ded89e661127819eac57541bddb41ea [file] [log] [blame]
// 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