Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Unified Diff: remoting/ios/ui/scene_view_unittest.mm

Issue 186733007: iOS Chromoting Client (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/ios/ui/scene_view.mm ('k') | remoting/ios/utility.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/ios/ui/scene_view_unittest.mm
diff --git a/remoting/ios/ui/scene_view_unittest.mm b/remoting/ios/ui/scene_view_unittest.mm
new file mode 100644
index 0000000000000000000000000000000000000000..d1dfabcd7dbd46c208a73cc3273632d2f2369960
--- /dev/null
+++ b/remoting/ios/ui/scene_view_unittest.mm
@@ -0,0 +1,1219 @@
+// Copyright 2014 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.
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+#import "remoting/ios/ui/scene_view.h"
+
+#import "base/compiler_specific.h"
+#import "testing/gtest_mac.h"
+
+namespace remoting {
+
+namespace {
+const int kClientWidth = 200;
+const int kClientHeight = 100;
+const webrtc::DesktopSize kClientSize(kClientWidth, kClientHeight);
+// Smaller then ClientSize
+const webrtc::DesktopSize kSmall(50, 75);
+// Inverted - The vertical is closer to an edge than the horizontal
+const webrtc::DesktopSize kSmallInversed(175, 50);
+// Larger then ClientSize
+const webrtc::DesktopSize kLarge(800, 125);
+const webrtc::DesktopSize kLargeInversed(225, 400);
+} // namespace
+
+class SceneViewTest : public ::testing::Test {
+ protected:
+ virtual void SetUp() OVERRIDE {
+ scene_ = [[SceneView alloc] init];
+ [scene_
+ setContentSize:CGSizeMake(kClientSize.width(), kClientSize.height())];
+ [scene_ setFrameSize:kLarge];
+ }
+
+ void MakeLarge() { [scene_ setFrameSize:kLarge]; }
+
+ SceneView* scene_;
+};
+
+TEST(SceneViewTest_Property, ContentSize) {
+ SceneView* scene = [[SceneView alloc] init];
+
+ [scene setContentSize:CGSizeMake(0, 0)];
+ EXPECT_EQ(0, scene.contentSize.width());
+ EXPECT_EQ(0, scene.contentSize.height());
+ float zeros[16] = {1.0f / 0.0f, 0, 0, 0, 0, 1.0f / 0.0f, 0, 0,
+ 0, 0, 1, 0, 0.0f / 0.0f, 0.0f / 0.0f, 0, 1};
+
+ ASSERT_TRUE(memcmp(zeros, scene.projectionMatrix.m, 16 * sizeof(float)) == 0);
+
+ [scene setContentSize:CGSizeMake(kClientSize.width(), kClientSize.height())];
+ EXPECT_EQ(kClientSize.width(), scene.contentSize.width());
+ EXPECT_EQ(kClientSize.height(), scene.contentSize.height());
+
+ EXPECT_TRUE(memcmp(GLKMatrix4MakeOrtho(
+ 0.0, kClientWidth, 0.0, kClientHeight, 1.0, -1.0).m,
+ scene.projectionMatrix.m,
+ 16 * sizeof(float)) == 0);
+}
+
+TEST(SceneViewTest_Property, FrameSizeInit) {
+ SceneView* scene = [[SceneView alloc] init];
+ [scene setContentSize:CGSizeMake(kClientSize.width(), kClientSize.height())];
+
+ [scene setFrameSize:webrtc::DesktopSize(1, 1)];
+ EXPECT_EQ(1, scene.frameSize.width());
+ EXPECT_EQ(1, scene.frameSize.height());
+
+ EXPECT_EQ(0, scene.position.x);
+ EXPECT_EQ(0, scene.position.y);
+ EXPECT_EQ(1, scene.position.z);
+
+ EXPECT_FALSE(scene.anchored.left);
+ EXPECT_FALSE(scene.anchored.right);
+ EXPECT_FALSE(scene.anchored.top);
+ EXPECT_FALSE(scene.anchored.bottom);
+
+ EXPECT_EQ(0, scene.mousePosition.x());
+ EXPECT_EQ(0, scene.mousePosition.y());
+}
+
+TEST(SceneViewTest_Property, FrameSizeLarge) {
+ SceneView* scene = [[SceneView alloc] init];
+ [scene setContentSize:CGSizeMake(kClientSize.width(), kClientSize.height())];
+ [scene setFrameSize:kLarge];
+ EXPECT_EQ(kLarge.width(), scene.frameSize.width());
+ EXPECT_EQ(kLarge.height(), scene.frameSize.height());
+
+ // Screen is positioned in the lower,left corner, zoomed until the vertical
+ // fits exactly, and then centered horizontally
+ // HOST
+ // CLIENT ------------------------------------------------
+ // ------------ | |
+ // | | | |
+ // | | | |
+ // | | | |
+ // ------------ ------------------------------------------------
+ // RESULT - ONSCREEN is completely covered, with some of the HOST off screen
+ // (-.-) the mouse cursor
+ // -----------------------------------------
+ // | ONSCREEN | OFFSCREEN |
+ // | -.- | |
+ // | | |
+ // -----------------------------------------
+ float scale = static_cast<float>(kClientSize.height()) /
+ static_cast<float>(kLarge.height());
+ // vertical fits exactly
+ EXPECT_EQ(scale, scene.position.z);
+
+ // sitting on both Axis
+ EXPECT_EQ(0, scene.position.x);
+ EXPECT_EQ(0, scene.position.y);
+
+ // bound on 3 sides, not on the right
+ EXPECT_TRUE(scene.anchored.left);
+ EXPECT_FALSE(scene.anchored.right);
+ EXPECT_TRUE(scene.anchored.top);
+ EXPECT_TRUE(scene.anchored.bottom);
+
+ // mouse is off center on the left horizontal
+ EXPECT_EQ(kClientSize.width() / (scale * 2), scene.mousePosition.x());
+ // mouse is centered vertical
+ EXPECT_EQ(kLarge.height() / 2, scene.mousePosition.y());
+}
+
+TEST(SceneViewTest_Property, FrameSizeLargeInversed) {
+ SceneView* scene = [[SceneView alloc] init];
+ [scene setContentSize:CGSizeMake(kClientSize.width(), kClientSize.height())];
+ [scene setFrameSize:kLargeInversed];
+ EXPECT_EQ(kLargeInversed.width(), scene.frameSize.width());
+ EXPECT_EQ(kLargeInversed.height(), scene.frameSize.height());
+
+ // Screen is positioned in the lower,left corner, zoomed until the vertical
+ // fits exactly, and then centered horizontally
+ // HOST
+ // ---------------
+ // | |
+ // | |
+ // | |
+ // | |
+ // | |
+ // | |
+ // | |
+ // CLIENT | |
+ // ------------- | |
+ // | | | |
+ // | | | |
+ // | | | |
+ // ------------- ---------------
+ // RESULT, entire HOST is on screen
+ // (-.-) the mouse cursor, XX is black backdrop
+ // -------------
+ // |XX| |XX|
+ // |XX| -.- |XX|
+ // |XX| |XX|
+ // -------------
+ float scale = static_cast<float>(kClientSize.height()) /
+ static_cast<float>(kLargeInversed.height());
+ // Vertical fits exactly
+ EXPECT_EQ(scale, scene.position.z);
+
+ // centered
+ EXPECT_EQ(
+ (kClientSize.width() - static_cast<int>(scale * kLargeInversed.width())) /
+ 2,
+ scene.position.x);
+ // sits on Axis
+ EXPECT_EQ(0, scene.position.y);
+
+ // bound on all 4 sides
+ EXPECT_TRUE(scene.anchored.left);
+ EXPECT_TRUE(scene.anchored.right);
+ EXPECT_TRUE(scene.anchored.top);
+ EXPECT_TRUE(scene.anchored.bottom);
+
+ // mouse is in centered both vertical and horizontal
+ EXPECT_EQ(kLargeInversed.width() / 2, scene.mousePosition.x());
+ EXPECT_EQ(kLargeInversed.height() / 2, scene.mousePosition.y());
+}
+
+TEST(SceneViewTest_Property, FrameSizeSmall) {
+ SceneView* scene = [[SceneView alloc] init];
+ [scene setContentSize:CGSizeMake(kClientSize.width(), kClientSize.height())];
+ [scene setFrameSize:kSmall];
+ EXPECT_EQ(kSmall.width(), scene.frameSize.width());
+ EXPECT_EQ(kSmall.height(), scene.frameSize.height());
+
+ // Screen is positioned in the lower,left corner, zoomed until the vertical
+ // fits exactly, and then centered horizontally
+ // CLIENT
+ // ---------------------------
+ // | | HOST
+ // | | -------
+ // | | | |
+ // | | | |
+ // | | | |
+ // | | | |
+ // | | | |
+ // --------------------------- -------
+ // RESULT, entire HOST is on screen
+ // (-.-) the mouse cursor, XX is black backdrop
+ // ---------------------------
+ // |XXXXXXXXX| |XXXXXXXXX|
+ // |XXXXXXXXX| |XXXXXXXXX|
+ // |XXXXXXXXX| |XXXXXXXXX|
+ // |XXXXXXXXX| -.- |XXXXXXXXX|
+ // |XXXXXXXXX| |XXXXXXXXX|
+ // |XXXXXXXXX| |XXXXXXXXX|
+ // |XXXXXXXXX| |XXXXXXXXX|
+ // ---------------------------
+ float scale = static_cast<float>(kClientSize.height()) /
+ static_cast<float>(kSmall.height());
+ // Vertical fits exactly
+ EXPECT_EQ(scale, scene.position.z);
+
+ // centered
+ EXPECT_EQ(
+ (kClientSize.width() - static_cast<int>(scale * kSmall.width())) / 2,
+ scene.position.x);
+ // sits on Axis
+ EXPECT_EQ(0, scene.position.y);
+
+ // bound on all 4 sides
+ EXPECT_TRUE(scene.anchored.left);
+ EXPECT_TRUE(scene.anchored.right);
+ EXPECT_TRUE(scene.anchored.top);
+ EXPECT_TRUE(scene.anchored.bottom);
+
+ // mouse is in centered both vertical and horizontal
+ EXPECT_EQ((kSmall.width() / 2) - 1, // -1 for pixel rounding
+ scene.mousePosition.x());
+ EXPECT_EQ(kSmall.height() / 2, scene.mousePosition.y());
+}
+
+TEST(SceneViewTest_Property, FrameSizeSmallInversed) {
+ SceneView* scene = [[SceneView alloc] init];
+ [scene setContentSize:CGSizeMake(kClientSize.width(), kClientSize.height())];
+ [scene setFrameSize:kSmallInversed];
+ EXPECT_EQ(kSmallInversed.width(), scene.frameSize.width());
+ EXPECT_EQ(kSmallInversed.height(), scene.frameSize.height());
+
+ // Screen is positioned in the lower,left corner, zoomed until the vertical
+ // fits exactly, and then centered horizontally
+ // CLIENT
+ // ---------------------------
+ // | |
+ // | |
+ // | | HOST
+ // | | ----------------------
+ // | | | |
+ // | | | |
+ // | | | |
+ // --------------------------- ----------------------
+ // RESULT - ONSCREEN is completely covered, with some of the HOST off screen
+ // (-.-) the mouse cursor
+ // --------------------------------------------
+ // | ONSCREEN | OFFSCREEN |
+ // | | |
+ // | | |
+ // | -.- | |
+ // | | |
+ // | | |
+ // | | |
+ // --------------------------------------------
+ float scale = static_cast<float>(kClientSize.height()) /
+ static_cast<float>(kSmallInversed.height());
+ // vertical fits exactly
+ EXPECT_EQ(scale, scene.position.z);
+
+ // sitting on both Axis
+ EXPECT_EQ(0, scene.position.x);
+ EXPECT_EQ(0, scene.position.y);
+
+ // bound on 3 sides, not on the right
+ EXPECT_TRUE(scene.anchored.left);
+ EXPECT_FALSE(scene.anchored.right);
+ EXPECT_TRUE(scene.anchored.top);
+ EXPECT_TRUE(scene.anchored.bottom);
+
+ // mouse is off center on the left horizontal
+ EXPECT_EQ(kClientSize.width() / (scale * 2), scene.mousePosition.x());
+ // mouse is centered vertical
+ EXPECT_EQ(kSmallInversed.height() / 2, scene.mousePosition.y());
+}
+
+TEST_F(SceneViewTest, ContainsTouchPoint) {
+ int midWidth = kClientWidth / 2;
+ int midHeight = kClientHeight / 2;
+ // left
+ EXPECT_FALSE([scene_ containsTouchPoint:CGPointMake(-1, midHeight)]);
+ EXPECT_TRUE([scene_ containsTouchPoint:CGPointMake(0, midHeight)]);
+ // right
+ EXPECT_FALSE(
+ [scene_ containsTouchPoint:CGPointMake(kClientWidth, midHeight)]);
+ EXPECT_TRUE(
+ [scene_ containsTouchPoint:CGPointMake(kClientWidth - 1, midHeight)]);
+ // top
+ EXPECT_FALSE(
+ [scene_ containsTouchPoint:CGPointMake(midWidth, kClientHeight)]);
+ EXPECT_TRUE(
+ [scene_ containsTouchPoint:CGPointMake(midWidth, kClientHeight - 1)]);
+ // bottom
+ EXPECT_FALSE([scene_ containsTouchPoint:CGPointMake(midWidth, -1)]);
+ EXPECT_TRUE([scene_ containsTouchPoint:CGPointMake(midWidth, 0)]);
+
+ [scene_ setMarginsFromLeft:10 right:10 top:10 bottom:10];
+
+ // left
+ EXPECT_FALSE([scene_ containsTouchPoint:CGPointMake(9, midHeight)]);
+ EXPECT_TRUE([scene_ containsTouchPoint:CGPointMake(10, midHeight)]);
+ // right
+ EXPECT_FALSE(
+ [scene_ containsTouchPoint:CGPointMake(kClientWidth - 10, midHeight)]);
+ EXPECT_TRUE(
+ [scene_ containsTouchPoint:CGPointMake(kClientWidth - 11, midHeight)]);
+ // top
+ EXPECT_FALSE(
+ [scene_ containsTouchPoint:CGPointMake(midWidth, kClientHeight - 10)]);
+ EXPECT_TRUE(
+ [scene_ containsTouchPoint:CGPointMake(midWidth, kClientHeight - 11)]);
+ // bottom
+ EXPECT_FALSE([scene_ containsTouchPoint:CGPointMake(midWidth, 9)]);
+ EXPECT_TRUE([scene_ containsTouchPoint:CGPointMake(midWidth, 10)]);
+}
+
+TEST_F(SceneViewTest,
+ UpdateMousePositionAndAnchorsWithTranslationNoMovement) {
+
+ webrtc::DesktopVector originalPosition = scene_.mousePosition;
+ AnchorPosition originalAnchors = scene_.anchored;
+
+ [scene_ updateMousePositionAndAnchorsWithTranslation:CGPointMake(0, 0)
+ scale:1];
+
+ webrtc::DesktopVector newPosition = scene_.mousePosition;
+
+ EXPECT_EQ(0, abs(originalPosition.x() - newPosition.x()));
+ EXPECT_EQ(0, abs(originalPosition.y() - newPosition.y()));
+
+ EXPECT_EQ(originalAnchors.right, scene_.anchored.right);
+ EXPECT_EQ(originalAnchors.top, scene_.anchored.top);
+ EXPECT_EQ(originalAnchors.left, scene_.anchored.left);
+ EXPECT_EQ(originalAnchors.bottom, scene_.anchored.bottom);
+
+ EXPECT_FALSE(scene_.tickPanVelocity);
+}
+
+TEST_F(SceneViewTest,
+ UpdateMousePositionAndAnchorsWithTranslationTowardLeftAndTop) {
+ // Translation is in a coordinate space where (0,0) is the bottom left of the
+ // view. Mouse position in in a coordinate space where (0,0) is the top left
+ // of the view. So |y| is moved in the negative direction.
+
+ webrtc::DesktopVector originalPosition = scene_.mousePosition;
+
+ [scene_ setPanVelocity:CGPointMake(1, 1)];
+ [scene_ updateMousePositionAndAnchorsWithTranslation:CGPointMake(2, -1)
+ scale:1];
+
+ webrtc::DesktopVector newPosition = scene_.mousePosition;
+
+ // We could do these checks as a single test, for a positive vs negative
+ // difference. But this style has a clearer meaning that the position moved
+ // toward or away from the origin.
+ EXPECT_LT(newPosition.x(), originalPosition.x());
+ EXPECT_LT(newPosition.y(), originalPosition.y());
+ EXPECT_EQ(2, abs(originalPosition.x() - newPosition.x()));
+ EXPECT_EQ(1, abs(originalPosition.y() - newPosition.y()));
+
+ EXPECT_TRUE(scene_.anchored.left);
+ EXPECT_TRUE(scene_.anchored.top);
+
+ EXPECT_FALSE(scene_.anchored.right);
+ EXPECT_FALSE(scene_.anchored.bottom);
+
+ EXPECT_TRUE(scene_.tickPanVelocity);
+
+ // move much further than the bounds allow
+ [scene_ setPanVelocity:CGPointMake(1, 1)];
+ [scene_
+ updateMousePositionAndAnchorsWithTranslation:CGPointMake(10000, -10000)
+ scale:1];
+
+ newPosition = scene_.mousePosition;
+
+ EXPECT_EQ(0, newPosition.x());
+ EXPECT_EQ(0, newPosition.y());
+
+ EXPECT_TRUE(scene_.anchored.left);
+ EXPECT_TRUE(scene_.anchored.top);
+
+ EXPECT_FALSE(scene_.anchored.right);
+ EXPECT_FALSE(scene_.anchored.bottom);
+
+ EXPECT_FALSE(scene_.tickPanVelocity);
+}
+
+TEST_F(SceneViewTest,
+ UpdateMousePositionAndAnchorsWithTranslationTowardLeftAndBottom) {
+ webrtc::DesktopVector originalPosition = scene_.mousePosition;
+
+ // see notes for Test
+ // UpdateMousePositionAndAnchorsWithTranslationTowardLeftAndTop
+ [scene_ setPanVelocity:CGPointMake(1, 1)];
+ [scene_ updateMousePositionAndAnchorsWithTranslation:CGPointMake(2, 1)
+ scale:1];
+ webrtc::DesktopVector newPosition = scene_.mousePosition;
+
+ EXPECT_LT(newPosition.x(), originalPosition.x());
+ EXPECT_GT(newPosition.y(), originalPosition.y());
+ EXPECT_EQ(2, abs(originalPosition.x() - newPosition.x()));
+ EXPECT_EQ(1, abs(originalPosition.y() - newPosition.y()));
+
+ EXPECT_TRUE(scene_.anchored.left);
+ EXPECT_TRUE(scene_.anchored.bottom);
+
+ EXPECT_FALSE(scene_.anchored.right);
+ EXPECT_FALSE(scene_.anchored.top);
+
+ EXPECT_TRUE(scene_.tickPanVelocity);
+
+ [scene_ setPanVelocity:CGPointMake(1, 1)];
+ [scene_ updateMousePositionAndAnchorsWithTranslation:CGPointMake(10000, 10000)
+ scale:1];
+ newPosition = scene_.mousePosition;
+
+ EXPECT_EQ(0, newPosition.x());
+ EXPECT_EQ(scene_.frameSize.height() - 1, newPosition.y());
+
+ EXPECT_TRUE(scene_.anchored.left);
+ EXPECT_TRUE(scene_.anchored.bottom);
+
+ EXPECT_FALSE(scene_.anchored.right);
+ EXPECT_FALSE(scene_.anchored.top);
+
+ EXPECT_FALSE(scene_.tickPanVelocity);
+}
+
+TEST_F(SceneViewTest,
+ UpdateMousePositionAndAnchorsWithTranslationTowardRightAndTop) {
+ webrtc::DesktopVector originalPosition = scene_.mousePosition;
+
+ // see notes for Test
+ // UpdateMousePositionAndAnchorsWithTranslationTowardLeftAndTop
+
+ // When moving to the right the mouse remains centered since the horizontal
+ // display space is larger than the view space
+ [scene_ setPanVelocity:CGPointMake(1, 1)];
+ [scene_ updateMousePositionAndAnchorsWithTranslation:CGPointMake(-2, -1)
+ scale:1];
+ webrtc::DesktopVector newPosition = scene_.mousePosition;
+
+ EXPECT_LT(newPosition.y(), originalPosition.y());
+ EXPECT_EQ(0, abs(originalPosition.x() - newPosition.x()));
+ EXPECT_EQ(1, abs(originalPosition.y() - newPosition.y()));
+
+ EXPECT_TRUE(scene_.anchored.top);
+
+ EXPECT_FALSE(scene_.anchored.left);
+ EXPECT_FALSE(scene_.anchored.right);
+ EXPECT_FALSE(scene_.anchored.bottom);
+
+ EXPECT_TRUE(scene_.tickPanVelocity);
+
+ [scene_ setPanVelocity:CGPointMake(1, 1)];
+ [scene_
+ updateMousePositionAndAnchorsWithTranslation:CGPointMake(-10000, -10000)
+ scale:1];
+ newPosition = scene_.mousePosition;
+
+ EXPECT_EQ(scene_.frameSize.width() - 1, newPosition.x());
+ EXPECT_EQ(0, newPosition.y());
+
+ EXPECT_TRUE(scene_.anchored.right);
+ EXPECT_TRUE(scene_.anchored.top);
+
+ EXPECT_FALSE(scene_.anchored.left);
+ EXPECT_FALSE(scene_.anchored.bottom);
+
+ EXPECT_FALSE(scene_.tickPanVelocity);
+}
+
+TEST_F(SceneViewTest,
+ UpdateMousePositionAndAnchorsWithTranslationTowardRightAndBottom) {
+ webrtc::DesktopVector originalPosition = scene_.mousePosition;
+
+ // see notes for Test
+ // UpdateMousePositionAndAnchorsWithTranslationTowardLeftAndTop
+
+ // When moving to the right the mouse remains centered since the horizontal
+ // display space is larger than the view space
+ [scene_ setPanVelocity:CGPointMake(1, 1)];
+ [scene_ updateMousePositionAndAnchorsWithTranslation:CGPointMake(-2, 1)
+ scale:1];
+ webrtc::DesktopVector newPosition = scene_.mousePosition;
+
+ EXPECT_GT(newPosition.y(), originalPosition.y());
+ EXPECT_EQ(0, abs(originalPosition.x() - newPosition.x()));
+ EXPECT_EQ(1, abs(originalPosition.y() - newPosition.y()));
+
+ EXPECT_TRUE(scene_.anchored.bottom);
+
+ EXPECT_FALSE(scene_.anchored.left);
+ EXPECT_FALSE(scene_.anchored.right);
+ EXPECT_FALSE(scene_.anchored.top);
+
+ EXPECT_TRUE(scene_.tickPanVelocity);
+
+ [scene_ setPanVelocity:CGPointMake(1, 1)];
+ [scene_
+ updateMousePositionAndAnchorsWithTranslation:CGPointMake(-10000, 10000)
+ scale:1];
+ newPosition = scene_.mousePosition;
+
+ EXPECT_EQ(scene_.frameSize.width() - 1, newPosition.x());
+ EXPECT_EQ(scene_.frameSize.height() - 1, newPosition.y());
+
+ EXPECT_TRUE(scene_.anchored.right);
+ EXPECT_TRUE(scene_.anchored.bottom);
+
+ EXPECT_FALSE(scene_.anchored.left);
+ EXPECT_FALSE(scene_.anchored.top);
+
+ EXPECT_FALSE(scene_.tickPanVelocity);
+}
+
+TEST(SceneViewTest_Static, PositionDeltaFromScaling) {
+
+ // Legend:
+ // * anchored point or end point
+ // | unanchored endpoint
+ // - onscreen
+ // # offscreen
+
+ // *---|
+ // *-------|
+ EXPECT_EQ(
+ 0,
+ [SceneView positionDeltaFromScaling:2.0F position:0 length:100 anchor:0]);
+ // *---|
+ // *-|
+ EXPECT_EQ(
+ 0,
+ [SceneView positionDeltaFromScaling:0.5F position:0 length:100 anchor:0]);
+ // |---*
+ // |-------*
+ EXPECT_EQ(100,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:0
+ length:100
+ anchor:100]);
+ // |----*
+ // |--*
+ EXPECT_EQ(-50,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:0
+ length:100
+ anchor:100]);
+ // |*---|
+ // |-*-------|
+ EXPECT_EQ(25,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:0
+ length:100
+ anchor:25]);
+ // |-*--|
+ // |*-|
+ EXPECT_EQ(-12.5,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:0
+ length:100
+ anchor:25]);
+ // |---*|
+ // |------*-|
+ EXPECT_EQ(75,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:0
+ length:100
+ anchor:75]);
+ // |--*-|
+ // |-*|
+ EXPECT_EQ(-37.5,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:0
+ length:100
+ anchor:75]);
+ // |-*-|
+ // |---*---|
+ EXPECT_EQ(50,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:0
+ length:100
+ anchor:50]);
+ // |--*--|
+ // |*|
+ EXPECT_EQ(-25,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:0
+ length:100
+ anchor:50]);
+ //////////////////////////////////
+ // Change position to 50, anchor is relatively the same
+ //////////////////////////////////
+ EXPECT_EQ(0,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:50
+ length:100
+ anchor:50]);
+ EXPECT_EQ(0,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:50
+ length:100
+ anchor:50]);
+ EXPECT_EQ(100,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:50
+ length:100
+ anchor:150]);
+ EXPECT_EQ(-50,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:50
+ length:100
+ anchor:150]);
+ EXPECT_EQ(25,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:50
+ length:100
+ anchor:75]);
+ EXPECT_EQ(-12.5,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:50
+ length:100
+ anchor:75]);
+ EXPECT_EQ(75,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:50
+ length:100
+ anchor:125]);
+ EXPECT_EQ(-37.5,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:50
+ length:100
+ anchor:125]);
+ EXPECT_EQ(50,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:50
+ length:100
+ anchor:100]);
+ EXPECT_EQ(-25,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:50
+ length:100
+ anchor:100]);
+
+ //////////////////////////////////
+ // Change position to -50, length to 200, anchor is relatively the same
+ //////////////////////////////////
+ EXPECT_EQ(0,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:-50
+ length:200
+ anchor:-50]);
+ EXPECT_EQ(0,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:-50
+ length:200
+ anchor:-50]);
+ EXPECT_EQ(200,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:-50
+ length:200
+ anchor:150]);
+ EXPECT_EQ(-100,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:-50
+ length:200
+ anchor:150]);
+ EXPECT_EQ(50,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:-50
+ length:200
+ anchor:0]);
+ EXPECT_EQ(-25,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:-50
+ length:200
+ anchor:0]);
+ EXPECT_EQ(150,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:-50
+ length:200
+ anchor:100]);
+ EXPECT_EQ(-75,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:-50
+ length:200
+ anchor:100]);
+ EXPECT_EQ(100,
+ [SceneView positionDeltaFromScaling:2.0F
+ position:-50
+ length:200
+ anchor:50]);
+ EXPECT_EQ(-50,
+ [SceneView positionDeltaFromScaling:0.5F
+ position:-50
+ length:200
+ anchor:50]);
+}
+
+TEST(SceneViewTest_Static, PositionDeltaFromTranslation) {
+ // Anchored on both sides. Center it by using 1/2 the free space, offset by
+ // the current position
+ EXPECT_EQ(50,
+ [SceneView positionDeltaFromTranslation:0
+ position:0
+ freeSpace:100
+ scaleingPositionDelta:0
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(50,
+ [SceneView positionDeltaFromTranslation:100
+ position:0
+ freeSpace:100
+ scaleingPositionDelta:0
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(-50,
+ [SceneView positionDeltaFromTranslation:0
+ position:100
+ freeSpace:100
+ scaleingPositionDelta:0
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(50,
+ [SceneView positionDeltaFromTranslation:0
+ position:0
+ freeSpace:100
+ scaleingPositionDelta:100
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(100,
+ [SceneView positionDeltaFromTranslation:0
+ position:0
+ freeSpace:200
+ scaleingPositionDelta:0
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+
+ // Anchored only on the left. Don't move it
+ EXPECT_EQ(0,
+ [SceneView positionDeltaFromTranslation:0
+ position:0
+ freeSpace:100
+ scaleingPositionDelta:0
+ isAnchoredLow:YES
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(0,
+ [SceneView positionDeltaFromTranslation:100
+ position:0
+ freeSpace:100
+ scaleingPositionDelta:0
+ isAnchoredLow:YES
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(0,
+ [SceneView positionDeltaFromTranslation:0
+ position:100
+ freeSpace:100
+ scaleingPositionDelta:0
+ isAnchoredLow:YES
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(0,
+ [SceneView positionDeltaFromTranslation:0
+ position:0
+ freeSpace:200
+ scaleingPositionDelta:100
+ isAnchoredLow:YES
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(0,
+ [SceneView positionDeltaFromTranslation:0
+ position:0
+ freeSpace:200
+ scaleingPositionDelta:0
+ isAnchoredLow:YES
+ isAnchoredHigh:NO]);
+ // Anchored only on the right. Move by the scaling delta
+ EXPECT_EQ(25,
+ [SceneView positionDeltaFromTranslation:0
+ position:0
+ freeSpace:100
+ scaleingPositionDelta:25
+ isAnchoredLow:NO
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(50,
+ [SceneView positionDeltaFromTranslation:100
+ position:0
+ freeSpace:100
+ scaleingPositionDelta:50
+ isAnchoredLow:NO
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(75,
+ [SceneView positionDeltaFromTranslation:0
+ position:100
+ freeSpace:100
+ scaleingPositionDelta:75
+ isAnchoredLow:NO
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(100,
+ [SceneView positionDeltaFromTranslation:0
+ position:0
+ freeSpace:100
+ scaleingPositionDelta:100
+ isAnchoredLow:NO
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(125,
+ [SceneView positionDeltaFromTranslation:0
+ position:0
+ freeSpace:200
+ scaleingPositionDelta:125
+ isAnchoredLow:NO
+ isAnchoredHigh:YES]);
+ // Not anchored, translate and move by the scaling delta
+ EXPECT_EQ(0,
+ [SceneView positionDeltaFromTranslation:0
+ position:0
+ freeSpace:100
+ scaleingPositionDelta:0
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(25,
+ [SceneView positionDeltaFromTranslation:25
+ position:0
+ freeSpace:100
+ scaleingPositionDelta:0
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(50,
+ [SceneView positionDeltaFromTranslation:50
+ position:100
+ freeSpace:100
+ scaleingPositionDelta:0
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(175,
+ [SceneView positionDeltaFromTranslation:75
+ position:0
+ freeSpace:100
+ scaleingPositionDelta:100
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(100,
+ [SceneView positionDeltaFromTranslation:100
+ position:0
+ freeSpace:200
+ scaleingPositionDelta:0
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+}
+
+TEST(SceneViewTest_Static, BoundDeltaFromPosition) {
+ // Entire entity fits in our view, lower bound is not less than the
+ // upperBound. The delta is bounded to the lowerBound.
+ EXPECT_EQ(200,
+ [SceneView boundDeltaFromPosition:0
+ delta:0
+ lowerBound:200
+ upperBound:100]);
+ EXPECT_EQ(100,
+ [SceneView boundDeltaFromPosition:100
+ delta:0
+ lowerBound:200
+ upperBound:100]);
+ EXPECT_EQ(200,
+ [SceneView boundDeltaFromPosition:0
+ delta:100
+ lowerBound:200
+ upperBound:100]);
+ EXPECT_EQ(150,
+ [SceneView boundDeltaFromPosition:50
+ delta:100
+ lowerBound:200
+ upperBound:200]);
+ // Entity does not fit in our view. The result would be out of bounds on the
+ // high bound. The delta is bounded to the upper bound and the delta from the
+ // position is returned.
+ EXPECT_EQ(100,
+ [SceneView boundDeltaFromPosition:0
+ delta:1000
+ lowerBound:0
+ upperBound:100]);
+ EXPECT_EQ(99,
+ [SceneView boundDeltaFromPosition:1
+ delta:1000
+ lowerBound:0
+ upperBound:100]);
+ EXPECT_EQ(-50,
+ [SceneView boundDeltaFromPosition:150
+ delta:1000
+ lowerBound:50
+ upperBound:100]);
+ EXPECT_EQ(100,
+ [SceneView boundDeltaFromPosition:100
+ delta:1000
+ lowerBound:0
+ upperBound:200]);
+ // Entity does not fit in our view. The result would be out of bounds on the
+ // low bound. The delta is bounded to the lower bound and the delta from the
+ // position is returned.
+ EXPECT_EQ(0,
+ [SceneView boundDeltaFromPosition:0
+ delta:-1000
+ lowerBound:0
+ upperBound:100]);
+ EXPECT_EQ(-20,
+ [SceneView boundDeltaFromPosition:20
+ delta:-1000
+ lowerBound:0
+ upperBound:100]);
+ EXPECT_EQ(21,
+ [SceneView boundDeltaFromPosition:29
+ delta:-1000
+ lowerBound:50
+ upperBound:100]);
+ EXPECT_EQ(1,
+ [SceneView boundDeltaFromPosition:-1
+ delta:-1000
+ lowerBound:0
+ upperBound:200]);
+ // Entity does not fit in our view. The result is in bounds. The delta is
+ // returned unchanged.
+ EXPECT_EQ(50,
+ [SceneView boundDeltaFromPosition:0
+ delta:50
+ lowerBound:0
+ upperBound:100]);
+ EXPECT_EQ(-10,
+ [SceneView boundDeltaFromPosition:20
+ delta:-10
+ lowerBound:0
+ upperBound:100]);
+ EXPECT_EQ(31,
+ [SceneView boundDeltaFromPosition:29
+ delta:31
+ lowerBound:50
+ upperBound:100]);
+ EXPECT_EQ(50,
+ [SceneView boundDeltaFromPosition:100
+ delta:50
+ lowerBound:0
+ upperBound:200]);
+}
+
+TEST(SceneViewTest_Static, BoundMouseGivenNextPosition) {
+ // Mouse would move off screen in the negative
+ EXPECT_EQ(0,
+ [SceneView boundMouseGivenNextPosition:-1
+ maxPosition:50
+ centerPosition:2
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(0,
+ [SceneView boundMouseGivenNextPosition:-1
+ maxPosition:25
+ centerPosition:99
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(0,
+ [SceneView boundMouseGivenNextPosition:-11
+ maxPosition:0
+ centerPosition:-52
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(0,
+ [SceneView boundMouseGivenNextPosition:-11
+ maxPosition:-100
+ centerPosition:44
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(0,
+ [SceneView boundMouseGivenNextPosition:-1
+ maxPosition:50
+ centerPosition:-20
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+
+ // Mouse would move off screen in the positive
+ EXPECT_EQ(49,
+ [SceneView boundMouseGivenNextPosition:50
+ maxPosition:50
+ centerPosition:2
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(24,
+ [SceneView boundMouseGivenNextPosition:26
+ maxPosition:25
+ centerPosition:99
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(-1,
+ [SceneView boundMouseGivenNextPosition:1
+ maxPosition:0
+ centerPosition:-52
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(-101,
+ [SceneView boundMouseGivenNextPosition:0
+ maxPosition:-100
+ centerPosition:44
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(49,
+ [SceneView boundMouseGivenNextPosition:60
+ maxPosition:50
+ centerPosition:-20
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+
+ // Mouse is not out of bounds, and not anchored. The Center is returned.
+ EXPECT_EQ(2,
+ [SceneView boundMouseGivenNextPosition:0
+ maxPosition:100
+ centerPosition:2
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(99,
+ [SceneView boundMouseGivenNextPosition:25
+ maxPosition:100
+ centerPosition:99
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(-52,
+ [SceneView boundMouseGivenNextPosition:99
+ maxPosition:100
+ centerPosition:-52
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(44,
+ [SceneView boundMouseGivenNextPosition:120
+ maxPosition:200
+ centerPosition:44
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(-20,
+ [SceneView boundMouseGivenNextPosition:180
+ maxPosition:200
+ centerPosition:-20
+ isAnchoredLow:NO
+ isAnchoredHigh:NO]);
+
+ // Mouse is not out of bounds, and anchored. The position closest
+ // to the anchor is returned.
+ EXPECT_EQ(0,
+ [SceneView boundMouseGivenNextPosition:0
+ maxPosition:100
+ centerPosition:2
+ isAnchoredLow:YES
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(25,
+ [SceneView boundMouseGivenNextPosition:25
+ maxPosition:100
+ centerPosition:99
+ isAnchoredLow:YES
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(-52,
+ [SceneView boundMouseGivenNextPosition:99
+ maxPosition:100
+ centerPosition:-52
+ isAnchoredLow:YES
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(44,
+ [SceneView boundMouseGivenNextPosition:120
+ maxPosition:200
+ centerPosition:44
+ isAnchoredLow:YES
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(-20,
+ [SceneView boundMouseGivenNextPosition:180
+ maxPosition:200
+ centerPosition:-20
+ isAnchoredLow:YES
+ isAnchoredHigh:NO]);
+ EXPECT_EQ(2,
+ [SceneView boundMouseGivenNextPosition:0
+ maxPosition:100
+ centerPosition:2
+ isAnchoredLow:NO
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(99,
+ [SceneView boundMouseGivenNextPosition:25
+ maxPosition:100
+ centerPosition:99
+ isAnchoredLow:NO
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(99,
+ [SceneView boundMouseGivenNextPosition:99
+ maxPosition:100
+ centerPosition:-52
+ isAnchoredLow:NO
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(120,
+ [SceneView boundMouseGivenNextPosition:120
+ maxPosition:200
+ centerPosition:44
+ isAnchoredLow:NO
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(180,
+ [SceneView boundMouseGivenNextPosition:180
+ maxPosition:200
+ centerPosition:-20
+ isAnchoredLow:NO
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(0,
+ [SceneView boundMouseGivenNextPosition:0
+ maxPosition:100
+ centerPosition:2
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(25,
+ [SceneView boundMouseGivenNextPosition:25
+ maxPosition:100
+ centerPosition:99
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(99,
+ [SceneView boundMouseGivenNextPosition:99
+ maxPosition:100
+ centerPosition:-52
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(120,
+ [SceneView boundMouseGivenNextPosition:120
+ maxPosition:200
+ centerPosition:44
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+ EXPECT_EQ(180,
+ [SceneView boundMouseGivenNextPosition:180
+ maxPosition:200
+ centerPosition:-20
+ isAnchoredLow:YES
+ isAnchoredHigh:YES]);
+}
+
+TEST(SceneViewTest_Static, BoundVelocity) {
+ // Outside bounds of the axis
+ EXPECT_EQ(0, [SceneView boundVelocity:5.0f axisLength:100 mousePosition:0]);
+ EXPECT_EQ(0, [SceneView boundVelocity:5.0f axisLength:100 mousePosition:99]);
+ EXPECT_EQ(0, [SceneView boundVelocity:5.0f axisLength:200 mousePosition:200]);
+ // Not outside bounds of the axis
+ EXPECT_EQ(5.0f,
+ [SceneView boundVelocity:5.0f axisLength:100 mousePosition:1]);
+ EXPECT_EQ(5.0f,
+ [SceneView boundVelocity:5.0f axisLength:100 mousePosition:98]);
+ EXPECT_EQ(5.0f,
+ [SceneView boundVelocity:5.0f axisLength:200 mousePosition:100]);
+}
+
+TEST_F(SceneViewTest, TickPanVelocity) {
+ // We are in the large frame, which can pan left and right but not up and
+ // down. Start by resizing it to allow panning up and down.
+
+ [scene_ panAndZoom:CGPointMake(0, 0) scaleBy:2.0f];
+
+ // Going up and right
+ [scene_ setPanVelocity:CGPointMake(1000, 1000)];
+ [scene_ tickPanVelocity];
+
+ webrtc::DesktopVector pos = scene_.mousePosition;
+ int loopLimit = 0;
+ bool didMove = false;
+ bool inMotion = true;
+
+ while (inMotion && loopLimit < 100) {
+ inMotion = [scene_ tickPanVelocity];
+ if (inMotion) {
+ ASSERT_TRUE(pos.x() <= scene_.mousePosition.x()) << " after " << loopLimit
+ << " iterations.";
+ ASSERT_TRUE(pos.y() <= scene_.mousePosition.y()) << " after " << loopLimit
+ << " iterations.";
+ didMove = true;
+ }
+ pos = scene_.mousePosition;
+ loopLimit++;
+ }
+
+ EXPECT_LT(1, loopLimit);
+ EXPECT_TRUE(!inMotion);
+ EXPECT_TRUE(didMove);
+
+ // Going down and left
+ [scene_ setPanVelocity:CGPointMake(-1000, -1000)];
+ [scene_ tickPanVelocity];
+
+ pos = scene_.mousePosition;
+ loopLimit = 0;
+ didMove = false;
+ inMotion = true;
+
+ while (inMotion && loopLimit < 100) {
+ inMotion = [scene_ tickPanVelocity];
+ if (inMotion) {
+ ASSERT_TRUE(pos.x() >= scene_.mousePosition.x()) << " after " << loopLimit
+ << " iterations.";
+ ASSERT_TRUE(pos.y() >= scene_.mousePosition.y()) << " after " << loopLimit
+ << " iterations.";
+ didMove = true;
+ }
+ pos = scene_.mousePosition;
+ loopLimit++;
+ }
+
+ EXPECT_LT(1, loopLimit);
+ EXPECT_TRUE(!inMotion);
+ EXPECT_TRUE(didMove);
+}
+
+} // namespace remoting
« no previous file with comments | « remoting/ios/ui/scene_view.mm ('k') | remoting/ios/utility.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698