1#ifndef YAZE_APP_TEST_ROM_DEPENDENT_TEST_SUITE_H
2#define YAZE_APP_TEST_ROM_DEPENDENT_TEST_SUITE_H
7#include "absl/strings/str_format.h"
24 std::string
GetName()
const override {
return "ROM-Dependent Tests"; }
34 rom_check_result.
name =
"ROM_Available_Check";
37 rom_check_result.
timestamp = std::chrono::steady_clock::now();
45 absl::StrFormat(
"ROM not loaded (ptr: %p, title: '%s', size: %zu)",
46 (
void*)current_rom, current_rom->
title().c_str(),
51 "ROM loaded successfully (title: '%s', size: %.2f MB)",
52 current_rom->
title().c_str(), current_rom->
size() / 1048576.0f);
55 rom_check_result.
duration = std::chrono::milliseconds{0};
59 if (!current_rom || !current_rom->
is_loaded()) {
60 return absl::OkStatus();
66 if (test_manager.IsTestEnabled(
"ROM_Header_Validation_Test")) {
70 "Test disabled by user");
73 if (test_manager.IsTestEnabled(
"ROM_Data_Access_Test")) {
76 AddSkippedTest(results,
"ROM_Data_Access_Test",
"Test disabled by user");
79 if (test_manager.IsTestEnabled(
"ROM_Graphics_Extraction_Test")) {
83 "Test disabled by user");
86 if (test_manager.IsTestEnabled(
"ROM_Overworld_Loading_Test")) {
90 "Test disabled by user");
93 if (test_manager.IsTestEnabled(
"Tile16_Editor_Test")) {
96 AddSkippedTest(results,
"Tile16_Editor_Test",
"Test disabled by user");
99 if (test_manager.IsTestEnabled(
"Comprehensive_Save_Test")) {
103 "Test disabled by user (known to crash)");
111 return absl::OkStatus();
119 if (current_rom && current_rom->
is_loaded()) {
120 ImGui::TextColored(ImVec4(0.0f, 1.0f, 0.0f, 1.0f),
"%s Current ROM: %s",
122 ImGui::Text(
"Size: %zu bytes", current_rom->
size());
123 ImGui::Text(
"File: %s", current_rom->
filename().c_str());
125 ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.0f, 1.0f),
127 ImGui::Text(
"Load a ROM in the editor to enable ROM-dependent tests");
148 const std::string& reason) {
150 result.
name = test_name;
155 result.
duration = std::chrono::milliseconds{0};
156 result.
timestamp = std::chrono::steady_clock::now();
161 auto start_time = std::chrono::steady_clock::now();
164 result.
name =
"ROM_Header_Validation_Test";
171 result.
error_message =
"Header validation disabled in configuration";
174 std::string title = rom->
title();
175 size_t size = rom->
size();
179 !title.empty() && title !=
"ZELDA3" && title.length() <= 21;
181 size >= 1024 * 1024 && size <= 8 * 1024 * 1024;
183 if (valid_title && valid_size) {
186 "ROM header valid: '%s' (%zu bytes)", title.c_str(), size);
190 "ROM header validation failed: title='%s' size=%zu",
191 title.c_str(), size);
193 }
catch (
const std::exception& e) {
196 "Header validation failed: " + std::string(e.what());
200 auto end_time = std::chrono::steady_clock::now();
201 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
202 end_time - start_time);
208 auto start_time = std::chrono::steady_clock::now();
211 result.
name =
"ROM_Data_Access_Test";
218 result.
error_message =
"Data access testing disabled in configuration";
222 size_t bytes_tested = 0;
223 bool access_success =
true;
227 [[maybe_unused]]
auto header_byte = rom->
ReadByte(0x7FC0);
229 [[maybe_unused]]
auto code_byte = rom->
ReadByte(0x8000);
231 [[maybe_unused]]
auto data_word = rom->
ReadWord(0x8002);
234 access_success =
false;
237 if (access_success && bytes_tested >= 3) {
240 "ROM data access verified: %zu operations", bytes_tested);
245 }
catch (
const std::exception& e) {
248 "Data access test failed: " + std::string(e.what());
252 auto end_time = std::chrono::steady_clock::now();
253 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
254 end_time - start_time);
260 auto start_time = std::chrono::steady_clock::now();
263 result.
name =
"ROM_Graphics_Extraction_Test";
271 "Graphics extraction testing disabled in configuration";
276 if (load_status.ok()) {
278 size_t loaded_sheets = 0;
279 for (
const auto& sheet : sheets) {
280 if (sheet.is_active()) {
287 "Graphics extraction successful: %zu/%zu sheets loaded",
288 loaded_sheets, sheets.size());
292 "Graphics extraction failed: " +
293 std::string(load_status.message());
295 }
catch (
const std::exception& e) {
298 "Graphics extraction test failed: " + std::string(e.what());
302 auto end_time = std::chrono::steady_clock::now();
303 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
304 end_time - start_time);
310 auto start_time = std::chrono::steady_clock::now();
313 result.
name =
"ROM_Overworld_Loading_Test";
321 "Overworld loading testing disabled in configuration";
325 auto ow_status = overworld.
Load(rom);
327 if (ow_status.ok()) {
330 "Overworld loading successful from current ROM";
334 "Overworld loading failed: " + std::string(ow_status.message());
336 }
catch (
const std::exception& e) {
339 "Overworld loading test failed: " + std::string(e.what());
343 auto end_time = std::chrono::steady_clock::now();
344 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
345 end_time - start_time);
351 auto start_time = std::chrono::steady_clock::now();
354 result.
name =
"ROM_Sprite_Data_Test";
361 result.
error_message =
"Sprite data testing disabled in configuration";
367 result.
error_message =
"Sprite data testing not yet implemented";
368 }
catch (
const std::exception& e) {
371 "Sprite data test failed: " + std::string(e.what());
375 auto end_time = std::chrono::steady_clock::now();
376 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
377 end_time - start_time);
383 auto start_time = std::chrono::steady_clock::now();
386 result.
name =
"ROM_Music_Data_Test";
393 result.
error_message =
"Music data testing disabled in configuration";
399 result.
error_message =
"Music data testing not yet implemented";
400 }
catch (
const std::exception& e) {
403 "Music data test failed: " + std::string(e.what());
407 auto end_time = std::chrono::steady_clock::now();
408 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
409 end_time - start_time);
415 auto start_time = std::chrono::steady_clock::now();
418 result.
name =
"Tile16_Editor_Test";
434 std::vector<uint8_t> test_blockset_data(256 * 8192,
436 std::vector<uint8_t> test_gfx_data(256 * 256, 1);
439 test_blockset_bmp.
Create(256, 8192, 8, test_blockset_data);
440 test_gfx_bmp.
Create(256, 256, 8, test_gfx_data);
448 std::array<uint8_t, 0x200> tile_types{};
451 auto init_status = tile16_editor.
Initialize(test_blockset_bmp,
452 test_gfx_bmp, tile_types);
453 if (!init_status.ok()) {
456 "Tile16Editor initialization failed: " + init_status.ToString();
460 if (!set_tile_status.ok()) {
463 "SetCurrentTile failed: " + set_tile_status.ToString();
467 "Tile16Editor working correctly (ROM: %s, Palette groups: %zu)",
468 rom->
title().c_str(),
474 result.
error_message =
"ROM palette data not available or failed to load game data";
476 }
catch (
const std::exception& e) {
479 "Tile16Editor test exception: " + std::string(e.what());
482 auto end_time = std::chrono::steady_clock::now();
483 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
484 end_time - start_time);
490 auto start_time = std::chrono::steady_clock::now();
493 result.
name =
"Comprehensive_Save_Test";
503 test_manager.TestRomWithCopy(rom, [&](
Rom* test_rom) -> absl::Status {
506 auto load_status = overworld.
Load(test_rom);
507 if (!load_status.ok()) {
513 uint8_t original_gfx = test_map->area_graphics();
514 test_map->set_area_graphics(
521 if (!save_maps_status.ok()) {
522 return save_maps_status;
524 if (!save_props_status.ok()) {
525 return save_props_status;
533 test_manager.GenerateTestRomFilename(test_rom->
title());
535 auto save_file_status = test_rom->
SaveToFile(settings);
536 if (!save_file_status.ok()) {
537 return save_file_status;
541 test_manager.OfferTestSessionCreation(settings.
filename);
543 return absl::OkStatus();
546 if (test_status.ok()) {
549 "Comprehensive save test completed successfully using ROM copy";
552 result.
error_message =
"Save test failed: " + test_status.ToString();
555 }
catch (
const std::exception& e) {
558 "Comprehensive save test exception: " + std::string(e.what());
561 auto end_time = std::chrono::steady_clock::now();
562 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
563 end_time - start_time);
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
absl::StatusOr< uint16_t > ReadWord(int offset)
absl::Status SaveToFile(const SaveSettings &settings)
absl::StatusOr< uint8_t > ReadByte(int offset)
Popup window to edit Tile16 data.
absl::Status Initialize(const gfx::Bitmap &tile16_blockset_bmp, const gfx::Bitmap ¤t_gfx_bmp, std::array< uint8_t, 0x200 > &all_tiles_types)
absl::Status SetCurrentTile(int id)
Represents a bitmap image optimized for SNES ROM hacking.
void Create(int width, int height, int depth, std::span< uint8_t > data)
Create a bitmap with the given dimensions and data.
void SetPalette(const SnesPalette &palette)
Set the palette for the bitmap using SNES palette format.
void RunTile16EditorTest(TestResults &results, Rom *rom)
bool test_header_validation_
bool test_comprehensive_save_
bool test_advanced_features_
void DrawConfiguration() override
void RunRomMusicDataTest(TestResults &results, Rom *rom)
void RunRomOverworldLoadingTest(TestResults &results, Rom *rom)
bool test_overworld_loading_
void RunComprehensiveSaveTest(TestResults &results, Rom *rom)
void RunRomGraphicsExtractionTest(TestResults &results, Rom *rom)
void RunRomHeaderValidationTest(TestResults &results, Rom *rom)
~RomDependentTestSuite() override=default
RomDependentTestSuite()=default
void AddSkippedTest(TestResults &results, const std::string &test_name, const std::string &reason)
void RunRomSpriteDataTest(TestResults &results, Rom *rom)
void RunRomDataAccessTest(TestResults &results, Rom *rom)
std::string GetName() const override
absl::Status RunTests(TestResults &results) override
TestCategory GetCategory() const override
bool test_graphics_extraction_
Rom * GetCurrentRom() const
static TestManager & Get()
Represents the full Overworld data, light and dark world.
absl::Status Load(Rom *rom)
Load all overworld data from ROM.
absl::Status SaveMapProperties()
Save per-area graphics, palettes, and messages.
auto mutable_overworld_map(int i)
absl::Status SaveOverworldMaps()
Save compressed map tile data to ROM.
#define ICON_MD_CHECK_CIRCLE
absl::Status LoadGameData(Rom &rom, GameData &data, const LoadOptions &options)
Loads all Zelda3-specific game data from a generic ROM.
PaletteGroup overworld_main
std::chrono::milliseconds duration
std::string error_message
std::chrono::time_point< std::chrono::steady_clock > timestamp
void AddResult(const TestResult &result)
gfx::PaletteGroupMap palette_groups
std::array< gfx::Bitmap, kNumGfxSheets > gfx_bitmaps