yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
object_parser_test.cc
Go to the documentation of this file.
2
3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
5
6#include <vector>
7
8#include "mocks/mock_rom.h"
9
10namespace yaze {
11namespace test {
12
13class ObjectParserTest : public ::testing::Test {
14 protected:
15 void SetUp() override {
16 mock_rom_ = std::make_unique<MockRom>();
18 parser_ = std::make_unique<zelda3::ObjectParser>(mock_rom_.get());
19 }
20
22 std::vector<uint8_t> mock_data(0x100000, 0x00);
23
24 // Set up object subtype tables
25 SetupSubtypeTable(mock_data, 0x8000, 0x100); // Subtype 1 table
26 SetupSubtypeTable(mock_data, 0x83F0, 0x80); // Subtype 2 table
27 SetupSubtypeTable(mock_data, 0x84F0, 0x100); // Subtype 3 table
28
29 // Set up tile data
30 SetupTileData(mock_data, 0x1B52, 0x1000);
31
32 static_cast<MockRom*>(mock_rom_.get())->SetTestData(mock_data);
33 }
34
35 void SetupSubtypeTable(std::vector<uint8_t>& data, int base_addr, int count) {
36 for (int i = 0; i < count; i++) {
37 int addr = base_addr + (i * 2);
38 if (addr + 1 < (int)data.size()) {
39 // Point to tile data at 0x1B52 + (i * 8)
40 int tile_offset = (i * 8) & 0xFFFF;
41 data[addr] = tile_offset & 0xFF;
42 data[addr + 1] = (tile_offset >> 8) & 0xFF;
43 }
44 }
45 }
46
47 void SetupTileData(std::vector<uint8_t>& data, int base_addr, int size) {
48 for (int i = 0; i < size; i += 8) {
49 int addr = base_addr + i;
50 if (addr + 7 < (int)data.size()) {
51 // Create simple tile data (4 words per tile)
52 for (int j = 0; j < 8; j++) {
53 data[addr + j] = (i + j) & 0xFF;
54 }
55 }
56 }
57 }
58
59 std::unique_ptr<MockRom> mock_rom_;
60 std::unique_ptr<zelda3::ObjectParser> parser_;
61};
62
63TEST_F(ObjectParserTest, ParseSubtype1Object) {
64 auto result = parser_->ParseObject(0x01);
65 ASSERT_TRUE(result.ok());
66
67 const auto& tiles = result.value();
68 EXPECT_EQ(tiles.size(), 8);
69
70 // Verify tile data was parsed correctly
71 for (const auto& tile : tiles) {
72 EXPECT_NE(tile.id_, 0);
73 }
74}
75
76TEST_F(ObjectParserTest, ParseSubtype2Object) {
77 auto result = parser_->ParseObject(0x101);
78 ASSERT_TRUE(result.ok());
79
80 const auto& tiles = result.value();
81 EXPECT_EQ(tiles.size(), 8);
82}
83
84TEST_F(ObjectParserTest, ParseSubtype3Object) {
85 auto result = parser_->ParseObject(0x201);
86 ASSERT_TRUE(result.ok());
87
88 const auto& tiles = result.value();
89 EXPECT_EQ(tiles.size(), 8);
90}
91
92TEST_F(ObjectParserTest, GetObjectSubtype) {
93 auto result1 = parser_->GetObjectSubtype(0x01);
94 ASSERT_TRUE(result1.ok());
95 EXPECT_EQ(result1->subtype, 1);
96
97 auto result2 = parser_->GetObjectSubtype(0x101);
98 ASSERT_TRUE(result2.ok());
99 EXPECT_EQ(result2->subtype, 2);
100
101 auto result3 = parser_->GetObjectSubtype(0x201);
102 ASSERT_TRUE(result3.ok());
103 EXPECT_EQ(result3->subtype, 3);
104}
105
106TEST_F(ObjectParserTest, ParseObjectSize) {
107 auto result = parser_->ParseObjectSize(0x01, 0x12);
108 ASSERT_TRUE(result.ok());
109
110 const auto& size_info = result.value();
111 EXPECT_EQ(size_info.width_tiles, 4); // (1 + 1) * 2
112 EXPECT_EQ(size_info.height_tiles, 6); // (2 + 1) * 2
113 EXPECT_TRUE(size_info.is_horizontal);
114 EXPECT_TRUE(size_info.is_repeatable);
115 EXPECT_EQ(size_info.repeat_count, 0x12);
116}
117
118TEST_F(ObjectParserTest, ParseObjectRoutine) {
119 auto result = parser_->ParseObjectRoutine(0x01);
120 ASSERT_TRUE(result.ok());
121
122 const auto& routine_info = result.value();
123 EXPECT_NE(routine_info.routine_ptr, 0);
124 EXPECT_NE(routine_info.tile_ptr, 0);
125 EXPECT_EQ(routine_info.tile_count, 8);
126 EXPECT_TRUE(routine_info.is_repeatable);
127 EXPECT_TRUE(routine_info.is_orientation_dependent);
128}
129
130TEST_F(ObjectParserTest, InvalidObjectId) {
131 auto result = parser_->ParseObject(-1);
132 EXPECT_FALSE(result.ok());
133 EXPECT_EQ(result.status().code(), absl::StatusCode::kInvalidArgument);
134}
135
137 zelda3::ObjectParser null_parser(nullptr);
138 auto result = null_parser.ParseObject(0x01);
139 EXPECT_FALSE(result.ok());
140 EXPECT_EQ(result.status().code(), absl::StatusCode::kInvalidArgument);
141}
142
143} // namespace test
144} // namespace yaze
Enhanced ROM for testing that behaves like a real ROM but with test data.
Definition mock_rom.h:21
void SetupSubtypeTable(std::vector< uint8_t > &data, int base_addr, int count)
void SetupTileData(std::vector< uint8_t > &data, int base_addr, int size)
std::unique_ptr< MockRom > mock_rom_
std::unique_ptr< zelda3::ObjectParser > parser_
Direct ROM parser for dungeon objects.
absl::StatusOr< std::vector< gfx::TileInfo > > ParseObject(int16_t object_id)
Parse object data directly from ROM.
TEST_F(DungeonObjectRenderingE2ETests, RunAllTests)
Main namespace for the application.