Add out of range error in Rom class write functions, test Write fns

This commit is contained in:
scawful
2024-08-14 01:04:50 -04:00
parent f7a3d6cb8b
commit 6b35fcb07e
2 changed files with 68 additions and 4 deletions

View File

@@ -301,8 +301,9 @@ class Rom : public core::ExperimentFlags {
}
absl::Status WriteByte(int addr, uint8_t value) {
RETURN_IF_ERROR(ReadWritePreconditions());
if (addr >= rom_data_.size()) {
return absl::InvalidArgumentError(absl::StrFormat(
return absl::OutOfRangeError(absl::StrFormat(
"Attempt to write byte %#02x value failed, address %d out of range",
value, addr));
}
@@ -314,8 +315,9 @@ class Rom : public core::ExperimentFlags {
}
absl::Status WriteWord(int addr, uint16_t value) {
RETURN_IF_ERROR(ReadWritePreconditions());
if (addr + 1 >= rom_data_.size()) {
return absl::InvalidArgumentError(absl::StrFormat(
return absl::OutOfRangeError(absl::StrFormat(
"Attempt to write word %#04x value failed, address %d out of range",
value, addr));
}
@@ -327,8 +329,9 @@ class Rom : public core::ExperimentFlags {
}
absl::Status WriteShort(int addr, uint16_t value) {
RETURN_IF_ERROR(ReadWritePreconditions());
if (addr + 1 >= rom_data_.size()) {
return absl::InvalidArgumentError(absl::StrFormat(
return absl::OutOfRangeError(absl::StrFormat(
"Attempt to write short %#04x value failed, address %d out of range",
value, addr));
}
@@ -340,8 +343,9 @@ class Rom : public core::ExperimentFlags {
}
absl::Status WriteLong(uint32_t addr, uint32_t value) {
RETURN_IF_ERROR(ReadWritePreconditions());
if (addr + 2 >= rom_data_.size()) {
return absl::InvalidArgumentError(absl::StrFormat(
return absl::OutOfRangeError(absl::StrFormat(
"Attempt to write long %#06x value failed, address %d out of range",
value, addr));
}

View File

@@ -113,5 +113,65 @@ TEST_F(RomTest, ReadBytesOutOfRange) {
StatusIs(absl::StatusCode::kOutOfRange));
}
TEST_F(RomTest, WriteByteOk) {
EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
for (size_t i = 0; i < kMockRomData.size(); ++i) {
EXPECT_OK(rom_.WriteByte(i, 0xFF));
uint8_t byte;
ASSERT_OK_AND_ASSIGN(byte, rom_.ReadByte(i));
EXPECT_EQ(byte, 0xFF);
}
}
TEST_F(RomTest, WriteByteInvalid) {
EXPECT_THAT(rom_.WriteByte(0, 0xFF),
StatusIs(absl::StatusCode::kFailedPrecondition));
EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
EXPECT_THAT(rom_.WriteByte(kMockRomData.size(), 0xFF),
StatusIs(absl::StatusCode::kOutOfRange));
}
TEST_F(RomTest, WriteWordOk) {
EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
for (size_t i = 0; i < kMockRomData.size(); i += 2) {
EXPECT_OK(rom_.WriteWord(i, 0xFFFF));
uint16_t word;
ASSERT_OK_AND_ASSIGN(word, rom_.ReadWord(i));
EXPECT_EQ(word, 0xFFFF);
}
}
TEST_F(RomTest, WriteWordInvalid) {
EXPECT_THAT(rom_.WriteWord(0, 0xFFFF),
StatusIs(absl::StatusCode::kFailedPrecondition));
EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
EXPECT_THAT(rom_.WriteWord(kMockRomData.size(), 0xFFFF),
StatusIs(absl::StatusCode::kOutOfRange));
}
TEST_F(RomTest, WriteLongOk) {
EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
for (size_t i = 0; i < kMockRomData.size(); i += 4) {
EXPECT_OK(rom_.WriteLong(i, 0xFFFFFF));
uint32_t word;
ASSERT_OK_AND_ASSIGN(word, rom_.ReadLong(i));
EXPECT_EQ(word, 0xFFFFFF);
}
}
TEST_F(RomTest, WriteLongInvalid) {
EXPECT_THAT(rom_.WriteLong(0, 0xFFFFFF),
StatusIs(absl::StatusCode::kFailedPrecondition));
EXPECT_OK(rom_.LoadFromBytes(kMockRomData));
EXPECT_THAT(rom_.WriteLong(kMockRomData.size(), 0xFFFFFFFF),
StatusIs(absl::StatusCode::kOutOfRange));
}
} // namespace test
} // namespace yaze