// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/layout/letterboxed_image.h"

#include "cobalt/base/polymorphic_downcast.h"
#include "cobalt/math/size.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace layout {
namespace {

using math::PointF;
using math::Size;
using math::SizeF;

// When the area of the image is 0, the destination will be fill with the given
// color.
TEST(LetterboxedImageTest, ZeroAreaImage) {
  const SizeF kDestinationSize(300, 200);

  LetterboxDimensions dimensions =
      GetLetterboxDimensions(Size(0, 1), kDestinationSize);
  ASSERT_EQ(1, dimensions.fill_rects.size());
  EXPECT_FALSE(dimensions.image_rect);

  EXPECT_EQ(PointF(0, 0), dimensions.fill_rects[0].origin());
  EXPECT_EQ(kDestinationSize, dimensions.fill_rects[0].size());
}

// When the aspect ratio of the image is the same as the destination, it will be
// stretched to cover the whole destination and no color bands will be drawn.
TEST(LetterboxedImageTest, ImageAtRightAspectRatio) {
  const SizeF kDestinationSize(300, 200);

  for (int i = 0; i < 10; ++i) {
    LetterboxDimensions dimensions = GetLetterboxDimensions(
        Size(3 * (1 << i), 2 * (1 << i)), kDestinationSize);

    EXPECT_TRUE(dimensions.fill_rects.empty());
    ASSERT_TRUE(dimensions.image_rect);

    EXPECT_EQ(PointF(0, 0), dimensions.image_rect->origin());
    EXPECT_EQ(kDestinationSize, dimensions.image_rect->size());
  }
}

// When the aspect ratio of the image is wider than the destination, blanks will
// be added to the top and bottom as extra RectNodes.
TEST(LetterboxedImageTest, WiderImage) {
  const SizeF kDestinationSize(300, 200);

  for (int i = 0; i < 10; ++i) {
    LetterboxDimensions dimensions = GetLetterboxDimensions(
        Size(5 * (1 << i), 3 * (1 << i)), kDestinationSize);

    ASSERT_EQ(2, dimensions.fill_rects.size());
    ASSERT_TRUE(dimensions.image_rect);

    EXPECT_EQ(PointF(0, 10), dimensions.image_rect->origin());
    EXPECT_EQ(kDestinationSize.width(), dimensions.image_rect->width());
    EXPECT_EQ(180, dimensions.image_rect->height());

    EXPECT_EQ(PointF(0, 0), dimensions.fill_rects[0].origin());
    EXPECT_EQ(kDestinationSize.width(), dimensions.fill_rects[0].width());
    EXPECT_EQ(10, dimensions.fill_rects[0].height());

    EXPECT_EQ(PointF(0, 190), dimensions.fill_rects[1].origin());
    EXPECT_EQ(kDestinationSize.width(), dimensions.fill_rects[1].width());
    EXPECT_EQ(10, dimensions.fill_rects[1].height());
  }
}

// When the aspect ratio of the image is higher than the destination, blanks
// will be added to the left and right as extra RectNodes.
TEST(LetterboxedImageTest, HigherImage) {
  const SizeF kDestinationSize(300, 200);

  for (int i = 0; i < 10; ++i) {
    LetterboxDimensions dimensions = GetLetterboxDimensions(
        Size(4 * (1 << i), 5 * (1 << i)), kDestinationSize);

    ASSERT_EQ(2, dimensions.fill_rects.size());
    ASSERT_TRUE(dimensions.image_rect);

    EXPECT_EQ(PointF(70, 0), dimensions.image_rect->origin());
    EXPECT_EQ(160, dimensions.image_rect->width());
    EXPECT_EQ(kDestinationSize.height(), dimensions.image_rect->height());

    EXPECT_EQ(PointF(0, 0), dimensions.fill_rects[0].origin());
    EXPECT_EQ(70, dimensions.fill_rects[0].width());
    EXPECT_EQ(kDestinationSize.height(), dimensions.fill_rects[0].height());

    EXPECT_EQ(PointF(230, 0), dimensions.fill_rects[1].origin());
    EXPECT_EQ(70, dimensions.fill_rects[1].width());
    EXPECT_EQ(kDestinationSize.height(), dimensions.fill_rects[1].height());
  }
}

}  // namespace
}  // namespace layout
}  // namespace cobalt
