Add new RomTests and fix small bugs in Rom class
This commit is contained in:
@@ -143,7 +143,7 @@ absl::Status Rom::LoadAllGraphicsData() {
|
|||||||
|
|
||||||
absl::Status Rom::LoadFromFile(const std::string& filename, bool z3_load) {
|
absl::Status Rom::LoadFromFile(const std::string& filename, bool z3_load) {
|
||||||
std::string full_filename = std::filesystem::absolute(filename).string();
|
std::string full_filename = std::filesystem::absolute(filename).string();
|
||||||
if (full_filename.empty()) {
|
if (filename.empty()) {
|
||||||
return absl::InvalidArgumentError(
|
return absl::InvalidArgumentError(
|
||||||
"Could not load ROM: parameter `filename` is empty.");
|
"Could not load ROM: parameter `filename` is empty.");
|
||||||
}
|
}
|
||||||
@@ -153,7 +153,7 @@ absl::Status Rom::LoadFromFile(const std::string& filename, bool z3_load) {
|
|||||||
// Open file
|
// Open file
|
||||||
std::ifstream file(filename_, std::ios::binary);
|
std::ifstream file(filename_, std::ios::binary);
|
||||||
if (!file.is_open()) {
|
if (!file.is_open()) {
|
||||||
return absl::InternalError(
|
return absl::NotFoundError(
|
||||||
absl::StrCat("Could not open ROM file: ", filename_));
|
absl::StrCat("Could not open ROM file: ", filename_));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -209,14 +209,14 @@ class Rom : public core::ExperimentFlags {
|
|||||||
// Read functions
|
// Read functions
|
||||||
absl::StatusOr<uint8_t> ReadByte(int offset) {
|
absl::StatusOr<uint8_t> ReadByte(int offset) {
|
||||||
if (offset >= rom_data_.size()) {
|
if (offset >= rom_data_.size()) {
|
||||||
return absl::InvalidArgumentError("Offset out of range");
|
return absl::FailedPreconditionError("Offset out of range");
|
||||||
}
|
}
|
||||||
return rom_data_[offset];
|
return rom_data_[offset];
|
||||||
}
|
}
|
||||||
|
|
||||||
absl::StatusOr<uint16_t> ReadWord(int offset) {
|
absl::StatusOr<uint16_t> ReadWord(int offset) {
|
||||||
if (offset + 1 >= rom_data_.size()) {
|
if (offset + 1 >= rom_data_.size()) {
|
||||||
return absl::InvalidArgumentError("Offset out of range");
|
return absl::FailedPreconditionError("Offset out of range");
|
||||||
}
|
}
|
||||||
auto result = (uint16_t)(rom_data_[offset] | (rom_data_[offset + 1] << 8));
|
auto result = (uint16_t)(rom_data_[offset] | (rom_data_[offset + 1] << 8));
|
||||||
return result;
|
return result;
|
||||||
@@ -228,7 +228,7 @@ class Rom : public core::ExperimentFlags {
|
|||||||
|
|
||||||
absl::StatusOr<uint32_t> ReadLong(int offset) {
|
absl::StatusOr<uint32_t> ReadLong(int offset) {
|
||||||
if (offset + 2 >= rom_data_.size()) {
|
if (offset + 2 >= rom_data_.size()) {
|
||||||
return absl::InvalidArgumentError("Offset out of range");
|
return absl::FailedPreconditionError("Offset out of range");
|
||||||
}
|
}
|
||||||
auto result = (uint32_t)(rom_data_[offset] | (rom_data_[offset + 1] << 8) |
|
auto result = (uint32_t)(rom_data_[offset] | (rom_data_[offset + 1] << 8) |
|
||||||
(rom_data_[offset + 2] << 16));
|
(rom_data_[offset + 2] << 16));
|
||||||
@@ -238,7 +238,7 @@ class Rom : public core::ExperimentFlags {
|
|||||||
absl::StatusOr<std::vector<uint8_t>> ReadByteVector(uint32_t offset,
|
absl::StatusOr<std::vector<uint8_t>> ReadByteVector(uint32_t offset,
|
||||||
uint32_t length) {
|
uint32_t length) {
|
||||||
if (offset + length > rom_data_.size()) {
|
if (offset + length > rom_data_.size()) {
|
||||||
return absl::InvalidArgumentError("Offset and length out of range");
|
return absl::FailedPreconditionError("Offset and length out of range");
|
||||||
}
|
}
|
||||||
std::vector<uint8_t> result;
|
std::vector<uint8_t> result;
|
||||||
for (int i = offset; i < offset + length; i++) {
|
for (int i = offset; i < offset + length; i++) {
|
||||||
|
|||||||
@@ -9,14 +9,19 @@
|
|||||||
|
|
||||||
namespace yaze {
|
namespace yaze {
|
||||||
namespace test {
|
namespace test {
|
||||||
using yaze::app::Rom;
|
|
||||||
|
const static std::vector<uint8_t> kMockRomData = {
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
|
||||||
|
0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
|
||||||
|
0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
|
||||||
|
};
|
||||||
|
|
||||||
class RomTest : public ::testing::Test {
|
class RomTest : public ::testing::Test {
|
||||||
protected:
|
protected:
|
||||||
Rom rom_;
|
app::Rom rom_;
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST_F(RomTest, RomTest) {
|
TEST_F(RomTest, Uninitialized) {
|
||||||
EXPECT_EQ(rom_.size(), 0);
|
EXPECT_EQ(rom_.size(), 0);
|
||||||
EXPECT_EQ(rom_.data(), nullptr);
|
EXPECT_EQ(rom_.data(), nullptr);
|
||||||
}
|
}
|
||||||
@@ -34,5 +39,41 @@ TEST_F(RomTest, LoadFromFileInvalid) {
|
|||||||
EXPECT_EQ(rom_.data(), nullptr);
|
EXPECT_EQ(rom_.data(), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(RomTest, LoadFromFileEmpty) {
|
||||||
|
EXPECT_THAT(rom_.LoadFromFile(""),
|
||||||
|
StatusIs(absl::StatusCode::kInvalidArgument));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RomTest, ReadByteOk) {
|
||||||
|
EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
|
||||||
|
|
||||||
|
for (size_t i = 0; i < kMockRomData.size(); ++i) {
|
||||||
|
uint8_t byte;
|
||||||
|
ASSERT_OK_AND_ASSIGN(byte, rom_.ReadByte(i));
|
||||||
|
EXPECT_EQ(byte, kMockRomData[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RomTest, ReadByteInvalid) {
|
||||||
|
EXPECT_THAT(rom_.ReadByte(0).status(),
|
||||||
|
StatusIs(absl::StatusCode::kFailedPrecondition));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RomTest, ReadWordOk) {
|
||||||
|
EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
|
||||||
|
|
||||||
|
for (size_t i = 0; i < kMockRomData.size(); i += 2) {
|
||||||
|
// Little endian
|
||||||
|
EXPECT_THAT(
|
||||||
|
rom_.ReadWord(i),
|
||||||
|
IsOkAndHolds<uint16_t>((kMockRomData[i]) | kMockRomData[i + 1] << 8));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RomTest, ReadWordInvalid) {
|
||||||
|
EXPECT_THAT(rom_.ReadWord(0).status(),
|
||||||
|
StatusIs(absl::StatusCode::kFailedPrecondition));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace test
|
} // namespace test
|
||||||
} // namespace yaze
|
} // namespace yaze
|
||||||
Reference in New Issue
Block a user