// Copyright 2016 The Chromium OS 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 <algorithm>

#include "camera3_test/camera3_stream_fixture.h"

namespace camera3_test {

void Camera3StreamFixture::SetUp() {
  Camera3DeviceFixture::SetUp();

  std::vector<ResolutionInfo> resolutions =
      cam_device_.GetStaticInfo()->GetSortedOutputResolutions(
          HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED);
  ASSERT_TRUE(!resolutions.empty())
      << "Failed to find resolutions for implementation defined format";

  default_width_ = resolutions[0].Width();
  default_height_ = resolutions[0].Height();
}

void Camera3StreamFixture::TearDown() {
  Camera3DeviceFixture::TearDown();
}

int32_t Camera3StreamFixture::GetMinResolution(int32_t format,
                                               ResolutionInfo* resolution,
                                               bool is_output) {
  if (!resolution) {
    return -EINVAL;
  }

  std::vector<ResolutionInfo> resolutions =
      cam_device_.GetStaticInfo()->GetSortedResolutions(format, is_output);
  if (resolutions.empty()) {
    return -EIO;
  }

  ResolutionInfo min_resolution(resolutions[0]);
  for (auto& it : resolutions) {
    if (it.Area() < min_resolution.Area()) {
      min_resolution = it;
    }
  }
  *resolution = min_resolution;
  return 0;
}

int32_t Camera3StreamFixture::GetMaxResolution(int32_t format,
                                               ResolutionInfo* resolution,
                                               bool is_output) {
  if (!resolution) {
    return -EINVAL;
  }

  std::vector<ResolutionInfo> resolutions =
      cam_device_.GetStaticInfo()->GetSortedResolutions(format, is_output);
  if (resolutions.empty()) {
    return -EIO;
  }

  ResolutionInfo max_resolution(resolutions[0]);
  for (auto& it : resolutions) {
    if (it.Area() > max_resolution.Area()) {
      max_resolution = it;
    }
  }
  *resolution = max_resolution;
  return 0;
}

ResolutionInfo Camera3StreamFixture::CapResolution(ResolutionInfo input,
                                                   ResolutionInfo limit) const {
  if (input.Area() > limit.Area()) {
    return limit;
  }
  return input;
}

// Test spec:
// - Camera ID
// - Output stream format
class Camera3SingleStreamTest
    : public Camera3StreamFixture,
      public ::testing::WithParamInterface<std::tuple<int32_t, int32_t>> {
 public:
  Camera3SingleStreamTest() : Camera3StreamFixture(std::get<0>(GetParam())) {}
};

TEST_P(Camera3SingleStreamTest, CreateStream) {
  int32_t format = std::get<1>(GetParam());

  cam_device_.AddOutputStream(format, default_width_, default_height_,
                              CAMERA3_STREAM_ROTATION_0);
  if (cam_device_.GetStaticInfo()->IsFormatAvailable(format)) {
    ASSERT_EQ(0, cam_device_.ConfigureStreams(nullptr))
        << "Configuring stream of supported format fails";
  } else {
    ASSERT_NE(0, cam_device_.ConfigureStreams(nullptr))
        << "Configuring stream of unsupported format succeeds";
  }
}

TEST_P(Camera3SingleStreamTest, BadResolution) {
  int32_t format = std::get<1>(GetParam());

  if (cam_device_.GetStaticInfo()->IsFormatAvailable(format)) {
    int32_t bad_width = default_width_ + 1;
    std::vector<ResolutionInfo> available_resolutions =
        cam_device_.GetStaticInfo()->GetSortedOutputResolutions(format);
    while (std::find(available_resolutions.begin(), available_resolutions.end(),
                     ResolutionInfo(bad_width, default_height_)) !=
           available_resolutions.end()) {
      bad_width++;
    }
    cam_device_.AddOutputStream(format, bad_width, default_height_,
                                CAMERA3_STREAM_ROTATION_0);
    ASSERT_NE(0, cam_device_.ConfigureStreams(nullptr))
        << "Configuring stream of bad resolution succeeds";
  }
}

// Test spec:
// - Camera ID
class Camera3MultiStreamTest : public Camera3StreamFixture,
                               public ::testing::WithParamInterface<int32_t> {
 public:
  Camera3MultiStreamTest() : Camera3StreamFixture(GetParam()) {}
};

TEST_P(Camera3MultiStreamTest, CreateStream) {
  // Preview stream with large size no bigger than 1080p
  ResolutionInfo limit_resolution(1920, 1080);
  ResolutionInfo preview_resolution(0, 0);
  ASSERT_EQ(0, GetMaxResolution(HAL_PIXEL_FORMAT_YCbCr_420_888,
                                &preview_resolution, true))
      << "Failed to get max resolution for implementation defined format";
  preview_resolution = CapResolution(preview_resolution, limit_resolution);
  cam_device_.AddOutputStream(
      HAL_PIXEL_FORMAT_YCbCr_420_888, preview_resolution.Width(),
      preview_resolution.Height(), CAMERA3_STREAM_ROTATION_0);

  // Second preview stream
  cam_device_.AddOutputStream(
      HAL_PIXEL_FORMAT_YCbCr_420_888, preview_resolution.Width(),
      preview_resolution.Height(), CAMERA3_STREAM_ROTATION_0);

  // Capture stream with largest size
  ResolutionInfo capture_resolution(0, 0);
  ASSERT_EQ(0,
            GetMaxResolution(HAL_PIXEL_FORMAT_BLOB, &capture_resolution, true))
      << "Failed to get max resolution for YCbCr 420 format";
  cam_device_.AddOutputStream(HAL_PIXEL_FORMAT_BLOB, capture_resolution.Width(),
                              capture_resolution.Height(),
                              CAMERA3_STREAM_ROTATION_0);

  ASSERT_EQ(0, cam_device_.ConfigureStreams(nullptr))
      << "Configuring stream fails";
}

TEST_P(Camera3MultiStreamTest, DifferentRotation) {
  // Preview stream with large size no bigger than 1080p
  ResolutionInfo limit_resolution(1920, 1080);
  ResolutionInfo preview_resolution(0, 0);
  ASSERT_EQ(0, GetMaxResolution(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
                                &preview_resolution, true))
      << "Failed to get max resolution for implementation defined format";
  preview_resolution = CapResolution(preview_resolution, limit_resolution);
  cam_device_.AddOutputStream(
      HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, preview_resolution.Width(),
      preview_resolution.Height(), CAMERA3_STREAM_ROTATION_0);

  // Capture stream with largest size
  ResolutionInfo capture_resolution(0, 0);
  ASSERT_EQ(0, GetMaxResolution(HAL_PIXEL_FORMAT_YCbCr_420_888,
                                &capture_resolution, true))
      << "Failed to get max resolution for YCbCr 420 format";
  cam_device_.AddOutputStream(
      HAL_PIXEL_FORMAT_YCbCr_420_888, capture_resolution.Width(),
      capture_resolution.Height(), CAMERA3_STREAM_ROTATION_90);

  ASSERT_NE(0, cam_device_.ConfigureStreams(nullptr))
      << "Configuring streams of different rotation should not succeed";
}

// Test spec:
// - Camera ID
// - Output stream format
// - Rotation degrees
class Camera3StreamInvalidRotationTest
    : public Camera3StreamFixture,
      public ::testing::WithParamInterface<
          std::tuple<int32_t, int32_t, int32_t>> {
 public:
  Camera3StreamInvalidRotationTest()
      : Camera3StreamFixture(std::get<0>(GetParam())) {}
};

TEST_P(Camera3StreamInvalidRotationTest, CreateStream) {
  int32_t format = std::get<1>(GetParam());
  int32_t crop_rotate_scale_degrees = std::get<2>(GetParam());

  cam_device_.AddOutputStreamWithRawDegrees(
      format, default_width_, default_height_, crop_rotate_scale_degrees);
  ASSERT_NE(0, cam_device_.ConfigureStreams(nullptr))
      << "Configuring stream of invalid rotation should not succeed";
}

INSTANTIATE_TEST_SUITE_P(
    Camera3StreamTest,
    Camera3SingleStreamTest,
    ::testing::Combine(
        ::testing::ValuesIn(Camera3Module().GetTestCameraIds()),
        ::testing::Values(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
                          HAL_PIXEL_FORMAT_YCbCr_420_888,
                          HAL_PIXEL_FORMAT_YCrCb_420_SP,
                          HAL_PIXEL_FORMAT_BLOB,
                          HAL_PIXEL_FORMAT_YV12,
                          HAL_PIXEL_FORMAT_Y8,
                          HAL_PIXEL_FORMAT_Y16,
                          HAL_PIXEL_FORMAT_RAW16)));

INSTANTIATE_TEST_SUITE_P(
    Camera3StreamTest,
    Camera3MultiStreamTest,
    ::testing::ValuesIn(Camera3Module().GetTestCameraIds()));

INSTANTIATE_TEST_SUITE_P(
    Camera3StreamTest,
    Camera3StreamInvalidRotationTest,
    ::testing::Combine(
        ::testing::ValuesIn(Camera3Module().GetTestCameraIds()),
        ::testing::Values(HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED,
                          HAL_PIXEL_FORMAT_YCbCr_420_888,
                          HAL_PIXEL_FORMAT_YCrCb_420_SP,
                          HAL_PIXEL_FORMAT_BLOB,
                          HAL_PIXEL_FORMAT_YV12,
                          HAL_PIXEL_FORMAT_Y8,
                          HAL_PIXEL_FORMAT_Y16,
                          HAL_PIXEL_FORMAT_RAW16),
        ::testing::Values(CAMERA3_STREAM_ROTATION_180, 90, 180, 270)));

}  // namespace camera3_test
