243 std::vector<uint8_t> rom_copy = test_rom_;
244 size_t original_size = rom_copy.size();
248 wrapper_->ApplyPatch(simple_patch_path_.string(), rom_copy);
251 const auto& result = patch_result.value();
252 EXPECT_TRUE(result.success)
253 <<
"Patch failed: " << testing::PrintToString(result.errors);
256 EXPECT_NE(rom_copy, test_rom_);
257 EXPECT_GE(rom_copy.size(), original_size);
260 bool found_entry =
false;
261 bool found_subroutine =
false;
263 for (
const auto& symbol : result.symbols) {
264 if (symbol.name ==
"yaze_test_entry") {
266 EXPECT_EQ(symbol.address, 0x008000);
267 }
else if (symbol.name ==
"yaze_test_subroutine") {
268 found_subroutine =
true;
272 EXPECT_TRUE(found_entry) <<
"yaze_test_entry symbol not found";
273 EXPECT_TRUE(found_subroutine) <<
"yaze_test_subroutine symbol not found";
278 auto symbols_result = wrapper_->ExtractSymbols(symbols_patch_path_.string());
281 const auto& symbols = symbols_result.value();
282 EXPECT_GT(symbols.size(), 0);
285 std::vector<std::string> expected_symbols = {
286 "main_routine",
"init_player",
"game_loop",
"update_player",
287 "update_enemies",
"update_graphics",
"multiply_by_two",
"divide_by_two"};
289 for (
const auto& expected_symbol : expected_symbols) {
291 for (
const auto& symbol : symbols) {
292 if (symbol.name == expected_symbol) {
294 EXPECT_GT(symbol.address, 0)
295 <<
"Symbol " << expected_symbol <<
" has invalid address";
299 EXPECT_TRUE(found) <<
"Expected symbol not found: " << expected_symbol;
303 auto symbol_table = wrapper_->GetSymbolTable();
304 EXPECT_GT(symbol_table.size(), 0);
306 auto main_symbol = wrapper_->FindSymbol(
"main_routine");
307 EXPECT_TRUE(main_symbol.has_value());
309 EXPECT_EQ(main_symbol->name,
"main_routine");
310 EXPECT_EQ(main_symbol->address, 0x008000);
316 std::vector<uint8_t> rom_copy = test_rom_;
320 wrapper_->ApplyPatch(gameplay_patch_path_.string(), rom_copy);
323 const auto& result = patch_result.value();
324 EXPECT_TRUE(result.success)
325 <<
"Gameplay patch failed: " << testing::PrintToString(result.errors);
334 const uint32_t rom_offset = 0x18000;
335 if (rom_offset < rom_copy.size()) {
337 EXPECT_EQ(rom_copy[rom_offset], 0xE2);
338 EXPECT_EQ(rom_copy[rom_offset + 1], 0x20);
344 std::vector<uint8_t> rom_copy = test_rom_;
345 size_t original_size = rom_copy.size();
348 auto result1 = wrapper_->ApplyPatch(simple_patch_path_.string(), rom_copy);
350 EXPECT_TRUE(result1->success);
354 auto result2 = wrapper_->ApplyPatch(symbols_patch_path_.string(), rom_copy);
356 EXPECT_TRUE(result2->success);
359 EXPECT_GE(rom_copy.size(), original_size);
360 EXPECT_GT(result2->symbols.size(), 0);
365 auto broken_patch_path = test_dir_ /
"broken_test.asm";
366 std::ofstream broken_file(broken_patch_path);
368; Broken patch for error testing
371 invalid_opcode ; This will cause an error
372 lda unknown_symbol ; This will cause an error
373 sta $FFFFFF ; Invalid address
377 std::vector<uint8_t> rom_copy = test_rom_;
379 wrapper_->ApplyPatch(broken_patch_path.string(), rom_copy);
382 EXPECT_FALSE(patch_result.ok());
383 EXPECT_THAT(patch_result.status().message(),
384 testing::AnyOf(testing::HasSubstr(
"invalid"),
385 testing::HasSubstr(
"unknown"),
386 testing::HasSubstr(
"error")));
389TEST_F(AsarRomIntegrationTest, PatchValidationWorkflow) {
393 auto validation_result =
394 wrapper_->ValidateAssembly(simple_patch_path_.string());
398 std::vector<uint8_t> rom_copy = test_rom_;
400 wrapper_->ApplyPatch(simple_patch_path_.string(), rom_copy);
402 EXPECT_TRUE(patch_result->success);
405 EXPECT_GT(patch_result->symbols.size(), 0);
406 EXPECT_GT(patch_result->rom_size, 0);
409 auto entry_symbol = wrapper_->FindSymbol(
"yaze_test_entry");
410 EXPECT_TRUE(entry_symbol.has_value());