3#include <gmock/gmock.h>
4#include <gtest/gtest.h>
6#include "absl/status/status.h"
7#include "absl/status/statusor.h"
16using ::testing::Return;
18const static std::vector<uint8_t> kMockRomData = {
19 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
20 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
21 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
30 EXPECT_EQ(rom_.size(), 0);
31 EXPECT_EQ(rom_.data(),
nullptr);
38 EXPECT_OK(rom_.LoadFromFile(
"zelda3.sfc"));
39 EXPECT_EQ(rom_.size(), 0x200000);
40 EXPECT_NE(rom_.data(),
nullptr);
44 EXPECT_THAT(rom_.LoadFromFile(
"invalid.sfc"),
45 StatusIs(absl::StatusCode::kNotFound));
46 EXPECT_EQ(rom_.size(), 0);
47 EXPECT_EQ(rom_.data(),
nullptr);
51 EXPECT_THAT(rom_.LoadFromFile(
""),
52 StatusIs(absl::StatusCode::kInvalidArgument));
56 EXPECT_OK(rom_.LoadFromData(kMockRomData,
false));
58 for (
size_t i = 0; i < kMockRomData.size(); ++i) {
61 EXPECT_EQ(
byte, kMockRomData[i]);
66 EXPECT_THAT(rom_.ReadByte(0).status(),
67 StatusIs(absl::StatusCode::kFailedPrecondition));
71 EXPECT_OK(rom_.LoadFromData(kMockRomData,
false));
73 for (
size_t i = 0; i < kMockRomData.size(); i += 2) {
77 IsOkAndHolds<uint16_t>((kMockRomData[i]) | kMockRomData[i + 1] << 8));
82 EXPECT_THAT(rom_.ReadWord(0).status(),
83 StatusIs(absl::StatusCode::kFailedPrecondition));
87 EXPECT_OK(rom_.LoadFromData(kMockRomData,
false));
89 for (
size_t i = 0; i < kMockRomData.size(); i += 4) {
91 EXPECT_THAT(rom_.ReadLong(i),
92 IsOkAndHolds<uint32_t>((kMockRomData[i]) | kMockRomData[i] |
93 kMockRomData[i + 1] << 8 |
94 kMockRomData[i + 2] << 16));
99 EXPECT_OK(rom_.LoadFromData(kMockRomData,
false));
101 std::vector<uint8_t> bytes;
103 EXPECT_THAT(bytes, ::testing::ContainerEq(kMockRomData));
107 EXPECT_OK(rom_.LoadFromData(kMockRomData,
false));
109 std::vector<uint8_t> bytes;
110 EXPECT_THAT(rom_.ReadByteVector(kMockRomData.size() + 1, 1).status(),
111 StatusIs(absl::StatusCode::kOutOfRange));
115 EXPECT_OK(rom_.LoadFromData(kMockRomData,
false));
117 for (
size_t i = 0; i < kMockRomData.size(); ++i) {
121 EXPECT_EQ(
byte, 0xFF);
126 EXPECT_OK(rom_.LoadFromData(kMockRomData,
false));
128 for (
size_t i = 0; i < kMockRomData.size(); i += 2) {
132 EXPECT_EQ(word, 0xFFFF);
137 EXPECT_OK(rom_.LoadFromData(kMockRomData,
false));
139 for (
size_t i = 0; i < kMockRomData.size(); i += 4) {
143 EXPECT_EQ(word, 0xFFFFFF);
151 EXPECT_CALL(mock_rom, WriteHelper(_))
152 .WillRepeatedly(Return(absl::OkStatus()));
157 Rom::WriteAction{0x1002, std::vector<uint8_t>{0x12, 0x34}}));
164 EXPECT_CALL(mock_rom, WriteHelper(_))
165 .WillOnce(Return(absl::OkStatus()))
166 .WillOnce(Return(absl::InternalError(
"Write failed")));
171 absl::InternalError(
"Write failed"));
182 EXPECT_EQ(byte_val, 0x00);
183 EXPECT_EQ(word_val, 0x0201);
192 absl::FailedPreconditionError(
"Offset out of range"));
196#if defined(__linux__)
200 EXPECT_OK(rom_.LoadFromData(kMockRomData,
false));
202 const char* tmp_name =
"test_temp_rom.sfc";
217 EXPECT_EQ(verify.
size(), kMockRomData.size());
219 ASSERT_TRUE(b0.ok());
220 EXPECT_EQ(*b0, 0xEE);
223TEST_F(
RomTest, TransactionRollbackRestoresOriginals) {
224 EXPECT_OK(rom_.LoadFromData(kMockRomData,
false));
230 EXPECT_FALSE(status.ok());
231 auto b1 = rom_.ReadByte(0x01);
232 ASSERT_TRUE(b1.ok());
234 EXPECT_EQ(*b1, kMockRomData[0x01]);
The Rom class is used to load, save, and modify Rom data.
absl::Status LoadFromFile(const std::string &filename, bool z3_load=true)
absl::Status ReadTransaction(T &var, int address, Args &&... args)
absl::Status LoadFromData(const std::vector< uint8_t > &data, bool z3_load=true)
absl::Status WriteTransaction(Args... args)
absl::StatusOr< uint8_t > ReadByte(int offset)
Transaction & WriteWord(int address, uint16_t value)
Transaction & WriteByte(int address, uint8_t value)
Enhanced ROM for testing that behaves like a real ROM but with test data.
TEST_F(DungeonObjectRenderingE2ETests, RunAllTests)
Main namespace for the application.
#define ASSERT_OK_AND_ASSIGN(lhs, rexpr)