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"
23 std::string
GetName()
const override {
return "ROM-Dependent Tests"; }
31 rom_check_result.
name =
"ROM_Available_Check";
34 rom_check_result.
timestamp = std::chrono::steady_clock::now();
42 "ROM not loaded (ptr: %p, title: '%s', size: %zu)",
43 (
void*)current_rom, current_rom->
title().c_str(), current_rom->size());
47 "ROM loaded successfully (title: '%s', size: %.2f MB)",
48 current_rom->
title().c_str(), current_rom->
size() / 1048576.0f);
51 rom_check_result.
duration = std::chrono::milliseconds{0};
55 if (!current_rom || !current_rom->
is_loaded()) {
56 return absl::OkStatus();
62 if (test_manager.IsTestEnabled(
"ROM_Header_Validation_Test")) {
65 AddSkippedTest(results,
"ROM_Header_Validation_Test",
"Test disabled by user");
68 if (test_manager.IsTestEnabled(
"ROM_Data_Access_Test")) {
71 AddSkippedTest(results,
"ROM_Data_Access_Test",
"Test disabled by user");
74 if (test_manager.IsTestEnabled(
"ROM_Graphics_Extraction_Test")) {
77 AddSkippedTest(results,
"ROM_Graphics_Extraction_Test",
"Test disabled by user");
80 if (test_manager.IsTestEnabled(
"ROM_Overworld_Loading_Test")) {
83 AddSkippedTest(results,
"ROM_Overworld_Loading_Test",
"Test disabled by user");
86 if (test_manager.IsTestEnabled(
"Tile16_Editor_Test")) {
89 AddSkippedTest(results,
"Tile16_Editor_Test",
"Test disabled by user");
92 if (test_manager.IsTestEnabled(
"Comprehensive_Save_Test")) {
95 AddSkippedTest(results,
"Comprehensive_Save_Test",
"Test disabled by user (known to crash)");
103 return absl::OkStatus();
111 if (current_rom && current_rom->
is_loaded()) {
112 ImGui::TextColored(ImVec4(0.0f, 1.0f, 0.0f, 1.0f),
114 ImGui::Text(
"Size: %zu bytes", current_rom->
size());
115 ImGui::Text(
"File: %s", current_rom->
filename().c_str());
117 ImGui::TextColored(ImVec4(1.0f, 0.5f, 0.0f, 1.0f),
119 ImGui::Text(
"Load a ROM in the editor to enable ROM-dependent tests");
141 result.
name = test_name;
146 result.
duration = std::chrono::milliseconds{0};
147 result.
timestamp = std::chrono::steady_clock::now();
152 auto start_time = std::chrono::steady_clock::now();
155 result.
name =
"ROM_Header_Validation_Test";
162 result.
error_message =
"Header validation disabled in configuration";
165 std::string title = rom->
title();
166 size_t size = rom->
size();
169 bool valid_title = !title.empty() && title !=
"ZELDA3" && title.length() <= 21;
170 bool valid_size = size >= 1024*1024 && size <= 8*1024*1024;
172 if (valid_title && valid_size) {
175 "ROM header valid: '%s' (%zu bytes)", title.c_str(), size);
179 "ROM header validation failed: title='%s' size=%zu", title.c_str(), size);
181 }
catch (
const std::exception& e) {
183 result.
error_message =
"Header validation failed: " + std::string(e.what());
187 auto end_time = std::chrono::steady_clock::now();
188 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
189 end_time - start_time);
195 auto start_time = std::chrono::steady_clock::now();
198 result.
name =
"ROM_Data_Access_Test";
205 result.
error_message =
"Data access testing disabled in configuration";
209 size_t bytes_tested = 0;
210 bool access_success =
true;
214 [[maybe_unused]]
auto header_byte = rom->
ReadByte(0x7FC0);
216 [[maybe_unused]]
auto code_byte = rom->
ReadByte(0x8000);
218 [[maybe_unused]]
auto data_word = rom->
ReadWord(0x8002);
221 access_success =
false;
224 if (access_success && bytes_tested >= 3) {
227 "ROM data access verified: %zu operations", bytes_tested);
232 }
catch (
const std::exception& e) {
234 result.
error_message =
"Data access test failed: " + std::string(e.what());
238 auto end_time = std::chrono::steady_clock::now();
239 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
240 end_time - start_time);
246 auto start_time = std::chrono::steady_clock::now();
249 result.
name =
"ROM_Graphics_Extraction_Test";
256 result.
error_message =
"Graphics extraction testing disabled in configuration";
260 if (graphics_result.ok()) {
261 auto& sheets = graphics_result.value();
262 size_t loaded_sheets = 0;
263 for (
const auto& sheet : sheets) {
264 if (sheet.is_active()) {
271 "Graphics extraction successful: %zu/%zu sheets loaded",
272 loaded_sheets, sheets.size());
276 std::string(graphics_result.status().message());
278 }
catch (
const std::exception& e) {
280 result.
error_message =
"Graphics extraction test failed: " + std::string(e.what());
284 auto end_time = std::chrono::steady_clock::now();
285 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
286 end_time - start_time);
292 auto start_time = std::chrono::steady_clock::now();
295 result.
name =
"ROM_Overworld_Loading_Test";
302 result.
error_message =
"Overworld loading testing disabled in configuration";
306 auto ow_status = overworld.
Load(rom);
308 if (ow_status.ok()) {
310 result.
error_message =
"Overworld loading successful from current ROM";
313 result.
error_message =
"Overworld loading failed: " + std::string(ow_status.message());
315 }
catch (
const std::exception& e) {
317 result.
error_message =
"Overworld loading test failed: " + std::string(e.what());
321 auto end_time = std::chrono::steady_clock::now();
322 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
323 end_time - start_time);
329 auto start_time = std::chrono::steady_clock::now();
332 result.
name =
"ROM_Sprite_Data_Test";
339 result.
error_message =
"Sprite data testing disabled in configuration";
345 result.
error_message =
"Sprite data testing not yet implemented";
346 }
catch (
const std::exception& e) {
348 result.
error_message =
"Sprite data test failed: " + std::string(e.what());
352 auto end_time = std::chrono::steady_clock::now();
353 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
354 end_time - start_time);
360 auto start_time = std::chrono::steady_clock::now();
363 result.
name =
"ROM_Music_Data_Test";
370 result.
error_message =
"Music data testing disabled in configuration";
376 result.
error_message =
"Music data testing not yet implemented";
377 }
catch (
const std::exception& e) {
379 result.
error_message =
"Music data test failed: " + std::string(e.what());
383 auto end_time = std::chrono::steady_clock::now();
384 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
385 end_time - start_time);
391 auto start_time = std::chrono::steady_clock::now();
394 result.
name =
"Tile16_Editor_Test";
406 std::vector<uint8_t> test_blockset_data(256 * 8192, 1);
407 std::vector<uint8_t> test_gfx_data(256 * 256, 1);
410 test_blockset_bmp.
Create(256, 8192, 8, test_blockset_data);
411 test_gfx_bmp.
Create(256, 256, 8, test_gfx_data);
419 std::array<uint8_t, 0x200> tile_types{};
422 auto init_status = tile16_editor.
Initialize(test_blockset_bmp, test_gfx_bmp, tile_types);
423 if (!init_status.ok()) {
425 result.
error_message =
"Tile16Editor initialization failed: " + init_status.ToString();
429 if (!set_tile_status.ok()) {
431 result.
error_message =
"SetCurrentTile failed: " + set_tile_status.ToString();
435 "Tile16Editor working correctly (ROM: %s, Palette groups: %zu)",
443 }
catch (
const std::exception& e) {
445 result.
error_message =
"Tile16Editor test exception: " + std::string(e.what());
448 auto end_time = std::chrono::steady_clock::now();
449 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
450 end_time - start_time);
456 auto start_time = std::chrono::steady_clock::now();
459 result.
name =
"Comprehensive_Save_Test";
468 auto test_status = test_manager.TestRomWithCopy(rom, [&](
Rom* test_rom) -> absl::Status {
471 auto load_status = overworld.
Load(test_rom);
472 if (!load_status.ok()) {
478 uint8_t original_gfx = test_map->area_graphics();
479 test_map->set_area_graphics(0x01);
485 if (!save_maps_status.ok()) {
486 return save_maps_status;
488 if (!save_props_status.ok()) {
489 return save_props_status;
496 settings.
filename = test_manager.GenerateTestRomFilename(test_rom->
title());
498 auto save_file_status = test_rom->
SaveToFile(settings);
499 if (!save_file_status.ok()) {
500 return save_file_status;
504 test_manager.OfferTestSessionCreation(settings.
filename);
506 return absl::OkStatus();
509 if (test_status.ok()) {
511 result.
error_message =
"Comprehensive save test completed successfully using ROM copy";
514 result.
error_message =
"Save test failed: " + test_status.ToString();
517 }
catch (
const std::exception& e) {
519 result.
error_message =
"Comprehensive save test exception: " + std::string(e.what());
522 auto end_time = std::chrono::steady_clock::now();
523 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
524 end_time - start_time);
The Rom class is used to load, save, and modify Rom data.
auto palette_group() const
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.
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)
absl::Status SaveMapProperties()
auto mutable_overworld_map(int i)
absl::Status SaveOverworldMaps()
#define ICON_MD_CHECK_CIRCLE
Main namespace for the application.
absl::StatusOr< std::array< gfx::Bitmap, kNumGfxSheets > > LoadAllGraphicsData(Rom &rom, bool defer_render)
This function iterates over all graphics sheets in the Rom and loads them into memory....
std::chrono::milliseconds duration
std::string error_message
std::chrono::time_point< std::chrono::steady_clock > timestamp
void AddResult(const TestResult &result)