Add CroppedDesktopFrameTest

CroppedDesktopFrame was broken by recent changes unexpectedly, it should be
covered by test cases to avoid this kind of accident.

Bug: chromium:761703
Change-Id: Ib95e4fe19a8bb9799db24fefd3ad154ddd15e53e
Reviewed-on: https://chromium-review.googlesource.com/651448
Commit-Queue: Zijie He <zijiehe@chromium.org>
Reviewed-by: Jamie Walch <jamiewalch@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#19725}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: 05ec178808fc8b0da4511cfaac1f734304fd48eb
diff --git a/modules/desktop_capture/BUILD.gn b/modules/desktop_capture/BUILD.gn
index 2e6b168..75311bd 100644
--- a/modules/desktop_capture/BUILD.gn
+++ b/modules/desktop_capture/BUILD.gn
@@ -74,6 +74,7 @@
     }
     sources = [
       "blank_detector_desktop_capturer_wrapper_unittest.cc",
+      "cropped_desktop_frame_unittest.cc",
       "desktop_and_cursor_composer_unittest.cc",
       "desktop_capturer_differ_wrapper_unittest.cc",
       "desktop_frame_rotation_unittest.cc",
diff --git a/modules/desktop_capture/cropped_desktop_frame_unittest.cc b/modules/desktop_capture/cropped_desktop_frame_unittest.cc
new file mode 100644
index 0000000..36c51d7
--- /dev/null
+++ b/modules/desktop_capture/cropped_desktop_frame_unittest.cc
@@ -0,0 +1,66 @@
+/*
+ *  Copyright (c) 2017 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 <memory>
+#include <utility>
+
+#include "webrtc/modules/desktop_capture/cropped_desktop_frame.h"
+#include "webrtc/modules/desktop_capture/desktop_frame.h"
+#include "webrtc/rtc_base/ptr_util.h"
+#include "webrtc/test/gtest.h"
+
+namespace webrtc {
+
+std::unique_ptr<DesktopFrame> CreateTestFrame() {
+  return rtc::MakeUnique<BasicDesktopFrame>(DesktopSize(10, 20));
+}
+
+TEST(CroppedDesktopFrameTest, DoNotCreateWrapperIfSizeIsNotChanged) {
+  std::unique_ptr<DesktopFrame> original = CreateTestFrame();
+  // owned by |original| and CroppedDesktopFrame.
+  DesktopFrame* raw_original = original.get();
+  std::unique_ptr<DesktopFrame> cropped = CreateCroppedDesktopFrame(
+      std::move(original), DesktopRect::MakeWH(10, 20));
+  ASSERT_EQ(cropped.get(), raw_original);
+}
+
+TEST(CroppedDesktopFrameTest, ReturnNullptrIfSizeIsNotSufficient) {
+  ASSERT_EQ(nullptr, CreateCroppedDesktopFrame(
+      CreateTestFrame(), DesktopRect::MakeWH(11, 10)));
+}
+
+TEST(CroppedDesktopFrameTest, ReturnNullIfCropRegionIsOutOfBounds) {
+  std::unique_ptr<DesktopFrame> frame = CreateTestFrame();
+  frame->set_top_left(DesktopVector(100, 200));
+  ASSERT_EQ(nullptr, CreateCroppedDesktopFrame(std::move(frame),
+      DesktopRect::MakeLTRB(101, 203, 109, 218)));
+}
+
+TEST(CroppedDesktopFrameTest, CropASubArea) {
+  std::unique_ptr<DesktopFrame> cropped = CreateCroppedDesktopFrame(
+      CreateTestFrame(), DesktopRect::MakeLTRB(1, 2, 9, 19));
+  ASSERT_EQ(cropped->size().width(), 8);
+  ASSERT_EQ(cropped->size().height(), 17);
+  ASSERT_EQ(cropped->top_left().x(), 1);
+  ASSERT_EQ(cropped->top_left().y(), 2);
+}
+
+TEST(CroppedDesktopFrameTest, SetTopLeft) {
+  std::unique_ptr<DesktopFrame> frame = CreateTestFrame();
+  frame->set_top_left(DesktopVector(100, 200));
+  frame = CreateCroppedDesktopFrame(std::move(frame),
+      DesktopRect::MakeLTRB(1, 3, 9, 18));
+  ASSERT_EQ(frame->size().width(), 8);
+  ASSERT_EQ(frame->size().height(), 15);
+  ASSERT_EQ(frame->top_left().x(), 101);
+  ASSERT_EQ(frame->top_left().y(), 203);
+}
+
+}  // namespace webrtc