yaze 0.2.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
mock_memory.h
Go to the documentation of this file.
1#ifndef YAZE_TEST_MOCK_MOCK_MEMORY_H
2#define YAZE_TEST_MOCK_MOCK_MEMORY_H
3
4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
6
8
9namespace yaze {
10namespace emu {
11
29class MockMemory : public Memory {
30 public:
31 MOCK_CONST_METHOD1(ReadByte, uint8_t(uint32_t address));
32 MOCK_CONST_METHOD1(ReadWord, uint16_t(uint32_t address));
33 MOCK_CONST_METHOD1(ReadWordLong, uint32_t(uint32_t address));
34 MOCK_METHOD(std::vector<uint8_t>, ReadByteVector,
35 (uint32_t address, uint16_t length), (const, override));
36
37 MOCK_METHOD2(WriteByte, void(uint32_t address, uint8_t value));
38 MOCK_METHOD2(WriteWord, void(uint32_t address, uint16_t value));
39 MOCK_METHOD2(WriteLong, void(uint32_t address, uint32_t value));
40
41 MOCK_METHOD1(PushByte, void(uint8_t value));
42 MOCK_METHOD0(PopByte, uint8_t());
43 MOCK_METHOD1(PushWord, void(uint16_t value));
44 MOCK_METHOD0(PopWord, uint16_t());
45 MOCK_METHOD1(PushLong, void(uint32_t value));
46 MOCK_METHOD0(PopLong, uint32_t());
47
48 MOCK_CONST_METHOD0(SP, uint16_t());
49 MOCK_METHOD1(SetSP, void(uint16_t value));
50
51 MOCK_METHOD1(SetMemory, void(const std::vector<uint8_t>& data));
52 MOCK_METHOD1(LoadData, void(const std::vector<uint8_t>& data));
53
55
56 MOCK_CONST_METHOD1(at, uint8_t(int i));
57 uint8_t operator[](int i) const override { return memory_[i]; }
58
65 MOCK_METHOD1(set_pal_timing, void(bool value));
69 MOCK_METHOD1(set_h_pos, void(uint16_t value));
70 MOCK_METHOD1(set_v_pos, void(uint16_t value));
71 MOCK_METHOD1(set_open_bus, void(uint8_t value));
73
74 void SetMemoryContents(const std::vector<uint8_t>& data) {
75 if (data.size() > memory_.size()) {
76 memory_.resize(data.size());
77 }
78 std::copy(data.begin(), data.end(), memory_.begin());
79 }
80
81 void SetMemoryContents(const std::vector<uint16_t>& data) {
82 if (data.size() > memory_.size()) {
83 memory_.resize(data.size());
84 }
85 int i = 0;
86 for (const auto& each : data) {
87 memory_[i] = each & 0xFF;
88 memory_[i + 1] = (each >> 8) & 0xFF;
89 i += 2;
90 }
91 }
92
93 void InsertMemory(const uint64_t address, const std::vector<uint8_t>& data) {
94 if (address > memory_.size()) {
95 memory_.resize(address + data.size());
96 }
97
98 int i = 0;
99 for (const auto& each : data) {
100 memory_[address + i] = each;
101 i++;
102 }
103 }
104
105 // 16MB = 0x1000000
106 // 02MB = 0x200000
107 void Initialize(const std::vector<uint8_t>& romData) {
108 // 16 MB, simplifying the memory layout for testing
109 memory_.resize(0x1000000);
110
111 // Clear memory
112 std::fill(memory_.begin(), memory_.end(), 0);
113
114 // Load ROM data into mock memory
115 size_t romSize = romData.size();
116 size_t romAddress = 0;
117 const size_t ROM_CHUNK_SIZE = 0x8000; // 32 KB
118 for (size_t bank = 0x00; bank <= 0xBF; bank += 0x80) {
119 for (size_t offset = 0x8000; offset <= 0xFFFF; offset += ROM_CHUNK_SIZE) {
120 if (romAddress < romSize) {
121 std::copy(romData.begin() + romAddress,
122 romData.begin() + romAddress + ROM_CHUNK_SIZE,
123 memory_.begin() + (bank << 16) + offset);
124 romAddress += ROM_CHUNK_SIZE;
125 }
126 }
127 }
128 }
129
130 void Init() {
131 ON_CALL(*this, ReadByte(::testing::_))
132 .WillByDefault(
133 [this](uint32_t address) { return memory_.at(address); });
134 ON_CALL(*this, ReadWord(::testing::_))
135 .WillByDefault([this](uint32_t address) {
136 return static_cast<uint16_t>(memory_.at(address)) |
137 (static_cast<uint16_t>(memory_.at(address + 1)) << 8);
138 });
139 ON_CALL(*this, ReadWordLong(::testing::_))
140 .WillByDefault([this](uint32_t address) {
141 return static_cast<uint32_t>(memory_.at(address)) |
142 (static_cast<uint32_t>(memory_.at(address + 1)) << 8) |
143 (static_cast<uint32_t>(memory_.at(address + 2)) << 16);
144 });
145 ON_CALL(*this, ReadByteVector(::testing::_, ::testing::_))
146 .WillByDefault([this](uint32_t address, uint16_t length) {
147 std::vector<uint8_t> data;
148 for (int i = 0; i < length; i++) {
149 data.push_back(memory_.at(address + i));
150 }
151 return data;
152 });
153 ON_CALL(*this, WriteByte(::testing::_, ::testing::_))
154 .WillByDefault([this](uint32_t address, uint8_t value) {
155 memory_[address] = value;
156 });
157 ON_CALL(*this, WriteWord(::testing::_, ::testing::_))
158 .WillByDefault([this](uint32_t address, uint16_t value) {
159 memory_[address] = value & 0xFF;
160 memory_[address + 1] = (value >> 8) & 0xFF;
161 });
162 ON_CALL(*this, PushByte(::testing::_)).WillByDefault([this](uint8_t value) {
163 memory_.at(SP_--) = value;
164 });
165 ON_CALL(*this, PopByte()).WillByDefault([this]() {
166 uint8_t value = memory_.at(SP_);
167 this->SetSP(SP_ + 1);
168 return value;
169 });
170 ON_CALL(*this, PushWord(::testing::_))
171 .WillByDefault([this](uint16_t value) {
172 memory_.at(SP_) = value & 0xFF;
173 memory_.at(SP_ + 1) = (value >> 8) & 0xFF;
174 this->SetSP(SP_ - 2);
175 });
176 ON_CALL(*this, PopWord()).WillByDefault([this]() {
177 uint16_t value = static_cast<uint16_t>(memory_.at(SP_)) |
178 (static_cast<uint16_t>(memory_.at(SP_ + 1)) << 8);
179 this->SetSP(SP_ + 2);
180 return value;
181 });
182 ON_CALL(*this, PushLong(::testing::_))
183 .WillByDefault([this](uint32_t value) {
184 memory_.at(SP_) = value & 0xFF;
185 memory_.at(SP_ + 1) = (value >> 8) & 0xFF;
186 memory_.at(SP_ + 2) = (value >> 16) & 0xFF;
187 });
188 ON_CALL(*this, PopLong()).WillByDefault([this]() {
189 uint32_t value = static_cast<uint32_t>(memory_.at(SP_)) |
190 (static_cast<uint32_t>(memory_.at(SP_ + 1)) << 8) |
191 (static_cast<uint32_t>(memory_.at(SP_ + 2)) << 16);
192 this->SetSP(SP_ + 3);
193 return value;
194 });
195 ON_CALL(*this, SP()).WillByDefault([this]() { return SP_; });
196 ON_CALL(*this, SetSP(::testing::_)).WillByDefault([this](uint16_t value) {
197 SP_ = value;
198 });
199 ON_CALL(*this, ClearMemory()).WillByDefault([this]() {
200 memory_.resize(64000, 0x00);
201 });
202 }
203
204 std::vector<uint8_t> memory_;
205 uint16_t SP_ = 0x01FF;
206};
207
208} // namespace emu
209} // namespace yaze
210
211#endif // YAZE_TEST_MOCK_MOCK_MEMORY_H
Memory interface.
Definition memory.h:64
virtual void PushWord(uint16_t value)=0
virtual void PushLong(uint32_t value)=0
virtual void WriteLong(uint32_t address, uint32_t value)=0
virtual void init_hdma_request()=0
virtual bool hdma_run_requested() const =0
virtual void set_v_pos(uint16_t value)=0
virtual uint16_t PopWord()=0
virtual void WriteWord(uint32_t address, uint16_t value)=0
virtual void ClearMemory()=0
virtual auto pal_timing() const -> bool=0
virtual uint32_t PopLong()=0
virtual uint16_t SP() const =0
virtual auto h_pos() const -> uint16_t=0
virtual auto v_pos() const -> uint16_t=0
virtual void PushByte(uint8_t value)=0
virtual void set_hdma_run_requested(bool value)=0
virtual uint32_t ReadWordLong(uint32_t address) const =0
virtual uint8_t ReadByte(uint32_t address) const =0
virtual void WriteByte(uint32_t address, uint8_t value)=0
virtual void run_hdma_request()=0
virtual bool hdma_init_requested() const =0
virtual uint8_t open_bus() const =0
virtual uint8_t PopByte()=0
virtual void set_hdma_init_requested(bool value)=0
virtual std::vector< uint8_t > ReadByteVector(uint32_t address, uint16_t length) const =0
virtual void set_h_pos(uint16_t value)=0
virtual void SetSP(uint16_t value)=0
virtual void set_pal_timing(bool value)=0
virtual uint16_t ReadWord(uint32_t address) const =0
virtual uint8_t at(int i) const =0
virtual void set_open_bus(uint8_t value)=0
A mock implementation of the Memory class.
Definition mock_memory.h:29
MOCK_METHOD0(ClearMemory, void())
void SetMemoryContents(const std::vector< uint8_t > &data)
Definition mock_memory.h:74
MOCK_CONST_METHOD0(pal_timing, bool())
MOCK_METHOD0(PopByte, uint8_t())
MOCK_METHOD1(PushLong, void(uint32_t value))
MOCK_CONST_METHOD0(hdma_run_requested, bool())
MOCK_METHOD2(WriteLong, void(uint32_t address, uint32_t value))
uint8_t operator[](int i) const override
Definition mock_memory.h:57
MOCK_METHOD1(set_hdma_run_requested, void(bool value))
MOCK_CONST_METHOD1(ReadWordLong, uint32_t(uint32_t address))
MOCK_CONST_METHOD0(SP, uint16_t())
MOCK_METHOD1(LoadData, void(const std::vector< uint8_t > &data))
MOCK_METHOD(std::vector< uint8_t >, ReadByteVector,(uint32_t address, uint16_t length),(const, override))
void SetMemoryContents(const std::vector< uint16_t > &data)
Definition mock_memory.h:81
std::vector< uint8_t > memory_
void InsertMemory(const uint64_t address, const std::vector< uint8_t > &data)
Definition mock_memory.h:93
MOCK_METHOD1(set_open_bus, void(uint8_t value))
MOCK_METHOD2(WriteByte, void(uint32_t address, uint8_t value))
MOCK_METHOD1(PushWord, void(uint16_t value))
MOCK_METHOD1(set_h_pos, void(uint16_t value))
MOCK_METHOD0(init_hdma_request, void())
MOCK_CONST_METHOD0(hdma_init_requested, bool())
MOCK_METHOD0(PopWord, uint16_t())
MOCK_METHOD2(WriteWord, void(uint32_t address, uint16_t value))
MOCK_METHOD0(PopLong, uint32_t())
MOCK_METHOD1(SetMemory, void(const std::vector< uint8_t > &data))
MOCK_METHOD1(PushByte, void(uint8_t value))
MOCK_METHOD0(run_hdma_request, void())
MOCK_CONST_METHOD0(v_pos, uint16_t())
MOCK_CONST_METHOD1(at, uint8_t(int i))
MOCK_METHOD1(SetSP, void(uint16_t value))
void Initialize(const std::vector< uint8_t > &romData)
MOCK_METHOD1(set_v_pos, void(uint16_t value))
MOCK_CONST_METHOD1(ReadByte, uint8_t(uint32_t address))
MOCK_CONST_METHOD1(ReadWord, uint16_t(uint32_t address))
MOCK_CONST_METHOD0(h_pos, uint16_t())
MOCK_METHOD1(set_pal_timing, void(bool value))
MOCK_METHOD1(set_hdma_init_requested, void(bool value))
MOCK_CONST_METHOD0(open_bus, uint8_t())
SNES Emulation and debugging tools.
Definition apu.cc:13
Main namespace for the application.
Definition controller.cc:18