3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
6#include "absl/status/status.h"
7#include "absl/status/statusor.h"
14using ::testing::DoAll;
15using ::testing::Return;
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,
42 EXPECT_EQ(rom_.size(), 0);
43 EXPECT_EQ(rom_.data(),
nullptr);
47#if __defined(__linux__)
51 EXPECT_EQ(rom_.size(), 0x200000);
52 EXPECT_NE(rom_.data(),
nullptr);
56 EXPECT_THAT(rom_.LoadFromFile(
"invalid.sfc"),
57 StatusIs(absl::StatusCode::kNotFound));
58 EXPECT_EQ(rom_.size(), 0);
59 EXPECT_EQ(rom_.data(),
nullptr);
63 EXPECT_THAT(rom_.LoadFromFile(
""),
64 StatusIs(absl::StatusCode::kInvalidArgument));
68 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
70 for (
size_t i = 0; i < kMockRomData.size(); ++i) {
73 EXPECT_EQ(
byte, kMockRomData[i]);
78 EXPECT_THAT(rom_.ReadByte(0).status(),
79 StatusIs(absl::StatusCode::kFailedPrecondition));
83 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
85 for (
size_t i = 0; i < kMockRomData.size(); i += 2) {
94 EXPECT_THAT(rom_.ReadWord(0).status(),
95 StatusIs(absl::StatusCode::kFailedPrecondition));
99 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
101 for (
size_t i = 0; i < kMockRomData.size(); i += 4) {
103 EXPECT_THAT(rom_.ReadLong(i),
105 kMockRomData[i + 1] << 8 |
106 kMockRomData[i + 2] << 16));
111 EXPECT_THAT(rom_.ReadLong(0).status(),
112 StatusIs(absl::StatusCode::kFailedPrecondition));
116 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
118 std::vector<uint8_t> bytes;
120 EXPECT_THAT(bytes, ::testing::ContainerEq(kMockRomData));
124 EXPECT_THAT(rom_.ReadByteVector(0, 1).status(),
125 StatusIs(absl::StatusCode::kFailedPrecondition));
129 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
131 std::vector<uint8_t> bytes;
132 EXPECT_THAT(rom_.ReadByteVector(kMockRomData.size() + 1, 1).status(),
133 StatusIs(absl::StatusCode::kOutOfRange));
137 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
139 for (
size_t i = 0; i < kMockRomData.size(); ++i) {
143 EXPECT_EQ(
byte, 0xFF);
148 EXPECT_THAT(rom_.WriteByte(0, 0xFF),
149 StatusIs(absl::StatusCode::kFailedPrecondition));
151 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
152 EXPECT_THAT(rom_.WriteByte(kMockRomData.size(), 0xFF),
153 StatusIs(absl::StatusCode::kOutOfRange));
157 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
159 for (
size_t i = 0; i < kMockRomData.size(); i += 2) {
163 EXPECT_EQ(word, 0xFFFF);
168 EXPECT_THAT(rom_.WriteWord(0, 0xFFFF),
169 StatusIs(absl::StatusCode::kFailedPrecondition));
171 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
172 EXPECT_THAT(rom_.WriteWord(kMockRomData.size(), 0xFFFF),
173 StatusIs(absl::StatusCode::kOutOfRange));
177 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
179 for (
size_t i = 0; i < kMockRomData.size(); i += 4) {
183 EXPECT_EQ(word, 0xFFFFFF);
188 EXPECT_THAT(rom_.WriteLong(0, 0xFFFFFF),
189 StatusIs(absl::StatusCode::kFailedPrecondition));
191 EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
192 EXPECT_THAT(rom_.WriteLong(kMockRomData.size(), 0xFFFFFFFF),
193 StatusIs(absl::StatusCode::kOutOfRange));
200 EXPECT_CALL(mock_rom, WriteHelper(_))
201 .WillRepeatedly(Return(absl::OkStatus()));
206 app::Rom::WriteAction{0x1002, std::vector<uint8_t>{0x12, 0x34}}));
213 EXPECT_CALL(mock_rom, WriteHelper(_))
214 .WillOnce(Return(absl::OkStatus()))
215 .WillOnce(Return(absl::InternalError(
"Write failed")));
220 absl::InternalError(
"Write failed"));
231 EXPECT_EQ(byte_val, 0x00);
232 EXPECT_EQ(word_val, 0x0201);
241 absl::FailedPreconditionError(
"Offset out of range"));
The Rom class is used to load, save, and modify Rom data.
absl::Status WriteTransaction(Args... args)
absl::Status ReadTransaction(T &var, int address, Args &&... args)
absl::StatusOr< uint32_t > ReadLong(int offset)
virtual absl::Status WriteHelper(const WriteAction &action)
absl::StatusOr< uint16_t > ReadWord(int offset)
absl::Status ReadHelper(T &var, int address)
absl::StatusOr< uint8_t > ReadByte(int offset)
absl::Status LoadFromBytes(const std::vector< uint8_t > &data)
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)
::testing::AssertionResult IsOkAndHolds(const absl::StatusOr< T > &status_or, const T &value)
#define ASSERT_OK_AND_ASSIGN(lhs, rexpr)