1#ifndef YAZE_APP_TEST_UNIT_TEST_SUITE_H
2#define YAZE_APP_TEST_UNIT_TEST_SUITE_H
7#include "app/gfx/arena.h"
10#ifdef YAZE_ENABLE_GTEST
11#include <gtest/gtest.h>
20#ifdef YAZE_ENABLE_GTEST
22class TestResultCapture :
public ::testing::TestEventListener {
24 explicit TestResultCapture(TestResults* results) : results_(results) {}
26 void OnTestStart(const ::testing::TestInfo& test_info)
override {
27 current_test_start_ = std::chrono::steady_clock::now();
29 std::string(test_info.test_case_name()) +
"." + test_info.name();
32 void OnTestEnd(const ::testing::TestInfo& test_info)
override {
33 auto end_time = std::chrono::steady_clock::now();
34 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
35 end_time - current_test_start_);
38 result.name = test_info.name();
39 result.suite_name = test_info.test_case_name();
40 result.category = TestCategory::kUnit;
41 result.duration = duration;
42 result.timestamp = current_test_start_;
44 if (test_info.result()->Passed()) {
45 result.status = TestStatus::kPassed;
46 }
else if (test_info.result()->Skipped()) {
47 result.status = TestStatus::kSkipped;
49 result.status = TestStatus::kFailed;
52 std::stringstream error_stream;
53 for (
int i = 0; i < test_info.result()->total_part_count(); ++i) {
54 const auto& part = test_info.result()->GetTestPartResult(i);
56 error_stream << part.file_name() <<
":" << part.line_number() <<
" "
57 << part.message() <<
"\n";
60 result.error_message = error_stream.str();
64 results_->AddResult(result);
69 void OnTestProgramStart(const ::testing::UnitTest&)
override {}
70 void OnTestIterationStart(const ::testing::UnitTest&,
int)
override {}
71 void OnEnvironmentsSetUpStart(const ::testing::UnitTest&)
override {}
72 void OnEnvironmentsSetUpEnd(const ::testing::UnitTest&)
override {}
73 void OnTestCaseStart(const ::testing::TestCase&)
override {}
74 void OnTestCaseEnd(const ::testing::TestCase&)
override {}
75 void OnTestPartResult(
76 const ::testing::TestPartResult& test_part_result)
override {
79 void OnEnvironmentsTearDownStart(const ::testing::UnitTest&)
override {}
80 void OnEnvironmentsTearDownEnd(const ::testing::UnitTest&)
override {}
81 void OnTestIterationEnd(const ::testing::UnitTest&,
int)
override {}
82 void OnTestProgramEnd(const ::testing::UnitTest&)
override {}
85 TestResults* results_;
86 std::chrono::time_point<std::chrono::steady_clock> current_test_start_;
87 std::string current_test_name_;
97 std::string
GetName()
const override {
return "Google Test Unit Tests"; }
101#ifdef YAZE_ENABLE_GTEST
103 auto& listeners = ::testing::UnitTest::GetInstance()->listeners();
106 delete listeners.Release(listeners.default_result_printer());
109 auto capture_listener =
new TestResultCapture(&results);
110 listeners.Append(capture_listener);
114 const char* argv[] = {
"yaze_tests"};
115 ::testing::InitGoogleTest(&argc,
const_cast<char**
>(argv));
118 int result = RUN_ALL_TESTS();
121 listeners.Release(capture_listener);
122 delete capture_listener;
124 return result == 0 ? absl::OkStatus()
125 : absl::InternalError(
"Some unit tests failed");
129 result.
name =
"Placeholder Test";
133 result.error_message =
"Google Test not available in this build";
134 result.duration = std::chrono::milliseconds{0};
135 result.timestamp = std::chrono::steady_clock::now();
138 return absl::OkStatus();
143 ImGui::Text(
"Google Test Configuration");
152 if (ImGui::Button(
"Clear")) {
170 std::string
GetName()
const override {
return "Arena Memory Tests"; }
179 return absl::OkStatus();
183 ImGui::Text(
"Arena Test Configuration");
191 auto start_time = std::chrono::steady_clock::now();
194 result.
name =
"Arena_Allocation_Test";
201 size_t initial_texture_count = arena.GetTextureCount();
202 size_t initial_surface_count = arena.GetSurfaceCount();
208 size_t final_texture_count = arena.GetTextureCount();
209 size_t final_surface_count = arena.GetSurfaceCount();
214 }
catch (
const std::exception& e) {
217 "Arena allocation test failed: " + std::string(e.what());
220 auto end_time = std::chrono::steady_clock::now();
221 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
222 end_time - start_time);
228 auto start_time = std::chrono::steady_clock::now();
231 result.
name =
"Arena_Cleanup_Test";
242 size_t texture_count = arena.GetTextureCount();
243 size_t surface_count = arena.GetSurfaceCount();
247 }
catch (
const std::exception& e) {
250 "Arena cleanup test failed: " + std::string(e.what());
253 auto end_time = std::chrono::steady_clock::now();
254 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
255 end_time - start_time);
261 auto start_time = std::chrono::steady_clock::now();
264 result.
name =
"Arena_Resource_Tracking_Test";
273 size_t texture_count = arena.GetTextureCount();
274 size_t surface_count = arena.GetSurfaceCount();
277 if (texture_count >= 0 && surface_count >= 0) {
284 }
catch (
const std::exception& e) {
287 "Resource tracking test failed: " + std::string(e.what());
290 auto end_time = std::chrono::steady_clock::now();
291 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
292 end_time - start_time);
void DrawConfiguration() override
void RunArenaCleanupTest(TestResults &results)
~ArenaTestSuite() override=default
TestCategory GetCategory() const override
absl::Status RunTests(TestResults &results) override
void RunArenaResourceTrackingTest(TestResults &results)
std::string GetName() const override
void RunArenaAllocationTest(TestResults &results)
int test_allocation_count_
absl::Status RunTests(TestResults &results) override
TestCategory GetCategory() const override
std::string GetName() const override
void DrawConfiguration() override
~UnitTestSuite() override=default
std::chrono::milliseconds duration
std::string error_message
std::chrono::time_point< std::chrono::steady_clock > timestamp
void AddResult(const TestResult &result)