diff --git a/src/app/rom.h b/src/app/rom.h index 2f903eb2..aa9c1608 100644 --- a/src/app/rom.h +++ b/src/app/rom.h @@ -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)); } diff --git a/src/test/rom_test.cc b/src/test/rom_test.cc index 3562b0cc..7162af3b 100644 --- a/src/test/rom_test.cc +++ b/src/test/rom_test.cc @@ -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 \ No newline at end of file