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