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 "mocks/mock_rom.h"
9#include "test/testing.h"
10
11namespace yaze {
12namespace test {
13
14using ::testing::_;
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 RomTest : public ::testing::Test {
24 protected:
26};
27
28TEST_F(RomTest, Uninitialized) {
29 EXPECT_EQ(rom_.size(), 0);
30 EXPECT_EQ(rom_.data(), nullptr);
31}
32
33TEST_F(RomTest, LoadFromFile) {
34#if defined(__linux__)
35 GTEST_SKIP();
36#endif
37 EXPECT_OK(rom_.LoadFromFile("zelda3.sfc"));
38 EXPECT_EQ(rom_.size(), 0x200000);
39 EXPECT_NE(rom_.data(), nullptr);
40}
41
42TEST_F(RomTest, LoadFromFileInvalid) {
43 EXPECT_THAT(rom_.LoadFromFile("invalid.sfc"),
44 StatusIs(absl::StatusCode::kNotFound));
45 EXPECT_EQ(rom_.size(), 0);
46 EXPECT_EQ(rom_.data(), nullptr);
47}
48
49TEST_F(RomTest, LoadFromFileEmpty) {
50 EXPECT_THAT(rom_.LoadFromFile(""),
51 StatusIs(absl::StatusCode::kInvalidArgument));
52}
53
54TEST_F(RomTest, ReadByteOk) {
55 EXPECT_OK(rom_.LoadFromData(kMockRomData, false));
56
57 for (size_t i = 0; i < kMockRomData.size(); ++i) {
58 uint8_t byte;
59 ASSERT_OK_AND_ASSIGN(byte, rom_.ReadByte(i));
60 EXPECT_EQ(byte, kMockRomData[i]);
61 }
62}
63
64TEST_F(RomTest, ReadByteInvalid) {
65 EXPECT_THAT(rom_.ReadByte(0).status(),
66 StatusIs(absl::StatusCode::kFailedPrecondition));
67}
68
69TEST_F(RomTest, ReadWordOk) {
70 EXPECT_OK(rom_.LoadFromData(kMockRomData, false));
71
72 for (size_t i = 0; i < kMockRomData.size(); i += 2) {
73 // Little endian
74 EXPECT_THAT(
75 rom_.ReadWord(i),
76 IsOkAndHolds<uint16_t>((kMockRomData[i]) | kMockRomData[i + 1] << 8));
77 }
78}
79
80TEST_F(RomTest, ReadWordInvalid) {
81 EXPECT_THAT(rom_.ReadWord(0).status(),
82 StatusIs(absl::StatusCode::kFailedPrecondition));
83}
84
85TEST_F(RomTest, ReadLongOk) {
86 EXPECT_OK(rom_.LoadFromData(kMockRomData, false));
87
88 for (size_t i = 0; i < kMockRomData.size(); i += 4) {
89 // Little endian
90 EXPECT_THAT(rom_.ReadLong(i),
91 IsOkAndHolds<uint32_t>((kMockRomData[i]) | kMockRomData[i] |
92 kMockRomData[i + 1] << 8 |
93 kMockRomData[i + 2] << 16));
94 }
95}
96
97TEST_F(RomTest, ReadBytesOk) {
98 EXPECT_OK(rom_.LoadFromData(kMockRomData, false));
99
100 std::vector<uint8_t> bytes;
101 ASSERT_OK_AND_ASSIGN(bytes, rom_.ReadByteVector(0, kMockRomData.size()));
102 EXPECT_THAT(bytes, ::testing::ContainerEq(kMockRomData));
103}
104
105TEST_F(RomTest, ReadBytesOutOfRange) {
106 EXPECT_OK(rom_.LoadFromData(kMockRomData, false));
107
108 std::vector<uint8_t> bytes;
109 EXPECT_THAT(rom_.ReadByteVector(kMockRomData.size() + 1, 1).status(),
110 StatusIs(absl::StatusCode::kOutOfRange));
111}
112
113TEST_F(RomTest, WriteByteOk) {
114 EXPECT_OK(rom_.LoadFromData(kMockRomData, false));
115
116 for (size_t i = 0; i < kMockRomData.size(); ++i) {
117 EXPECT_OK(rom_.WriteByte(i, 0xFF));
118 uint8_t byte;
119 ASSERT_OK_AND_ASSIGN(byte, rom_.ReadByte(i));
120 EXPECT_EQ(byte, 0xFF);
121 }
122}
123
124TEST_F(RomTest, WriteWordOk) {
125 EXPECT_OK(rom_.LoadFromData(kMockRomData, false));
126
127 for (size_t i = 0; i < kMockRomData.size(); i += 2) {
128 EXPECT_OK(rom_.WriteWord(i, 0xFFFF));
129 uint16_t word;
130 ASSERT_OK_AND_ASSIGN(word, rom_.ReadWord(i));
131 EXPECT_EQ(word, 0xFFFF);
132 }
133}
134
135TEST_F(RomTest, WriteLongOk) {
136 EXPECT_OK(rom_.LoadFromData(kMockRomData, false));
137
138 for (size_t i = 0; i < kMockRomData.size(); i += 4) {
139 EXPECT_OK(rom_.WriteLong(i, 0xFFFFFF));
140 uint32_t word;
141 ASSERT_OK_AND_ASSIGN(word, rom_.ReadLong(i));
142 EXPECT_EQ(word, 0xFFFFFF);
143 }
144}
145
146TEST_F(RomTest, WriteTransactionSuccess) {
147 MockRom mock_rom;
148 EXPECT_OK(mock_rom.LoadFromData(kMockRomData, false));
149
150 EXPECT_CALL(mock_rom, WriteHelper(_))
151 .WillRepeatedly(Return(absl::OkStatus()));
152
154 Rom::WriteAction{0x1000, uint8_t{0xFF}},
155 Rom::WriteAction{0x1001, uint16_t{0xABCD}},
156 Rom::WriteAction{0x1002, std::vector<uint8_t>{0x12, 0x34}}));
157}
158
159TEST_F(RomTest, WriteTransactionFailure) {
160 MockRom mock_rom;
161 EXPECT_OK(mock_rom.LoadFromData(kMockRomData, false));
162
163 EXPECT_CALL(mock_rom, WriteHelper(_))
164 .WillOnce(Return(absl::OkStatus()))
165 .WillOnce(Return(absl::InternalError("Write failed")));
166
167 EXPECT_EQ(
168 mock_rom.WriteTransaction(Rom::WriteAction{0x1000, uint8_t{0xFF}},
169 Rom::WriteAction{0x1001, uint16_t{0xABCD}}),
170 absl::InternalError("Write failed"));
171}
172
173TEST_F(RomTest, ReadTransactionSuccess) {
174 MockRom mock_rom;
175 EXPECT_OK(mock_rom.LoadFromData(kMockRomData, false));
176 uint8_t byte_val;
177 uint16_t word_val;
178
179 EXPECT_OK(mock_rom.ReadTransaction(byte_val, 0x0000, word_val, 0x0001));
180
181 EXPECT_EQ(byte_val, 0x00);
182 EXPECT_EQ(word_val, 0x0201);
183}
184
185TEST_F(RomTest, ReadTransactionFailure) {
186 MockRom mock_rom;
187 EXPECT_OK(mock_rom.LoadFromData(kMockRomData, false));
188 uint8_t byte_val;
189
190 EXPECT_EQ(mock_rom.ReadTransaction(byte_val, 0x1000),
191 absl::FailedPreconditionError("Offset out of range"));
192}
193
194} // namespace test
195} // 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:137
absl::Status LoadFromData(const std::vector< uint8_t > &data, bool z3_load=true)
Definition rom.cc:217
absl::Status WriteTransaction(Args... args)
Definition rom.h:129
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