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"
10#include "app/gfx/arena.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 absl::StrFormat(
"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) {
87 "Arena integrity test failed: " + std::string(e.what());
90 auto end_time = std::chrono::steady_clock::now();
91 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
92 end_time - start_time);
98 auto start_time = std::chrono::steady_clock::now();
101 result.
name =
"Arena_Resource_Management_Test";
109 size_t before_textures = arena.GetTextureCount();
110 size_t before_surfaces = arena.GetSurfaceCount();
115 size_t after_textures = arena.GetTextureCount();
116 size_t after_surfaces = arena.GetSurfaceCount();
119 if (after_textures >= before_textures &&
120 after_surfaces >= before_surfaces) {
123 "Resource tracking working: %zu→%zu textures, %zu→%zu surfaces",
124 before_textures, after_textures, before_surfaces, after_surfaces);
130 }
catch (
const std::exception& e) {
133 "Resource management test failed: " + std::string(e.what());
136 auto end_time = std::chrono::steady_clock::now();
137 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
138 end_time - start_time);
144 auto start_time = std::chrono::steady_clock::now();
147 result.
name =
"ROM_Basic_Operations_Test";
154 result.
error_message =
"ROM testing disabled in configuration";
160 if (current_rom && current_rom->
is_loaded()) {
164 "Current ROM validated: %s (%zu bytes)",
165 current_rom->
title().c_str(), current_rom->
size());
170 if (rom_path.empty()) {
171 rom_path =
"zelda3.sfc";
174 if (std::filesystem::exists(rom_path)) {
179 absl::StrFormat(
"ROM loaded from file: %s (%zu bytes)",
180 test_rom.
title().c_str(), test_rom.
size());
184 "ROM loading failed: " + std::string(status.message());
189 "No current ROM and file not found: " + rom_path;
193 "No current ROM and required file not found: " + rom_path;
197 }
catch (
const std::exception& e) {
199 result.
error_message =
"ROM test failed: " + std::string(e.what());
203 auto end_time = std::chrono::steady_clock::now();
204 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
205 end_time - start_time);
211 auto start_time = std::chrono::steady_clock::now();
214 result.
name =
"Graphics_Pipeline_Validation_Test";
221 result.
error_message =
"Graphics testing disabled in configuration";
228 auto& gfx_sheets = arena.gfx_sheets();
231 if (gfx_sheets.size() == 223) {
234 "Graphics pipeline validated: %zu sheets available",
239 "Graphics sheets count mismatch: expected 223, got %zu",
243 }
catch (
const std::exception& e) {
246 "Graphics validation failed: " + std::string(e.what());
250 auto end_time = std::chrono::steady_clock::now();
251 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
252 end_time - start_time);
271 std::string
GetName()
const override {
return "Performance Tests"; }
281 return absl::OkStatus();
285 ImGui::Text(
"Performance Test Configuration");
293 auto start_time = std::chrono::steady_clock::now();
296 result.
name =
"Frame_Rate_Test";
303 float current_fps = ImGui::GetIO().Framerate;
308 absl::StrFormat(
"Frame rate acceptable: %.1f FPS (target: %.1f)",
313 absl::StrFormat(
"Frame rate below target: %.1f FPS (target: %.1f)",
317 }
catch (
const std::exception& e) {
319 result.
error_message =
"Frame rate test failed: " + std::string(e.what());
322 auto end_time = std::chrono::steady_clock::now();
323 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
324 end_time - start_time);
330 auto start_time = std::chrono::steady_clock::now();
333 result.
name =
"Memory_Usage_Test";
342 size_t texture_count = arena.GetTextureCount();
343 size_t surface_count = arena.GetSurfaceCount();
346 size_t estimated_memory_kb = (texture_count + surface_count);
347 size_t estimated_memory_mb = estimated_memory_kb / 1024;
352 "Memory usage acceptable: ~%zu MB (%zu textures, %zu surfaces)",
353 estimated_memory_mb, texture_count, surface_count);
357 absl::StrFormat(
"Memory usage high: ~%zu MB (limit: %d MB)",
361 }
catch (
const std::exception& e) {
364 "Memory usage test failed: " + std::string(e.what());
367 auto end_time = std::chrono::steady_clock::now();
368 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
369 end_time - start_time);
375 auto start_time = std::chrono::steady_clock::now();
378 result.
name =
"Resource_Leak_Test";
387 size_t baseline_textures = arena.GetTextureCount();
388 size_t baseline_surfaces = arena.GetSurfaceCount();
393 size_t final_textures = arena.GetTextureCount();
394 size_t final_surfaces = arena.GetSurfaceCount();
397 size_t texture_diff = final_textures > baseline_textures
398 ? final_textures - baseline_textures
400 size_t surface_diff = final_surfaces > baseline_surfaces
401 ? final_surfaces - baseline_surfaces
404 if (texture_diff == 0 && surface_diff == 0) {
407 }
else if (texture_diff < 10 && surface_diff < 10) {
410 "Minor resource growth: +%zu textures, +%zu surfaces (acceptable)",
411 texture_diff, surface_diff);
415 "Potential resource leak: +%zu textures, +%zu surfaces",
416 texture_diff, surface_diff);
419 }
catch (
const std::exception& e) {
422 "Resource leak test failed: " + std::string(e.what());
425 auto end_time = std::chrono::steady_clock::now();
426 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
427 end_time - start_time);
449 std::string
GetName()
const override {
return "UI Interaction Tests"; }
453#ifdef YAZE_ENABLE_IMGUI_TEST_ENGINE
454 RunMenuInteractionTest(results);
455 RunDialogTest(results);
456 RunTestDashboardTest(results);
459 result.
name =
"UI_Tests_Disabled";
463 result.
error_message =
"ImGui Test Engine not available in this build";
464 result.
duration = std::chrono::milliseconds{0};
465 result.
timestamp = std::chrono::steady_clock::now();
469 return absl::OkStatus();
473 ImGui::Text(
"UI Test Configuration");
474#ifdef YAZE_ENABLE_IMGUI_TEST_ENGINE
475 ImGui::Checkbox(
"Test menu interactions", &test_menus_);
476 ImGui::Checkbox(
"Test dialog workflows", &test_dialogs_);
477 ImGui::Checkbox(
"Test dashboard UI", &test_dashboard_);
478 ImGui::InputFloat(
"UI interaction delay (ms)", &interaction_delay_ms_);
480 ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.0f, 1.0f),
481 "UI tests not available - ImGui Test Engine disabled");
486#ifdef YAZE_ENABLE_IMGUI_TEST_ENGINE
487 void RunMenuInteractionTest(
TestResults& results) {
488 auto start_time = std::chrono::steady_clock::now();
491 result.
name =
"Menu_Interaction_Test";
502 result.
error_message =
"UI test engine available for menu testing";
507 }
catch (
const std::exception& e) {
510 "Menu interaction test failed: " + std::string(e.what());
513 auto end_time = std::chrono::steady_clock::now();
514 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
515 end_time - start_time);
520 void RunDialogTest(TestResults& results) {
521 auto start_time = std::chrono::steady_clock::now();
524 result.
name =
"Dialog_Workflow_Test";
527 result.timestamp = start_time;
531 result.error_message =
"Dialog testing not yet implemented";
533 auto end_time = std::chrono::steady_clock::now();
534 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
535 end_time - start_time);
537 results.AddResult(result);
540 void RunTestDashboardTest(TestResults& results) {
541 auto start_time = std::chrono::steady_clock::now();
544 result.name =
"Test_Dashboard_UI_Test";
547 result.timestamp = start_time;
553 result.error_message =
"Test dashboard UI functioning correctly";
554 }
catch (
const std::exception& e) {
556 result.error_message =
"Dashboard test failed: " + std::string(e.what());
559 auto end_time = std::chrono::steady_clock::now();
560 result.duration = std::chrono::duration_cast<std::chrono::milliseconds>(
561 end_time - start_time);
563 results.AddResult(result);
566 bool test_menus_ =
true;
567 bool test_dialogs_ =
true;
568 bool test_dashboard_ =
true;
569 float interaction_delay_ms_ = 100.0f;
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
absl::Status LoadFromFile(const std::string &filename, const LoadOptions &options=LoadOptions::Defaults())
~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
std::chrono::milliseconds duration
std::string error_message
std::chrono::time_point< std::chrono::steady_clock > timestamp
void AddResult(const TestResult &result)