1#ifndef YAZE_APP_TEST_INTEGRATED_TEST_SUITE_H
2#define YAZE_APP_TEST_INTEGRATED_TEST_SUITE_H
9#include "absl/strings/str_format.h"
14#ifdef YAZE_ENABLE_GTEST
15#include <gtest/gtest.h>
27 std::string
GetName()
const override {
return "Integrated Unit Tests"; }
41 return absl::OkStatus();
45 ImGui::Text(
"Integrated Test Configuration");
46 ImGui::Checkbox(
"Test Arena operations", &
test_arena_);
47 ImGui::Checkbox(
"Test ROM loading", &
test_rom_);
50 if (ImGui::CollapsingHeader(
"ROM Test Settings")) {
58 auto start_time = std::chrono::steady_clock::now();
61 result.
name =
"Arena_Integrity_Test";
70 size_t initial_textures = arena.GetTextureCount();
71 size_t initial_surfaces = arena.GetSurfaceCount();
74 if (initial_textures >= 0 && initial_surfaces >= 0) {
77 "Arena initialized: %zu textures, %zu surfaces",
78 initial_textures, initial_surfaces);
81 result.
error_message =
"Arena returned invalid resource counts";
84 }
catch (
const std::exception& e) {
86 result.
error_message =
"Arena integrity test failed: " + std::string(e.what());
89 auto end_time = std::chrono::steady_clock::now();
90 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
91 end_time - start_time);
97 auto start_time = std::chrono::steady_clock::now();
100 result.
name =
"Arena_Resource_Management_Test";
108 size_t before_textures = arena.GetTextureCount();
109 size_t before_surfaces = arena.GetSurfaceCount();
114 size_t after_textures = arena.GetTextureCount();
115 size_t after_surfaces = arena.GetSurfaceCount();
118 if (after_textures >= before_textures && after_surfaces >= before_surfaces) {
121 "Resource tracking working: %zu→%zu textures, %zu→%zu surfaces",
122 before_textures, after_textures, before_surfaces, after_surfaces);
128 }
catch (
const std::exception& e) {
130 result.
error_message =
"Resource management test failed: " + std::string(e.what());
133 auto end_time = std::chrono::steady_clock::now();
134 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
135 end_time - start_time);
141 auto start_time = std::chrono::steady_clock::now();
144 result.
name =
"ROM_Basic_Operations_Test";
151 result.
error_message =
"ROM testing disabled in configuration";
157 if (current_rom && current_rom->
is_loaded()) {
161 "Current ROM validated: %s (%zu bytes)",
162 current_rom->
title().c_str(), current_rom->
size());
167 if (rom_path.empty()) {
168 rom_path =
"zelda3.sfc";
171 if (std::filesystem::exists(rom_path)) {
176 "ROM loaded from file: %s (%zu bytes)",
177 test_rom.
title().c_str(), test_rom.
size());
180 result.
error_message =
"ROM loading failed: " + std::string(status.message());
184 result.
error_message =
"No current ROM and file not found: " + rom_path;
187 result.
error_message =
"No current ROM and required file not found: " + rom_path;
191 }
catch (
const std::exception& e) {
193 result.
error_message =
"ROM test failed: " + std::string(e.what());
197 auto end_time = std::chrono::steady_clock::now();
198 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
199 end_time - start_time);
205 auto start_time = std::chrono::steady_clock::now();
208 result.
name =
"Graphics_Pipeline_Validation_Test";
215 result.
error_message =
"Graphics testing disabled in configuration";
222 auto& gfx_sheets = arena.gfx_sheets();
225 if (gfx_sheets.size() == 223) {
228 "Graphics pipeline validated: %zu sheets available",
233 "Graphics sheets count mismatch: expected 223, got %zu",
237 }
catch (
const std::exception& e) {
239 result.
error_message =
"Graphics validation failed: " + std::string(e.what());
243 auto end_time = std::chrono::steady_clock::now();
244 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
245 end_time - start_time);
264 std::string
GetName()
const override {
return "Performance Tests"; }
272 return absl::OkStatus();
276 ImGui::Text(
"Performance Test Configuration");
284 auto start_time = std::chrono::steady_clock::now();
287 result.
name =
"Frame_Rate_Test";
294 float current_fps = ImGui::GetIO().Framerate;
299 "Frame rate acceptable: %.1f FPS (target: %.1f)",
304 "Frame rate below target: %.1f FPS (target: %.1f)",
308 }
catch (
const std::exception& e) {
310 result.
error_message =
"Frame rate test failed: " + std::string(e.what());
313 auto end_time = std::chrono::steady_clock::now();
314 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
315 end_time - start_time);
321 auto start_time = std::chrono::steady_clock::now();
324 result.
name =
"Memory_Usage_Test";
333 size_t texture_count = arena.GetTextureCount();
334 size_t surface_count = arena.GetSurfaceCount();
337 size_t estimated_memory_kb = (texture_count + surface_count);
338 size_t estimated_memory_mb = estimated_memory_kb / 1024;
343 "Memory usage acceptable: ~%zu MB (%zu textures, %zu surfaces)",
344 estimated_memory_mb, texture_count, surface_count);
348 "Memory usage high: ~%zu MB (limit: %d MB)",
352 }
catch (
const std::exception& e) {
354 result.
error_message =
"Memory usage test failed: " + std::string(e.what());
357 auto end_time = std::chrono::steady_clock::now();
358 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
359 end_time - start_time);
365 auto start_time = std::chrono::steady_clock::now();
368 result.
name =
"Resource_Leak_Test";
377 size_t baseline_textures = arena.GetTextureCount();
378 size_t baseline_surfaces = arena.GetSurfaceCount();
383 size_t final_textures = arena.GetTextureCount();
384 size_t final_surfaces = arena.GetSurfaceCount();
387 size_t texture_diff = final_textures > baseline_textures ?
388 final_textures - baseline_textures : 0;
389 size_t surface_diff = final_surfaces > baseline_surfaces ?
390 final_surfaces - baseline_surfaces : 0;
392 if (texture_diff == 0 && surface_diff == 0) {
395 }
else if (texture_diff < 10 && surface_diff < 10) {
398 "Minor resource growth: +%zu textures, +%zu surfaces (acceptable)",
399 texture_diff, surface_diff);
403 "Potential resource leak: +%zu textures, +%zu surfaces",
404 texture_diff, surface_diff);
407 }
catch (
const std::exception& e) {
409 result.
error_message =
"Resource leak test failed: " + std::string(e.what());
412 auto end_time = std::chrono::steady_clock::now();
413 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
414 end_time - start_time);
436 std::string
GetName()
const override {
return "UI Interaction Tests"; }
440#ifdef YAZE_ENABLE_IMGUI_TEST_ENGINE
441 RunMenuInteractionTest(results);
442 RunDialogTest(results);
443 RunTestDashboardTest(results);
446 result.
name =
"UI_Tests_Disabled";
450 result.
error_message =
"ImGui Test Engine not available in this build";
451 result.
duration = std::chrono::milliseconds{0};
452 result.
timestamp = std::chrono::steady_clock::now();
456 return absl::OkStatus();
460 ImGui::Text(
"UI Test Configuration");
461#ifdef YAZE_ENABLE_IMGUI_TEST_ENGINE
462 ImGui::Checkbox(
"Test menu interactions", &test_menus_);
463 ImGui::Checkbox(
"Test dialog workflows", &test_dialogs_);
464 ImGui::Checkbox(
"Test dashboard UI", &test_dashboard_);
465 ImGui::InputFloat(
"UI interaction delay (ms)", &interaction_delay_ms_);
467 ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.0f, 1.0f),
468 "UI tests not available - ImGui Test Engine disabled");
473#ifdef YAZE_ENABLE_IMGUI_TEST_ENGINE
474 void RunMenuInteractionTest(
TestResults& results) {
475 auto start_time = std::chrono::steady_clock::now();
478 result.
name =
"Menu_Interaction_Test";
489 result.
error_message =
"UI test engine available for menu testing";
494 }
catch (
const std::exception& e) {
496 result.
error_message =
"Menu interaction test failed: " + std::string(e.what());
499 auto end_time = std::chrono::steady_clock::now();
500 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
501 end_time - start_time);
506 void RunDialogTest(TestResults& results) {
507 auto start_time = std::chrono::steady_clock::now();
510 result.
name =
"Dialog_Workflow_Test";
513 result.timestamp = start_time;
517 result.error_message =
"Dialog testing not yet implemented";
519 auto end_time = std::chrono::steady_clock::now();
520 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
521 end_time - start_time);
523 results.AddResult(result);
526 void RunTestDashboardTest(TestResults& results) {
527 auto start_time = std::chrono::steady_clock::now();
530 result.name =
"Test_Dashboard_UI_Test";
533 result.timestamp = start_time;
539 result.error_message =
"Test dashboard UI functioning correctly";
540 }
catch (
const std::exception& e) {
542 result.error_message =
"Dashboard test failed: " + std::string(e.what());
545 auto end_time = std::chrono::steady_clock::now();
546 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
547 end_time - start_time);
549 results.AddResult(result);
552 bool test_menus_ =
true;
553 bool test_dialogs_ =
true;
554 bool test_dashboard_ =
true;
555 float interaction_delay_ms_ = 100.0f;
The Rom class is used to load, save, and modify Rom data.
absl::Status LoadFromFile(const std::string &filename, bool z3_load=true)
~IntegratedTestSuite() override=default
void RunGraphicsValidationTest(TestResults &results)
void DrawConfiguration() override
void RunArenaIntegrityTest(TestResults &results)
void RunArenaResourceManagementTest(TestResults &results)
TestCategory GetCategory() const override
void RunRomBasicTest(TestResults &results)
std::string GetName() const override
absl::Status RunTests(TestResults &results) override
IntegratedTestSuite()=default
Rom * GetCurrentRom() const
static TestManager & Get()
std::string GetName() const override
TestCategory GetCategory() const override
~UITestSuite() override=default
absl::Status RunTests(TestResults &results) override
void DrawConfiguration() override
Main namespace for the application.
std::chrono::milliseconds duration
std::string error_message
std::chrono::time_point< std::chrono::steady_clock > timestamp
void AddResult(const TestResult &result)