// 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
