Home | History | Annotate | Download | only in workspace
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ash/wm/workspace/magnetism_matcher.h"
      6 
      7 #include "testing/gtest/include/gtest/gtest.h"
      8 
      9 namespace ash {
     10 namespace internal {
     11 
     12 // Trivial test case verifying assertions on left edge.
     13 TEST(MagnetismMatcherTest, TrivialLeft) {
     14   const int distance = MagnetismMatcher::kMagneticDistance;
     15   const gfx::Rect initial_bounds(20, 10, 50, 60);
     16   MagnetismMatcher matcher(initial_bounds, kAllMagnetismEdges);
     17   EXPECT_FALSE(matcher.AreEdgesObscured());
     18   MatchedEdge edge;
     19   EXPECT_FALSE(matcher.ShouldAttach(
     20                    gfx::Rect(initial_bounds.x() - distance - 10,
     21                              initial_bounds.y() - distance - 10, 2, 3), &edge));
     22   EXPECT_FALSE(matcher.AreEdgesObscured());
     23   EXPECT_TRUE(matcher.ShouldAttach(
     24                   gfx::Rect(initial_bounds.x() - 2, initial_bounds.y(), 1, 1),
     25                   &edge));
     26   EXPECT_EQ(MAGNETISM_EDGE_LEFT, edge.primary_edge);
     27   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_LEADING, edge.secondary_edge);
     28 
     29   EXPECT_TRUE(matcher.ShouldAttach(
     30                   gfx::Rect(initial_bounds.x() - 2,
     31                             initial_bounds.y() + distance + 1 , 1, 1),
     32                   &edge));
     33   EXPECT_EQ(MAGNETISM_EDGE_LEFT, edge.primary_edge);
     34   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_NONE, edge.secondary_edge);
     35 }
     36 
     37 // Trivial test case verifying assertions on bottom edge.
     38 TEST(MagnetismMatcherTest, TrivialBottom) {
     39   const int distance = MagnetismMatcher::kMagneticDistance;
     40   const gfx::Rect initial_bounds(20, 10, 50, 60);
     41   MagnetismMatcher matcher(initial_bounds, kAllMagnetismEdges);
     42   EXPECT_FALSE(matcher.AreEdgesObscured());
     43   MatchedEdge edge;
     44   EXPECT_FALSE(matcher.ShouldAttach(
     45                    gfx::Rect(initial_bounds.x() - distance - 10,
     46                              initial_bounds.y() - distance - 10, 2, 3), &edge));
     47   EXPECT_FALSE(matcher.AreEdgesObscured());
     48   EXPECT_TRUE(matcher.ShouldAttach(
     49                   gfx::Rect(initial_bounds.x() - 2,
     50                             initial_bounds.bottom() + 4, 10, 1), &edge));
     51   EXPECT_EQ(MAGNETISM_EDGE_BOTTOM, edge.primary_edge);
     52   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_LEADING, edge.secondary_edge);
     53 
     54   EXPECT_TRUE(matcher.ShouldAttach(
     55                   gfx::Rect(initial_bounds.x() + distance + 1,
     56                             initial_bounds.bottom() + 4, 10, 1), &edge));
     57   EXPECT_EQ(MAGNETISM_EDGE_BOTTOM, edge.primary_edge);
     58   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_NONE, edge.secondary_edge);
     59 
     60   EXPECT_TRUE(matcher.ShouldAttach(
     61                   gfx::Rect(initial_bounds.right() - 10 - 1,
     62                             initial_bounds.bottom() + 4, 10, 1), &edge));
     63   EXPECT_EQ(MAGNETISM_EDGE_BOTTOM, edge.primary_edge);
     64   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_TRAILING, edge.secondary_edge);
     65 }
     66 
     67 // Verifies we don't match an obscured corner.
     68 TEST(MagnetismMatcherTest, ObscureLeading) {
     69   const int distance = MagnetismMatcher::kMagneticDistance;
     70   const gfx::Rect initial_bounds(20, 10, 150, 160);
     71   MagnetismMatcher matcher(initial_bounds, kAllMagnetismEdges);
     72   MatchedEdge edge;
     73   // Overlap with the upper right corner.
     74   EXPECT_FALSE(matcher.ShouldAttach(
     75                    gfx::Rect(initial_bounds.right() - distance * 2,
     76                              initial_bounds.y() - distance - 2,
     77                              distance * 3,
     78                              (distance + 2) * 2), &edge));
     79   EXPECT_FALSE(matcher.AreEdgesObscured());
     80   // Verify doesn't match the following which is obscured by first.
     81   EXPECT_FALSE(matcher.ShouldAttach(
     82                    gfx::Rect(initial_bounds.right() + 1,
     83                              initial_bounds.y(),
     84                              distance,
     85                              5), &edge));
     86   // Should match the following which extends into non-overlapping region.
     87   EXPECT_TRUE(matcher.ShouldAttach(
     88                    gfx::Rect(initial_bounds.right() + 1,
     89                              initial_bounds.y() + distance + 1,
     90                              distance,
     91                              15), &edge));
     92   EXPECT_EQ(MAGNETISM_EDGE_RIGHT, edge.primary_edge);
     93   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_NONE, edge.secondary_edge);
     94 }
     95 
     96 // Verifies obscuring one side doesn't obscure the other.
     97 TEST(MagnetismMatcherTest, DontObscureOtherSide) {
     98   const int distance = MagnetismMatcher::kMagneticDistance;
     99   const gfx::Rect initial_bounds(20, 10, 150, 160);
    100   MagnetismMatcher matcher(initial_bounds, kAllMagnetismEdges);
    101   MatchedEdge edge;
    102   // Overlap with the left side.
    103   EXPECT_FALSE(matcher.ShouldAttach(
    104                    gfx::Rect(initial_bounds.x() - distance + 1,
    105                              initial_bounds.y() + 2,
    106                              distance * 2 + 2,
    107                              initial_bounds.height() + distance * 4), &edge));
    108   EXPECT_FALSE(matcher.AreEdgesObscured());
    109   // Should match the right side since it isn't obscured.
    110   EXPECT_TRUE(matcher.ShouldAttach(
    111                    gfx::Rect(initial_bounds.right() - 1,
    112                              initial_bounds.y() + distance + 1,
    113                              distance,
    114                              5), &edge));
    115   EXPECT_EQ(MAGNETISM_EDGE_RIGHT, edge.primary_edge);
    116   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_NONE, edge.secondary_edge);
    117 }
    118 
    119 // Verifies we don't match an obscured center.
    120 TEST(MagnetismMatcherTest, ObscureCenter) {
    121   const int distance = MagnetismMatcher::kMagneticDistance;
    122   const gfx::Rect initial_bounds(20, 10, 150, 160);
    123   MagnetismMatcher matcher(initial_bounds, kAllMagnetismEdges);
    124   MatchedEdge edge;
    125   // Overlap with the center bottom edge.
    126   EXPECT_FALSE(matcher.ShouldAttach(
    127                    gfx::Rect(100, initial_bounds.bottom() - distance - 2,
    128                              20,
    129                              (distance + 2) * 2), &edge));
    130   EXPECT_FALSE(matcher.AreEdgesObscured());
    131   // Verify doesn't match the following which is obscured by first.
    132   EXPECT_FALSE(matcher.ShouldAttach(
    133                    gfx::Rect(110, initial_bounds.bottom() + 1,
    134                              10, 5), &edge));
    135   // Should match the following which extends into non-overlapping region.
    136   EXPECT_TRUE(matcher.ShouldAttach(
    137                   gfx::Rect(90,
    138                             initial_bounds.bottom() + 1,
    139                             10, 5), &edge));
    140   EXPECT_EQ(MAGNETISM_EDGE_BOTTOM, edge.primary_edge);
    141   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_NONE, edge.secondary_edge);
    142 }
    143 
    144 // Verifies we don't match an obscured trailing edge.
    145 TEST(MagnetismMatcherTest, ObscureTrailing) {
    146   const int distance = MagnetismMatcher::kMagneticDistance;
    147   const gfx::Rect initial_bounds(20, 10, 150, 160);
    148   MagnetismMatcher matcher(initial_bounds, kAllMagnetismEdges);
    149   MatchedEdge edge;
    150   // Overlap with the trailing left edge.
    151   EXPECT_FALSE(matcher.ShouldAttach(
    152                    gfx::Rect(initial_bounds.x() - distance - 2,
    153                              150,
    154                              (distance + 2) * 2,
    155                              50), &edge));
    156   EXPECT_FALSE(matcher.AreEdgesObscured());
    157   // Verify doesn't match the following which is obscured by first.
    158   EXPECT_FALSE(matcher.ShouldAttach(
    159                    gfx::Rect(initial_bounds.x() - 4,
    160                              160, 3, 20), &edge));
    161   // Should match the following which extends into non-overlapping region.
    162   EXPECT_TRUE(matcher.ShouldAttach(
    163                    gfx::Rect(initial_bounds.x() - 4,
    164                              140, 3, 20), &edge));
    165   EXPECT_EQ(MAGNETISM_EDGE_LEFT, edge.primary_edge);
    166   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_NONE, edge.secondary_edge);
    167 }
    168 
    169 }  // namespace internal
    170 }  // namespace ash
    171 
    172