/*
 * Copyright 2015 Google Inc. 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
