yaze 0.2.0
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
rom_test.cc
Go to the documentation of this file.
1#include "app/rom.h"
2
3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
5
6#include "absl/status/status.h"
7#include "absl/status/statusor.h"
8#include "test/core/testing.h"
9
10namespace yaze {
11namespace test {
12
13using ::testing::_;
14using ::testing::DoAll;
15using ::testing::Return;
16
17const static std::vector<uint8_t> kMockRomData = {
18 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
19 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
20 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
21};
22
23class MockRom : public app::Rom {
24 public:
25 MOCK_METHOD(absl::Status, WriteHelper, (const WriteAction&), (override));
26
27 MOCK_METHOD2(ReadHelper, absl::Status(uint8_t&, int));
28 MOCK_METHOD2(ReadHelper, absl::Status(uint16_t&, int));
29 MOCK_METHOD2(ReadHelper, absl::Status(std::vector<uint8_t>&, int));
30
31 MOCK_METHOD(absl::StatusOr<uint8_t>, ReadByte, (int));
32 MOCK_METHOD(absl::StatusOr<uint16_t>, ReadWord, (int));
33 MOCK_METHOD(absl::StatusOr<uint32_t>, ReadLong, (int));
34};
35
36class RomTest : public ::testing::Test {
37 protected:
39};
40
41TEST_F(RomTest, Uninitialized) {
42 EXPECT_EQ(rom_.size(), 0);
43 EXPECT_EQ(rom_.data(), nullptr);
44}
45
46TEST_F(RomTest, LoadFromFile) {
47#if __defined(__linux__)
48 GTEST_SKIP();
49#endif
50 EXPECT_OK(rom_.LoadFromFile("test.sfc"));
51 EXPECT_EQ(rom_.size(), 0x200000);
52 EXPECT_NE(rom_.data(), nullptr);
53}
54
55TEST_F(RomTest, LoadFromFileInvalid) {
56 EXPECT_THAT(rom_.LoadFromFile("invalid.sfc"),
57 StatusIs(absl::StatusCode::kNotFound));
58 EXPECT_EQ(rom_.size(), 0);
59 EXPECT_EQ(rom_.data(), nullptr);
60}
61
62TEST_F(RomTest, LoadFromFileEmpty) {
63 EXPECT_THAT(rom_.LoadFromFile(""),
64 StatusIs(absl::StatusCode::kInvalidArgument));
65}
66
67TEST_F(RomTest, ReadByteOk) {
68 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
69
70 for (size_t i = 0; i < kMockRomData.size(); ++i) {
71 uint8_t byte;
72 ASSERT_OK_AND_ASSIGN(byte, rom_.ReadByte(i));
73 EXPECT_EQ(byte, kMockRomData[i]);
74 }
75}
76
77TEST_F(RomTest, ReadByteInvalid) {
78 EXPECT_THAT(rom_.ReadByte(0).status(),
79 StatusIs(absl::StatusCode::kFailedPrecondition));
80}
81
82TEST_F(RomTest, ReadWordOk) {
83 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
84
85 for (size_t i = 0; i < kMockRomData.size(); i += 2) {
86 // Little endian
87 EXPECT_THAT(
88 rom_.ReadWord(i),
89 IsOkAndHolds<uint16_t>((kMockRomData[i]) | kMockRomData[i + 1] << 8));
90 }
91}
92
93TEST_F(RomTest, ReadWordInvalid) {
94 EXPECT_THAT(rom_.ReadWord(0).status(),
95 StatusIs(absl::StatusCode::kFailedPrecondition));
96}
97
98TEST_F(RomTest, ReadLongOk) {
99 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
100
101 for (size_t i = 0; i < kMockRomData.size(); i += 4) {
102 // Little endian
103 EXPECT_THAT(rom_.ReadLong(i),
104 IsOkAndHolds<uint32_t>((kMockRomData[i]) | kMockRomData[i] |
105 kMockRomData[i + 1] << 8 |
106 kMockRomData[i + 2] << 16));
107 }
108}
109
110TEST_F(RomTest, ReadLongInvalid) {
111 EXPECT_THAT(rom_.ReadLong(0).status(),
112 StatusIs(absl::StatusCode::kFailedPrecondition));
113}
114
115TEST_F(RomTest, ReadBytesOk) {
116 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
117
118 std::vector<uint8_t> bytes;
119 ASSERT_OK_AND_ASSIGN(bytes, rom_.ReadByteVector(0, kMockRomData.size()));
120 EXPECT_THAT(bytes, ::testing::ContainerEq(kMockRomData));
121}
122
123TEST_F(RomTest, ReadBytesInvalid) {
124 EXPECT_THAT(rom_.ReadByteVector(0, 1).status(),
125 StatusIs(absl::StatusCode::kFailedPrecondition));
126}
127
128TEST_F(RomTest, ReadBytesOutOfRange) {
129 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
130
131 std::vector<uint8_t> bytes;
132 EXPECT_THAT(rom_.ReadByteVector(kMockRomData.size() + 1, 1).status(),
133 StatusIs(absl::StatusCode::kOutOfRange));
134}
135
136TEST_F(RomTest, WriteByteOk) {
137 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
138
139 for (size_t i = 0; i < kMockRomData.size(); ++i) {
140 EXPECT_OK(rom_.WriteByte(i, 0xFF));
141 uint8_t byte;
142 ASSERT_OK_AND_ASSIGN(byte, rom_.ReadByte(i));
143 EXPECT_EQ(byte, 0xFF);
144 }
145}
146
147TEST_F(RomTest, WriteByteInvalid) {
148 EXPECT_THAT(rom_.WriteByte(0, 0xFF),
149 StatusIs(absl::StatusCode::kFailedPrecondition));
150
151 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
152 EXPECT_THAT(rom_.WriteByte(kMockRomData.size(), 0xFF),
153 StatusIs(absl::StatusCode::kOutOfRange));
154}
155
156TEST_F(RomTest, WriteWordOk) {
157 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
158
159 for (size_t i = 0; i < kMockRomData.size(); i += 2) {
160 EXPECT_OK(rom_.WriteWord(i, 0xFFFF));
161 uint16_t word;
162 ASSERT_OK_AND_ASSIGN(word, rom_.ReadWord(i));
163 EXPECT_EQ(word, 0xFFFF);
164 }
165}
166
167TEST_F(RomTest, WriteWordInvalid) {
168 EXPECT_THAT(rom_.WriteWord(0, 0xFFFF),
169 StatusIs(absl::StatusCode::kFailedPrecondition));
170
171 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
172 EXPECT_THAT(rom_.WriteWord(kMockRomData.size(), 0xFFFF),
173 StatusIs(absl::StatusCode::kOutOfRange));
174}
175
176TEST_F(RomTest, WriteLongOk) {
177 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
178
179 for (size_t i = 0; i < kMockRomData.size(); i += 4) {
180 EXPECT_OK(rom_.WriteLong(i, 0xFFFFFF));
181 uint32_t word;
182 ASSERT_OK_AND_ASSIGN(word, rom_.ReadLong(i));
183 EXPECT_EQ(word, 0xFFFFFF);
184 }
185}
186
187TEST_F(RomTest, WriteLongInvalid) {
188 EXPECT_THAT(rom_.WriteLong(0, 0xFFFFFF),
189 StatusIs(absl::StatusCode::kFailedPrecondition));
190
191 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
192 EXPECT_THAT(rom_.WriteLong(kMockRomData.size(), 0xFFFFFFFF),
193 StatusIs(absl::StatusCode::kOutOfRange));
194}
195
196TEST_F(RomTest, WriteTransactionSuccess) {
197 MockRom mock_rom;
198 EXPECT_OK(mock_rom.LoadFromBytes(kMockRomData));
199
200 EXPECT_CALL(mock_rom, WriteHelper(_))
201 .WillRepeatedly(Return(absl::OkStatus()));
202
204 app::Rom::WriteAction{0x1000, uint8_t{0xFF}},
205 app::Rom::WriteAction{0x1001, uint16_t{0xABCD}},
206 app::Rom::WriteAction{0x1002, std::vector<uint8_t>{0x12, 0x34}}));
207}
208
209TEST_F(RomTest, WriteTransactionFailure) {
210 MockRom mock_rom;
211 EXPECT_OK(mock_rom.LoadFromBytes(kMockRomData));
212
213 EXPECT_CALL(mock_rom, WriteHelper(_))
214 .WillOnce(Return(absl::OkStatus()))
215 .WillOnce(Return(absl::InternalError("Write failed")));
216
217 EXPECT_EQ(mock_rom.WriteTransaction(
218 app::Rom::WriteAction{0x1000, uint8_t{0xFF}},
219 app::Rom::WriteAction{0x1001, uint16_t{0xABCD}}),
220 absl::InternalError("Write failed"));
221}
222
223TEST_F(RomTest, ReadTransactionSuccess) {
224 MockRom mock_rom;
225 EXPECT_OK(mock_rom.LoadFromBytes(kMockRomData));
226 uint8_t byte_val;
227 uint16_t word_val;
228
229 EXPECT_OK(mock_rom.ReadTransaction(byte_val, 0x0000, word_val, 0x0001));
230
231 EXPECT_EQ(byte_val, 0x00);
232 EXPECT_EQ(word_val, 0x0201);
233}
234
235TEST_F(RomTest, ReadTransactionFailure) {
236 MockRom mock_rom;
237 EXPECT_OK(mock_rom.LoadFromBytes(kMockRomData));
238 uint8_t byte_val;
239
240 EXPECT_EQ(mock_rom.ReadTransaction(byte_val, 0x1000),
241 absl::FailedPreconditionError("Offset out of range"));
242}
243
244} // namespace test
245} // namespace yaze
The Rom class is used to load, save, and modify Rom data.
Definition rom.h:145
absl::Status WriteTransaction(Args... args)
Definition rom.h:425
absl::Status ReadTransaction(T &var, int address, Args &&... args)
Definition rom.h:433
absl::StatusOr< uint32_t > ReadLong(int offset)
Definition rom.h:277
virtual absl::Status WriteHelper(const WriteAction &action)
Definition rom.h:508
absl::StatusOr< uint16_t > ReadWord(int offset)
Definition rom.h:264
absl::Status ReadHelper(T &var, int address)
Definition rom.h:530
absl::StatusOr< uint8_t > ReadByte(int offset)
Definition rom.h:256
absl::Status LoadFromBytes(const std::vector< uint8_t > &data)
Definition rom.cc:243
MOCK_METHOD2(ReadHelper, absl::Status(uint8_t &, int))
MOCK_METHOD(absl::StatusOr< uint16_t >, ReadWord,(int))
MOCK_METHOD(absl::StatusOr< uint8_t >, ReadByte,(int))
MOCK_METHOD2(ReadHelper, absl::Status(std::vector< uint8_t > &, int))
MOCK_METHOD(absl::Status, WriteHelper,(const WriteAction &),(override))
MOCK_METHOD2(ReadHelper, absl::Status(uint16_t &, int))
MOCK_METHOD(absl::StatusOr< uint32_t >, ReadLong,(int))
TEST_F(RomTest, Uninitialized)
Definition rom_test.cc:41
::testing::AssertionResult IsOkAndHolds(const absl::StatusOr< T > &status_or, const T &value)
Definition testing.h:30
Definition common.cc:21
#define EXPECT_OK(expr)
Definition testing.h:10
#define ASSERT_OK_AND_ASSIGN(lhs, rexpr)
Definition testing.h:14