// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/camera/calibration/algorithms/blc.h"

#include <array>

#include <gtest/gtest.h>

#include "src/camera/lib/image_writer/raw12_writer.h"

namespace camera {
namespace {

constexpr uint32_t kWidth = 500;
constexpr uint32_t kHeight = 500;
constexpr uint16_t kRedVal = 500;
constexpr uint16_t kGreenVal = 500;
constexpr uint16_t kBlueVal = 500;

TEST(BlcTest, BlcRaw12WorksCorrectly) {
  auto result = Raw12Writer::Create(kWidth, kHeight);
  ASSERT_TRUE(result.is_ok());
  auto image_writer = result.take_value();

  zx::vmo vmo;
  std::vector<uint8_t> buf(kWidth * kHeight * kBytesPerDoublePixel);

  const uint32_t kAvg = kGreenVal / 2;
  // Gb starts one line ahead and so will average out to be one value greater than Gr and B.
  const BlcResult kExpectedResult = {kRedVal, kAvg - 1, kAvg, kAvg - 1};

  zx_status_t status = image_writer->Write(&vmo, kRedVal, kGreenVal, kBlueVal);
  ASSERT_EQ(status, ZX_OK);

  const BlcResult kResult = BlcRaw12(&vmo, kWidth, kHeight, kBytesPerDoublePixel);
  ASSERT_EQ(kExpectedResult, kResult);
}

TEST(BlcTest, BlcRaw12RedAveragesCorrectly) {
  constexpr uint8_t kRedTestVal = 0x80;
  constexpr uint32_t kRedTestWidth = 2;
  constexpr uint32_t kRedTestHeight = 4;
  constexpr size_t kRedTestImageSize = kRedTestWidth * kRedTestHeight * kBytesPerDoublePixel;
  std::array<uint8_t, kRedTestImageSize> kRedTestImage = {
      0x00,        0x00, 0x00, 0x00,        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
      kRedTestVal, 0x00, 0x00, kRedTestVal, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

  zx_status_t status;
  zx::vmo vmo;

  status = zx::vmo::create(kRedTestImageSize, 0, &vmo);
  ASSERT_EQ(status, ZX_OK);
  status = vmo.write(kRedTestImage.data(), 0, kRedTestImageSize);
  ASSERT_EQ(status, ZX_OK);

  // 0x80 must be converted into a double-pixel before averaging; 0x800 in this case.
  const uint16_t kRedAvg = (kRedTestVal << 4) / 2;
  const BlcResult kExpectedResult = {kRedAvg, 0x0, 0x0, 0x0};

  const BlcResult kResult = BlcRaw12(&vmo, kRedTestWidth, kRedTestHeight, kBytesPerDoublePixel);
  ASSERT_EQ(kExpectedResult, kResult);
}

}  // namespace
}  // namespace camera
