Воспользовался комбинацией из
.InSequence
и
.After
+ добавил
.Times(0)
для особого случая
TEST_F(RV32I_Handler_System, CSR_RS)
{
auto impl = create<csrrs>();
constexpr Code funcA = 0b0010;
ASSERT_TRUE(impl->getId().equal(expectedId(funcA)));
for (register_no src = 0; src < vm::register_count; ++src) {
vm::register_t csr_id = 0;
vm::register_t csr_val = 0;
vm::register_t src_val = 0;
register_no dst = RegAlias::t0;
auto code = encode(funcA, dst, src, csr_id);
MockVM mockVm;
Sequence csr_get, csr_set;
Expectation was_read = EXPECT_CALL(mockVm, control_get(csr_id, _))
.InSequence(csr_get);
EXPECT_CALL(mockVm, set_register(dst, _))
.InSequence(csr_get);
if (src == 0)
{
EXPECT_CALL(mockVm, control_set(_, _))
.Times(0);
}
else
{
EXPECT_CALL(mockVm, get_register(src))
.InSequence(csr_set)
.WillOnce(Return(0));
EXPECT_CALL(mockVm, control_set(csr_id, _))
.InSequence(csr_set)
.After(was_read);
}
impl->exec(&mockVm, &code);
}
}