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 |