Add out of range error in Rom class write functions, test Write fns
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user