blob: 52e114720535bcf24b3042b0623a4dd518a06623 [file] [log] [blame]
// Copyright 2019 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/framework.h"
namespace pw::unit_test {
void RegisterEventHandler(EventHandler* event_handler) {
internal::Framework::Get().RegisterEventHandler(event_handler);
}
namespace internal {
// Singleton instance of the unit test framework class.
Framework Framework::framework_;
// Linked list of all test cases in the test executable. This is static as it is
// populated using static initialization.
TestInfo* Framework::tests_ = nullptr;
void Framework::RegisterTest(TestInfo* test) {
// Append the test case to the end of the test list.
TestInfo** pos = &tests_;
for (; *pos != nullptr; pos = &(*pos)->next) {
}
*pos = test;
}
int Framework::RunAllTests() {
run_tests_summary_.passed_tests = 0;
run_tests_summary_.failed_tests = 0;
if (event_handler_ != nullptr) {
event_handler_->RunAllTestsStart();
}
for (TestInfo* test = tests_; test != nullptr; test = test->next) {
test->run();
}
if (event_handler_ != nullptr) {
event_handler_->RunAllTestsEnd(run_tests_summary_);
}
return exit_status_;
}
void Framework::StartTest(Test* test) {
current_test_ = test;
current_result_ = TestResult::kSuccess;
if (event_handler_ == nullptr) {
return;
}
const TestInfo* info = test->pigweed_test_info_;
TestCase test_case = {
.suite_name = info->test_suite_name,
.test_name = info->test_name,
.file_name = info->file_name,
};
event_handler_->TestCaseStart(test_case);
}
void Framework::EndTest(Test* test) {
current_test_ = nullptr;
switch (current_result_) {
case TestResult::kSuccess:
run_tests_summary_.passed_tests++;
break;
case TestResult::kFailure:
run_tests_summary_.failed_tests++;
break;
}
if (event_handler_ == nullptr) {
return;
}
const TestInfo* info = test->pigweed_test_info_;
TestCase test_case = {
.suite_name = info->test_suite_name,
.test_name = info->test_name,
.file_name = info->file_name,
};
event_handler_->TestCaseEnd(test_case, current_result_);
}
void Framework::ExpectationResult(const char* expression,
const char* evaluated_expression,
int line,
bool success) {
if (!success) {
current_result_ = TestResult::kFailure;
exit_status_ = 1;
}
if (event_handler_ == nullptr) {
return;
}
const TestInfo* info = current_test_->pigweed_test_info_;
TestCase test_case = {
.suite_name = info->test_suite_name,
.test_name = info->test_name,
.file_name = info->file_name,
};
TestExpectation expectation = {
.expression = expression,
.evaluated_expression = evaluated_expression,
.line_number = line,
.success = success,
};
event_handler_->TestCaseExpect(test_case, expectation);
}
} // namespace internal
} // namespace pw::unit_test