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"; }
37 if (!current_rom || !current_rom->
is_loaded()) {
38 AddSkippedTest(results,
"ROM_Availability_Check",
"No ROM loaded");
39 return absl::OkStatus();
63 return absl::OkStatus();
71 if (current_rom && current_rom->
is_loaded()) {
72 ImGui::TextColored(ImVec4(0.0F, 1.0F, 0.0F, 1.0F),
74 ImGui::Text(
"Size: %.2F MB", current_rom->
size() / 1048576.0F);
76 ImGui::TextColored(ImVec4(1.0F, 0.5F, 0.0F, 1.0F),
89 ImGui::InputInt(
"Number of edits", &
num_edits_);
99 result.
name = test_name;
104 result.
duration = std::chrono::milliseconds{0};
105 result.
timestamp = std::chrono::steady_clock::now();
110 auto start_time = std::chrono::steady_clock::now();
113 result.
name =
"ROM_Load_Save_Test";
121 auto test_status = test_manager.TestRomWithCopy(rom, [&](
Rom* test_rom) -> absl::Status {
123 if (test_rom->
size() != rom->
size()) {
124 return absl::InternalError(
"ROM copy size mismatch");
128 std::string test_filename = test_manager.GenerateTestRomFilename(
"e2e_test");
130 if (!save_status.ok()) {
135 std::filesystem::remove(test_filename);
137 return absl::OkStatus();
140 if (test_status.ok()) {
142 result.
error_message =
"ROM load/save test completed successfully";
145 result.
error_message =
"ROM load/save test failed: " + test_status.ToString();
148 }
catch (
const std::exception& e) {
150 result.
error_message =
"ROM load/save test exception: " + std::string(e.what());
153 auto end_time = std::chrono::steady_clock::now();
154 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
155 end_time - start_time);
161 auto start_time = std::chrono::steady_clock::now();
164 result.
name =
"Data_Integrity_Test";
172 auto test_status = test_manager.TestRomWithCopy(rom, [&](
Rom* test_rom) -> absl::Status {
174 std::vector<uint32_t> test_addresses = {0x7FC0, 0x8000, 0x10000, 0x20000};
176 for (uint32_t addr : test_addresses) {
177 auto original_byte = rom->
ReadByte(addr);
178 auto copy_byte = test_rom->
ReadByte(addr);
180 if (!original_byte.ok() || !copy_byte.ok()) {
181 return absl::InternalError(
"Failed to read ROM data for comparison");
184 if (*original_byte != *copy_byte) {
185 return absl::InternalError(absl::StrFormat(
186 "Data integrity check failed at address 0x%X: original=0x%02X, copy=0x%02X",
187 addr, *original_byte, *copy_byte));
191 return absl::OkStatus();
194 if (test_status.ok()) {
196 result.
error_message =
"Data integrity test passed - all checked addresses match";
199 result.
error_message =
"Data integrity test failed: " + test_status.ToString();
202 }
catch (
const std::exception& e) {
204 result.
error_message =
"Data integrity test exception: " + std::string(e.what());
207 auto end_time = std::chrono::steady_clock::now();
208 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
209 end_time - start_time);
215 auto start_time = std::chrono::steady_clock::now();
218 result.
name =
"Transaction_System_Test";
226 auto test_status = test_manager.TestRomWithCopy(rom, [&](
Rom* test_rom) -> absl::Status {
231 auto original_byte1 = test_rom->
ReadByte(0x1000);
232 auto original_byte2 = test_rom->
ReadByte(0x2000);
233 auto original_word = test_rom->
ReadWord(0x3000);
235 if (!original_byte1.ok() || !original_byte2.ok() || !original_word.ok()) {
236 return absl::InternalError(
"Failed to read original ROM data");
248 auto new_byte1 = test_rom->
ReadByte(0x1000);
249 auto new_byte2 = test_rom->
ReadByte(0x2000);
250 auto new_word = test_rom->
ReadWord(0x3000);
252 if (!new_byte1.ok() || !new_byte2.ok() || !new_word.ok()) {
253 return absl::InternalError(
"Failed to read modified ROM data");
256 if (*new_byte1 != 0xAA || *new_byte2 != 0xBB || *new_word != 0xCCDD) {
257 return absl::InternalError(
"Transaction changes not applied correctly");
260 return absl::OkStatus();
263 if (test_status.ok()) {
265 result.
error_message =
"Transaction system test completed successfully";
268 result.
error_message =
"Transaction system test failed: " + test_status.ToString();
271 }
catch (
const std::exception& e) {
273 result.
error_message =
"Transaction system test exception: " + std::string(e.what());
276 auto end_time = std::chrono::steady_clock::now();
277 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
278 end_time - start_time);
284 auto start_time = std::chrono::steady_clock::now();
287 result.
name =
"Large_Scale_Editing_Test";
295 auto test_status = test_manager.TestRomWithCopy(rom, [&](
Rom* test_rom) -> absl::Status {
298 uint32_t addr = 0x1000 + (i * 4);
299 uint8_t value = i % 256;
306 uint32_t addr = 0x1000 + (i * 4);
307 uint8_t expected_value = i % 256;
309 auto actual_value = test_rom->
ReadByte(addr);
310 if (!actual_value.ok()) {
311 return absl::InternalError(absl::StrFormat(
"Failed to read address 0x%X", addr));
314 if (*actual_value != expected_value) {
315 return absl::InternalError(absl::StrFormat(
316 "Value mismatch at 0x%X: expected=0x%02X, actual=0x%02X",
317 addr, expected_value, *actual_value));
321 return absl::OkStatus();
324 if (test_status.ok()) {
329 result.
error_message =
"Large-scale editing test failed: " + test_status.ToString();
332 }
catch (
const std::exception& e) {
334 result.
error_message =
"Large-scale editing test exception: " + std::string(e.what());
337 auto end_time = std::chrono::steady_clock::now();
338 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
339 end_time - start_time);
345 auto start_time = std::chrono::steady_clock::now();
348 result.
name =
"Corruption_Detection_Test";
356 auto test_status = test_manager.TestRomWithCopy(rom, [&](
Rom* test_rom) -> absl::Status {
362 auto corrupted_byte1 = test_rom->
ReadByte(0x1000);
363 auto corrupted_byte2 = test_rom->
ReadByte(0x2000);
365 if (!corrupted_byte1.ok() || !corrupted_byte2.ok()) {
366 return absl::InternalError(
"Failed to read corrupted data");
369 if (*corrupted_byte1 != 0xFF || *corrupted_byte2 != 0xAA) {
370 return absl::InternalError(
"Corruption not applied correctly");
374 auto original_byte1 = rom->
ReadByte(0x1000);
375 auto original_byte2 = rom->
ReadByte(0x2000);
377 if (!original_byte1.ok() || !original_byte2.ok()) {
378 return absl::InternalError(
"Failed to read original data for comparison");
381 if (*corrupted_byte1 == *original_byte1 || *corrupted_byte2 == *original_byte2) {
382 return absl::InternalError(
"Corruption detection test failed - data not actually corrupted");
385 return absl::OkStatus();
388 if (test_status.ok()) {
390 result.
error_message =
"Corruption detection test passed - corruption successfully applied and detected";
393 result.
error_message =
"Corruption detection test failed: " + test_status.ToString();
396 }
catch (
const std::exception& e) {
398 result.
error_message =
"Corruption detection test exception: " + std::string(e.what());
401 auto end_time = std::chrono::steady_clock::now();
402 result.
duration = std::chrono::duration_cast<std::chrono::milliseconds>(
403 end_time - start_time);
The Rom class is used to load, save, and modify Rom data.
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(expression)
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)