#include "../isp-mem-array.h"

#include <mock-mmio-reg/mock-mmio-reg.h>
#include <zxtest/zxtest.h>

namespace camera {
namespace {

constexpr uint32_t kArraySize = 16;

class IspMemArrayTest : public zxtest::Test {
 public:
  void SetUp() override;

  void TearDown() override;

  void SetExpectations();

 protected:
  std::unique_ptr<ddk_mock::MockMmioRegRegion> mock_registers_;
  std::unique_ptr<ddk::MmioView> local_mmio_;
  std::vector<uint32_t> expectations_;
};

void IspMemArrayTest::SetUp() { expectations_.reserve(kArraySize); }

void IspMemArrayTest::TearDown() { expectations_.clear(); }

void IspMemArrayTest::SetExpectations() {
  for (uint32_t i = 0; i < kArraySize; ++i) {
    (*mock_registers_.get())[i << 2].ExpectWrite(expectations_[i]);
  }
}

TEST_F(IspMemArrayTest, IspMemArray32) {
  auto reg_array = std::make_unique<ddk_mock::MockMmioReg[]>(kArraySize);
  mock_registers_ =
      std::make_unique<ddk_mock::MockMmioRegRegion>(reg_array.get(), sizeof(uint32_t), kArraySize);
  local_mmio_ = std::make_unique<ddk::MmioView>(mock_registers_->GetMmioBuffer().View(0));
  std::shared_ptr<IspMemArray32> mem_array =
      std::make_shared<IspMemArray32>(*local_mmio_.get(), 0x00, kArraySize);
  for (uint32_t i = 0; i < kArraySize; ++i) {
    (*mem_array.get())[i] = i;
    expectations_.push_back(i);
  }
  SetExpectations();
  mem_array->WriteRegisters();
  std::shared_ptr<const IspMemArray32> const_mem_array =
      std::const_pointer_cast<const IspMemArray32>(mem_array);
  for (uint32_t i = 0; i < kArraySize; ++i) {
    (*mem_array.get())[i] = 2 + i;
    expectations_[i] = 2 + i;
    EXPECT_NE((*mem_array.get())[i], (*const_mem_array.get())[i]);
  }
  SetExpectations();
  mem_array->WriteRegisters();
  for (uint32_t i = 0; i < kArraySize; ++i) {
    EXPECT_EQ((*mem_array.get())[i], (*const_mem_array.get())[i]);
  }
}

}  // namespace
}  // namespace camera
