Chromium Code Reviews| 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..d526487bb9e33f20785850f157a90757c5d5d91f |
| --- /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 { |
|
joedow
2017/04/28 21:29:53
This system is a bit different than other unit tes
Yuwei
2017/04/28 23:53:40
I just reversed the order to use the more common c
|
| + public: |
| + void SetUp() override; |
| + void TearDown() override; |
| + |
| + protected: |
| + void ExpectTransformation(const tracked_objects::Location& from_here, |
|
joedow
2017/04/28 21:29:53
I'd rename this to SetExpectedTransform() or SetEx
Yuwei
2017/04/28 23:53:40
Renamed to AssertTransformationReceived.
|
| + float scale, |
| + float offset_x, |
| + float offset_y); |
| + |
| + DesktopViewport viewport_; |
| + |
| + private: |
| + void OnTransformationChanged(const std::array<float, 9>& matrix); |
| + |
| + bool expect_matrix_ = false; |
| + std::array<float, 9> expected_matrix_; |
|
joedow
2017/04/28 21:29:53
expected_transfrom_? The method above doesn't men
Yuwei
2017/04/28 23:53:40
Use |received_transformation_| now
|
| + tracked_objects::Location expectation_location_; |
| +}; |
| + |
| +void DesktopViewportTest::SetUp() { |
| + viewport_.RegisterOnTransformationChangedCallback( |
| + base::Bind(&DesktopViewportTest::OnTransformationChanged, |
| + base::Unretained(this)), |
| + true); |
| +} |
| + |
| +void DesktopViewportTest::TearDown() { |
| + ASSERT_FALSE(expect_matrix_); |
| +} |
| + |
| +void DesktopViewportTest::ExpectTransformation( |
| + const tracked_objects::Location& from_here, |
| + float scale, |
| + float offset_x, |
| + float offset_y) { |
| + ASSERT_FALSE(expect_matrix_) << "Previous matrix has not received yet."; |
| + expect_matrix_ = true; |
| + SimpleMatrix expected(scale, {offset_x, offset_y}); |
| + expected_matrix_ = expected.ToMatrixArray(); |
| + expectation_location_ = from_here; |
| +} |
| + |
| +void DesktopViewportTest::OnTransformationChanged( |
| + const std::array<float, 9>& matrix) { |
| + ASSERT_TRUE(expect_matrix_); |
| + |
| + for (int i = 0; i < 9; i++) { |
| + float diff = matrix[i] - expected_matrix_[i]; |
| + ASSERT_TRUE(diff > -EPSILON && diff < EPSILON) |
| + << "Matrix doesn't match. \n" |
| + << base::StringPrintf("Expected scale: %f, offset: (%f, %f)\n", |
| + expected_matrix_[0], expected_matrix_[2], |
| + expected_matrix_[5]) |
| + << base::StringPrintf("Actual scale: %f, offset: (%f, %f)\n", matrix[0], |
| + matrix[2], matrix[5]) |
| + << "Location: " << expectation_location_.ToString(); |
| + } |
| + |
| + expect_matrix_ = false; |
|
joedow
2017/04/28 21:29:53
If SimpleMatrix had an 'isEmpty()' method, you cou
Yuwei
2017/04/28 23:53:40
Done.
|
| +} |
| + |
| +TEST_F(DesktopViewportTest, TestViewportInitialization1) { |
| + // VP < DP. Desktop shrinks to fit. |
| + // +====+------+ |
| + // | VP | DP | |
| + // | | | |
| + // +====+------+ |
| + ExpectTransformation(FROM_HERE, 0.5f, 0.f, 0.f); |
| + viewport_.SetDesktopSize(8, 6); |
| + viewport_.SetSurfaceSize(2, 3); |
| +} |
| + |
| +TEST_F(DesktopViewportTest, TestViewportInitialization2) { |
| + // VP < DP. Desktop shrinks to fit. |
| + // +-----------------+ |
| + // | DP | |
| + // | | |
| + // +=================+ |
| + // | VP | |
| + // +=================+ |
| + ExpectTransformation(FROM_HERE, 0.375, 0.f, 0.f); |
| + viewport_.SetDesktopSize(8, 6); |
| + viewport_.SetSurfaceSize(3, 2); |
| +} |
| + |
| +TEST_F(DesktopViewportTest, TestViewportInitialization3) { |
| + // VP < DP. Desktop shrinks to fit. |
| + // +========+----+ |
| + // | VP | DP | |
| + // +========+----+ |
| + ExpectTransformation(FROM_HERE, 0.333f, 0.f, 0.f); |
| + viewport_.SetDesktopSize(9, 3); |
| + viewport_.SetSurfaceSize(2, 1); |
| +} |
| + |
| +TEST_F(DesktopViewportTest, TestViewportInitialization4) { |
| + // VP > DP. Desktop grows to fit. |
| + // +====+------+ |
| + // | VP | DP | |
| + // | | | |
| + // +====+------+ |
| + ExpectTransformation(FROM_HERE, 4.f, 0.f, 0.f); |
| + viewport_.SetDesktopSize(2, 1); |
| + viewport_.SetSurfaceSize(3, 4); |
| +} |
| + |
| +TEST_F(DesktopViewportTest, TestMoveDesktop) { |
| + // +====+------+ |
| + // | VP | DP | |
| + // | | | |
| + // +====+------+ |
| + ExpectTransformation(FROM_HERE, 0.5f, 0.f, 0.f); |
| + viewport_.SetDesktopSize(8, 6); |
| + viewport_.SetSurfaceSize(2, 3); |
| + |
| + // <--- DP |
| + // +------+====+ |
| + // | DP | VP | |
| + // | | | |
| + // +------+====+ |
| + ExpectTransformation(FROM_HERE, 0.5f, -2.f, 0.f); |
| + viewport_.MoveDesktop(-2.f, 0.f); |
| + |
| + // +====+ |
| + // +----| VP | |
| + // | DP | | |
| + // | +====+ |
| + // +--------+ |
| + // Bounces back. |
| + ExpectTransformation(FROM_HERE, 0.5f, -2.f, 0.f); |
| + viewport_.MoveDesktop(-1.f, 1.f); |
| +} |
| + |
| +TEST_F(DesktopViewportTest, TestMoveAndScaleDesktop) { |
| + // Number in surface coordinate. |
| + // |
| + // +====+------+ |
| + // | VP | DP | |
| + // | | | 3 |
| + // +====+------+ |
| + // 4 |
| + ExpectTransformation(FROM_HERE, 0.5f, 0.f, 0.f); |
| + viewport_.SetDesktopSize(8, 6); |
| + viewport_.SetSurfaceSize(2, 3); |
| + |
| + // Scale at pivot point (2, 3) by 1.5x. |
| + // +------------------+ |
| + // | | |
| + // | +====+ DP | 4.5 |
| + // | | VP | | |
| + // | | | | |
| + // +---+====+---------+ |
| + // 2 6 |
| + ExpectTransformation(FROM_HERE, 0.75f, -1.f, -1.5f); |
| + viewport_.ScaleDesktop(2.f, 3.f, 1.5f); |
| + |
| + // Move VP to the top-right. |
| + // +-------------+====+ |
| + // | | VP | |
| + // | DP | | |
| + // | +====+ 4.5 |
| + // | 2 | |
| + // +------------------+ |
| + // 6 |
| + ExpectTransformation(FROM_HERE, 0.75f, -4.f, 0.f); |
| + viewport_.MoveDesktop(-10000.f, 10000.f); |
| + |
| + // Scale at (2, 0) by 0.5x. |
| + // VP |
| + // +====+ |
| + // +--+----+ |
| + // DP | | | |
| + // +--+----+ |
| + // +====+ |
| + ExpectTransformation(FROM_HERE, 0.375, -1.f, 0.375f); |
| + viewport_.ScaleDesktop(2.f, 0.f, 0.5f); |
| + |
| + // Scale all the way down. |
| + // +========+ |
| + // | VP | |
| + // +--------+ |
| + // | DP | |
| + // +--------+ |
| + // | | |
| + // +========+ |
| + ExpectTransformation(FROM_HERE, 0.25f, 0.f, 0.75f); |
| + viewport_.ScaleDesktop(20.f, 0.f, 0.0001f); |
| +} |
| + |
| +TEST_F(DesktopViewportTest, TestSetViewportCenter) { |
| + // Numbers in desktop coordinates. |
| + // |
| + // +====+------+ |
| + // | VP | DP | |
| + // | | | 6 |
| + // +====+------+ |
| + // 8 |
| + ExpectTransformation(FROM_HERE, 0.5f, 0.f, 0.f); |
| + viewport_.SetDesktopSize(8, 6); |
| + viewport_.SetSurfaceSize(2, 3); |
| + |
| + // 1.6 |
| + // +==+--------+ |
| + // |VP|2.4 DP | |
| + // +==+ | 6 |
| + // +-----------+ |
| + // 8 |
| + ExpectTransformation(FROM_HERE, 1.25f, 0.f, 0.f); |
| + viewport_.ScaleDesktop(0.f, 0.f, 2.5f); |
| + |
| + // Move VP to center of the desktop. |
| + // +------------------+ |
| + // | +1.6=+ | |
| + // | | VP |2.4 | 6 |
| + // | +====+ | |
| + // +------------------+ |
| + // 8 |
| + ExpectTransformation(FROM_HERE, 1.25f, -4.f, -2.25f); |
| + viewport_.SetViewportCenter(4.f, 3.f); |
| + |
| + // Move it out of bound and bounce it back. |
| + // +------------------+ |
| + // | | |
| + // | DP | |
| + // | +====+ |
| + // | | VP | |
| + // +---------------| | |
| + // +====+ |
| + ExpectTransformation(FROM_HERE, 1.25f, -8.f, -4.5f); |
| + viewport_.SetViewportCenter(1000.f, 1000.f); |
| +} |
| + |
| +} // namespace remoting |