| Index: remoting/client/desktop_viewport_unittest.cc
|
| diff --git a/remoting/client/desktop_viewport_unittest.cc b/remoting/client/desktop_viewport_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8e12230233e591171c310d9e0941e4b2ba06966e
|
| --- /dev/null
|
| +++ b/remoting/client/desktop_viewport_unittest.cc
|
| @@ -0,0 +1,254 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "remoting/client/desktop_viewport.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/location.h"
|
| +#include "base/strings/stringprintf.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace remoting {
|
| +
|
| +namespace {
|
| +
|
| +const float EPSILON = 0.001f;
|
| +
|
| +} // namespace
|
| +
|
| +class DesktopViewportTest : public testing::Test {
|
| + public:
|
| + void SetUp() override;
|
| + void TearDown() override;
|
| +
|
| + protected:
|
| + void AssertTransformationReceived(const tracked_objects::Location& from_here,
|
| + float scale,
|
| + float offset_x,
|
| + float offset_y);
|
| +
|
| + DesktopViewport viewport_;
|
| +
|
| + private:
|
| + void OnTransformationChanged(const ViewMatrix& matrix);
|
| +
|
| + ViewMatrix received_transformation_;
|
| +};
|
| +
|
| +void DesktopViewportTest::SetUp() {
|
| + viewport_.RegisterOnTransformationChangedCallback(
|
| + base::Bind(&DesktopViewportTest::OnTransformationChanged,
|
| + base::Unretained(this)),
|
| + true);
|
| +}
|
| +
|
| +void DesktopViewportTest::TearDown() {
|
| + ASSERT_TRUE(received_transformation_.IsEmpty());
|
| +}
|
| +
|
| +void DesktopViewportTest::AssertTransformationReceived(
|
| + const tracked_objects::Location& from_here,
|
| + float scale,
|
| + float offset_x,
|
| + float offset_y) {
|
| + ASSERT_FALSE(received_transformation_.IsEmpty())
|
| + << "Matrix has not been received yet."
|
| + << "Location: " << from_here.ToString();
|
| + ViewMatrix expected(scale, {offset_x, offset_y});
|
| + std::array<float, 9> expected_array = expected.ToMatrixArray();
|
| + std::array<float, 9> actual_array = received_transformation_.ToMatrixArray();
|
| +
|
| + for (int i = 0; i < 9; i++) {
|
| + float diff = expected_array[i] - actual_array[i];
|
| + ASSERT_TRUE(diff > -EPSILON && diff < EPSILON)
|
| + << "Matrix doesn't match. \n"
|
| + << base::StringPrintf("Expected scale: %f, offset: (%f, %f)\n",
|
| + expected_array[0], expected_array[2],
|
| + expected_array[5])
|
| + << base::StringPrintf("Actual scale: %f, offset: (%f, %f)\n",
|
| + actual_array[0], actual_array[2], actual_array[5])
|
| + << "Location: " << from_here.ToString();
|
| + }
|
| +
|
| + received_transformation_ = ViewMatrix();
|
| +}
|
| +
|
| +void DesktopViewportTest::OnTransformationChanged(const ViewMatrix& matrix) {
|
| + ASSERT_TRUE(received_transformation_.IsEmpty())
|
| + << "Previous matrix has not been asserted.";
|
| + received_transformation_ = matrix;
|
| +}
|
| +
|
| +TEST_F(DesktopViewportTest, TestViewportInitialization1) {
|
| + // VP < DP. Desktop shrinks to fit.
|
| + // +====+------+
|
| + // | VP | DP |
|
| + // | | |
|
| + // +====+------+
|
| + viewport_.SetDesktopSize(8, 6);
|
| + viewport_.SetSurfaceSize(2, 3);
|
| + AssertTransformationReceived(FROM_HERE, 0.5f, 0.f, 0.f);
|
| +}
|
| +
|
| +TEST_F(DesktopViewportTest, TestViewportInitialization2) {
|
| + // VP < DP. Desktop shrinks to fit.
|
| + // +-----------------+
|
| + // | DP |
|
| + // | |
|
| + // +=================+
|
| + // | VP |
|
| + // +=================+
|
| + viewport_.SetDesktopSize(8, 6);
|
| + viewport_.SetSurfaceSize(3, 2);
|
| + AssertTransformationReceived(FROM_HERE, 0.375, 0.f, 0.f);
|
| +}
|
| +
|
| +TEST_F(DesktopViewportTest, TestViewportInitialization3) {
|
| + // VP < DP. Desktop shrinks to fit.
|
| + // +========+----+
|
| + // | VP | DP |
|
| + // +========+----+
|
| + viewport_.SetDesktopSize(9, 3);
|
| + viewport_.SetSurfaceSize(2, 1);
|
| + AssertTransformationReceived(FROM_HERE, 0.333f, 0.f, 0.f);
|
| +}
|
| +
|
| +TEST_F(DesktopViewportTest, TestViewportInitialization4) {
|
| + // VP > DP. Desktop grows to fit.
|
| + // +====+------+
|
| + // | VP | DP |
|
| + // | | |
|
| + // +====+------+
|
| + viewport_.SetDesktopSize(2, 1);
|
| + viewport_.SetSurfaceSize(3, 4);
|
| + AssertTransformationReceived(FROM_HERE, 4.f, 0.f, 0.f);
|
| +}
|
| +
|
| +TEST_F(DesktopViewportTest, TestMoveDesktop) {
|
| + // +====+------+
|
| + // | VP | DP |
|
| + // | | |
|
| + // +====+------+
|
| + viewport_.SetDesktopSize(8, 6);
|
| + viewport_.SetSurfaceSize(2, 3);
|
| + AssertTransformationReceived(FROM_HERE, 0.5f, 0.f, 0.f);
|
| +
|
| + // <--- DP
|
| + // +------+====+
|
| + // | DP | VP |
|
| + // | | |
|
| + // +------+====+
|
| + viewport_.MoveDesktop(-2.f, 0.f);
|
| + AssertTransformationReceived(FROM_HERE, 0.5f, -2.f, 0.f);
|
| +
|
| + // +====+
|
| + // +----| VP |
|
| + // | DP | |
|
| + // | +====+
|
| + // +--------+
|
| + // Bounces back.
|
| + viewport_.MoveDesktop(-1.f, 1.f);
|
| + AssertTransformationReceived(FROM_HERE, 0.5f, -2.f, 0.f);
|
| +}
|
| +
|
| +TEST_F(DesktopViewportTest, TestMoveAndScaleDesktop) {
|
| + // Number in surface coordinate.
|
| + //
|
| + // +====+------+
|
| + // | VP | DP |
|
| + // | | | 3
|
| + // +====+------+
|
| + // 4
|
| + viewport_.SetDesktopSize(8, 6);
|
| + viewport_.SetSurfaceSize(2, 3);
|
| + AssertTransformationReceived(FROM_HERE, 0.5f, 0.f, 0.f);
|
| +
|
| + // Scale at pivot point (2, 3) by 1.5x.
|
| + // +------------------+
|
| + // | |
|
| + // | +====+ DP | 4.5
|
| + // | | VP | |
|
| + // | | | |
|
| + // +---+====+---------+
|
| + // 2 6
|
| + viewport_.ScaleDesktop(2.f, 3.f, 1.5f);
|
| + AssertTransformationReceived(FROM_HERE, 0.75f, -1.f, -1.5f);
|
| +
|
| + // Move VP to the top-right.
|
| + // +-------------+====+
|
| + // | | VP |
|
| + // | DP | |
|
| + // | +====+ 4.5
|
| + // | 2 |
|
| + // +------------------+
|
| + // 6
|
| + viewport_.MoveDesktop(-10000.f, 10000.f);
|
| + AssertTransformationReceived(FROM_HERE, 0.75f, -4.f, 0.f);
|
| +
|
| + // Scale at (2, 0) by 0.5x.
|
| + // VP
|
| + // +====+
|
| + // +--+----+
|
| + // DP | | |
|
| + // +--+----+
|
| + // +====+
|
| + viewport_.ScaleDesktop(2.f, 0.f, 0.5f);
|
| + AssertTransformationReceived(FROM_HERE, 0.375, -1.f, 0.375f);
|
| +
|
| + // Scale all the way down.
|
| + // +========+
|
| + // | VP |
|
| + // +--------+
|
| + // | DP |
|
| + // +--------+
|
| + // | |
|
| + // +========+
|
| + viewport_.ScaleDesktop(20.f, 0.f, 0.0001f);
|
| + AssertTransformationReceived(FROM_HERE, 0.25f, 0.f, 0.75f);
|
| +}
|
| +
|
| +TEST_F(DesktopViewportTest, TestSetViewportCenter) {
|
| + // Numbers in desktop coordinates.
|
| + //
|
| + // +====+------+
|
| + // | VP | DP |
|
| + // | | | 6
|
| + // +====+------+
|
| + // 8
|
| + viewport_.SetDesktopSize(8, 6);
|
| + viewport_.SetSurfaceSize(2, 3);
|
| + AssertTransformationReceived(FROM_HERE, 0.5f, 0.f, 0.f);
|
| +
|
| + // 1.6
|
| + // +==+--------+
|
| + // |VP|2.4 DP |
|
| + // +==+ | 6
|
| + // +-----------+
|
| + // 8
|
| + viewport_.ScaleDesktop(0.f, 0.f, 2.5f);
|
| + AssertTransformationReceived(FROM_HERE, 1.25f, 0.f, 0.f);
|
| +
|
| + // Move VP to center of the desktop.
|
| + // +------------------+
|
| + // | +1.6=+ |
|
| + // | | VP |2.4 | 6
|
| + // | +====+ |
|
| + // +------------------+
|
| + // 8
|
| + viewport_.SetViewportCenter(4.f, 3.f);
|
| + AssertTransformationReceived(FROM_HERE, 1.25f, -4.f, -2.25f);
|
| +
|
| + // Move it out of bound and bounce it back.
|
| + // +------------------+
|
| + // | |
|
| + // | DP |
|
| + // | +====+
|
| + // | | VP |
|
| + // +---------------| |
|
| + // +====+
|
| + viewport_.SetViewportCenter(1000.f, 1000.f);
|
| + AssertTransformationReceived(FROM_HERE, 1.25f, -8.f, -4.5f);
|
| +}
|
| +
|
| +} // namespace remoting
|
|
|