1#ifndef YAZE_APP_TEST_E2E_TEST_SUITE_H
2#define YAZE_APP_TEST_E2E_TEST_SUITE_H
7#include "absl/strings/str_format.h"
30 std::string
GetName()
const override {
return "End-to-End ROM Tests"; }
39 if (!current_rom || !current_rom->
is_loaded()) {
40 AddSkippedTest(results,
"ROM_Availability_Check",
"No ROM loaded");
41 return absl::OkStatus();
65 return absl::OkStatus();
73 if (current_rom && current_rom->
is_loaded()) {
74 ImGui::TextColored(ImVec4(0.0F, 1.0F, 0.0F, 1.0F),
"%s Current ROM: %s",
76 ImGui::Text(
"Size: %.2F MB", current_rom->
size() / 1048576.0F);
78 ImGui::TextColored(ImVec4(1.0F, 0.5F, 0.0F, 1.0F),
91 ImGui::InputInt(
"Number of edits", &
num_edits_);
102 const std::string& reason) {
104 result.
name = test_name;
109 result.
duration = std::chrono::milliseconds{0};
110 result.
timestamp = std::chrono::steady_clock::now();
115 auto start_time = std::chrono::steady_clock::now();
118 result.
name =
"ROM_Load_Save_Test";
127 test_manager.TestRomWithCopy(rom, [&](
Rom* test_rom) -> absl::Status {
129 if (test_rom->
size() != rom->
size()) {
130 return absl::InternalError(
"ROM copy size mismatch");
134 std::string test_filename =
135 test_manager.GenerateTestRomFilename(
"e2e_test");
138 if (!save_status.ok()) {
143 std::filesystem::remove(test_filename);
145 return absl::OkStatus();
148 if (test_status.ok()) {
150 result.
error_message =
"ROM load/save test completed successfully";
154 "ROM load/save test failed: " + test_status.ToString();
157 }
catch (
const std::exception& e) {
160 "ROM load/save test exception: " + std::string(e.what());
163 auto end_time = std::chrono::steady_clock::now();
164 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
165 end_time - start_time);
171 auto start_time = std::chrono::steady_clock::now();
174 result.
name =
"Data_Integrity_Test";
183 test_manager.TestRomWithCopy(rom, [&](
Rom* test_rom) -> absl::Status {
185 std::vector<uint32_t> test_addresses = {0x7FC0, 0x8000, 0x10000,
188 for (uint32_t addr : test_addresses) {
189 auto original_byte = rom->
ReadByte(addr);
190 auto copy_byte = test_rom->
ReadByte(addr);
192 if (!original_byte.ok() || !copy_byte.ok()) {
193 return absl::InternalError(
194 "Failed to read ROM data for comparison");
197 if (*original_byte != *copy_byte) {
198 return absl::InternalError(
199 absl::StrFormat(
"Data integrity check failed at address "
200 "0x%X: original=0x%02X, copy=0x%02X",
201 addr, *original_byte, *copy_byte));
205 return absl::OkStatus();
208 if (test_status.ok()) {
211 "Data integrity test passed - all checked addresses match";
215 "Data integrity test failed: " + test_status.ToString();
218 }
catch (
const std::exception& e) {
221 "Data integrity test exception: " + std::string(e.what());
224 auto end_time = std::chrono::steady_clock::now();
225 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
226 end_time - start_time);
232 auto start_time = std::chrono::steady_clock::now();
235 result.
name =
"Transaction_System_Test";
244 test_manager.TestRomWithCopy(rom, [&](
Rom* test_rom) -> absl::Status {
249 auto original_byte1 = test_rom->
ReadByte(0x1000);
250 auto original_byte2 = test_rom->
ReadByte(0x2000);
251 auto original_word = test_rom->
ReadWord(0x3000);
253 if (!original_byte1.ok() || !original_byte2.ok() ||
254 !original_word.ok()) {
255 return absl::InternalError(
"Failed to read original ROM data");
267 auto new_byte1 = test_rom->
ReadByte(0x1000);
268 auto new_byte2 = test_rom->
ReadByte(0x2000);
269 auto new_word = test_rom->
ReadWord(0x3000);
271 if (!new_byte1.ok() || !new_byte2.ok() || !new_word.ok()) {
272 return absl::InternalError(
"Failed to read modified ROM data");
275 if (*new_byte1 != 0xAA || *new_byte2 != 0xBB ||
276 *new_word != 0xCCDD) {
277 return absl::InternalError(
278 "Transaction changes not applied correctly");
281 return absl::OkStatus();
284 if (test_status.ok()) {
286 result.
error_message =
"Transaction system test completed successfully";
290 "Transaction system test failed: " + test_status.ToString();
293 }
catch (
const std::exception& e) {
296 "Transaction system test exception: " + std::string(e.what());
299 auto end_time = std::chrono::steady_clock::now();
300 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
301 end_time - start_time);
307 auto start_time = std::chrono::steady_clock::now();
310 result.
name =
"Large_Scale_Editing_Test";
319 test_manager.TestRomWithCopy(rom, [&](
Rom* test_rom) -> absl::Status {
322 uint32_t addr = 0x1000 + (i * 4);
323 uint8_t value = i % 256;
330 uint32_t addr = 0x1000 + (i * 4);
331 uint8_t expected_value = i % 256;
333 auto actual_value = test_rom->
ReadByte(addr);
334 if (!actual_value.ok()) {
335 return absl::InternalError(
336 absl::StrFormat(
"Failed to read address 0x%X", addr));
339 if (*actual_value != expected_value) {
340 return absl::InternalError(absl::StrFormat(
341 "Value mismatch at 0x%X: expected=0x%02X, actual=0x%02X",
342 addr, expected_value, *actual_value));
346 return absl::OkStatus();
349 if (test_status.ok()) {
352 "Large-scale editing test passed: %d edits",
num_edits_);
356 "Large-scale editing test failed: " + test_status.ToString();
359 }
catch (
const std::exception& e) {
362 "Large-scale editing test exception: " + std::string(e.what());
365 auto end_time = std::chrono::steady_clock::now();
366 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
367 end_time - start_time);
373 auto start_time = std::chrono::steady_clock::now();
376 result.
name =
"Corruption_Detection_Test";
385 test_manager.TestRomWithCopy(rom, [&](
Rom* test_rom) -> absl::Status {
391 auto corrupted_byte1 = test_rom->
ReadByte(0x1000);
392 auto corrupted_byte2 = test_rom->
ReadByte(0x2000);
394 if (!corrupted_byte1.ok() || !corrupted_byte2.ok()) {
395 return absl::InternalError(
"Failed to read corrupted data");
398 if (*corrupted_byte1 != 0xFF || *corrupted_byte2 != 0xAA) {
399 return absl::InternalError(
"Corruption not applied correctly");
403 auto original_byte1 = rom->
ReadByte(0x1000);
404 auto original_byte2 = rom->
ReadByte(0x2000);
406 if (!original_byte1.ok() || !original_byte2.ok()) {
407 return absl::InternalError(
408 "Failed to read original data for comparison");
411 if (*corrupted_byte1 == *original_byte1 ||
412 *corrupted_byte2 == *original_byte2) {
413 return absl::InternalError(
414 "Corruption detection test failed - data not actually "
418 return absl::OkStatus();
421 if (test_status.ok()) {
424 "Corruption detection test passed - corruption successfully "
425 "applied and detected";
429 "Corruption detection test failed: " + test_status.ToString();
432 }
catch (
const std::exception& e) {
435 "Corruption detection test exception: " + std::string(e.what());
438 auto end_time = std::chrono::steady_clock::now();
439 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
440 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::Status WriteByte(int addr, uint8_t value)
absl::StatusOr< uint16_t > ReadWord(int offset)
absl::Status SaveToFile(const SaveSettings &settings)
absl::StatusOr< uint8_t > ReadByte(int offset)
Transaction & WriteWord(int address, uint16_t value)
Transaction & WriteByte(int address, uint8_t value)
End-to-End test suite for comprehensive ROM testing.
TestCategory GetCategory() const override
void DrawConfiguration() override
bool test_data_integrity_
void RunDataIntegrityTest(TestResults &results, Rom *rom)
void RunLargeScaleEditingTest(TestResults &results, Rom *rom)
~E2ETestSuite() override=default
std::string GetName() const override
void RunCorruptionDetectionTest(TestResults &results, Rom *rom)
bool test_large_scale_editing_
void RunTransactionSystemTest(TestResults &results, Rom *rom)
bool test_transaction_system_
absl::Status RunTests(TestResults &results) override
bool test_corruption_detection_
void RunRomLoadSaveTest(TestResults &results, Rom *rom)
void AddSkippedTest(TestResults &results, const std::string &test_name, const std::string &reason)
Rom * GetCurrentRom() const
static TestManager & Get()
#define ICON_MD_CHECK_CIRCLE
#define ICON_MD_VERIFIED_USER
#define RETURN_IF_ERROR(expr)
std::chrono::milliseconds duration
std::string error_message
std::chrono::time_point< std::chrono::steady_clock > timestamp
void AddResult(const TestResult &result)