From 6c259340f9d40ce33ce5ec0aa18a01006f0d685b Mon Sep 17 00:00:00 2001 From: scawful Date: Wed, 14 Aug 2024 00:51:43 -0400 Subject: [PATCH] Add new RomTests and fix small bugs in Rom class --- src/app/rom.cc | 4 ++-- src/app/rom.h | 8 ++++---- src/test/rom_test.cc | 47 +++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/src/app/rom.cc b/src/app/rom.cc index c426de7e..d9df5317 100644 --- a/src/app/rom.cc +++ b/src/app/rom.cc @@ -143,7 +143,7 @@ absl::Status Rom::LoadAllGraphicsData() { absl::Status Rom::LoadFromFile(const std::string& filename, bool z3_load) { std::string full_filename = std::filesystem::absolute(filename).string(); - if (full_filename.empty()) { + if (filename.empty()) { return absl::InvalidArgumentError( "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 std::ifstream file(filename_, std::ios::binary); if (!file.is_open()) { - return absl::InternalError( + return absl::NotFoundError( absl::StrCat("Could not open ROM file: ", filename_)); } diff --git a/src/app/rom.h b/src/app/rom.h index 98a10e0b..3a3aad63 100644 --- a/src/app/rom.h +++ b/src/app/rom.h @@ -209,14 +209,14 @@ class Rom : public core::ExperimentFlags { // Read functions absl::StatusOr ReadByte(int offset) { if (offset >= rom_data_.size()) { - return absl::InvalidArgumentError("Offset out of range"); + return absl::FailedPreconditionError("Offset out of range"); } return rom_data_[offset]; } absl::StatusOr ReadWord(int offset) { 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)); return result; @@ -228,7 +228,7 @@ class Rom : public core::ExperimentFlags { absl::StatusOr ReadLong(int offset) { 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) | (rom_data_[offset + 2] << 16)); @@ -238,7 +238,7 @@ class Rom : public core::ExperimentFlags { absl::StatusOr> ReadByteVector(uint32_t offset, uint32_t length) { 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 result; for (int i = offset; i < offset + length; i++) { diff --git a/src/test/rom_test.cc b/src/test/rom_test.cc index 33baced3..c46e851b 100644 --- a/src/test/rom_test.cc +++ b/src/test/rom_test.cc @@ -9,14 +9,19 @@ namespace yaze { namespace test { -using yaze::app::Rom; + +const static std::vector 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 { protected: - Rom rom_; + app::Rom rom_; }; -TEST_F(RomTest, RomTest) { +TEST_F(RomTest, Uninitialized) { EXPECT_EQ(rom_.size(), 0); EXPECT_EQ(rom_.data(), nullptr); } @@ -34,5 +39,41 @@ TEST_F(RomTest, LoadFromFileInvalid) { 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((kMockRomData[i]) | kMockRomData[i + 1] << 8)); + } +} + +TEST_F(RomTest, ReadWordInvalid) { + EXPECT_THAT(rom_.ReadWord(0).status(), + StatusIs(absl::StatusCode::kFailedPrecondition)); +} + } // namespace test } // namespace yaze \ No newline at end of file