/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/common_video/plane.h"

#include <math.h>
#include <string.h>

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

namespace webrtc {

TEST(TestPlane, CreateEmptyPlaneValues) {
  Plane plane;
  int size, stride;
  EXPECT_EQ(0, plane.allocated_size());
  EXPECT_EQ(0, plane.stride());
  EXPECT_TRUE(plane.IsZeroSize());
  size = 0;
  stride = 20;
  EXPECT_EQ(-1, plane.CreateEmptyPlane(size, stride, 1));
  EXPECT_EQ(-1, plane.CreateEmptyPlane(10, stride, size));
  size  = 20;
  stride = 0;
  EXPECT_EQ(-1, plane.CreateEmptyPlane(size, stride, size));
  stride = 20;
  EXPECT_EQ(0, plane.CreateEmptyPlane(size, stride, size));
  EXPECT_EQ(size, plane.allocated_size());
  EXPECT_EQ(stride, plane.stride());
  EXPECT_FALSE(plane.IsZeroSize());
}

TEST(TestPlane, ResetSize) {
  Plane plane;
  EXPECT_TRUE(plane.IsZeroSize());
  int allocated_size, plane_size, stride;
  EXPECT_EQ(0, plane.allocated_size());
  allocated_size = 30;
  plane_size = 20;
  stride = 10;
  EXPECT_EQ(0, plane.CreateEmptyPlane(allocated_size, stride, plane_size));
  EXPECT_EQ(allocated_size, plane.allocated_size());
  EXPECT_FALSE(plane.IsZeroSize());
  plane.ResetSize();
  EXPECT_TRUE(plane.IsZeroSize());
}

TEST(TestPlane, PlaneCopy) {
  Plane plane1, plane2;
  // Copy entire plane.
  plane1.CreateEmptyPlane(100, 10, 100);
  int size1 = plane1.allocated_size();
  int size2 = 30;
  plane2.CreateEmptyPlane(50, 15, size2);
  int stride1 = plane1.stride();
  int stride2 = plane2.stride();
  plane1.Copy(plane2);
  // Smaller size - keep buffer size as is.
  EXPECT_EQ(size1, plane1.allocated_size());
  EXPECT_EQ(stride2, plane1.stride());
  plane2.Copy(plane1);
  // Verify increment of allocated size.
  EXPECT_EQ(plane1.allocated_size(), plane2.allocated_size());
  EXPECT_EQ(stride2, plane2.stride());
  // Copy buffer.
  uint8_t buffer1[100];
  size1 = 80;
  memset(&buffer1, 0, size1);
  plane2.Copy(size1, stride1, buffer1);
  EXPECT_GE(plane2.allocated_size(), size1);
  EXPECT_EQ(0, memcmp(buffer1, plane2.buffer(), size1));
}

TEST(TestPlane, PlaneSwap) {
  Plane plane1, plane2;
  int size1, size2, stride1, stride2;
  plane1.CreateEmptyPlane(100, 10, 100);
  plane2.CreateEmptyPlane(50, 15, 50);
  size1 = plane1.allocated_size();
  stride1 = plane1.stride();
  stride2 = plane2.stride();
  size2 = plane2.allocated_size();
  plane1.Swap(plane2);
  EXPECT_EQ(size1, plane2.allocated_size());
  EXPECT_EQ(size2, plane1.allocated_size());
  EXPECT_EQ(stride2, plane1.stride());
  EXPECT_EQ(stride1, plane2.stride());
}

}  // namespace webrtc
